Watchdog

Gast #27362
Lesenswert?

Hallo
Ich habe schon im Tutorial uä Seiten durchsucht und komme nicht klar. 
Ich benutze Codevision ein Mega163 und möchte doch nur mein Watchdog 
Timer aktivieren.Hab auch schon einige Beispiele ausprobiert aber komme 
nicht zum Zuge.
Hat noch jemand ein guten Tip auf Lager?
mfg Mario
Gast #27366
Lesenswert?

Hallo
Bin leider erst jetzt dazu gekommen eure Tips zu lesen. Ich habe das 
WDTCR Register mit WDTCR=0x08 initialisiert.Soll  OSC/16 sein. Ich weiß 
meine ganzen Versuche schon alle nicht mehr. Hab´s auch mit einer 
asm-einbindung versucht. Ich habe eine ganz einfache while Schleife wo 
portb (LED) blinkt. Sollte das Programm nicht neu starten wenn der 
Watchdog nicht resettet wird?
Gruß Mario
Gast #27368
Lesenswert?

Hallo Mario

Hast du vielleicht einen Denkfehler in deinen Überlegungen. So wie du 
schreibst, hast du nur eine Schleife, wo eine LED blinkt. Wenn der WDT 
nicht zurück gesetzt wird, startet das Porgramm neu und ist doch wieder 
in der Schleife. Das geht so schnell, das merkst du gar nicht, wenn er 
neu startet. Bau vor der Schleife doch mal eine Tastenabfrage ein, damit 
deine LED nur blinken kann, wenn die Taste einmal gedrückt wurde. Oder 
eine andere LED, die vor deiner Schleife an geht und nach 2 Sekunden 
wieder ausgeht, damit du sehen kannst ob er neu startet oder nicht.

Nur so als Anregung.

MFG
Dieter
Gast #27372
Lesenswert?

Hallo Dieter
Es klappt leider immer noch nicht.Den Code benutze ich jetzt nur zum 
probieren des WDT. (nicht lachen :-))

WDTCR=0x0F;
a=MCUSR;
PORTB=255;
PORTB.0=0;
delay_ms(3000);
while (1)
      {
      if(a>=8)#asm ("rjmp 0")
      PORTB=0;
      delay_ms(50);
      PORTB=255;
      delay_ms(50);
      };


Die Sache mit dem MCUSR war noch ein Versuch ---> der sicherlich voll 
daneben war
Gast #27373
Lesenswert?

es ist seltsam....
nehme ich die delay_ms(50) raus funktioniert es.
Den Test mit den LED´s hab ich mal abgebrochen.Das eigentliche Prog 
sieht so aus (ausschnitt):

i=0;j=0;
 while(j!=2)
  {
   if(rx_buffer[i]==13)j++;
    i++;
  }

Ich möchte damit in der Zeichenkette "rx_buffer" das zweite 
Enter-zeichen suchen. Haut auch alles hin. Aber wenn keins da ist, 
wollte ich den watchdog benutzen.Der möchte aber nicht.
gruß Mario
Gast #27374
Lesenswert?

Hallo Mario

Schaltest du in der delay Routine vielleicht die Interrupts aus. Weiß 
zwar imMoment nicht genau, ob die braucht für den WDT. Aber von der 
Logik her, dürfe dein Programm gar nicht bis zu der Schleife laufen. Bei 
WDTCR=0x0F; kommt ja bei 5 Volt ca. alle 1,9 s ein Neustart. Bei deinem 
Delay am Anfang von 3000 ms würde ja schon ein Neustart kommen, d.h. die 
Schleife würde er nie erreichen.

Oder sehe ich das so falsch ??

MFG
Dieter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren