Zmienne A i B (zmiennym globalnym nadawaj dłuższe nazwy, bo ArduinoIDE to szmelc, który nie potrafi tego co KEIL czy Atolic i w ogóle Arduino, nie powinno być nazywane IDE tak jak i Windows systemem. Szukanie krótkich nazw zmiennych to katastrofa. Spróbuj wyszukać przez CTFL+F wystąpienia zmiennej "A".) używasz zarówno w przerwaniu jak i programie głównym. Nie poinformowałeś o tym kompilatora.
Deklarujesz zmienne 16 bit
a wystarczyło by 8-bit. AVR jest za szybki? Nie sądzę.
W ARM miałoby to sens. Operacje na zmiennych 32-bit wykonują się szybciej niż na 8-bit. W ARM typ int jest 32-bit a nie jak w przestarzałych AVR czy Intel286, 386 16-bit. W takiej sytuacji bezpieczniej deklarować taką zmienną jako int_fast8_t. Zależne od CPU zostanie użyty odpowiednia długość słowa, np w 64-bitowym CPU będą to 64-bity, ARM - 32-bit, AVR - 8-bit, MC68000/08/10 8-bit (68008 na pewno 8-bit, 00/10 może i 16-bit) a pewnie w MC68020/30/40/60 16 lub 32-bit. a może tylko 8-bit,
Co do
Serial.println działa jak delay.
AVR to nie ARM czy PC. Musisz nauczyć się oszczędzać RAM. Deklarujesz
zmienne 16-bit, 40*4 elementów co pochłania 320bajtów RAM. Z pobieżnej analizy kodu wnioskuję, że wystarczy 8-bit, co pochłonie tylko 160bajtów. Dalej, po co aż 4 elementy na kierunki przód, tył, lewo, prawo? Użyłeś wykluczeń
co oznacza, że analizowany jest jeden z czterech elementów. Nie lepiej w jednym elemencie zapisać informację o wartości a w drugim o kierunku? Zużycie RAM zmniejszy się dwukrotnie. Zamiast 160bajtów po zaoszczędzeniu na deklaracji 8-bit a nie 16-bit zużyjesz 80 bajtów RAM. 4 razy mniej RAM! Nie analizowałem jakie wartości zapisujesz do tablicy ale może wystarczy 6 bitów, w takiej sytuacji, na pozostałych 2 kodujesz kierunek. Zużyjesz tylko 40 bajtów RAM. 8 razy mniej niż pierwotnie!
Napięcie baterii odczytujesz bez uśredniania. jednorazowy skok napięcia i wszystko się zatrzyma. Tak ma być? Raczej nie!
PS
Generalnie, Arduinowcy, nagminnie używają typów 16-bit tam gdzie wystarczy 8. Dlaczego nie wiem?
W deklaracjach PIO, używają zmiennych 16-bit. Po co skoro w 99% przypadkach mogą to być 8-bit stałe w FLASH a jeszcze lepiej, tak jak zrobiłeś, definicje. To chyba pierwszy kod na Arduino, w którym deklaracje PIO zrobiono z głową!
Deklarujesz zmienne 16 bit
Kod:
for (int i = 39; i >= 0; i--)
W ARM miałoby to sens. Operacje na zmiennych 32-bit wykonują się szybciej niż na 8-bit. W ARM typ int jest 32-bit a nie jak w przestarzałych AVR czy Intel286, 386 16-bit. W takiej sytuacji bezpieczniej deklarować taką zmienną jako int_fast8_t. Zależne od CPU zostanie użyty odpowiednia długość słowa, np w 64-bitowym CPU będą to 64-bity, ARM - 32-bit, AVR - 8-bit, MC68000/08/10 8-bit (68008 na pewno 8-bit, 00/10 może i 16-bit) a pewnie w MC68020/30/40/60 16 lub 32-bit. a może tylko 8-bit,
Co do
Kod:
Serial.println(A); // bez tego wiersza program nie opuszcza pętli while. (???)
AVR to nie ARM czy PC. Musisz nauczyć się oszczędzać RAM. Deklarujesz
Kod:
int macierz [40][4]
Kod:
else if (macierz[i][1] > 0) { // do przodu
Napięcie baterii odczytujesz bez uśredniania. jednorazowy skok napięcia i wszystko się zatrzyma. Tak ma być? Raczej nie!
PS
Generalnie, Arduinowcy, nagminnie używają typów 16-bit tam gdzie wystarczy 8. Dlaczego nie wiem?
W deklaracjach PIO, używają zmiennych 16-bit. Po co skoro w 99% przypadkach mogą to być 8-bit stałe w FLASH a jeszcze lepiej, tak jak zrobiłeś, definicje. To chyba pierwszy kod na Arduino, w którym deklaracje PIO zrobiono z głową!