Folgendes Problem hab ich: Also ich möchte gerne eine Spannung mithilfe des im Mega8 integrierten ADC messen und auf einem 2x16 LCD ausgeben. Die Ansteuerung des LCD funktioniert wunderbar. (Peter Fleury's LCD lib) Aber der ADC will nicht so richtig. Ich verwende die int. Ref Spannung von 2,56 V die ich auch am AREF Pin messen kann. Die zu messende Spannung von 2 V die über einen Spannungsteiler erzeugt wird, liegt am ADC5 an. Auf dem LCD erscheint immer 0. Mir ist schon klar, dass ich den Wert, der mir der ADC liefert schon noch umrechnen muss, da der ACD nur einen Wert zw. 0 und 1023 liefert. Da ich noch Anfänger bin, was die speziellen Funktionen eines AVR betriff, bin ich jedem sehr dankbar, der mir irgendwie weiter helfen kann. Das AVR Tutorial hab ich auch schon durch, sieht man viellicht am Code.
Hi Wenn du keinen Wert messen kannst gibt es folgende Moglichkeiten: -ADEN nicht gesetzt -ADC nicht gestartet ->ADSC -ADIE nicht gesetzt (wenn Du Interrupt benutzt) -Falscher Vorteiler ,ADC arbeitet nur in einem bestimmten Frequenzbereich -Eingangsmultiplexer auf falschen Eingang Mfg HG
Die Einstellungen hab ich schon überprüft. Einen anderen AVR hab ich auch schon ausprobiert. Wie schon gesagt, ich bin noch Anfänger was die "Sonderfunktionen" eines µC betrifft. Deswegen hab ich mal meinen Code und den Schaltplan gepostet.
Hab meinen Fehler gefunden: lcd_puts(" ATmega 8 V1.3\n"); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1); ADMUX |= (1<<REFS1) | (1<<REFS0) | (1<<MUX2) | (1<<MUX0); _delay_ms (10); // hier war der Fehler x = ADC; itoa(x,buffer,10); lcd_puts("ADC:"); lcd_puts(buffer); Nach dem Messen muss ich ja erst warten bis das Ergebniss im Register liegt. Die Rohdaten kann ich nun anzeigen. Problem Nr. 2 zum Umrechnen in einen Spannungswert muss ich ja folgendes Rechnen: result = ((2560/1023)/x) Problem ist nur, dass 2560/1023 2,50 ergibt, aber der µC mit 2 rechnet. Wie kann ich denn mit Kommazahlen rechnen ?
rechne mit 250 (oder 25) und bastle das komma in der anzeige zwei (eine) stellen nach vorne. Gruß CrashCode
Wenn ich folgendes eingebe, stimmt das Ergebnis: result = ((2560.0/1023.0)/x) Aber wie bekomme ich ein Komma in die itoa funktion ? Dort werden nämlich nur ganze Zahlen angezeigt.
sprintf_P(buffer, "%4.2", result); Dieser Befehl erzeugt nur wirre Zeichen auf meinem LCD.
Grr, ohne Edit-Funktion immer wieder ärgerlich
1 | float result; |
2 | char buffer[17]; // Nehme an, das LCD hat 16 Spalten ;) |
3 | |
4 | lcd_puts(" ATmega 8 V1.3\n"); |
5 | |
6 | ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1); |
7 | ADMUX |= (1<<REFS1) | (1<<REFS0) | (1<<MUX2) | (1<<MUX0); |
8 | |
9 | _delay_ms (10); // hier war der Fehler |
10 | |
11 | result = ((2560.0/1023.0)/(float)ADC); |
12 | |
13 | sprintf_P(buffer, "ADC:%4.2f", result); |
14 | |
15 | lcd_puts(buffer); |
Hab leider nix zum Testen da
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.