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?
Hi Stell doch einfach mal deinen Code rein. Mit deinen Angaben kann man nur raten. MfG Spess
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
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 |
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.