www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sprung wenn Interrupt Enable


Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Int_CompA:
  pushen etc.

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

  popen etc.
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!

Autor: marc (Gast)
Datum:

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

VG marc

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: Erazer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sbis ADCSRA, ADIE   ;wenn Interrupt-Enable aktiv

Wenn ADIE 0 ist ist auch der Int nicht aktiv

Autor: Erazer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du springst jetzt also wenn der int. aktiv ist.

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erazer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du es mal im Simulator angeschaut?

Autor: Erazer (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.