Ich hatte bei meinem m644 ähnliche Probs bis ich darauf gekommen war, dass man den Watchdog als erstes deaktivieren sollte. Jedoch hat man dafür nur 4 Takte Zeit, sodass ich das gleich am Anfang des Programmes machen musste, seitdem läuft es super.
Mein Programm fängt also so an:
Code:
$asm
Wdt_off:
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, wdrf;(0xff & (WDRF))
Out Mcusr , R16
; Write logical one to WDCE and WDE
; Keep old prescaler setting to prevent unintentional time-out
in r16, WDTCSR
ori r16,wdce; (1<<WDCE) | (1<<WDE)
Out Wdtcsr , R16
; Turn off WDT
ldi r16,wde; (0<<WDE)
Out Wdtcsr , R16
$end Asm
$regfile = "m644def.dat"
$crystal = 16000000
$loadersize = 2048
Stop Watchdog
Config Watchdog = 2048
Config Graphlcd = 240 * 64 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Mode = 6
...
Die Assembler Routine habe ich direkt aus dem Datenblatt des Atmegas übernommen.
Lesezeichen