PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel Assembler ... ADC Wert auf LCD anzeigen lassen



relaxer
21.06.2006, 21: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]

dennisstrehl
21.06.2006, 22:04
1. Wäre es ganz nützlich, zu wissen, welchen Controller du benutzt.
2. Hab ich auch mal den Free Running Modus ausprobiert, und irgendwie funktioniert das nicht, zumindest nicht im Simulator, deswegen würd ich den manuell neu starten.
3.

ldi temp, 1
out ADMUX, temp ;Spannungsmessung an PA0 (Kanal1)
Da muss ne 0 rein wenn du den ersten Kanal auswählen willst.

Edit:

4.

sbi ADCSR, ADIF ;logisch "1" löscht ADIF
Wenn du das Bit löschen willst, muss es "cbi ..." heißen.
Aber wozu? Du nutzt den Interrupt doch eh nicht, und selbst wenn, muss man es nicht manuell löschen.

izaseba
21.06.2006, 22:10
Ist das jetzt schon alles?
Oder sind das ein paar wilde Ausschnitte aus einem größerem Programm ?

Woran erkennst Du, daß eine Wandlung erfolgt ist ?
Oder reicht es neuerdings die ADCL u. ADCH Register hin und wieder mal auszulesen?
und die hex2ascii Umwandlung verstehe ich persönlich auch nicht ganz...