-
        

Ergebnis 1 bis 3 von 3

Thema: Atmel Assembler ... ADC Wert auf LCD anzeigen lassen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2006
    Beiträge
    9

    Atmel Assembler ... ADC Wert auf LCD anzeigen lassen

    Anzeige

    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*


    Code:
    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]

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.02.2006
    Alter
    47
    Beiträge
    781
    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.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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...
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •