Cześć,
sytuacja jest dla mnie trochę dziwna, a nie mam za dużego doświadczenia z AVRami. Dlatego proszę o zerknięcie, bo może da się wyciągnąć jakieś sensowne wnioski.
Próbuję zaadoptować przykład 26 (Simple test) z Greenbooka, aby sprawdzić połączenie dwóch modułów RFM73.
Posiadam dwie Atmegi328P (DIP28) na stykówce.
1. Obie tak samo podpięte do zasilania i do modułów RFM73.
2. Obie pracują na wewnętrznym oscylatorze 8MHz (fusy: H:0xD9 L:0xE2 E:0x07 - czyli z fabrycznego ustawienia zmienione jest tylko CKDIV8).
3. Moje zmiany biblioteki w rfm7x.h:
- używam nóżek od 15 do 19
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i nóżki nr 4
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
4. Moje zmiany biblioteki w rfm7x.c:
- w tym mikrokontrolerze inaczej inicjalizuje się przerwania i dodatkowo na PD2 jest INT0, więc zmieniam
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
5. Moje zmiany w main.c:
- mam leda podpiętego do innego pinu
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- timer inaczej inicjalizowany w tej Atmedze:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- inna też nazwa wektora przerwań:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
PROBLEM:
Po podłączeniu zasilania widać, że oba zestawy przechodzą pomyślnie funkcję 'is_rfm7x_connected()' o czym dają znać diody. Jednak jedna z tych Atmeg chwilę po wejściu do głównej pętli while(1) resetuje się. Widzę po tym, że znowu zaczyna mrugać diodka informująca o tym, że jest poprawne połączenie (is_rfm7x_connected() zwraca 1).
Wprowadziłem na początku pętli while(1) pętelkę for z trochę innym mruganiem, żeby odróżnić od tego informującego o poprawnym połączeniu. W ten sposób widzę, że program nawet nie dochodzi na tym jednym procku do włączenia zdarzenia odbiorczego:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
bo już w trakcie tego mrugania diodką powraca do wykonywania funkcji main() od początku.
Próbowałem szukać przyczyny i jedyne co to zauważyłem, że jak odłączam pin IRQ modułu RFM73 od pinu PD2 Atmegi to problem znika. A później zauważyłem też, że nawet gdy nie ma zasilania 3V3 na nóżce VDD modułu to i tak następuje reset Atmegi, gdy te piny przerwania są połączone. Tylko ich rozłączenie pomaga.
Oczywiście druga Atmega z tym samym programem i tak samo podpięta zachowuje się poprawnie.
Pomożecie?