Forum: Mikrocontroller und Digitale Elektronik ADC Messwert auf LCD ausgeben


von Tobias P. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Tobias P. (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch der Schaltplan.

von Hartmut Gröger (Gast)


Lesenswert?

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

von Tobias P. (Gast)


Lesenswert?

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.

von Tobias P. (Gast)


Lesenswert?

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 ?

von CrashCode (Gast)


Lesenswert?

rechne mit 250 (oder 25) und bastle das komma in der anzeige zwei (eine)
stellen nach vorne.

Gruß



CrashCode

von Tobias P. (Gast)


Lesenswert?

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.

von Henning S. (xtsi)


Lesenswert?

1
  sprintf_P(buffer, "%4.2", result);

von Tobias P. (Gast)


Lesenswert?

sprintf_P(buffer, "%4.2", result);

Dieser Befehl erzeugt nur wirre Zeichen auf meinem LCD.

von Henning S. (xtsi)


Lesenswert?

Natürlich muss result ein float sein. Hab es nicht getestet.

von Henning S. (xtsi)


Lesenswert?

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
Noch kein Account? Hier anmelden.