mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 ADC Interrupt


Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe am ADC0 Eingang einen Poti. Inititalisiere den Port mit ADCSRA, 
dabei setzte ich ADEN, ADIE und den Prescaler. ADUX Byte=0. Den 
Interruptvektor habe ich mit 0x00E angelegt und freigeschalten mit SEI. 
Wenn ich nun mit ADSC die Wandlung starte funktioniert die erste 
Wandlung korrekt. Bei der zweiten Wandlung sehe ich im Status wie das 
ADSC Bit nach dem Setzen wieder zu 0 wird jedoch der Interrupt löst 
nicht aus.
Wer kann mir helfen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Stell doch einfach mal deinen Code rein. Mit deinen Angaben kann man nur 
raten.

MfG Spess

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe gerade versucht den Code zu kopieren, leider ist er dann nicht 
formatiert und da ich lange Texte habe sieht das fürchterlich aus.
Vielleich kannst du mir auch so helfen.
Was für Bits müssen nach einer Wandlung im ADCSRA rückgesetzt werden 
damit das Ganze wieder von neuem startet? Oder warum funktioniert der 
Interrupt beim zweiten Mal nicht mehr? Wenn ich das "Start Conversion" 
Bit wieder setzte sollte doch auch der Interrupt wieder funktionieren?
Gruß
Norbert

Auszug aus meinem Programm

org 0x00E
RJMP    ADC_Interrupt       ; Anlaog Handler
        SEI            ; Interrupt freigeben

;*********************************************************************** 
***
Diese Programmteil wird nur ein Mal durchlaufen

Analogeingang ADC0 initialisieren
ADC0:  LDI  R16,  0b00100000     ; ADC0 freischalten/ 8Bit
  OUT  ADMUX,  R16            ; Kanal an Wandler übergeben
  LDI  R25,  0b11001101     ; Enable, Interrupt, Vorteiler
  OUT  ADCSRA,  R25        ; Start Conversion
  RJMP   mainloop
:*********************************************************************** 
***

ADC_Interrupt:
  IN  R26,  ADCL        ; Wandler Low  Teil auslesen
  IN  R27,  ADCH           ; Wandler High Teil auslesen
  MOVE     ...,     R27            ; Ergebnis
  RET

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> Hallo,
> habe gerade versucht den Code zu kopieren, leider ist er dann nicht
> formatiert und da ich lange Texte habe sieht das fürchterlich aus.

Häng einfach dein *.asm File als "Dateianhang" an.

Falls du Quelltext direkt in das Posting übernehmen willst:

Assembler:
Am Anfang fügst du
 [ avrasm ]      (ohne die Leerzeichen)
und am Ende
 [ / avrasm ]    (wieder ohne Leerzeichen)
ein

Ich mach das mal bei deinem Posting, damit man das Lesen kann
org 0x00E
RJMP    ADC_Interrupt       ; Anlaog Handler
        SEI            ; Interrupt freigeben

;**************************************************************************
Diese Programmteil wird nur ein Mal durchlaufen

Analogeingang ADC0 initialisieren
ADC0:  LDI  R16,  0b00100000     ; ADC0 freischalten/ 8Bit
  OUT  ADMUX,  R16            ; Kanal an Wandler übergeben
  LDI  R25,  0b11001101     ; Enable, Interrupt, Vorteiler
  OUT  ADCSRA,  R25        ; Start Conversion
  RJMP   mainloop
:**************************************************************************

ADC_Interrupt:
  IN  R26,  ADCL        ; Wandler Low  Teil auslesen
  IN  R27,  ADCH           ; Wandler High Teil auslesen
  MOVE     ...,     R27            ; Ergebnis
  RET

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
>
>   RET
> 

und da haben wir ihn auch schon.
Eine Interrupt Routine wird mit RETI abgeschlossen, nicht mit RET.
Ansonsten werden die globalen Interrupts nicht wieder freigegeben. Beim 
Aufruf eines Interrupt Handlers geschieht ein impliziter CLI und der 
RETI macht einen impliziten SEI


Schönes Beispiel für: Der Fehler liegt ganz woanders als du vermutest 
:-)

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,
du bist einfach spitze. Den Fehler hätte ich dort wirklich nicht 
gesucht!
Vielen Dank.

Gruß
Norbert

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.