PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe auf LCD, Frage...



The_Darkside
21.01.2006, 15:44
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.

uwegw
21.01.2006, 15:51
wie sieht dein code aus?
gib mal den nicht-umgerechneten wert direkt aus. dann müssten sich Werte zwischen 0 und 1023 ergeben...

The_Darkside
21.01.2006, 16:07
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.

The_Darkside
22.01.2006, 15:47
Hier ist mal der 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);
}
}

}

linux_80
22.01.2006, 17:35
Hallo,

ich glaub da zwickts:

ADMUX = channel;
ADMUX = (1<<ADLAR);
danach ist der channel wieder dahin !
hier geht noch ein | ab, am besten in eine Zeile:

ADMUX = (1<<ADLAR) | channel;

Dann geht noch die Referenzspannung ab.

The_Darkside
23.01.2006, 08:03
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...

The_Darkside
23.01.2006, 14:55
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:


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 ;)

SprinterSB
23.01.2006, 17:11
Das Wandeln geht so:


// 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);

The_Darkside
24.01.2006, 10:28
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

SprinterSB
24.01.2006, 11:13
Nö, nach 330 sollte 331 kommen:

330, 331, 332, 333, 1000, 1001, ...

The_Darkside
24.01.2006, 12:16
Wie jetzt? Nach 333 käme 1000? (sogenau kann man das Poti auch gar nicht schieben) aber wie soll man die Werte dann jemals in was verwertbares umrechenen.

Das versteh ich nicht... bei mir käme nach 333, 334...

SprinterSB
24.01.2006, 12:27
Oben hattest du 4 angegeben als Zahlensystem, und da kommt nach 333 eben 1000. Im zweiten Beispiel ist die Basis 10, und die Darstellung wie gewohnt.

The_Darkside
24.01.2006, 12:46
Also doch so wie vermutete, ich werd mal lesen lernen, dann ist es viel. einfacher Dokumentationen zu verstehen ;)

The_Darkside
25.01.2006, 14:48
Ganz vielen Dank, jetzt macht es genau das was es soll. Damit habe ich die Grundlage für mein Projekt. Kann ich mich nun an die nächsten Schritte wagen. :)
Manchmal müsste einfach ne Information mehr in den Dokus der Lib's bzw. den API Dokus stehen. (oder man müsste lesen können)