Wprowadzam właśnie niewielkie zmiany do softu w jednym z moich projektów. Jedno z usprawnień umożliwia zapisywanie konfiguracji (m.in numer IP) w pamięci EEPROM i przywracanie ustawień fabrycznych z flasha. Aby dało się to robić wygodnie, potrzebuję sposobu zdalnego resetowania. Skorzystałem z popularnego sposobu - watchdog ustawiony na najkrótszy czas i pętla nieskończona.
Niestety, coś nie działa tak, jak powinno. ATmega najwyraźniej się resetuje, ale ENC28J60 nie chce działać poprawnie.
Najpierw zaraz po resecie dioda połączenia na gniazdku RJ45 (ta, która powinna świecić cały czas po włożeniu kabla Ethernetowego) zaczęła szybko migać. Oczywiście urządzenie nie odpowiadało na pakiety UDP. Dodanie instrukcji opóźnienia na początku programu zlikwidowało miganie, ale nie przywróciło łączności.
Próbowałem też resetować ENC28J60 w przypadku wykrycia resetu przez watchdoga. Próbowałem rozwiązania zarówno z resetem przez stan niski na odpowiednim pinie, jak również przez SPI. Pomogło tyle, że układ najwyraźniej "jakoś" się zainicjował, gdyż migała zielona dioda w odpowiedzi na jakieś pakiety z sieci. Niestety ciągle nie przychodziły odpowiedzi. Co ciekawe ta instrukcja blokowała układ cały czas, bez względu na to czy był resetowany przez WD, czy przez odłączenie zasilania, chociaż reset wykonywałem wewnątrz instrukcji sprawdzajacej stan pinu odpowiadającego za eset watchdog wewnątrz MCUSR.
Ktoś wie co może być powodem takiego dziwnego zachowania?
Nie uśmiecha mi się odpinanie urządzenia od prądu po każdej zmianie ustawień. Poza tym można podejrzewać, że tak samo układ zachowania się po normalnym restarcie przez watchdog. A przecież nie o to chodzi - watchdog ma chronić przez zawieszeniami, a nie zawieszać układ. ;)