-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Ausgabe auf LCD, Frage...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25

    Ausgabe auf LCD, Frage...

    Anzeige

    Nun hab ich mich mal an das einlesen von Daten über den ADC gemacht. Genau diese geb ich dann wieder auf das LCD aus. Das funkt. prinzipiell auch, allerdings bekomm ich nur Schwachsinn zu sehen. Das einlesen usw. funkt, denn immerhin ändert sich der Inhalt des Displays beim ändern der Spannung am ADC Eingang.
    Irgendwas muss ich doch falsch machen, ich rechne den einlesenen Wert um (ADC-Wert*Vref/1023) und geb den Wert aus.
    Wie bekomme ich eine vernünftige Anzeige, als den echten Wert dann zustand? Irgendwie muss ich vermutlich den Wert konvertieren, aber wie?
    Wäre schön, wenn jemand helfen könnte...

    Danke im voraus.


    PS: hab schon ne Menge Howtos und Manuals gelesen, bin aber irgendwie noch auf keinen Nenner gekommen.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    wie sieht dein code aus?
    gib mal den nicht-umgerechneten wert direkt aus. dann müssten sich Werte zwischen 0 und 1023 ergeben...

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25
    Den Code hab ich leider nicht im Kopf, und daheim kein Inet. Wenn ich direkt nen Wert aufs Display schreib, funkt das auch. Der Wert direkt, vor dem umrechen führt zum gleichen Ergebnis.
    Ich weiß ne, was das soll.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25
    Hier ist mal der Code:

    Code:
    uint16_t readChannel(uint8_t channel){
    	uint8_t i;
    	uint16_t result;
    	// ADC aktivieren, Vorteiler 128 --> 8Mhz/128 = 62.5kHz
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    	ADMUX = channel;
    	ADMUX = (1<<ADLAR);
    	// eine Messung durchführen, Ergebnis verwerfen
    	ADCSRA |= (1<<ADSC);
    	while(!(ADCSRA & (1<<ADIF)));
    	result = 0;
    	//vier mal Messen
    	for(i=0;i<4;i++){
    		ADCSRA |= (1<<ADSC);
    		while(!(ADCSRA & (1<<ADIF)));
    		result += ADCH;
    	}
    	//ADC abstellen
    	ADCSRA &= ~(1<<ADEN);
    	result >>= 2; // Mittelwert bilden
    	//Ergebnis zurückgeben
    	return result;
    }
    
    int main(void){
    	uint16_t  out_lcd = 0;
    	uint16_t temp = 0;
    	lcd_init(LCD_DISP_ON_CURSOR_BLINK);
    	lcd_clrscr();
    	lcd_home();
    	while(1){
    		out_lcd = readChannel(0);
    		if(temp!=out_lcd){
    			lcd_clrscr();
    			lcd_home();
    			temp = out_lcd;
    			lcd_puts((char*)out_lcd);
    		}
    	}  	
    	
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    ich glaub da zwickts:
    Code:
     ADMUX = channel;
     ADMUX = (1<<ADLAR);
    danach ist der channel wieder dahin !
    hier geht noch ein | ab, am besten in eine Zeile:
    Code:
    ADMUX = (1<<ADLAR) | channel;
    Dann geht noch die Referenzspannung ab.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25
    Ahso, das werd ich probieren. Die Referenzspannung nehm ich über Aref mit 5V.
    Wiegesagt irgendewas misst er ja, sonnst würde sich beim verstellen des Potis ja, denke ich, nichts auf der Anzeige ändern.
    Danke erstmal...

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25
    Vermutlich muss ich den Wert ja auch noch in irgendetwas darstellbares umwandeln, oder?

    So hätte ich vom ADC z.B. den Wert 0x3cc und wenn ich den aufs Display ausgebe, steht da eben nicht 972, sondern irgendein Humbug bzw. ' '', oder seh ich das falsch?

    Könnte man das eventl. so lösen:
    Code:
      char adc_zur_ausgabe[4];
      char *p_adc_zur_ausgabe = adc_zur_ausgabe;
      itoa(adc_wert,p_adc_zur_ausgabe,4);
    wobei in adc_wert der Wert vom Adc steht

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Das Wandeln geht so:
    Code:
    // genügend Platz + 1 Endezeichen, (max 65535 = 2**15 - 1)
    char adc_zur_ausgabe[6]; 
    // 10 ist Radix (Zahlensystem)
    itoa (adc_wert, adc_zur_ausgabe, 10);
    Disclaimer: none. Sue me.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    07.09.2005
    Beiträge
    25
    Das erklärt dann vermutlich warum bei meiner Variante die ausgegebenen Zahlen zwischen 0 und 3330 stehen, wobei nach 330 gleich 1000 kommt.
    Hab mich schon gewundert

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Nö, nach 330 sollte 331 kommen:

    330, 331, 332, 333, 1000, 1001, ...
    Disclaimer: none. Sue me.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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