Hardware XOR til udgangsstifter på AVR Microcontrollers
Vidste du, at mange AVR-chips har en type hardware Eksklusiv eller (XOR) mulighed, når det drejer sig om logiske niveauer af udgangsstifterne? Hvis du ser i databladet (billedet ovenfor er et screenshot fra et ATTINY13 DATASHEET), finder du et afsnit om at skifte PIN-kode. Det viser sig, at hvis du indstiller en port som en udgang, skriver logik til det tilsvarende PIN-register, skifter logikniveauerne af det ud. Dette er virkelig nemt at forsømme, hvis du skriver i c, men jeg har arbejdet på at lære en smule samlingssprog og fandt dette at være meget nyttigt. Fortsæt med at læse efter pause, og jeg vil fortælle dig, hvordan jeg skete på denne info og hvad det er godt for.
Så først, lad os tale om, hvorfor dette ikke betyder noget meget, hvis du skriver i C-kode. Typisk hvis du vil skifte nogle output pins, vil du bare skrive en en-liner, som Xor er med en bitmask:
1
Portb ^ = 0xff;
Dette er en smule c shorthand (lær meget mere om det fra min tutorial serie), der udfører XOR på de nuværende udgangsniveauer og skriver resultatet tilbage til porten. Men det samme kan gøres i hardware ved at skrive bitmasken til PINB-registret:
1
Pinb = 0xff;
Du er ikke rigtig ligeglad, fordi det kun er en enkelt linje. Faktisk er det sandsynligvis enklere at XOR Portb, fordi det gør meget mere mening konceptuelt. Men kompilatoren kan ende med at bruge meget flere cykler, end hvis du havde skrevet til PIN-registret.
Jeg skete på tværs af denne funktion, fordi jeg blinkede nogle lysdioder som en måde at lære assembler på. Jeg havde denne jumble af kode i en afbryder service rutine:
1
2.
3.
4.
ldi myreg, 0xff
i Integ, Portb
eor Integ, Myreg
ud portb, Integ
Den indlæser en bitmask i et register, belastninger i den aktuelle logik fra PORTB til et andet register, udfører en XOR af de to, og skriver resultatet tilbage til PORTB. Dette kræver fire cykler og kræver to registre. Skiftende bits er sådan en rudimentær operation, jeg var forbløffet, der var ikke en kommando til Xor bits direkte, så jeg begyndte at søge rundt. Jeg kom på tværs af denne korte artikel over på AVR Freaks, som clued mig ind i bit-toggelfunktionen. Nu kunne jeg reducere min assembler kode som følger:
1
2.
LDI INTREG2, 0XFF; temporarity Brug Integ2 som en smule maske
ud Pinb, Integ2; Skrivning til Pinb Effectivley gør en eksklusiv eller på portb
Dette resulterer i samme skiftende effekt, men tager kun to cyklusser og kræver brug af kun ét register.
Hvad jeg fandt mange interessante er, at uanset hvor meget jeg bruger AVR chips, er der aldrig mangel på overraskelser, der venter på at blive fundet i databladet.