MicroController Register Manipulation (4 / 6 steg)
Steg 4: Arduino Microcontrollers med ATMEL marker
Som tidigare nämnts, är bakgrunden församlingen språk används för att programmera PIC32 och ATMEL marker olika. Om du sedan hoppa till slutsatsen att registrera namnen är annorlunda, du skulle vara rätt.
Jag kommer inte gå så djupt in i den logik förklaringen här, men det finns några viktiga skillnader som du måste hålla i minnet. Gå tillbaka till föregående steg för ingående förklaring av logiken.
Först riktade registret som anger I/O tillstånd av klämma fast kallas DDRx, där x designerar registret (pinMode() anger DDRx). Om du vill ange PIN-koden som en utgång, måste du skriva en 1 till motsvarande bit skriftligen DDRx. 0 till DDRx kommer att ange PIN-koden som indata. Nästa är PORTx registret, som avgör om ett stift in som en utgång är hög (1) eller låg (0) (digitalWrite() anger PORTx). Sist är PINx, där du kan läsa data presentera på pin det den är inställd som en ingång (digitalRead() läser PINx). En '1' i PINx registret anger att det finns en signal på det klämmer fast.
Titta på Arduino UNO (se PDF nedan, källa här), beslöt jag att använda 4 lysdioder på stift 4→7 som mappas till registrera D, bitar 4→7. Vi satt register D4→7 som utgångar av ORing med 0b1111 0000, att dessa fyra bitar som 1. Jag satte 4 växlar på stift 8→11, som kartan till registrera B, bitar 0→3. Vi satt register B0→3 som ingångar av ANDing med 0b1111 0000, att dessa fyra bitar som 0. Följande kod går i våra setup() uttalande:
DDRD = DDRD | 0xF0; 0b1111 0000
DDRB = DDRB & 0xF0; 0b1111 0000
De register bitarna igen ser, vi att växlarna är tilldelade till bitar 0→3 och ljusdioderna till bitar 4→7. Om vi bara tilldela tillståndet i PINB direkt till PORTD, vi kommer att sätta PORTD bitar 0→3, inte bitar 4 -> 7 och lysdioderna kommer inte att lysa upp. Vi fixa detta med en bitvis SKIFT till vänster, fyra områdena. Koden för våra loop() uttalande ser ut så här:
PORTD = PINB << 4.
Här är hela koden:
Arduino registrera manipulation med 4 växlar
på stift 8-11, 4 lysdioder och motstånd på stift 4-7
void setup()
{
DDRD = DDRD | 0xF0; Digital stift 4-7 karta för att registrera D,
BITS 4-7. 0xF0 = 0b1111 0000 var
en 1 definierar stiftet som utdata. Med hjälp av
Bitvis eller (|) tillåter de återstående
BITS vara opåverkad och undvika
oönskade drift och enda uppsättning
de 4 stift som vi vill. Du kan skriva
DDRD = 0xnn, (där n är ett hexadecimalt tal)
men det finns inget sätt att veta hur
de andra bitarna kommer att påverkas.
Det kanske inte gör något, det kan inte.
DDRB = DDRB & 0xF0; Digital stift 8-11 karta för att registrera B0-3.
Med 0xF0 igen, men nu 0 är en ingång.
Vi använder bitvis AND (och) att lämna
de återstående bitarna i registret ensam.
}
void loop()
{
PORTD = PINB << 4. skriva status av växlar på
PINB att lamporna på PORTD, men lite
skiftat vänster av 4 bitar. Så RB3-0 karta
RD7-4.
}
Igen 10 rader kod, och endast 3 göra något. Det var allt.
Sammanställningen av detta med MPIDE tar bara 470 byte minne, en minskning av 604 byte från den kortare versionen i steg 2 som kostar 1074 byte och använde pinMode(), digitalWrite() och digitalRead().