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

[Atmega8] [Atmega8][C] Zawieszanie się procesora przy zakłóceniach i2c, watchdog nie pomaga

mradowski 14 Maj 2008 13:00 4225 12
REKLAMA
  • #1 5139391
    mradowski
    Poziom 14  
    Posty: 176
    Pomógł: 4
    Ocena: 21
    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?
  • REKLAMA
  • #2 5139453
    elektrofil
    Poziom 18  
    Posty: 509
    Pomógł: 32
    Ocena: 46
    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"...
  • REKLAMA
  • #4 5139562
    mradowski
    Poziom 14  
    Posty: 176
    Pomógł: 4
    Ocena: 21
    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  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    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  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    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  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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.
  • REKLAMA
  • #8 5142143
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    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.
  • REKLAMA
  • #9 5142993
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    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  
    Posty: 176
    Pomógł: 4
    Ocena: 21
    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  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    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  
    Posty: 155
    Pomógł: 17
    Ocena: 7
    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();
    }

Podsumowanie tematu

LABEL_AI_GENERATED
W warunkach silnych zakłóceń elektromagnetycznych procesory Atmega8 połączone magistralą I2C ulegają zawieszeniu. Watchdog (WDT) jest włączony i resetuje procesor po błędach transmisji, jednak po pierwszym resecie, jeśli watchdog nie zadziała ponownie, procesor zawiesza się na stałe i jedynie odłączenie zasilania przywraca działanie. Problem może wynikać z tego, że watchdog pozostaje aktywny po resecie systemowym z najszybszym prescalerem (~15 ms), co wymaga jego wyłączenia na wczesnym etapie startu programu (np. w sekcji init). Dodatkowo sugerowano sprawdzenie, czy w pętli głównej watchdog jest faktycznie resetowany, a także zwrócenie uwagi na obsługę przerwań i I2C, które mogą się zawieszać bez wywołania resetu watchdog. Wskazano również na możliwe problemy sprzętowe, takie jak brak kondensatora 100nF blisko procesora, słabe filtrowanie zasilania czy brak odpowiedniego ekranowania. Porównanie z Atmega32 wykazało, że tam problem nie występuje, co sugeruje specyfikę Atmegi8 i jej watchdog. Rozwiązaniem jest implementacja funkcji wyłączającej watchdog w sekcji inicjalizacji, np. poprzez funkcję oznaczoną atrybutem naked i umieszczoną w sekcji .init3, która czyści rejestr MCUSR i wyłącza watchdog przed startem main().
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA