Forum: Mikrocontroller und Digitale Elektronik Atmega8 ADC Interrupt


von Norbert (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Norbert (Gast)


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

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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

von Norbert (Gast)


Lesenswert?

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

Gruß
Norbert

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.