Atmega8 ADC Interrupt

Gast #1337937
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?
Gast #1338036
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
#1338039
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
1
org 0x00E
2
RJMP    ADC_Interrupt       ; Anlaog Handler
3
        SEI            ; Interrupt freigeben
4

5
;**************************************************************************
6
Diese Programmteil wird nur ein Mal durchlaufen
7

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

16
ADC_Interrupt:
17
  IN  R26,  ADCL        ; Wandler Low  Teil auslesen
18
  IN  R27,  ADCH           ; Wandler High Teil auslesen
19
  MOVE     ...,     R27            ; Ergebnis
20
  RET
#1338043
Lesenswert?

Karl heinz Buchegger schrieb:
>
1
>   RET
2
>

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 
:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren