HARDWARE XOR FOR OUTPUT PINS ON AVR MICROCONTROLLERS
Did you know that many AVR chips have a type of hardware exclusive OR (XOR) option when it concerns the logic levels of the output pins? Ha megjelenik az adatlapon (a fenti kép egy Attiny13 adatlapból készült képernyőkép), akkor talál egy részt a PIN kóddal. Kiderül, hogy ha egy kikötőt kimenetként állít be, az írás logikája az egyik a megfelelő PIN-regiszterhez kapcsolja ki a logikai szinteket. This is really easy to neglect if you’re writing in C, but I’ve been working on learning a bit of assembler language and found this to be very useful. Tartsa az olvasást a szünet után, és elmondom neked, hogyan történt ezzel az információval, és mi jó.
Tehát először, beszéljünk arról, hogy miért nem számít, ha C-kódban írsz. typically if you want to toggle some output pins you’ll just write a one-liner that XOR’s with a bitmask:
1
Portb ^ = 0xff;
Ez egy kicsit c rövidítés (sokkal többet megtudhat arról, hogy a Tutorial Series), amely elvégzi az XOR-t az aktuális kimeneti szinten, és az eredményt a kikötőbe írja. De ugyanazt a dolgot lehet elvégezni a hardverben a bitmaszk írása a PINB Regisztráláshoz:
1
Pinb = 0xff;
Nem igazán érdekel, mert ez csak egy kódsor. Valójában valószínűleg egyszerűbb Xor a Portb, mert sokkal több értelemben koncepcionálódik. De a fordító sokkal több ciklust használhat, mint ha a PIN-kódra írta volna.
Ebben a funkcióban történt, mert néhány LED-t villogtam, mint az összeszerelő tanulási módja. Ezt a kódot a megszakítási szolgáltatás rutinjában volt:
1
2
Három
4
ldi myreg, 0xff
Intreg, Portb
EOR INTREG, MYREG
KI PORTB, INTREG
A bitmaszkot egy regiszterbe terheli, a Portb jelenlegi logikájának betöltése egy másik regiszterbe, a XOR XOR-t végzi, és az eredményt a PORTB-ra írja. Ez négy ciklust vesz igénybe, és két regisztert igényel. A bitek átkapcsolása olyan kezdetleges művelet, amit csodálkoztam, nem volt parancs a Xor bitekre, így kezdtem keresni. Ehhez a rövid cikkre kerültem az AVR Freaks-en, amely a Bit Toggle funkcióba helyezett. Most az alábbiak szerint csökkentem az összeszerelő kódomat:
1
2
LDI INTREG2, 0xFF; Tempority Az INTREG2-t egy kicsit maszkként használja
ki Pinb, Intreg2; A PINB Effectivley írása kizárólagos vagy Portb
Ez ugyanabból a váltogatási hatást eredményez, de csak két ciklust igényel, és csak egy regiszter használatát igényli.
Amit sok érdekes volt, az, hogy nem számít, mennyire használom az AVR chipeket, soha nem lesz olyan meglepetés hiánya, amely az adatlapon található.