Forum: Mikrocontroller und Digitale Elektronik Sprung wenn Interrupt Enable


von marc (Gast)


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!

von marc (Gast)


Lesenswert?

Hat Niemand eine Idee?
Kann es sein, daß das Flag ADIE nicht unter allen Umstanden (in einer 
ISR) auszulesen ist?

VG marc

von Michael U. (Gast)


Lesenswert?

Hallo,

ich kann zumindest auf Anhieb nichts finden, weshalb das nicht gehen 
sollte. (Mega16-Doku).

Gruß aus Berlin
Michael

von Erazer (Gast)


Lesenswert?

sbis ADCSRA, ADIE   ;wenn Interrupt-Enable aktiv

Wenn ADIE 0 ist ist auch der Int nicht aktiv

von Erazer (Gast)


Lesenswert?

Du springst jetzt also wenn der int. aktiv ist.

von marc (Gast)


Lesenswert?

@Erazer
Ich möchte in die Routine ADGate_Off springen, wenn der AD-Interrupt 
noch freigegeben ist. Der Timer ist sozusagen das Timeout für die 
Messung.

von Erazer (Gast)


Lesenswert?

Hast Du es mal im Simulator angeschaut?

von Erazer (Gast)


Lesenswert?

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

von Falk (Gast)


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


von marc (Gast)


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

von marc (Gast)


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

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
Noch kein Account? Hier anmelden.