Przyczyn może być co najmniej kilka, a ja się skupie na tych w sumie prostych, ale niekoniecznie oczywistych.
1. Brak rezystora 10k przy pinie MCLR. Fundujemy sobie resety układu, bo napięcie na tym pinie radośnie sobie pływa. Pin MCLR można wyłączyć w bitach konfiguracyjnych, ale od tego momentu nie będzie można programować układu niskonapięciowym programatorem.
2. Brak filtracji napięcia zasilającego układ. Przede wszystkim należy zapoznać się z datasheet wykorzystywanego przez nas układu. Dowiemy się, czy producent przyszykował nam jakies niespodzianki typu filtracja napięcia Vcore itp... Poza tym obowiązują ogólne zasady projektowania obwodów. Kondensatory filtrujące jak najbliżej pinów układu, jeśli producent zaleca użycie dławików, to mają być dławiki... Tutaj działania są silnie uzależnione od producenta i typu układu.
3. Włączony watchdog. Timer ten można odpowiednio skonfigurować lub wyłączyć w bitach konfiguracyjnych lub zwyczajnie obsłużyć przy pomocy CLRWDT(); lub ClrWdt();
4. Aktywna (w bitach konfiguracyjnych) opcja programowania niskonapięciowego. Tutaj odniosę się do konkretnego układu, a mianowicie PIC18F2550/4550. jeden z pinów układu oznaczony jest literami PGM. Pin ten służy do wymuszenia wejścia w tryb programowania niskonapięciowego. Wymuszenie następuje poprzez podanie stanu wysokiego na ten pin. Niestety łatwo to przeoczyć i kłopot murowany
Co zrobić?
a. wyłączyć LVP w bitach konfiguracyjnych.
b. jeśli potrzebujemy LVP, należy sprowadzić jego pin do stanu niskiego przy pomocy rezystora. W programie należy zadbać, by pin ten był ustawiony jako wyjście (to wyłączy ewentualny pull up), a wyjściowy stan tego pinu ma być stanem niskim.
5. Błędnie ustawiony priorytet źródła przerwania. No cóż... Należy po kolei prześledzić, które z naszych przerwań mają priorytet niski, a które wysoki, a następnie zerknąć obsługę tychże przerwań
Pozdrawiam!
