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.