Sprung wenn Interrupt Enable

Gast #532648
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich möchte in einer Interruptroutine (Timer0 Compare Interrupt) einen 
skip in Abhängigkeit von einem anderen Interrupt-Enable-Bit (ADC, ADIE) 
durchführen. Die Abfrage versagt, der skip wird immer durchgeführt:
1
Int_CompA:
2
  pushen etc.
3

4
;  Interruptgesteuerte ADU der Gatespannung abschalten
5
  sbic ADCSRA, ADIE   ;wenn Interrupt-Enable aktiv
6
  rcall ADGate_Off    ;ggf. den Interrupt sperren
7
  usw.
8

9
  popen etc.
10
reti

Der rcall wird immer übersprungen, obwohl der ADC-Interrupt noch 
freigegeben ist. Was mache ich falsch?
Ich verwende ATtiny13, AVR, Assembler

Danke im Voraus!
Gast #532744
Lesenswert?
• ▲
▼
@ Erazer

>Beim Sprung in die Int. Routine wird das entsprechende Int.Enable Bit
>zurückgesetzt. Soviel ich noch weiß.

Nein, das Interrupt FLAG wird beim Sprung in die Interruptroutine 
gelöscht (bei den meisten interrupts), nicht jedoch das Enable Bit.
Wird das Enable Bit überhaupt vom Hauptprogramm gesetzt?

MfG
Falk

Gast #532758
Lesenswert?
• ▲
▼
Hallo zusammen!
Interrupt-Enable steuere ich im Hauptprogramm aus einer Statemachine.

Danach wird bei jedem AD-Interrupt in der der entsprechenden ISR der 
Meßwert abgeholt, auf ein paar Bedingungen abgeklopft und eine neue 
Messung gestartet. Sind die Bedingungen erfüllt schaltet die ISR den 
Interrupt mit ADIE aus.

Wenn aber zwischenzeitlich der Timer-Compare kommt soll dieser prüfen ob 
der ADIE noch aktiv ist. Nur wenn das der Fall ist soll an dieser Stelle 
der letzte Meßwert gespeichert und die Messung beendet werden.

Zur Signalisierung wollte ich eben das ADIE-Flag selbst verwenden. Jetzt 
habe ich zwischenzeitlich ein neues Flag in einem Register hinzugefügt 
und immer parallel gesetzt und gelöscht und alles funktioniert. 
Irgendwie unbefriediegend!

Simulation fällt leider aus, weil zu viel interaktive Hardware nötig 
ist.
VG Marc
Gast #532892
Lesenswert?
• ▲
▼
Wenn es noch jemanden interessiert:
Ich habe das Programm auf eine Steuerung durch ADATE umgestrickt. D.h. 
zum Start werden die Bits
ADGate_Go:
  setb ADCSRA, ADATE  ;Auto Trigger Enable
  setb ADCSRA, ADIE  ;Interrupt freigeben
  setb ADCSRA, ADSC  ;Start Conversation
gesetzt.

Die Abfrage erfolgt nun mit
  sbic ADCSRA, ADATE  ;anstatt ADIE
  rcall ADGate_Off

Den Wandler abschalten
ADGate_Off:
  clrb ADCSRA, ADATE  ;Auto Trigger ausschalten
  clrb ADCSRA, ADIE  ;Interrupt sperren, löscht ADIF

Geht hervorragend!
setb und clrb sind nur Macros für sbi u. cbi

VG Marc

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.