Forum: Mikrocontroller und Digitale Elektronik Watchdog + LCD


von Peter (Gast)


Lesenswert?

Guten Abend!

Habe da ein folgendes Problem:

Ich möchte gerne den Reset-Grund zu Test Zwecken auf den LCD-Display 
anzeige.

Beschäftige mich zu Zeit mit dem Watchdog dabei bin ich auf das Register 
MCUCSR gekommen. Wie ich das verstanden habe wird dort der GRund für 
einen Rest gespeichert.

Jetzt mein Vorhaben: Den Grund für den Reset auf einem LCD-Display 
anzuzeigen.

Habe dazu den Watchdog eingerichtet/gestartet. Jetzt tritt aber 
folgendes Problem auf die daten in dem Register(MCUCSR) werden in binär 
gespeichert. diese übergebe ich in eine variable also so 
Reset_Grund=MCUCSR. Nun möchte ich mit dem Befehl sprintf diese binären 
daten auf das display bringen leider gibs bei sprintf keine möglichkeit 
dies in binär zu tun.

Frage wie mach ich das am besten?
oder muss ich sogar den wert vom Register in den EEPRom speichern damit 
der bei reseten nicht verschwindet oder ist das register MCUCSR nicht 
flüchtig nach dem reset?

arbeite mit CodeVIsion

danke für ideen und vorschläge

von Peter (Gast)


Lesenswert?

Hat den keine mit dem Register MCUCSR erfahrung?

wie bekomme ich die daten auf ein lcd-diplay?

wenn das REgister z.b 00001000 ist dann war der Reset durch einen 
Watchdog ausgelöst worden aber wie bring ich diese info auf das diplay?

von Hmm... (Gast)


Lesenswert?

if (MCUCSR&00001000)
{
  //...
}
else if (..)

von Peter (Gast)


Lesenswert?

habe mir das so gedacht leider kommt nur ein wert von 564. was mach ich 
falsch?

if(MCUCSR=0xb00001000)
      {
      lcd_gotoxy(3,0);
      lcd_putsf("WD aktiv");
      }
      else
      {

      lcd_putsf("");
      };

von Hmm... (Gast)


Lesenswert?

Wieso beschreibst du denn in deiner 'if'-Anweisung das Register?

Und ob das mit dem '0xb' so in Ordnung ist? Das wird als Hex-Wert 
interpretiert. Und noch dazu einer, der nicht in das Register passt...

von hans (Gast)


Lesenswert?

Hallo Peter,

ein einfaches = ist eine Zuweisung, der Vergleich ist ==

Im MCUCSR sind es einzelne Bits die den Interrupt anzeigen.
Daher besser auf Bits testen

z.B. if(Reset_grund&0x08){     // Test Watchdog Mega8
               Ausgabe "Watchdog";
                }
else if(Reset_grund&0x04){     // Test BrownOut Mega8
               Ausgabe "BrownOut";
                }
else if(Reset_grund&0x02){     // Test Ext Mega8
               Ausgabe "Ext";
                }

else {     // Power on bleibt übrig Bit0 Mega8
               Ausgabe "Power";
                }

Nach dem Reset und dem sichern von MCUCSR in Reset_grund
MCUCSR leeren! (bei Mega8 Bits mit 0 beschreiben)

Gruß hans

von Peter (Gast)


Lesenswert?

habe das program so:
 leider wird bei auslösen des resets der text "Hardware Reset aktiv" 
nicht angezeiht wo ist der fehler?


Reset_Grund=MCUCSR;

      if(MCUCSR==0x02)
      {
      lcd_gotoxy(0,0);
      lcd_putsf("Hardware Reset aktiv");
      }
      else
      {

      lcd_putsf("kein Reset");
      };

      }

von hans (Gast)


Lesenswert?

Zuerst kommt für jeden Prozessor mal ein Power On sonst läuft er nicht.

Da er normalerweise nachtragend ist merkt er sich das auch!

D.h. Bit0 in MCUCSR ist gesetzt und bleibt gesetzt wenn man das nicht 
ändert. Dann ist der Vergleich ==0x02 immer false!

Bit-Test  (MCUCSR&0x02) ist jedoch True.

gruß hans

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.