Hallo, Ich habe ein Programm geschrieben und immer wieder r16 auf den Stack geschrieben, -> jedoch vergessen es wieder aus dem Stack zu holen. Nach einer gewissen Zeit hat der Microkontroller immer automatisch einen Reset ausgeführt. Nun habe ich das geändert und es läuft. => Führt der Microkontroller einen Reset aus, wenn der Stack vollgeschrieben wurde? MFG J.J.
> => Führt der Microkontroller einen Reset aus, wenn der Stack > vollgeschrieben wurde? Nein. Sicher dass es ein Reset ist? Oder ist es nur ein Sprung nach Adresse 0? Kann man per MCUCSR rausfinden. Beim Start auslesen, löschen und dann anzeigen.
Wenn ein Unterprogramm per ret oder reti eine Rücksprungadresse vom Stack holt und da (bedingt durch die pusherei ohne entsprechendes poppen) entweder eine Null steht oder eine Adresse von ungültigem Code ("leerer" Speicher), dann fängt das Programm wieder von vorne an, was aber nicht mit einem Reset gleichzusetzen ist.
Danke für eure Antworten! An sowas habe ich garnicht gedacht -> dachte sofort an RESET!
J.J. wrote: > => Führt der Microkontroller einen Reset aus, wenn der Stack > vollgeschrieben wurde? Nein. Der Stackpointer wird irgendwann den SRAM verlassen und im IO-Bereich landen. Und da der IO-Bereich nicht vollständig belegt ist, könnten nicht definierte IO-Register als 0x00 gelesen werden. Laut Datenbblatt ist der Zugriff auf nicht vorhandene Register aber undefiniert. Peter P.S.: Mit Erstaunen habe ich festgestellt, daß neuere AVRs endlich vom 8051 gelernt haben und schon beim Reset den Stackpointer auf eine gültige Adresse setzen. Die alten AVRs wollten ja nach nem Reset immmer auf Adresse 0xFFFF pushen.
>P.S.: >Mit Erstaunen habe ich festgestellt, daß neuere AVRs endlich vom 8051 >gelernt haben und schon beim Reset den Stackpointer auf eine gültige >Adresse setzen. >Die alten AVRs wollten ja nach nem Reset immmer auf Adresse 0xFFFF >pushen Bei welchen AVR trifft dass denn zu? Ich hab hier das neueste Datenblatt (08-2007) von einem mega8 und da kann ich nichts dergleichen erkennen. S. 13: Stackpointer: initial value 0x00 muss auf einen Wert >0x60 gesetzt werden, bevor eine Subroutine aufgerufen wird (so sinngemäß übersetzt) Oder hab ich das falsch verstanden?
Der Mega8 ist ja auch mittlerweile ein Uralt-AVR! Unter "neuen" AVRs, bei denen der SP automatisch auf das RAMEND zeigt, versteht man die Typen, die in den letzten sagen wir mal zwei Jahren auf den Markt gekommen sind. EDIT: Schau Dir z.B. mal die neuen ATMega48/88/168 oder ATTiny45 an. Bei denen ist das z.B. so.
Gast wrote: >>P.S.: >>Mit Erstaunen habe ich festgestellt, daß neuere AVRs endlich vom 8051 >>gelernt haben und schon beim Reset den Stackpointer auf eine gültige >>Adresse setzen. >>Die alten AVRs wollten ja nach nem Reset immmer auf Adresse 0xFFFF >>pushen > > Bei welchen AVR trifft dass denn zu? Z.B. Mega88, Tiny25 usw. Peter
>Schau Dir z.B. mal die neuen ATMega48/88/168 oder ATTiny45 an. Bei denen >ist das z.B. so. Danke für den Tip. Da die mega8 immer das hatten, was ich bei meinen Sachen brauchte, hab ich mich in letzter Zeit gar nicht mehr damit beschäftigt, was Atmel so neues rausgeworfen hat. Werd ich wohl sofort nachholen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.