logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AT89C4051 resetuje się po kilku minutach działania z Timer0 i DS1820

john_t 11 Sty 2005 20:31 1380 6
REKLAMA
  • #1 1129870
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Napisałem program w Bascom 8051 zawiera zegar w oparciu o Timer0, sekwencja włączania i wyłączania o nastawionym czasie oraz procedurka obsługi DS1820.
    1-Dallas działa poprawnie tylko z podłączonym dzsilaniem 5V (podłączenie 3 przewodowe), przy 2 przewodowym wyświetla 85st.C i "nie żyje". - nie wiem dlaczego???
    2-A teraz Hit. Układ działa przez parę minut po czym resetuje się sam ?!
    Wykluczyłem zakłócenia, i procka (kilka z nich działa tak samo).
    Wykluczyłem programator (porównanie plików z procka i źródła pozytywnie), co jest grane??? Może kogoś spotkał podobny problem???
    Podejrzewam błąd "gramatyczny" w programie.
    Proszę o pomoc.
    PS.
    Cały program jest dość obszerny ponad 9kB w .bas i 4000kB w bin
    dlatego nie załączam.
  • REKLAMA
  • #2 1130676
    Press
    Poziom 24  
    Posty: 566
    Pomógł: 69
    Ocena: 40
    hehe dobre :D podejżewam błąd w programie, ale źródła nie załączam :D
    No to zgaduję, bład masz w 43 lini programu :P
    Co ty, wróżek tu szukasz?
    A tak jeszcze zgadując, to RESET przypadkiem nie "wisi w powietrzu" w czasie pracy procka??
  • REKLAMA
  • #3 1130944
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Reset podpięty do Vcc przez 1µF, ale to chyba nie to gdyż na tej samej płytce testowej inne programy chodzą bez problemu i nawet sztuczne zakłócanie np: lutownicą transformatorową z odl. 10cm nie zakłóca układu.
    Wstawienie 100nF pomiędzy Vcc i GND nic nie pomogło, zasilanie całego układu z baterii też nie.
    Reset powstaje samorzutnie po 2 do 8 minut po włączeniu!!!
    Dlaczego podczas testu w bascomie program działa a w układzie testowym są takie jaja???
  • REKLAMA
  • #4 1130974
    Press
    Poziom 24  
    Posty: 566
    Pomógł: 69
    Ocena: 40
    Reset poza kondkiem do Vcc warto jeszcze sprowadzić do masy rezystorem.
    A to że program działa w symulatorze, to nie bierz za gwarancję jego poprawności. Bascom to młody program i ma jeszcze tonę błędów.
  • REKLAMA
  • #5 1131102
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Dzięki za zainteresowanie. Coraz bardziej jestem przekonany iż problem tkwi w oprogramowaniu. Jest to do wykrycia, po prostu będę uruchamiał program segmentowo, tylko że to mozolna praca...
    Podobnie jak Ty założyłem że bascom może posiadać błędy i zważywszy na dość skomplikowany program (mam w nim 5-cio poziomowe CALL), kontrolowałem wsk. stosu (nie przekracza się pływa opmiędzy 0...122).
    Ale nic to , widzę że czeka mnie mozolna praca "badawcza", jak rozwiążę problem to go opiszę.
  • #6 1136847
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Pozmieniałem trochę program, jest lepiej a nawet całkiem dobrze dopóki nie ruszam przycisków obsługiwanych w pętli DO <> LOOP.
    wygląda to mniej więcej tak:

    S1 Alias P3.4
    S2 Alias P3.5
    S3 Alias P3.7

    Do
    If S1=0 Then Call Dyspl_tempr
    If S2=0 Then Call inny_podprogram
    If S3=0 Then Call inny_podprogram
    ...
    inne rzeczy
    ...
    Loop

    Sub Dyspl_tempr
    Call Odcz_Ds1820
    'Tu obsługa LCD
    End Sub

    Sub Odcz_Ds1820
    'Tu procedurka obsługi Ds1820
    End Sub

    Timer0_init 'Procedurka obsługi przerwania Timer0
    ... 'Przerwanie typu Mode=1; Gate=Internal
    ... 'Występuje ok. 15razy na sekundę
    Return

    Efekt jest taki gdy przytrzymam przycisk np S1 przez parę minut,
    procek resetuje się, pętla Do <> Loop działa, a timer0 przestaje działać.
    Czas od naciśnięcia S1 do resetu jest różny, od kilkudziesięciu sekund do 8 minut.
    Może Ktoś ma jakieś sugestie ?????
    John_t

    PS.
    Zgodnie z zaleceniem "Pressa" Oprócz 1&micro;F do Vcc na resecie dałem 10kΩ do masy - nic się nie zmieniło...
  • #7 1138457
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Obiecałem że jak dojdę do sedna problemu to napiszę i....
    STAŁO SIĘ
    Problem tkwił w zbyt czasożernej sekwencji w obsłudze przerwania
    2 linie jn.

    If Tempr_set > Tempr_real And Out_flag < 255 Then Incr Out_flag
    If Tempr_set < Tempr_real And Out_flag > 240 Then Decr Out_flag

    zajmują 2 x 0,6ms a cała reszta przerwania 100x mniej !!!
    (dla 11.059 MHz)
    Przewaliłem to do pętli głównej i problem z głowy zero resetów!!!

    To tyle

    pozdro dla tych co to czytali.

Podsumowanie tematu

✨ Program napisany w Bascom 8051 dla mikrokontrolera AT89C4051 wykorzystuje Timer0 do zegara oraz obsługę czujnika temperatury DS1820. Czujnik DS1820 działa poprawnie przy zasilaniu 5V w konfiguracji 3-przewodowej, natomiast w 2-przewodowej wyświetla stałą wartość 85°C, co wskazuje na problem z komunikacją. Układ resetuje się samoczynnie po kilku minutach pracy, mimo wykluczenia zakłóceń elektromagnetycznych i problemów sprzętowych, w tym stabilności zasilania i poprawności programatora. Problem występuje podczas długotrwałego przytrzymania przycisków obsługiwanych w pętli DO...LOOP, co powoduje zatrzymanie działania Timer0 i reset mikrokontrolera. Przyczyną okazała się zbyt czasochłonna obsługa przerwania Timer0, gdzie dwie linie kodu wykonujące porównania i inkrementacje/dekrementacje zmiennej zajmowały około 1,2 ms, co jest zbyt długim czasem dla przerwania przy taktowaniu 11.059 MHz. Przeniesienie tej sekwencji do pętli głównej programu wyeliminowało problem resetów i poprawiło stabilność działania układu.
REKLAMA