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

[Atmega8][C] Watchdog i silne zakłócenia.

mradowski 14 Maj 2008 13:00 4099 12
  • #1 5139391
    mradowski
    Poziom 14  
    Witam,

    Używam procka w warunkach o dość silnych zakłóceniach elektromagnetycznych i często zdarza się, że procek a właściwie dwa połączone przez i2c zawieszają się. Jeśli procek się zawiesi w wyniku bledów w transmisji wybudza go wdt. Problem w tym, że gdy wdt zadziała raz i procek nawiąże transmisje jest wszystko ok, ale gdy po pierwszym resecie nie zadziała to się wiesza na dobre i nawet ręczny reset nie działa tylko odpięcie zasilania pomaga.
    W czym tkwi przyczyna takiego zachowania?
  • #2 5139453
    elektrofil
    Poziom 17  
    umieść kawałek kodu z petlą gdzie WDT jest zerowany, może pomimo braku transmisji lub jej ponawiania jest on zerowany. ale bez fragmentu kodu to tylko"może"...
  • #4 5139562
    mradowski
    Poziom 14  
    Nie bardzo rozumien co masz na myśli.

    Ja piszę:

    void main()
    {
    wdt_enable(WDTO_1S);
    
      //  a potem w kodzie w pętli:
     while(1)
     {
         ....
         ....
         wdt_reset();
     }
    }
  • #5 5140235
    adamusx
    Poziom 27  
    A moze wiesza sie sama obsługa I2C lub jakes przerwanie, a WATCHDOG jest i tak resetowany w pętli głównej więc nie dochodzi do resetu procesora.
  • #6 5141089
    asembler
    Poziom 32  
    Tam gdzie resetujes Watchdog'a wstaw zerownie któregokolwiek pinu i przekonasz sie czy program faktycznie dochodzi do tego punktu. Oczywscie powinienes do portu podłaczyc diodę LED lub oscyloskop.
  • #7 5141818
    dawid512
    Poziom 32  
    Może oprócz kodu masz problemy związane z PCB np. brak kondensatora 100nF w bezpośredniej bliskości procka, kiepskie odfiltrowanie w zasilaczu, brak pól masy pod prockiem. Jeżeli µc znajduje się w miejscu w którym mogą działać na niego zakłocenia może poprostu zastostujesz ekranowanie. Najpierw pokaż konkretny program.
  • #8 5142143
    fantom
    Poziom 31  
    Sorry za OT ale chyba nie wszyscy z was umieja czytac
    Cytat:

    ale gdy po pierwszym resecie nie zadziała to się wiesza na dobre i nawet ręczny reset nie działa tylko odpięcie zasilania pomaga.


    Jak to sie ma do waszych wszystkich dywagacji ? Z drugiej strony sam przeszukalem manual do Atmega8 i nie potrafie odpowiedziec na to pytanie takze chetnie sie dowiem co sie za tym kryje, choc nie wykluczam mozliwosci ze autor zle nam opisuje problem.

    EDIT:
    Znalazlem cos takiego:

    
    Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup, the datasheet recommends a sequence like the following:
    
     #include <stdint.h>
     #include <avr/wdt.h>
    
    uint8_t mcusr_mirror;
    
    void get_mcusr(void)       __attribute__((naked))       __attribute__((section('.init3')));
     void get_mcusr(void)
     {
       mcusr_mirror = MCUSR;
       MCUSR = 0;
       wdt_disable();
     }
    


    Przyjrzyj sie temu dokladniej. Byc moze najpierw trzeba wylaczyc watchdog a dopiero potem ustawic swoja wartosc bo domyslnie jest 15ms i moze to podowac ciagle resety zanim jeszcze cokolwiek twoj program zacznie robic. Dopiero power-on-reset zmienia ta konfiguracje.
  • #9 5142993
    kamyczek
    Poziom 38  
    Atmega 88 to niezbyt udany mikrokontroler , problemy z uartem , problemy z wdt .Proponuję dobrze poczytać dokumentację (pdf) choć i ta zawiera błędy np w obsłudze uarta ...
  • #10 5145600
    mradowski
    Poziom 14  
    Problem nie występuje na Atmega32 z wykorzystaniem tych samych instrukcji. Czyli po zerwaniu transmisji Atmega32 resetuje się w kółko bez żadnych przycięć.
  • #11 5147996
    GienekS
    Poziom 32  
    cyklonb napisał:
    i nawet ręczny reset nie działa tylko odpięcie zasilania pomaga.
    Właśnie się zastanawiam jak może procesor się zablokować że nawet ręczny reset nie wybudza go, to jest raczej nie możliwe. Może wiesz a się układ który odpowiada po magistrali I2C i należało by go właściwie ponownie zainicjować.
  • #12 5151996
    Konto nie istnieje
    Konto nie istnieje  
  • #13 5611573
    mj_2000
    Poziom 15  
    Miałem ten sam problem. Pół dnia szukałem błędu, myślałem, że to hardware, ale to było bez sensu, bo po dołączeniu zasilania działało, a po resecie watchdoga zawieszka (ciągłe resetowanie).
    Okazało się, że po resecie watchdog nadal działa i to z najmniejszym czasem zadziałania (około 15ms) i nawet jak dawałem w main() wdt_disable() to nie pomagało. A tak lubiłem ten mikroklocek.

    Rozwiązanie: trzeba dać wdt_disable() w sekcji init

    
    void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3")));
    void get_mcusr(void)
    {
          MCUSR = 0;
          wdt_disable();
    }
REKLAMA