Stap 4: Arduino Microcontrollers met ATMEL chips
Zoals eerder vermeld, is de achtergrond vergadering talen gebruikt voor het programmeren van de PIC32 en ATMEL chips zijn verschillend. Als u vervolgens tot de conclusie springen dat het register namen verschillend zijn, je zou gelijk.
Ik zal niet gaan zoals diep in de uitleg van de logica hier, maar er zijn enkele belangrijke verschillen die je in gedachten moet houden. Terugverwijzen naar de vorige stap voor de grondige uitleg van de logica.
Ten eerste, het directionele register waarin de staat van de I/O van de pin heet DDRx, waar x het register aanwijst (pinMode() wordt ingesteld DDRx). Om de pincode instellen als uitgang, moet u een 1 schrijven naar de overeenkomende bit schriftelijk DDRx. een 0 tot DDRx zal de pincode instellen als input. Daarna is het PORTx-register, dat bepaalt of een PIN-code ingesteld als een vermogen hoog (1) en laag (0 is) (digitalWrite() wordt ingesteld PORTx). Laatst is PINx, waarmee u lezen gegevens presenteren op de pin is ingesteld als een input (digitalRead() leest PINx). Een '1' in het register van de PINx geeft aan dat er een signaal aanwezig is op dat pin.
Kijkend naar de Arduino UNO (Zie PDF hieronder, bron hier), heb ik besloten om het gebruik van 4 LEDs op pinnen 4→7 die worden toegewezen aan D, stukjes 4→7 registreren. Wij registreren D4→7 instellen als uitgangen door ORing met 0b1111 0000, die vier stukjes instellen als 1's. Ik heb 4 schakelaars op pinnen 8→11, die zijn toegewezen aan het registreren van B, bits 0→3. Wij registreren B0→3 instellen als ingangen door ANDing met 0b1111 0000, die vier stukjes instellen als 0's. De volgende code gaat in onze setup() verklaring:
DDRD = DDRD | 0xF0; 0b1111 0000
DDRB = DDRB & 0xF0; 0b1111 0000
Kijkend naar de register bits opnieuw, zien we dat de schakelopties worden toegewezen aan stukjes 0→3 en de LED's naar bits 4→7. Als we alleen de status van PINB direct aan PORTD toewijst, wij zal opzetten PORTD bits 0→3, niet 4 bits -> 7 en de LEDs niet zal oplichten. Wij bevestigen dit met een bitsgewijs verplaatsen naar links door vier ruimten. De code voor onze() van de lusinstructieziet er zo uit:
PORTD = PINB << 4;
Hier is de volledige code:
// Arduino register manipulation with 4 switches // on pins 8-11, 4 LEDs and resistors on pins 4-7 void setup() { DDRD = DDRD | 0xF0; // digital pins 4-7 map to register D, // bits 4-7. 0xF0 = 0b1111 0000 where // a 1 defines the pin as output. Using // the bitwise OR (|) allows the remaining // bits to be unaffected and avoid // unwanted operation and only set // the 4 pins we want. You could write // DDRD = 0xnn, (where n is any hex digit) // but there is no way of knowing how // the other bits will be affected. // It may do nothing, it may not. DDRB = DDRB & 0xF0; // digital pins 8-11 map to register B0-3. // Using 0xF0 again, but now 0 is an input. // We use bitwise AND (&) to leave // the remaining bits in the register alone. } void loop() { PORTD = PINB << 4; // write the status of the switches on // PINB to the LEDs on PORTD, but bit // shifted left by 4 bits. So RB3-0 map // to RD7-4. }
Weer 10 lijnen van code, en slechts 3 doen iets. Thats it.
Dit compileren met MPIDE neemt alleen 470 bytes van het geheugen, een vermindering van de 604 bytes van de kortere versie in stap 2, die kosten 1074 bytes en pinMode(), digitalWrite() en digitalRead()gebruikt.