PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Z-Pointer nach Spannungsunterbrechung



bombatz
04.10.2006, 20:12
hallo,

ich möchte eine 7-Segment-Anzeige ansteuern. Dazu habe ich am Ende des Programmes mit Hilfe von ".db" die Daten geschrieben, welches Segment bei welcher Zahl aufleuten soll. Diese lade ich dann mit dem lpm-Befehl und dem Z-Pointer, in dem die Adresse der Daten steht.
Das Programm arbeitet auch wunderbar.

Nun zu meinem Problem:
Wenn ich das Programm mit dem ISP-Kabel rein gespielt habe, funktioniert es, ich kann auch einen Reset ausführen oder die Spannung unterbrechen, ohne das Fehler auftreten.

Aber nur solange bis ich das ISP-Kabel getrennt habe. Und sobald ich dann die Spannung kurz unterbreche funktioniert es nicht mehr.
Es wird dann nur noch "8" angezeigt, was bedeutet, dass mit lpm eine "FF" geladen wird, also der Z-Pointer nicht auf die Daten zeigt, sondern irgendwo ins nirvana.

Wie kann das sein?
Solange das ISP-Kabel noch dran ist, geht das Programm ja, auch nach Spannungsunterbrechungen.
Und wenn das Kabel ab ist (bzw. der Rechner ausgeschaltet), funktioniert es nicht mehr.
Das Programm arbeitet aber weiter, nur das Laden der Daten fuktioniert nicht mehr.

Nach dem Einschalten führe ich ja auch im Programm eine Reset-Routine aus, in der auch der Z-Pointer wieder mit der richtigen Adresse geladen wird.


Das klingt zwar vlt jetzt alles etwas durcheinander, aber ich hoffe es ist halbwegs verständlich.

ogni42
05.10.2006, 08:11
Das klingt danach, dass Dein ISP Teile der Schaltung mit Spannung versorgt, die ansonsten keine Spannung (oder Masse) bekommen.

PicNick
05.10.2006, 08:57
Und ein flatternder Reset-Pin kann auch für Spaß sorgen.

SprinterSB
05.10.2006, 10:23
Wenn du keine Spannung am µC hast verlierst du all deine nichtflüchtigen Daten. Möglicherweise hilft es, den BOD (Brown-Out-Detector) zu aktivieren, weil bei nicht komplettem Spannungsverlust der µC anfängt rumzuspinnen und kein richtigen RESET macht, woduch undefinierte Zustände entstehen.

Nach Spannungseinbruch solltest du einen Power-On-Reset bekommen. Ein Reset per ISP ist ein external Reset. Bei einem BO bekommst du einen Brown-Out-Reset. Die Reset-Quelle kannst du dem MCUSCR entnehmen.

Mit gestöpseltem ISP versorgst du deinen µC über den ISP und die Clamp-Diodenn der Ports mit Saft. Ausserdem hast du mit ISP möglicherweise geerdet, was manche Störungen beseitigt.

bombatz
05.10.2006, 16:24
Danke für euere Antworten.

Das mit dem Brown Out werd ich mal ausprobieren.
Es ist aber so, dass ich ja die Spannung komplett trenne und dann wieder anschließe, also ist das ja ein "kompletter" Spannungsverlust und nicht nur eine Unterspannung.
Wenn ich die Spannung unterbreche, wenn das ISP noch dran hängt, tritt dieses Problem ja komischerweise nicht auf. Das ist ja das, was mich so verwundert.
Und die Daten sind ja direkt mit im Flash gespeichert, also nicht flüchtig.
Das restliche Programm läuft ja trotzdem normal.

Aber ich werd den Brown Out Reset erst mal ausprobieren. Vlt erledigt sich dann das Problem von selbst.

bombatz
06.10.2006, 20:25
Nach stundenlangen Rumprobieren hab ich den Fehler endlich entdeckt.

Und zwar hatte ich zum Berechnen der Adresse der Daten für den HIGH Teil des Z-Registers einfach eine NULL gebraucht. Dazu hab ich einfach ein freies Register genommen und da ja dort anfangs sowieso ne NULL drin steht, hab ich an diesem Register auch nichts geändert.
Genau da war der Fehler.

Denn nach dem Abziehen des ISP-Kabels und anschließender Spannungsunterbrechung war eben in diesem Register keine NULL mehr drin, sodass der Z-Pointer nach der Berechnug ins Nirvana gezeigt hat.

Jetzt lösche ich dieses Register in meiner Reset-Routine am Anfang des Programms und es funktioniert. \:D/


Nochmal danke für die Antworten, auch wenn sie in meinem Fall leider nichts genützt haben.

SprinterSB
07.10.2006, 00:51
[...] Dazu hab ich einfach ein freies Register genommen und da ja dort anfangs sowieso ne NULL drin steht, [...]

[-X Wo hast du denn das her???

Register und RAM werden beim Reset *nicht* initialisiert! Es stehen undefinierte Inhalte drinne! Kann man prima benutzen, um ne Seed für nen Zufallsgenerator zu bekommen ;-)

bombatz
07.10.2006, 11:47
naja ich war der Annahme, dass in den Registern, wenn vorher nichts rein geschrieben wurde, nach einem Reset auch nichts drin steht 8-[ .... aber jetzt weiß ich das fürs nächste Mal... wieder was neues gelernt... O:)