ATmega8 und delay: Ich versteh die Welt nicht mehr

Gast #1088145
Lesenswert?

Ich hab ein großes Problem: Nachdem ich ein wenig mit Soft-PWM 
rumgespielt habe, funktionieren die einfachsten Sachen nicht mehr. Das 
primitive Blink-Programm (das so auf dem selben uC mal tat) will einfach 
nicht mehr.

Jeder Wert <= 13 funktioniert, dann leuchtet die LED halt mit halber 
Helligkeit. Bei größeren Werten kommt er aber gar nicht mehr bis zum 
Einschalten.

Der Code wird korrekt zum uC übertragen, ich kann ihn von dort wieder 
auslesen, das kann also nicht der Fehler sein.

OK, dann mal die Fakten: Ich hab hier einen ATmega8, die Fuses sind in 
der Standardeinstellung (ich hatte den Takt mal falsch gesetzt, da hat 
sogar der Timer gesponnen, aber jetzt sind sie wieder auf 0xC1 0x99). 
Compiler ist avr-gcc 4.1.3 20080612 bzw. WinAVR-20081205 (mit beiden 
getestet, gleiches Problem). Optimierung ist -Os, F_CPU ist auch richtig 
gesetzt.

Ich hab das Programm mit 13 und 14 kompiliert und dissassembliert, sieht 
alles OK aus, der einzige Unterschied ist die 
Warteschleifeninitialisierung:
1
_delay_ms(13):
2
  62:   e2 eb           ldi     r30, 0xB2       ; 178
3
  64:   fc e0           ldi     r31, 0x0C       ; 12
4

5
_delay_ms(14):
6
  62:   ec ea           ldi     r30, 0xAC       ; 172
7
  64:   fd e0           ldi     r31, 0x0D       ; 13

Ich hoffe, mir kann hier jemand helfen!

Ansonsten: Frohe Weihnachten!
Angehängte Dateien:
Persönliche Seite #1088164
Lesenswert?

> OK, dann mal die Fakten: Ich hab hier einen ATmega8, die Fuses sind in
> der Standardeinstellung (ich hatte den Takt mal falsch gesetzt, da hat
> sogar der Timer gesponnen, aber jetzt sind sie wieder auf 0xC1 0x99)

Schau mal nach der Fuse "Watch-dog Timer always on; [WDTON=0]" bzw. 
schalte die mal aus.

Hinweise zum Watchdog:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_Watchdog

Insbesondere dieser Abschnitt: "Es besteht die Möglichkeit 
herauszufinden, ob ein Reset durch den Watchdog ausgelöst wurde..."
Gast #1088191
Lesenswert?

Super, danke, ich hab die Fuse ausgeschaltet, jetzt tuts.

Aber ich würde auch ganz gern verstehen, was da eigentlich passiert. 
Irgendwas muss den Watchdog ja ausgelöst haben. Wie gesagt, delay bis 13 
ms funktioniert, mehr nicht. Auch wenn zum Beispiel 2 mal hintereinander 
10 ms warte, hängt er (möglicherweise packt das dann der Compiler 
zusammen). Komischerweise tat halt genau dieses Programm unverändert 
schon mal (mit WDTON=0) und jetzt nicht mehr.

Naja, ich brauch den Watchdog grad nicht, ich kann also wieder spielen.
Persönliche Seite #1088210
Lesenswert?

Ich hatte das Problem auch mal 
(http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Parallelport_ISP_Typ_STK200). 
Damals hatte ich vermutet, dass die im Netz angegebenen 
Default-Einstellungen einen aktivierten Watchdog beschreiben, das aber 
in den Werkseinstellungen nicht der Fall ist. Nachdem man das erste Mal 
die vermeintlichen Werkeinstellungen reaktiviert hat, sitzt man im 
Resetwunderland. Bisher hatte ich noch keinen "frischen" AVR zum 
nachkontrollieren dieser These.
Gast #1088229
Lesenswert?

Die These könnte stimmen. Das Datenblatt des ATmega8 gibt Dir Recht:
1
Fuse High Byte | Bit No. | Description   | Default Value
2
---------------+---------+---------------+---------------------------------------
3
WDTON          | 6       | WDT always on | 1 (unprogrammed, WDT enabled by WDTCR)

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