SREG in ISR speichern

OP #1053311
Hallo,

wir haben hier im Kollegium ein etwas undurchsichtiges Problem.

Innerhalb des "normalen" Programms (Atmega1280 mit winAVR) wird ein 
Vergleich von zwei uint16 durchgeführt. sporadisch wird aber 512>680 als 
true erkannt und dann die entsprechende Routine ausgeführt.

Da für den Vergleich intern ja das C-Flag benutzt wird, könnte ich mir 
vorstellen, dass das SREG von einer der vielen ISR verbröselt wird.

Und hier beginnt der Glaubenskrieg. Sollte man das SREG in der ISR 
zwischenspeichern um es am Ende der ISR wieder unverändert zu haben?

Gruß Thomas
#1053312
Wenn die ISR in C geschrieben ist, dann macht das der Compiler selbst. 
Das ist nur nötig, wenn die ISR in Assembler geschrieben ist.

Es könnte also eher sein, dass der Inhalt des Speichers 
(Register,Stack), in dem das SREG vom Compiler gesichert wird, dank 
irgendeines Programmfehlers zerstört wird.
Gast #1053350
Die SPannende Frage ist: werden die Variablen, die du vergleichst in der 
ISR benutzt?

Wenn ja, könnte ein Interrupt "Mitten im Vergleich" die Ursache sein. 
Außerdem sollten die Variablen dann als volatile deklarier sein.
#1054026
Hallo und vielen Dank für den richtigen Denkanstoss!

Die Ursache konnte heute gefunden werden:
Scheinbar hat wirklich die ADC-ISR in mitten des Vergleiches die Werte 
geändert.
Dadurch konnte mit einem Breakpoint ->nach<- diesem Vergleich auch nur 
noch den nun wieder neuen Wert angezeigt werden - der alte war 
mittlerweile schon wieder in der Variable überschriben worden.

Durch ein cli()/sei() in dieser Funktion konnte schonmal der richtige 
Wert angezeigt werden, der für den Einsprung in die if/then 
verantwortlich war.

Nachdem das schonmal geklärt wurde, ist nun nur der ADC-Interrupt 
kurzzeitig ausgeschaltet worden und alles läuft wieder wie es sollte.

Die Suche danach war wirklich sehr mühsam, da man zudem noch den 
Optimizer aus schalten mußte um richtig Debuggen zu können...

Viele Grüße
Björn

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.