relaxer
21.06.2006, 22:54
Hallo Leute,
bin ein absoluter Anfänger, mit 2 Wöchiger Atmel Erfahrung!!!!
Also jetzt zum Thema...
Ich versuche schon seid Tagen einen Poti-Wert (0-5V) über den ADC Eingang des ATMega 16 Controlers auszulesen und auf eine 16x2 LCD-Anzeige dar zu stellen. Sobald ich das Poti verändere soll sich auch die Anzeige ändern.
Später soll ein eingelesenes Signal an PA0 mit dem Potiwert an PA1 verrechnet werden und über I2C an einen DAC-Baustein gesendet werden. Der dann das veränderte Signal darstellt bzw. neu generiert. Das LCD soll die Eingangs- und Ausgangspegel darstellen. Soviel zur Theorie :-(
!!! Leider scheitert es schon an dem Auslesen eines popligen Potis *seufts*
main: ;Hauptprogramm---------------------------------------------------------
;Stack-Pointer an die letzte SRAM Addresse
ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, temp
rcall ports_init ;Funktioniert
rcall lcd_init ;Funktioniert
rcall adc_init ;Funktioniert nicht!!!
Schleife:;ADC einlesen----------------------------------------------------------
in lowByte, ADCL ;immer zuerst low byte lesen
in highByte, ADCH ;danach das mittlerweile gesperrte high byte
sbi ADCSR, ADIF ;logisch "1" löscht ADIF
push temp ;temp auf dem Stack sichern
swap temp ;High-Nibble löschen
andi temp, 0x0F ;High- und Low-Nibble vertauschen
rcall hex2ascii
rcall lcd_datenausgabe ;ASCII Zeichen an LCD Sub
pop temp ;temp vom Stack holen
andi temp, 0x0F ;High-Nibble löschen
rcall hex2ascii
rcall lcd_datenausgabe ;ASCII Zeichen an LCD Sub
rjmp Schleife ;Endlosschleife, Programmende
;ADC initialisieren "Free Run Modus"
;------------------------------------------------------------------------------------
adc_init:
;ADEN (ADC Enable) = 1
;ADSC (ADC Start Conversion) = 1
;ADFR (ADC Free Run Select) = 1
ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7
out ADCSR, temp
ldi temp, 1
out ADMUX, temp ;Spannungsmessung an PA0 (Kanal1)
ret
;ADC -> Umwandlung in ASCII
;-----------------------------------------------------------------------------------
hex2ascii:
cpi temp, 10
brsh ha1
subi temp, -48
ret
ha1:
subi temp, -55
ret[/code]
bin ein absoluter Anfänger, mit 2 Wöchiger Atmel Erfahrung!!!!
Also jetzt zum Thema...
Ich versuche schon seid Tagen einen Poti-Wert (0-5V) über den ADC Eingang des ATMega 16 Controlers auszulesen und auf eine 16x2 LCD-Anzeige dar zu stellen. Sobald ich das Poti verändere soll sich auch die Anzeige ändern.
Später soll ein eingelesenes Signal an PA0 mit dem Potiwert an PA1 verrechnet werden und über I2C an einen DAC-Baustein gesendet werden. Der dann das veränderte Signal darstellt bzw. neu generiert. Das LCD soll die Eingangs- und Ausgangspegel darstellen. Soviel zur Theorie :-(
!!! Leider scheitert es schon an dem Auslesen eines popligen Potis *seufts*
main: ;Hauptprogramm---------------------------------------------------------
;Stack-Pointer an die letzte SRAM Addresse
ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, temp
rcall ports_init ;Funktioniert
rcall lcd_init ;Funktioniert
rcall adc_init ;Funktioniert nicht!!!
Schleife:;ADC einlesen----------------------------------------------------------
in lowByte, ADCL ;immer zuerst low byte lesen
in highByte, ADCH ;danach das mittlerweile gesperrte high byte
sbi ADCSR, ADIF ;logisch "1" löscht ADIF
push temp ;temp auf dem Stack sichern
swap temp ;High-Nibble löschen
andi temp, 0x0F ;High- und Low-Nibble vertauschen
rcall hex2ascii
rcall lcd_datenausgabe ;ASCII Zeichen an LCD Sub
pop temp ;temp vom Stack holen
andi temp, 0x0F ;High-Nibble löschen
rcall hex2ascii
rcall lcd_datenausgabe ;ASCII Zeichen an LCD Sub
rjmp Schleife ;Endlosschleife, Programmende
;ADC initialisieren "Free Run Modus"
;------------------------------------------------------------------------------------
adc_init:
;ADEN (ADC Enable) = 1
;ADSC (ADC Start Conversion) = 1
;ADFR (ADC Free Run Select) = 1
ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7
out ADCSR, temp
ldi temp, 1
out ADMUX, temp ;Spannungsmessung an PA0 (Kanal1)
ret
;ADC -> Umwandlung in ASCII
;-----------------------------------------------------------------------------------
hex2ascii:
cpi temp, 10
brsh ha1
subi temp, -48
ret
ha1:
subi temp, -55
ret[/code]