Forum: Mikrocontroller und Digitale Elektronik Atmega8 Watchdog disable


von Florian S. (rambo)


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!

von Magnus Müller (Gast)


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.

von Florian S. (rambo)


Lesenswert?

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

von retreti (Gast)


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?

von Magnus Müller (Gast)


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....   ;)

von Florian S. (rambo)


Angehängte Dateien:

Lesenswert?

Es ist nur ein einfaches Blinken.. siehe Anhang.

von Magnus Müller (Gast)


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.

von Magnus Müller (Gast)


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?

von Magnus Müller (Gast)


Lesenswert?

Ah... hab das cli() eben entdeckt. Ist aber trotzdem blanker Unsinn!

Wo ist der Rest von Deinem Problemcode?

von Florian S. (rambo)


Lesenswert?

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

von Magnus Müller (Gast)


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.

von Florian S. (rambo)


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.

von Magnus Müller (Gast)


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....

von Magnus Müller (Gast)


Lesenswert?

1
void delay_ms(unsigned int ms)
2
 /* delay for a minimum of <ms> */
3
 /* with a 1Mhz clock, the resolution is 1 ms */
4
 {
5
     unsigned int i=0;
6
     unsigned int  j,ii;
7
     int k;
8
        for ( i=0;i<300;i++)
9
        {
10
                for(j=0;j < ms;j++)
11
                {
12
                  k = -j;
13
                  cli(); // muss rein, sonst geht es nicht
14
                }
15
        }
16
 }

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

von Florian S. (rambo)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

Warum benutzt du nicht die vorhandenen delay-Funktionen?

von Philipp (Gast)


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?

von Jean P. (fubu1000)


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ß

von Magnus Müller (Gast)


Angehängte Dateien:

Lesenswert?

Die Schleife wird ohne cli() definitiv wegoptimiert.

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

von Magnus Müller (Gast)


Angehängte Dateien:

Lesenswert?

...und das .lss OHNE cli().

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.