- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Watchdog-Timer Mega88

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101

    Watchdog-Timer Mega88

    Anzeige

    Powerstation Test
    Hi!

    Versuche grade den Watchdogtimer zum Laufen zu bringen. Klappt aber noch nicht so ganz...
    Hab zum Ausprobieren ein ganz einfaches Testprogramm geschrieben.
    Watchdog Initialisierung, in der Hauptschleife "Hello World" ans Terminal senden (dort will ich später Delay einbauen, um einen System Reset vom Watchdog zu erzwingen) und dann noch ein Check ob Senderoutine korrekt ausgeführt wurde (wenn dieser OK war, gibts nen Watchdog Reset)
    Problem ist, das nie ein "Hello World" am Terminal erscheint... sondern nur:
    4
    _4
    __4
    ___4
    usw. (die _ sollen Leerzeichen darstellen... Forum scheint das nicht zu checken)
    Am Software UART kanns aber nicht liegen, da bin ich mir 100% sicher

    Code:
    #include <iom88.h>
    #include <ina90.h>
    #include <string.h>
    #include "sw_uart.h"
    
    void watchdog_init(void);
    void sende_routine(void);
    void health_check(void);
    
    volatile unsigned char Flag;
    #define SENDEROUTINE_M_OK   1
    
    __task void main(void)
    {
      watchdog_init();
    
      __enable_interrupt();
    
      __watchdog_reset();   // Reset Watchdog Timer und ab in die Hauptschleife
    
      while(1)
      {
        sende_routine();    // Hallo Welt senden (mit versch. Delays ausprobieren -> System Reset funktioniert?)
    
        health_check();     // Am Ende der Hauptschleife prüfen, ob sende_routine() ordnungsgemäß ausgeführt
      }
    }
    
    
    void watchdog_init(void)
    {
      MCUSR = 0;  // Clear all flags previously set.
      Flag = 0;
    
      /* Setup Watchdog */
      WDTCSR |= (1<<WDCE);   // Watchdog Change Enable setzen
    
      WDTCSR |= (1<<WDE);    // Watchdog System Reset Mode einstellen
    
      WDTCSR |= (1<<WDP3);   // Timeout auf 4.0 Sekunden setzen
    
      sw_uart_init();
    }
    
    
    void sende_routine(void)
    {
      char	bTxt[24] = "\r\nHello, World\r\n";
      unsigned char bIx;
      unsigned char bLn;
    
      bLn = strlen(bTxt);
    
      for (bIx = 0;bIx < bLn; bIx++)
      {
        send_one_byte(bTxt[bIx]);
    
        // hier später delay um System Reset zu simulieren....
      }
    
      Flag |= (1<<SENDEROUTINE_M_OK);   // Routine korrekt ausgeführt
    }
    
    
    void health_check(void)
    {
      if(Flag & (1<<SENDEROUTINE_M_OK)) // alles ok ?
      {
        Flag &=~ (1<<SENDEROUTINE_M_OK);
    
        __watchdog_reset();   // dann Reset Watchdog
      }
    }

    Weis nicht woran das liegt..

    Gruß
    schamp

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hallo, Schampolino !
    Ich mißtraue den Griechen, auch wenn sie Geschenke bringen:
    void sende_routine(void)
    {
    char bTxt[24] = "\r\nHello, World\r\n";
    bau das mal um auf
    static char bTxt[24] = "\r\nHello, World\r\n";
    void sende_routine(void)
    {
    ....
    Er muß sonst bei jeder Senderoutine den Fixen Text aus dem Flash-Mem in den SRAM verschieben. Und wenn das irgendwie nicht hinhaut, zeigt er ja irgendwelche grauslichen Dinge her (und der strlen ist dann auch hinüber)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Hab ich jetz gleich ausprobiert.
    Mag irgendwie immer noch net. Die Initialisierung vom WD sollte eigentlich stimmen.
    Macht der WD vielleicht schon ständig Resets und der Mega88 kommt net dazu den "Hello World"-String zu senden??
    Wo kommt dann aber die 4 im Terminal her und eigentlich ist das Timeout ja auf 4 Sekunden gestellt....

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Hab grad mit PORTD ^= (1<<PORTD5) und Oszi getestet wie weit der uC im Prog kommt...
    In die for-Schleife (sende_routine) geht er noch, aber das SENDEROUTINE_M_OK Flag wird dann nimma gesetzt...

    edit: die initialisierungsroutine wird auch ständig gestartet.. also gibts ständig nen reset..

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Aus dem Bauch heraus würd ich das auch sagen. Mir kommen 4 sek. seltsam lang vor. Bist du sicher wegen der Zeiteinstellung ? (Ich mag jetzt nicht nachlesen)
    Immerhin, scheint ja, als würde er <CR><LF> ja noch rausbringen. Aber schon die blanks sind etwas seltsam. Vielleicht derklatscht ihn der WD mitten im Senden und das blank ist ein Empfangs-Wtlbrnft ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Was isn ein Empfangs-Wtlbrnft ?

    Die 4.0 Sec stimmen schon, ausm Datenblatt:

    WDP3 WDP2 WDP1 WDP0
    1 0 0 0

    Number of WDT Oscillator / Cycles
    512K (52428 cycles

    Typical Time-out at VCC = 5.0V
    4.0 s

    hm geht net gscheid zum reinkopiern hier... aber ma verstehts scho oda?

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von schamp
    Was isn ein ...-Wtlbrnft
    Es hat mal einen bayerischen Komiker gegeben, Karl Valentin
    Zitat Zitat von Karl Valentin
    "Valentin mit "F" und nicht mit "W", man sagt ja auch nicht Wogel-Wau
    Der hat den Ausdruck gebracht, das ist einfach irgendein unleserliches Zeugs

    Egal.

    Also irgendwie wird das Senden massakriert.
    Tu' mal alle Extra-Würste auskommentieren und schau, ob dann auch "Hello" kommt.
    Was auch mit dem WD sein mag, das senden muß ja schließlich zumindest richtig anfangen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Jo Karl Valentin kenn ich natürlich!! Komm aus der Nähe von MUC
    Bloß den Ausdruck "Wtlbrnft" kannte ich noch nicht, wieder was dazugelernt...

    Hab ma alles Extrazeug rausgeschmissen. Empfangen beim SW UART war scho auskommentiert. Der kloane uC schaffts einfach net bis zum Ende, kommen immer noch die blanks und 4er..

    Könnte noch schauen, wie weit er in den Software UART Routinen kommt. Aber is halt echt blöd, 4.0 Sec sind eingestellt und die würd er ja niemals für nen Hello World brauchen.... da müßt ich ja jetzt dann alle paar Befehle nen WD Reset reinhaun

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Und wenn man sich mal blöd stellt ?
    send_one_byte('\r');
    send_one_byte('\n');
    send_one_byte('H');
    send_one_byte('e');
    send_one_byte('l');
    send_one_byte('l');
    .....
    Sowas ist doch schon gegangen, grad das senden ?

    Taktfrequenz ? (Oszi-einstellungen ?)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Wenn ichs so ausprobier schafft er genau 2 Zeichen,... dann is Sense

    edit:
    SW UART allein funktioniert einwandfrei (auch oszieinstellungen stimmen), Irgendwas passt bei dem Watchdog nicht...
    Hab die Initialisierung jetzt wie im Datenblatt (die Funktion heisst bei denen void WDT_Prescaler_Change(void))
    Hilft aber trotzdem nix...

    Code:
    void watchdog_init(void)
    {
      __disable_interrupt();
    
      MCUSR = 0;  // Alle vorher gesetzten Flags clearen
      Flag = 0;
    
      sw_uart_init();
    
      WDTCSR |= (1<<WDIF);  // Clear WD Interrupt Flag
    
      __watchdog_reset();
    
      /* Setup Watchdog, bzw. Start timed sequence (wie im Datenblatt) */
      WDTCSR |= (1<<WDCE) | (1<<WDE);   // Watchdog Change Enable setzen
    
    
      /* Set new prescaler(time-out) value (siehe Datenblatt) */
      WDTCSR |= (1<<WDE) | (1<<WDP3);   // Timeout auf 4.0 Sekunden setzen
    
      __enable_interrupt();
    
      //PORTD &=~ (1<<PORTD5);
    }
    Muss man den WD doch irgendwie anders initialisieren ??
    Weis echt nich mehr weiter..

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress