Hardware XOR pro výstupní kolíky na AVR Microcontrollers
Věděli jste, že mnoho čipů AVR má typ hardwaru exkluzivní nebo (XOR) možnost, když se týká logických úrovní výstupních pinů? Pokud se podíváte do datového listu (obrázek výše je screenshot z listu Attiny13 Datasheet) najdete sekci na přepnutí PIN. Ukazuje se, že pokud nastavíte port jako výstup, bude psaní logiky jeden do odpovídajícího pinového registru přepínat logické úrovně tohoto venku. To je opravdu snadné zanedbávat, pokud píšete v c, ale pracoval jsem na učení se trochu montážního jazyka a zjistil, že je to velmi užitečné. Pokračujte v čtení po přestávce a řeknu vám, jak jsem se stal na těchto informacích a co je to dobré.
Takže první, pojďme mluvit o tom, proč to nezáleží moc, pokud píšete v kód C. Typicky, pokud chcete přepnout některé výstupní kolíky, budete napsat jednorázovou vložku, kterou XOR s bitmovou masou:
1.
Portb ^ = 0xff;
Jedná se o trochu c zkratka (naučit se mnohem více o tom z mé série tutoriálu), který provádí XOR na aktuální úrovni výstupu a zapíše výsledek zpět do portu. Ale totéž lze provést v hardwaru zapisováním bitmové masky do registru pinbu:
1.
Pinb = 0xff;
Opravdu se nestaráte, protože je to jen jedna řádka kódu. Ve skutečnosti je to pravděpodobně jednodušší pro XOR Portb, protože to dělá mnohem důležitější koncepčně. Ale kompilátor by mohl skončit mnohem více cyklů, než kdybyste napsali do registru PIN.
Stal jsem se napříč tuto funkci, protože jsem blikal nějaké LED diody jako způsob, jak se naučit assembler. Měl jsem tuto mumble kódu v rutině přerušení služby:
1.
2.
3.
4.
ldi myreg, 0xff
v intreg, portb
EOR intreg, myreg
Out portb, intreg
Načtou bitmovou masku do jednoho registru, načte v aktuální logice z PortB do jiného registru, provádí XOR ze dvou a zapíše výsledek zpět do portů. To trvá čtyři cykly a vyžaduje dva registry. Přechodné kousky je takový rudimentární operace Byl jsem ohromen tam nebyl příkaz Xor bits přímo, takže jsem začal hledat. Narazil jsem na tento krátký článek na AVR Freaks, který mě strčil do bitového přepínání. Teď jsem byl schopen snížit svůj kód assembleru následovně:
1.
2.
LDI Intreg2, 0xFF; dočasné použití Intreg2 jako bitová maska
Out Pinb, Intreg2; Psaní k Forect Effectiveley dělá exkluzivní nebo na portbar
To má za následek stejný přepínání účinku, ale trvá jen dva cykly a vyžaduje použití pouze jednoho registru.
To, co jsem našel mnoho zajímavých, je to, že bez ohledu na to, jak moc používám avr žetony, nikdy není nedostatek překvapení, které čekají na nalezení v datovém listu.