Sprzęt XOR do pinów wyjściowych na mikrokontrolerach AVR
Czy wiesz, że wiele żetonów AVR ma opcję wyłącznego sprzętu lub (XOR), gdy dotyczy poziomów logicznych pinów wyjściowych? Jeśli spojrzysz w arkusz danych (obraz powyżej jest zrzut ekranu z arkusza danych Attiny11) znajdziesz sekcję na przełączeniu szpilki. Okazuje się, że jeśli ustawisz port jako wyjście, logika pisania jeden do odpowiedniego rejestru PIN będzie przełączyć poziom logiki tego. To jest naprawdę łatwe do zaniedbania, jeśli piszesz w C, ale pracowałem nad uczeniem się trochę języka asemblera i stwierdziłem, że jest bardzo przydatny. Czytajcie po przerwie, a powiem ci, jak stało się na tej informacji i co to jest dobre.
Więc po raz pierwszy porozmawiajmy o tym, dlaczego to nie ma znaczenia, jeśli piszesz w kodzie C. Zazwyczaj jeśli chcesz przełączyć kilka pinów wyjściowych, po prostu napisz jedną liniową, którą XOR’s z bitmaską:
1.
Portb ^ = 0xFF;
Jest to trochę CHORTHAND (dowiedz się więcej o tym z mojego serii samouczka), która wykonuje XOR na bieżącym poziomie wyjściowym i pisze wynik z powrotem do portu. Ale to samo można zrobić w sprzęcie, pisząc bitmaskę do rejestru PINB:
1.
PinB = 0xFF;
Nie obchodzi cię naprawdę, ponieważ to tylko jedna linia kodu. W rzeczywistości prawdopodobnie jest prostsze do XOR Portub, ponieważ jest to znacznie więcej sensu koncepcyjnie. Ale kompilator może skończyć się za pomocą znacznie więcej cykli niż gdy napisałeś do rejestru PIN.
Stało mi się w całej tej funkcji, ponieważ mrugałem niektórym diodami diodami jako sposób na nauczanie insemblera. Miałem tę zbieranie kodu w rutynie serwisowej:
1.
2.
3.
4.
LDI MYREG, 0XFF
W Integ, Portb
Eor Intreg, Myreg
Out Portb, Intreg
Ładuje bitmaskę do jednego rejestru, ładunki w bieżącej logiki z PortB do innego rejestru wykonuje XOR z dwóch i pisze wynik z powrotem do PortB. To trwa cztery cykle i wymaga dwóch rejestrów. Przełączanie bitów jest taka podstawowa operacja Była zdumiona, że nie było bezpośredniego polecenia bitów XOR, więc zacząłem poszukiwać. Natknąłem się na ten krótki artykuł w Avr Freaks, które kleją mnie w funkcji przełączania bitów. Teraz byłem w stanie zmniejszyć mój kod asemblera w następujący sposób:
1.
2.
LDI Intreg2, 0xFF; Temporarity używaj Intreg2 jako maski nieco
Out PinB, Intreg2; Pisanie do PinB Effectivley robi wyłączne lub na portB
Powoduje to ten sam skutek przełączenia, ale zajmuje tylko dwa cykle i wymaga użycia tylko jednego rejestru.
Co znalazłem wiele ciekawych, to bez względu na to, jak bardzo korzystam z żetonów AVR, nie brakuje niespodzianek, czekając na znalezienie w arkuszu danych.