PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega168 hängt nach Watchdog im Zusammenspiel mit LCD



QM33
11.11.2007, 15:35
Nachfolgender Code läuft auf einem m8 perfekt. Der Watchdog kommt nach 2 Sekunden und das Programm startet von vorne.

Auf einem m168 jedoch hängt sich der Chip komplett auf. Nicht einmal ein HW Reset mit dem Reset PIN ist möglich! Für mich ist das der Super GAU und ich habe es nur durch Zufall bemerkt, weil ich in einigen Funktionen gezielt den WD durch lange Pause auslöse, um das Programm neu zu starten - z.B. nach Konfigurationsänderung.

Das Problem hängt mit dem LCD Befehl zusammen. Lasse ich ihn weg und mache statt dessen PRINT Ausgaben, läuft es.
Könnte das mal jemand von euch mit Bascom 1.11.9.0 nachvollziehen?


$regfile = "m168def.dat"
$crystal = 3686400

$hwstack = 32
$swstack = 10
$framesize = 40

Config Watchdog = 2048

'### LCD
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

Start Watchdog

Cls

Lcd "Start"
WaitMs 1000
Cls
Lcd "1000ms elapsed"
WaitMs 5000
Cls
Lcd "5000ms elapsed"

End

peterfido
12.11.2007, 21:31
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:


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

QM33
12.11.2007, 23:04
Leider löst es das Problem nicht...

peterfido
13.11.2007, 18:04
Hast du die Adressen evtl an den m168 angepasst?

QM33
13.11.2007, 22:56
welche Adressen konkret meinst du?

Was mich extrem wundert, ist die Abhängigkeit zum LCD Befehl. Wenn es ein Timingproblem in der Konfiguration des WDs ist, warum tritt das Problem dann beim Verzicht auf LCD Befehle nicht auf?

QM

peterfido
14.11.2007, 21:21
Ich habe das Datenblatt des M168 jetzt nicht studiert, aber ich würde da als erstes mal nachschauen, was da über den Watchdog steht. Evtl ist da ein ähnliches Beispiel bei. Wäre möglich, dass Bascom einige Pausen einbringt, wenn man LCD nutzt, damit das LCD Zeit für die Befehlsausführung hat