Ist es möglich das es zu einem Stack Überlauf kommt und Dein Programm im "Nirwana" endet?
Gruß Richard
Werbung
Ist es möglich das es zu einem Stack Überlauf kommt und Dein Programm im "Nirwana" endet?
Gruß Richard
@Richard Ich weiß nicht, wodurch könnte es denn zu einem Stack Überlauf kommen?
Sind z.B. cli() und sei() überhaupt sinnvoll im ISR? Kann das Tastenprellen vielleicht einen Überlauf verursachen?
Der µC hängt sich nicht auf, er startet definitiv neu, denn am Anfang von main() lasse ich eine Meldung ausgeben: lcd_puts("Starten..."); und die wird nach dem Interrupt angezeigt.
@oberallgeier Ich verstehe nicht ganz, was Du meinst - ich habe ja nur eine ISR... D.h. ich weiß, dass diese ISR bzw., das was danach geschieht, den Reset auslöst. Das Problem ist, dass ich nicht genau weiß, was nach der ISR passiert - bisher war ich davon ausgegangen, dass in die while(1)-Schleife zurückgesprungen wird...
Geändert von Jacob2 (29.06.2011 um 12:35 Uhr)
Roboter, CNC Fräse, Elektronik und Basteleien stelle ich auf meiner Website vor...
Ok, bevor wir die Geheimnisse der Interrupt-Vektortabelle diskutieren: Wie wärs, wenn Du SICHERSTELLST, dass nach dem lcd_puts("Vorher...") ein Reset im m48 erfolgt? Versuch doch mal zwischen lcd_clrscr(); und dem lcd_puts("Vorher...") ein Delay-1000 einzufügen - dann wäre nach einem Reset immer wieder für eine Sekunde ein gelöschtes LCD zu sehen. DANN sind wir sicher, dass ein Reset stattfindet und nicht "nur" ein Hängenbleiben des Controllers . . . . Dann könnte man weitersehen.Zitat von Jacob2
Ciao sagt der JoeamBerg
Mit C habe ich leider Probleme und kann Deinen Code nicht wirklich nachvollziehen.Aber solche "Neustarts" sind typisch wenn z.B. eine Rücksprung Adresse fehlt oder überschrieben wurde. Zum Testen mal den Sack Bereich vergrößern könnte helfen. Auch wenn das Programm selber "ins leere" Endet oder eine Variable zu "klein" ist( buffer overlow), (kann) das zum Neustart führen.
Gruß Richard
Hallo,
ich verstehe C auch kaum, aber ein anderer Gedanke:
Der PCF8574 zieht INT nach LOW, wenn ein Taster gedrückt wird.
Das verursacht ein PCINT am ATMega und der springt in die ISR und der PCF wird ausgelesen.
Nach Datenblatt des PCF8574 wird dessen INT Leitung resettet, wenn Daten von seinem Datenport gelesen werden.
Das bedeutet, das am PCINT Pin der Pegel wechselt und ein neuer PCINT ansteht.
Sobald aus der ISR zurückgekehrt wird muß µC da sofort wieder rein.
Das Ganze ist davon abhängig, ob der µC das PCI Flag zu Beginn der ISR oder bei Rücksprung löscht. Das weis ich leider nicht.
SEI und CLI in der ISR macht für mich keinen Sinn, da die sowieso während der ISR geblockt sind. Statt dessen eher Verhindern von PCINTs (im Maskenregister) und vor Rücksprung sicherheitshalber Löschen des PCI Flags und Wiederzulassen von PCINTs.
Entprellung von Tasten?
Gruß
Searcher
Geändert von Searcher (29.06.2011 um 16:03 Uhr)
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Lesezeichen