Wist u dat veel AVR-chips een type hardware exclusieve of (XOR) -optie hebben wanneer het de logische niveaus van de uitvoerpinnen betreft? Als u in de datasheet kijkt (de afbeelding hierboven is een screenshot van een Attiny13-datasheet), vindt u een sectie over het schakelen van de pincode. Het blijkt dat als u een poort instelt als een uitvoer, het schrijven van logica één op het bijbehorende PIN-register de logische niveaus van dat uit te schakelen. Dit is echt gemakkelijk om te verwaarlozen als je in C schrijft, maar ik heb gewerkt aan het leren van een beetje assembler-taal en vond dit erg handig. Blijf lezen na de pauze en ik zal je vertellen hoe ik op deze info gebeurde en waar het goed voor is.
Dus eerst af, laten we het hebben over waarom dit niet veel toe doet als je in C-code schrijft. Meestal als u een aantal uitgangspennen wilt schakelen, schrijft u gewoon een one-liner die XOR is met een bitmasker:
1
Portb ^ = 0xff;
Dit is een beetje C-shorthand (leer veel meer over dat vanuit mijn tutorial-serie) die de XOR uitvoert op de huidige uitvoerniveaus en schrijft het resultaat terug naar de haven. Maar hetzelfde kan worden gedaan in hardware door het bitmask naar het PINB-register te schrijven:
1
PINB = 0xFF;
Het maakt je niet echt uit, omdat het slechts één regel code is. In feite is het waarschijnlijk eenvoudiger voor XOR de portb omdat het veel zinvolle conceptueel maakt. Maar de compiler kan uiteindelijk veel meer cycli gebruiken dan wanneer u naar het PIN-register had geschreven.
Ik gebeurde deze functie omdat ik een paar LED’s knipperde als een manier om assembler te leren. Ik had deze wirwar van code in een onderbrekingsdienstroutine:
1
2
3
4
ldi myreg, 0xff
In Integratie, Portb
EOR INTREG, MYREG
OUT PORTB, INTREG
Het laadt een bitmasker in één register, belastingen in de huidige logica van PortB naar een ander register, voert een XOR van de twee uit en schrijft het resultaat terug naar portb. Dit duurt vier cycli en vereist twee registers. Schakelen tussen bits is zo’n rudimentaire operatie dat ik verbaasd was Er was geen commando aan XOR-bits direct, dus ik begon met zoeken. Ik kwam dit korte artikel over bij AVR-freaks die me in de bit-toggle-functie heb aangemeld. Nu kon ik mijn assembler-code als volgt verlagen:
1
2
LDI Intra2, 0xff; Templinity Gebruik Intra2 als een beetje masker
uit PINB, INTREG2; schrijven naar PINB Effectivley doet een exclusief of op portb
Dit resulteert in hetzelfde schakelt effect, maar duurt slechts twee cycli en vereist het gebruik van slechts één register.
Wat ik vele interessante vond, is dat het niet uitmaakt hoeveel ik AVR-chips gebruikt, er is nooit een tekort aan verrassingen die wachten op te vinden in de datasheet.