2.7 Przerwania w Arduino, operacje logiczne
Arduino Interrupts
W Arduino, jak i w innych mikrokontrolerach, interrupty (przerwania) są używane do obsługi zdarzeń, które występują w czasie rzeczywistym, niezależnie od wykonywanego właśnie kodu. Pozwala to na reagowanie na pewne zdarzenia natychmiast, bez konieczności ciągłego sprawdzania warunków w pętli głównej programu. Użycie interruptów zazwyczaj zwiększa efektywność i reaktywność programu.
Oto kilka powodów, dla których używa się interruptów w Arduino:
Reakcja na zdarzenia w czasie rzeczywistym: Jeśli istnieje potrzeba reagowania na zdarzenia, takie jak niski poziom sygnału na danym pinie, impuls z zegara czasu rzeczywistego (RTC), czy odbiór danych przez interfejs szeregowy (UART), interrupty pozwalają na błyskawiczne przerwanie wykonywania bieżącego kodu i przejście do obsługi zdarzenia.
Precyzyjne pomiar czasu: Dla zadań, które wymagają precyzyjnego pomiaru czasu, interrupty mogą być używane w połączeniu z timerami. Timer w mikrokontrolerze może generować przerwania w określonych odstępach czasu, co umożliwia dokładne śledzenie czasu.
Odbieranie danych szeregowej (UART): Gdy oczekuje się na dane przesyłane przez interfejs szeregowy (UART), korzystanie z przerwań pozwala na kontynuowanie innych operacji w trakcie oczekiwania na dane, zamiast blokować pętlę główną.
Obsługa wejść/wyjść cyfrowych: Przerwania mogą być używane do obsługi zmian stanu na pinach cyfrowych, co jest przydatne, na przykład, w przypadku obsługi przycisków lub czujników.
Zegar czasu rzeczywistego (RTC): W przypadku korzystania z modułów RTC, interrupty mogą być używane do obsługi minut lub sekund, co pozwala na precyzyjne zarządzanie czasem w programie.
Przerwania w Arduino można konfigurować przy użyciu funkcji takich jak attachInterrupt(). Warto jednak pamiętać, że obsługa interruptów wymaga ostrożności, aby uniknąć problemów związanych z konkurencją i dostępem do zasobów współdzielonych.
Kilka przydatnych artykułów:
Arduino as ISP oraz bypass programatora
Można za pomocą jednego arduino zaprogramować drugie arduino, inny mikrokontroler, bądź nawet bezpośrednio mikroprocesor (np. Atmega328p).
Sposób pierwszy - Interfejs SPI - Arduino as ISP (In-System Programming)
Zachęcam do zapoznania się z oficjalnym artykułem arduino

Ideowo dochodzi tutaj do:
- Połączenia dwóch płytek - zasilanie plus przewody interfejsu SPI
- Wgrania programu ArduinoISP na jedną z płytek
- Wgrania programu na drugą płytkę za pomocą pierwszej płytki

Podobnie prezentuje się ta sytuacja, w której zamiast drugiej płytki mamy bezpośrednio mikrokontroler.
Sposób drugi - Bypass programatora
Dla arduino UNO można zewrzeć piny RESET z GND otrzymując bypass, który pozwala na wgranie programu bezpośrednio z komputera. Wystarczy jedynie:
- Podłączyć płytki do zasilania
- Podłączyć piny na pierwszej płytce:
RESETzGND - Podłączyć piny dwóch płytek:
RXzTXorazTXzRX - Wgrać program bezpośrednio na drugą płytkę
Operacje logiczne
Rachunek Zdań jest działem logiki matematycznej badającym związki pomiędzy zdaniami utworzonymi ze zmiennych zdaniowych ża pomocą spójników logicznych. W klasycznym rachunku zdań […] przyjmuje się, że każdemu zdaniu można przypisać jedną z dwóch wartości logicznych - prawdę lub fałsz.
Definiujemy następujące operacje logiczne:
| p | q | NOT p | p AND q | p OR q | p XOR q | p => q | p <=> q |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
Szyfrowanie metodą XOR
Rozważmy następujące zależności dla operacji $\oplus$ XOR:
$A \oplus 0 = A$
$A \oplus A = 0$
$A \oplus B = B \oplus A$
$(A \oplus B) \oplus C = A \oplus (B \oplus C)$
$(B \oplus A) \oplus A = B \oplus 0 = B$
Szyfrowanie metodą XOR uznaje się za jednorazowe, gdyż przy użyciu takiego samego klucza do dwóch wiadmości, dla potencjalnego łamacza szyfrów istnieje tylko jedna permutacja 0, 1, dla których przetłumaczone zostaną jednocześnie dwie wiadomości.
Zauważmy, że (cytując Wikipedię):
If the key is random and is at least as long as the message, the XOR cipher is much more secure than when there is key repetition within a message. When the keystream is generated by a pseudo-random number generator, the result is a stream cipher. With a key that is truly random, the result is a one-time pad, which is unbreakable in theory.
W idealnych warunkach jest to szyfr nie do złamania metodami matematycznymi.
Poniżej znajduje się program do szyfrowania tą metodą. Sprawdź jego działanie z przykładem na Wikipedii
W celu praktycznego zilustrowania napisałem w języku python program szyfrujący, deszyfrujący i podmieniający klucz gotowego szyfru za pomocą operacji XOR. Funkcje programu:
-e (encode)- Szyfrujetekstpodany przez użytkownika za pomocąklucza wygenerowanegoprzez program-d (decode)- Deszyfrujeszyfrpodany przez użytkownika za pomocąkluczapodanego przez użytkownika-s (spoof)- Tworzy nowykluczdlaszyfrupodanego przez użytkownika, uzyskującyżądany wynikpodany przez użytkownika
W przypadkach -d -s zakłada się, że oba podane przez użytkownika parametry są zapisane jako tekst utf-8 bądź grupy 8 bitów oddzielone spacjami oraz ich długość wynosi tyle samo bajtów.
Przykładowe wyjście programu:
encode:
The following program encrypts your text using bitwise XOR operator.
Key is auto-generated on each input
Enter text to xorencrypt (CTRL+D to quit):
hello
msg 01101000 01100101 01101100 01101100 01101111
key 11001001 01100101 10010111 01110110 00100000
cyp 10100001 00000000 11111011 00011010 01001111
decode:
The following program decrypts your text using bitwise XOR operator.
Enter cipher to xordecrypt (CTRL+D to quit):
10100001 00000000 11111011 00011010 01001111
Enter key:
11001001 01100101 10010111 01110110 00100000
raw 10100001 00000000 11111011 00011010 01001111
key 11001001 01100101 10010111 01110110 00100000
msg 01101000 01100101 01101100 01101100 01101111
res hello