Wykrycie rodzaju resetu w AT89S8253

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Wykrycie rodzaju resetu w AT89S8253

Post autor: mr_x » 20 sty 2014, 9:02

Czy jest jakiś sposób na to, aby wykryć, w jaki sposób AT89S8253 był resetowany? Chodzi mi o różnicę w resecie po włączeniu zasilania oraz po zwykłym resecie przez podanie jedynki na wejście RESET. Myślałem o fladze POF w rejestrze PCON, ale zawsze jest ona ustawiana, niezależnie, czy to włączenie zasilania, czy późniejszy reset, czy nawet reset wymuszony działaniem układu watchdog (gdy wymuszony jest impuls na wejściu RESET).

Potrzebne mi jest to w pewnym projekcie, gdzie peryferia do niego podłączone wysyłają pewien kod po włączeniu zasilania, a później już reset mikrokontrolera i tego kodu nie ma. Gdybym potrafił określić rodzaj resetu, sterowałbym odpowiednio programem tak, aby przy zwykłym resecie program nie czekał na kod z dołączonego układu.

Jeśli się nie da, to trudno, ale tak byłoby bardziej "elegancko".

Awatar użytkownika
tom5555
Użytkownik
Posty: 619
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 20 sty 2014, 17:02

Jeżeli jest wolny jakiś pin, a najlepiej wewnętrzny komparator) to ja zrobił bym to w taki sposób:
Równolegle z zasilaniem układu podłączyłbym układ czasowy RC. Po włączeniu zasilania kondensator ładował by się przez rezystor. Wolny pin mikroprocesora sprawdzał by poziom naładowania kondensatora. Po resecie procesor sprawdzał by stan tego pinu. Po włączeniu zasilania kondensator nie zdąży się dostatecznie naładować, procesor wykryje stan niski na nóżce połączonej z układem RC i rozpocznie sprawdzanie kodu wysłanego przez "peryferia". W tym czasie kondensator powinien się w pełni naładować. Jeżeli nastąpi reset procesora, kondensator będzie naładowany, na odpowiednim pinie będzie stan wysoki, a procesor rozpocznie pracę bez odczytywania kodów.

Awatar użytkownika
kayron
Użytkownik
Posty: 2066
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 20 sty 2014, 17:34

Możesz zrobić reset programowo, przez odpowiednią instrukcję, a właściwie przez skok pod odpowiedni adres. Ale to wymaga odpowiednio napisanej procedury startowej.
Reset od WatchDoga można wykryć jak pamiętam ustawia on odpowiedni bit.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 20 sty 2014, 20:41

AT89S8253 nie posiada komparatora, a nie mogę już bardziej rozbudowywać układu, bo mam gotową płytkę i wolę by została jak jest. A co do watchdoga, to tak jest, jak piszesz, kayron, ale gdy nie jest generowany razem z nim sygnał na wejściu RESET, a dla mnie to niezbędne. Reset programowy też za bardzo nie wchodzi w grę, muszę mieć możliwość resetowania przyciskiem.

Tymczasowo poradziłem sobie inaczej. Przez pół sekundy po uruchomieniu programu czekam na kod z urządzenia, gdy go nie otrzymam, wykrywam go wysyłając polecenie odpytania. Gdy i to nie da odpowiedzi, traktuję ten fakt jako brak urządzenia. Mierzyłem stoperem i po włączeniu kod pojawia się po około 400ms, więc zapas pół sekundy wystarcza, a nie jest jednocześnie za długi.

W kolejnej wersji dodam coś podobnego, co opisał tom5555, ale na chwilę obecną modyfikacja hardware nie jest zalecana, jedynie mogę grzebać w kodzie.

Dzięki za podpowiedzi, będę o nich pamiętać.

Awatar użytkownika
kayron
Użytkownik
Posty: 2066
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 20 sty 2014, 22:16

Są specjalizowane układy RESETU, może coś takiego by ci pomogło ?
Przykładowy taki układ:
http://www.tme.eu/pl/details/adm706arz/ ... g-devices/#
Bo są oczywiście różne z różnymi funkcjami, mniej lub bardziej wypasione.
Przypadkiem nawet ten układ co podałem może spełnić twoje wymogi, bo Reset może być generowany, od przycisku, watchdoga, lub wykrycia spadku napięcia na linii zasilającej.
Natomiast żaden, znany mi mikroprocesor nie potrafi na swojej linii RESET, generować sprzętowo tego sygnału. Do tego trzeba poświęcić jakiś PIN I/O i robić to programowo.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 20 sty 2014, 23:19

Jak nie? Tu masz fragment z datasheet:

DISRTO - Enable/disable the WDT-driven Reset Out (WDT drives the RST pin). When DISRTO = 0, the RST pin is driven high after WDT times out and the entire board is reset. When DISRTO = 1, the RST pin remains only as an input and the WDT resets only the microcontroller internally after WDT times out.

Sprawdzałem też stan linii RESET i faktycznie po odpowiednim skonfigurowaniu watchdoga po jego zadziałaniu pojawia się krótki dodatni impuls.

r-mik
-
Posty: 48
Rejestracja: 10 wrz 2011, 6:36
Lokalizacja: Warszawa

Post autor: r-mik » 21 sty 2014, 9:35

W przyszłości pomyśl o wymianie na AVR. Są odpowiedniki pin w pin. W AVR masz rejestr w którym jest informacja o przyczynie resetu.

Awatar użytkownika
kayron
Użytkownik
Posty: 2066
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 21 sty 2014, 20:50

O.. widać dużo już zapomniałem o 51, ale cóż nie widziałem tego proca na oczy już lata.

Możesz spróbować jeszcze poeksperymentować z Bitem WRTINH w rejestrze EECON.
Ten bit jest powiązany z układem Power-up and Brown-out Detection Sequence. czyli wykrywa niejako reset w wyniku zaniku zasilania i jego powrotu.
Może odpowiednio napisana procedura na samym początku programu, będzie na tej podstawie, oszacować źródło Resetu.

m75
-
Posty: 50
Rejestracja: 21 sie 2012, 15:45
Lokalizacja: Olkusz

Post autor: m75 » 22 sty 2014, 10:01

Witam.
W niektórych systemach opartych na Zilogu Z180 po restarcie urządzenia szukało się ciągu znaków w pamięci RAM i na tej podstawie uznawano, że urządzenie wł. pierwszy raz, RAM jest pusty i wymaga załadowania programu itp.
Pozdrawiam.

ODPOWIEDZ