PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit ADC , kann mir da jemand helfen ?



LC-HC
08.10.2005, 20:32
Hi, ich hab mal was am ATmega8 ausprobiert und komm da im mom. nicht so richtig weiter. Den Code hab ich mit gepostet. Zur Funktion soviel: nachdem ein Wert überschritten worden ist, soll ein Portbit gesetzt werden. Es tut sich aber überhaupt nichts. Danke für alle tips und anregungen.

Hier der code:


.include "AVR.H"
;----------------------------------------------------------------------
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
reti ; 2 Int0-Interrupt
reti ; 3 Int1-Interrupt
reti ; 4 TC2 Compare Match
reti ; 5 TC2 Overflow
reti ; 6 TC1 Capture
reti ; 7 TC1 Compare Match A
reti ; 8 TC1 Compare Match B
reti ; 9 TC1 Overflow
reti ; 10 TC0 Overflow
reti ; 11 SPI, STC Serial Transfer Complete
reti ; 12 UART Rx Complete
reti ; 13 UART Data Register Empty
reti ; 14 UART Tx Complete
rjmp onADC ; 15 ADC Conversion Complete
reti ; 16 EEPROM Ready
reti ; 17 Analog Comparator
reti ; 18 TWI (I²C) Serial Interface
reti ; 19 Store Program Memory Ready
;----------------------------------------------------------------------
; Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
; Hier Init-Code eintragen.
;--------ADC Init-------------------------------
ldi r16,0
out ADMUX,r16 ; ADC kanal 0 = PortC.0
ldi r16,0b11011101
out ADCSRA,r16 ; ADC enable, Interrupt enable, run-mode
;--------PORT Init-------------------------------
ldi r16,0b00000010
out DDRC,r16 ; PORTC.1 als ausgang

;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
mainloop: wdr
rcall wait
rcall wait
mov r20,r25 ; ADC Wert holen


cpi r20,0b00000010 ; falls ADC Wert höher als 2
brge mainloop ; die led an

sbi PORTC,1

rjmp mainloop
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++

onADC: cli ; Interrupts sperren
in r25,ADCH ; ADC 8 Bit Daten holen
sbi ADCSRA,6 ; nächste Wandlung starten
sei ; Interrupts wieder zulassen
reti


wait: push r24
ldi r24,0x13 ;hier delay einstellen
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret


wait20ms: ldi r16,255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret

Marco78
08.10.2005, 20:53
Muss man in Assembler nicht auch angeben um was für einen AVR es sich handelt?

LC-HC
08.10.2005, 22:03
eigentlich schon, aber ich benutz das myAVR sisy studio. da ist die Anweisung für den mega8 bereits integriert.

Peter Themsfeld
08.10.2005, 23:07
also soweit wie ich das sehe fehlt das <<< sei >>> vor der mainloop... dein interrupt wird einfach nicht ausgelöst ;-)

PicNick
09.10.2005, 10:08
Wenn ich mich nicht irre, ist der "RETI" als Interrupt-Vector zu kurz, es sind immer 4 Byte vorgesehen. Da gehört immer noch ein "NOP" dazwischen.
Das kannst du aber im Listing leicht kontrollieren.
Wenn ich mich aber schon irre, dann bitte ich im Strafe

Peter Themsfeld
09.10.2005, 10:40
beim Mega8 reicht ein RETI, erst meim m168 der x8 Serie müssen es zwei Befehlsworte sein (NOP, RETI oder JMP Marke)

Gruß

Lektor
09.10.2005, 13:22
hast du das von Peter mal kontrolliert? bin auch der Meinung, dass da noch ein sei fehlt. Setz mal ein sei direkt hinter die Interrupttabelle in der Power On Instruktion.

LC-HC
09.10.2005, 22:33
Hi, und erst mal danke für die antworten. Das sei hab ich jetzt gesetzt. Obwohl ich dachte, dass es in meiner onADC - Funktion ausreicht paasiert nun folgendes: Board einschalten, 1 - 2 sek. warten und dann vemerken, dass die LED angeht. Natürlich unabhängig von der Stellung des potentiometers. Allerdings bleibt die LED aus, wenn statt BRGE, BRLO an der verzweigung steht. kann mir da jetzt aber garnichts darunter vorstellen !

Peter Themsfeld
10.10.2005, 12:58
und noch was ist mir aufgefallen... du musst unbedingt immer beide ADC-Werte (Low dann High) unmittelbar nacheinander auslesen sonst nimmt der ADC die Werte nicht als ausgelesen an... du hast doch SiSy... da ist Beispielcode für den ADC drin... und dann denke ich mal solltest du die LED auch ausschalten wenn der ADC-Wert wieder kleiner ist...

also ich habe dein onADC mal mit der onADC-Vorlage aus SiSy ersetzt und da gehts. O:)

LC-HC
10.10.2005, 22:53
Alles, klar, klappt einwandfrei. Tausend Dank ! Im Atmel Handbuch steht jedoch, dass es ausreichend ist, ADCH auszulesen , falls eine 8-Bit Auflösung genau genug ist.

Peter Themsfeld
10.10.2005, 23:29
hm... also ich habe das mit dem immer beide register lesen aus dem myavr lehrbuch... scheint ja irgendwie was dran zu sein *schmunzel*

waste
11.10.2005, 10:12
Im Atmel Handbuch steht jedoch, dass es ausreichend ist, ADCH auszulesen , falls eine 8-Bit Auflösung genau genug ist.
Stimmt, aber dann muss ADLAR=1 gesetzt sein, dann ist das Ergebnis linksbündig und es reicht nur ADCH auszulesen. Siehe Datenblatt Seite 203 und 205.

Waste

LC-HC
11.10.2005, 14:17
All right, ( manchmal sollte man einfach ei bischen weiter lesen) zum glück gibts foren ;)