Moim problemem jest brak stabilności kodu dla tego mikrokontrolera. Kod skompilowałem w AVR Studio 4 z WinAVR w aktualnej wersji (2010).
Kłopoty objawiają się poprzez skok do początku programu. Nie jest to reset - np. zakłócenia na linii RESET. Analizowałem rejestr statusu MCUSR. Początkowo przyjmuje on wartość 0x01, co znaczyłoby reset od POR. Jest to zrozumiałe. Potem jednak ma on wartość 0x00, co świadczy o braku resetu. Musi to być zatem skok do początku. Oczywiście rejestr MCUSR jest zerowany po odczycie. Myślałem, że to problem nieuchwyconego ISR, ale tylko raz, lub dwa przydarzył się ten problem. W dodatku było to po wcześniejszym dziwacznym skoku do początku, więc siłą rzeczy coś takiego mogło wywołać problemy. Próbowałem też zmniejszyć poziom optymalizacji, ale nawet na O1 jest identycznie. Wyłączyć optymalizacji nie mogę, bo nie zmieszczę kodu.
Jeszcze zabawniejsze jest to, że na innym egzemplarzu mikrokontrolera o identycznym oznaczeniu program zachowuje się inaczej. Tutaj początkowo w MCUSR jest 0x81, co świadczy o resecie z POR i Watch Doga. Potem już tylko 0x80, zatem wynikałoby, że to właśnie Watch Dog wykonuje reset. Co ciekawe FUSE BIT WDTON jest niezaprogramowany w obu układach. Rejestry samego Watch Doga też nie były zmieniane. W tym mikrokontrolerze częstotliwość tych resetów wydaje się być niższa.
Niekiedy też zwyczajnie kod się wiesza nie wiadomo gdzie. Jeszcze nie ustaliłem, gdzie to następuje.
Napięcie zasilania to 3,3 V, częstotliwość taktowania 4 MHz na wewnętrznym oscylatorze RC. Nie ma problemów z zakłóceniami. Nieużywane linie są ustawione jako wyjścia.
Załączam cały kod źródłowy. Mogę przekazać sporo punktów osobie, która rozwiąże ten problem.
Kłopoty objawiają się poprzez skok do początku programu. Nie jest to reset - np. zakłócenia na linii RESET. Analizowałem rejestr statusu MCUSR. Początkowo przyjmuje on wartość 0x01, co znaczyłoby reset od POR. Jest to zrozumiałe. Potem jednak ma on wartość 0x00, co świadczy o braku resetu. Musi to być zatem skok do początku. Oczywiście rejestr MCUSR jest zerowany po odczycie. Myślałem, że to problem nieuchwyconego ISR, ale tylko raz, lub dwa przydarzył się ten problem. W dodatku było to po wcześniejszym dziwacznym skoku do początku, więc siłą rzeczy coś takiego mogło wywołać problemy. Próbowałem też zmniejszyć poziom optymalizacji, ale nawet na O1 jest identycznie. Wyłączyć optymalizacji nie mogę, bo nie zmieszczę kodu.
Jeszcze zabawniejsze jest to, że na innym egzemplarzu mikrokontrolera o identycznym oznaczeniu program zachowuje się inaczej. Tutaj początkowo w MCUSR jest 0x81, co świadczy o resecie z POR i Watch Doga. Potem już tylko 0x80, zatem wynikałoby, że to właśnie Watch Dog wykonuje reset. Co ciekawe FUSE BIT WDTON jest niezaprogramowany w obu układach. Rejestry samego Watch Doga też nie były zmieniane. W tym mikrokontrolerze częstotliwość tych resetów wydaje się być niższa.
Niekiedy też zwyczajnie kod się wiesza nie wiadomo gdzie. Jeszcze nie ustaliłem, gdzie to następuje.
Napięcie zasilania to 3,3 V, częstotliwość taktowania 4 MHz na wewnętrznym oscylatorze RC. Nie ma problemów z zakłóceniami. Nieużywane linie są ustawione jako wyjścia.
Załączam cały kod źródłowy. Mogę przekazać sporo punktów osobie, która rozwiąże ten problem.
Kod: C / C++
