mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 Watchdog disable


Autor: Florian Sc (rambo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe schon gesucht, aber nichts gefunden..

Kann mir jmd kurz schreiben, wie ich beim Atmega8 mit internem Oszi die 
Fuses setzen muss und welche C Macros den Watchdog deaktivieren?

WDTCR = 0x1F;
WDTCR = 0x07;
und
wdt_disable();
gehen nicht.

Fuses:
hfuse: 0xD9
lfuse: 0x24

Danke schonmal!

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Sc schrieb:
> Habe schon gesucht, aber nichts gefunden..

Quatsch mit Soße... Liest Du kein Datenblatt?

> Kann mir jmd kurz schreiben, wie ich beim Atmega8 mit internem Oszi die
> Fuses setzen muss und welche C Macros den Watchdog deaktivieren?

Warum deaktivieren? Hast du den Watchdog denn vorher in Deinem Programm 
aktiviert?

Wie kommst du zu der Erkenntnis, dass der Watchdog läuft? Regelmäßiger 
Neustart des Programms? Dies könnte auch durch einen auftretenden 
Interrupt ausgelöst werden, für den Du keinen Interrupthandler 
geschrieben hast.

Autor: Florian Sc (rambo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss in die Programmschleife cli(); einfügen, sonst läuft es nicht - 
daher denke ich der Watchdog ist es..

Autor: retreti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atmega8 hat afaik keinen watchdog interrupt.

der watchdog wird immer aufgerufen egal ob mit oder ohne cli und sei

ich denke du hast deinen stack nicht/fehlerhaft initialisiert. sind alle 
interruptvektoren richtig drin?

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Sc schrieb:
> Ich muss in die Programmschleife cli(); einfügen, sonst läuft es nicht -

Häää? Wie bitte?

Lass mal die Hose runter und poste deinen Code als Anhang...

> daher denke ich der Watchdog ist es..

Guuuute Kombinationsgabe....   ;)

Autor: Florian Sc (rambo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es ist nur ein einfaches Blinken.. siehe Anhang.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
retreti schrieb:
> atmega8 hat afaik keinen watchdog interrupt.

Den hat KEIN AVR. Der Watchdog, sofern er denn überhaupt einmal 
gestartet wurde, löst im Falle des nicht rechtzeitigen Zurücksetzens 
einen Reset aus.

> der watchdog wird immer aufgerufen egal ob mit oder ohne cli und sei

Der Watchdog wird nicht aufgerufen. Er wird gestartet, gestoppt oder 
zurückgesetzt. Dass das Ganze dann unabhängig von cli und sei läuft 
stimmt allerdings.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Programm wackelt, wenn überhaupt, nur zwei mal an dem Portpin und 
verharrt dann in einer Endlosschleife.

Wo meintest Du, müsstest Du ein cli() einfügen, dass die Klospülung 
funktioniert?

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah... hab das cli() eben entdeckt. Ist aber trotzdem blanker Unsinn!

Wo ist der Rest von Deinem Problemcode?

Autor: Florian Sc (rambo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ganze sollte 30000mal blinken:
    for(i=0;i< 30000;i++){

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui... allen Ernstes übersehen. Doch schon so spät?

Trotzdem werde ich das Gefühl nicht los, dass Dein Problemcode auf 
deinem Rechner ein wenig umfangreicher ist.

Autor: Florian Sc (rambo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist genau der Code. Wenn ich cli() auskommentiere, leuchtet die LED 
kurz auf, dann geht sie aus. Mit cli() blinkt es schön im Sekundentakt.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie dem auch sei. cli() hat in keinster Weise Einfluss auf einen 
laufenden Watchdog. Und selbst wenn es etwas mit dem Watchdog zu tun 
hätte, müsste Deine LED trotzdem blinken (wenn auch anders), da der 
Watchdog den Controller regelmäßig neu starten würde.

Bin kurz davor, mein STK500 rauszukramen und den Schlonz durch nen Mega8 
zu drücken....

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void delay_ms(unsigned int ms)
 /* delay for a minimum of <ms> */
 /* with a 1Mhz clock, the resolution is 1 ms */
 {
     unsigned int i=0;
     unsigned int  j,ii;
     int k;
        for ( i=0;i<300;i++)
        {
                for(j=0;j < ms;j++)
                {
                  k = -j;
                  cli(); // muss rein, sonst geht es nicht
                }
        }
 }

Ohne dein "cli();) wird die Warteschleife komplett wegoptimiert. Woher 
hast du dieses merkwürdige Gebilde?

Autor: Florian Sc (rambo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat noch jemand anders ne Idee? Macht auf jeden Fall nen Unterschied mit 
oder ohne cli();

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum benutzt du nicht die vorhandenen delay-Funktionen?

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schließe mich mal dem Herrn Müller an.
Ohne das cli ist die Schleife wirklich sinnlos und wird mit 99,9%iger 
Sicherheit wegoptimiert. Und wozu bitte ist das k darin gut?

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Magnus Müller schrieb:
> retreti schrieb:
> atmega8 hat afaik keinen watchdog interrupt.
Richtig.

> Den hat KEIN AVR. Der Watchdog, sofern er denn überhaupt einmal
> gestartet wurde, löst im Falle des nicht rechtzeitigen Zurücksetzens
> einen Reset aus.
Da muß ich Dich enttäuschen, das ist falsch. Die neueren Avr's , wei 
z.B. Atmega88 oder 644 gehen erst in den WDT-Interrupt, sofern sei() 
gesetzt (äußerst schön um erst ein paar Sachen zu sichern) und gehen 
dann erst in den Reset.


>@ Florian Sc:
>Hat noch jemand anders ne Idee? Macht auf jeden Fall nen Unterschied mit
>oder ohne cli();
Naja ich vermute auch mal das die schleife wegoptimiert wird, da ja in 
ihr nix passiert, wenn cli() fehlt. Schon mal ohne Optimierung 
compiliert ? Dann optimiert der compiler auch nix raus.Zeig doch mal 
deine .LSS Datei. Da kann man im Assembler Code genau sehen ob die 
Schleife fehlt oder nit!

Besser benutze einfach util\delay.h, da kannste nix falsch machen. Oder 
noch besser Timer.


Gruß

Autor: Magnus Müller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Die Schleife wird ohne cli() definitiv wegoptimiert.

Habe das Ganze mal zur Probe compiliert. Im Anhang das .lss MIT cli().

Autor: Magnus Müller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...und das .lss OHNE cli().

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.