Hardware Xor pentru pinii de ieșire pe microcontrolerele AVR

Știați că multe chipsuri AVR au un tip de opțiune exclusivă sau (xor), atunci când se referă la nivelurile logice ale pinilor de ieșire? Dacă vă uitați în foaia de date (imaginea de mai sus este o captură de ecran dintr-o foaie de date ATTININY13) veți găsi o secțiune pe Comunicarea codului PIN. Se pare că, dacă setați un port ca ieșire, scrierea logicii una la registrul corespunzător PIN va comuta nivelele logice ale acestora. Acest lucru este foarte ușor de neglijat dacă scrieți în C, dar am lucrat la învățarea unui pic de limbaj de asamblare și am descoperit că acest lucru este foarte util. Continuați să citiți după pauză și vă voi spune cum sa întâmplat la aceste informații și despre ce este bine pentru.

Deci, mai întâi, să vorbim de ce acest lucru nu contează foarte mult dacă scrieți în codul C. În mod obișnuit, dacă doriți să comutați niște pini de ieșire, veți scrie doar o singură căptușeală pe care Xor este cu un bitmask:

1.
PORTB ^ = 0xFF;

Acesta este un pic de stentri c (aflați mai multe despre acest lucru din seria mea de tutorial) care efectuează XOR-ul la nivelurile de ieșire curent și scrie rezultatul înapoi la port. Dar același lucru se poate face în hardware scriind Bitmask la Registrul Pinb:

1.
Pinb = 0xFF;

Nu-ți pasă, pentru că este doar o linie de cod. De fapt, este probabil mai simplu să Xor Portb, deoarece face mult mai mult sens. Dar compilatorul ar putea ajunge să utilizeze mult mai multe cicluri decât dacă ați fi scris în registrul PIN.

M-am întâmplat pe această caracteristică pentru că am clipit câteva LED-uri ca o modalitate de a învăța asamblorul. Am avut acest cod de cod într-o rutină de rutină de întrerupere:

1.
2.
3.
4.
ldi myreg, 0xff
În INTREG, PORTB
EOR INTREG, MYREG
Out Portb, intreg

Se încarcă o bitmask într-un singur registru, încărcături în logica curentă de la PORT la un alt registru, efectuează un Xor al celor două și scrie rezultatul înapoi la Portb. Acest lucru ia patru cicluri și necesită două registre. Biturile de comutare este o operațiune atât de rudimentară, am fost uimit că nu a fost o comandă pentru Xor Bits direct, așa că am început să caut în jur. Am dat peste acest articol scurt de la Freaks AVR, care ma indragostit in caracteristica de comutare de biți. Acum am reușit să scriu codul de asamblare după cum urmează:

1.
2.
LDI INTREG2, 0xFF; Utilizarea temporarului INTREG2 ca o mască de biți
OUT PINB, INTREG2; scrierea la Pinb Effectivley face un exclusiv sau pe Portb

Acest lucru are ca rezultat același efect de compensare, dar ia doar două cicluri și necesită utilizarea unui singur registru.

Ceea ce am găsit multe interesante este că, indiferent cât de mult folosesc jetoane AVR, niciodată nu este o lipsă de surprize care așteaptă să fie găsite în foaia de date.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post