Ich würde zu Testzwecken mal den Watchdog rausnehmen. Meinen M 644 bekomme ich nur mit Watchdog zum laufen, wenn ich am Anfang des Codes den Watchdog abschalte, denn dafür bleiben nur 4 Takte Zeit. Dann muss der Watchdog regelmäßig zurückgesetzt werden, wenn er aktiviert ist. Ich mache das immer in der Hauptschleife.

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
Watchdog initialisierung beim Mega 644.