www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8: ADC-Wert auf Display ausgeben klappt nicht


Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich will den ADC- Wert eines ATmega8 (1Mhz) auf einem Display ausgeben. 
Das Diplay ist ein Standard-Display mit HD44780 kompatibeln Controller. 
Die lib dazu ist hier aus dem Wiki (.h- Datei: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...) 
und (.c- Datei: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...).
Das Diplay ist meines Wissens richtig angeschlossen, und funktioniert 
auch (Text ausgeben, usw. klappt). Nun wollte ich eben den ADC Wert auf 
dem Display ausgeben, dazu hab ich folgendes Programm geschrieben:
#include<avr/io.h>
#include"lcd-routines.h"
#define F_CPU 1000000
#include <util/delay.h>

int main(void)
{
lcd_init();
set_cursor(3,1);
lcd_string("ADC1 Wert:");
int adcwert;

ADMUX |= (0<<REFS1) | (1<<REFS0);   //VCC als Referenz
ADCSRA = (0<<ADPS2) | (1<<ADPS1) | (1<< ADPS0);  //Frequenzvorteiler auf 8
ADMUX |= (1<<MUX0);  // Kanal 1 waehlen

//Dummy Readyout
ADCSRA |= (1<<ADSC);        
while (ADCSRA & (1<<ADSC) ) {
      ;
    }
adcwert = ADCW;

//Richtiges Readout
while (1) {

ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC) ) {
      ;
    }
adcwert = ADCW;

//Ergebnis auf Display darstellen
set_cursor(6,2);
lcd_data(adcwert);
_delay_ms(500);
}
}

Die Datei lcd-routines.c hab ich unter source files hinzugefügt.
Nun hab ich also die .hex- Datei auf den Mega8 geflasht, und einfach mal 
den ADC1 Pin auf VCC gezogen. Nun erscheint aber auf dem Display nur in 
Zeile 1: ADC1 Wert: (wie es ja auch sein sollte), aber in Zeile 2, wo ja 
der aktuelle ADC Wert sein sollte, ist nur ein Zeichen (schwarzes 
Rechteck).

Wieso funktioniert das Programm nicht?
Kann ich mit lcd_data keine als Integer initialisierte Variablen 
ausgeben? Muss ich dafür lcd_string verwenden?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Steffen O. (derelektroniker)

>lcd_data(adcwert);

Das geht so einfach nicht in C. Du musst deinen ADC-Wert in einen 
ASCII-String umwandeln. Z.B. mit der Funktion itoa, siehe 
Festkommaarithmetik. Den kannst du dann ausgeben.

MfG
Falk

Autor: Chris :) (fr34k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
adcwert = ADCW;

char buf[4];
itoa(adcwert,buf,10);
lcd_data(buf);

so müssts funktionieren ;)

Autor: Chris :) (fr34k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also genauso wies Falk oben schon beschrieben hat ;)

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt mal das von Chris noch eingefügt, aber nun erscheint in 
der zweiten Zeile nur ein S.
Mein Code sieht nun so aus:
//Fuer ATmega8 mit 1Mhz

#include<avr/io.h>
#include"lcd-routines.h"
#define F_CPU 1000000
#include <util/delay.h>
#include <stdint.h>

int main(void)
{
int adcwert;
char buf[5];
lcd_init();
set_cursor(3,1);
lcd_string("ADC1 Wert:");


ADMUX |= (0<<REFS1) | (1<<REFS0);   //VCC als Referenz
ADCSRA = (0<<ADPS2) | (1<<ADPS1) | (1<< ADPS0);  //Frequenzvorteiler auf 8
ADMUX |= (1<<MUX0);
//Dummy Readyout
ADCSRA |= (1<<ADSC);        
while (ADCSRA & (1<<ADSC) ) {
      ;
    }
    adcwert = ADCW;

//Richtiges Readout
while (1) 
{
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC) ) {
      ;
    }
    adcwert = ADCW;

//Ergebnis auf Display darstellen
set_cursor(6,2);
itoa(adcwert,buf,10);
lcd_data(buf);
_delay_ms(500);
}
}

Woran liegt das nun?
Ach ja: Woher kommt die 10 in der Funktion "itoa"?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Steffen O. (derelektroniker)

>Ich hab jetzt mal das von Chris noch eingefügt, aber nun erscheint in
>der zweiten Zeile nur ein S.

S?
Ja klar, weil

>lcd_data(buf);

Diese Funktion gibt nur einzelne Zeichen aus, keine Strings. Das macht 
lcd_string() (Wer hätte DAS gedacht . . .  ;-)
Die Anweisung oben interpretiert buf als Zeichen. Dumm nur, das buf ein 
Pointer ist.

>Ach ja: Woher kommt die 10 in der Funktion "itoa"?

Das ist die Zahlenbasis. Man kann auch in Binär (2), Okal (8) und 
Hexadezimal (16) umwandeln, theoretisch auch in allen (un)möglichen 
anderen Zahlenbasen. Nonalzahlen? ;-)

MFG
Falk

Autor: Chris :) (fr34k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würd mich mal schlaumachen, ob deine lcd routine (die du 
möglicherweise nicht selber geschrieben hast) eventuell eine funktion 
wie "lcd_puts" => fleury lib oda sonst was beinhaltet ;)

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Falk Brunner wrote:
> @ Steffen O. (derelektroniker)
>
>>Ich hab jetzt mal das von Chris noch eingefügt, aber nun erscheint in
>>der zweiten Zeile nur ein S.
>
> S?
> Ja klar, weil
>
>>lcd_data(buf);

Ok, ich hab nun lcd_data durch lcd_string ersetzt, nun erscheint auf dem 
Display eine null.

> Diese Funktion gibt nur einzelne Zeichen aus, keine Strings. Das macht
> lcd_string() (Wer hätte DAS gedacht . . .  ;-)
> Die Anweisung oben interpretiert buf als Zeichen. Dumm nur, das buf ein
> Pointer ist.

Und wie bekomm ich diesen Pointer weg, oder änder ihn so um, dass das 
Display den Variableninhalt anzeigen kann?

>>Ach ja: Woher kommt die 10 in der Funktion "itoa"?
>
> Das ist die Zahlenbasis. Man kann auch in Binär (2), Okal (8) und
> Hexadezimal (16) umwandeln, theoretisch auch in allen (un)möglichen
> anderen Zahlenbasen. Nonalzahlen? ;-)

Danke der Aufklärung ;-).

Gruß, Steffen

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal für eure Antworten !!!(hab ich vorhin vergessen ;-))

Chris :) wrote:
> ich würd mich mal schlaumachen, ob deine lcd routine (die du
> möglicherweise nicht selber geschrieben hast) eventuell eine funktion
> wie "lcd_puts" => fleury lib oda sonst was beinhaltet ;)

Ich verwende die lib hier aus dem wiki, und die hat so weit ich weiß 
keine Funktion lcd_puts. Die Fleury lib könnte ich bei Gelegenheit mal 
ausprobieren.

Gruß, Steffen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Steffen O. (derelektroniker)

>Ich verwende die lib hier aus dem wiki, und die hat so weit ich weiß
>keine Funktion lcd_puts.

Doch, die heisst nur lcd_data ;-)

>Ok, ich hab nun lcd_data durch lcd_string ersetzt, nun erscheint auf dem
>Display eine null.

Teste erstmal, ob die Ausgabe läuft. Weise mal adcwert direkt einen Wert 
zu. Wenn die Anzeige klappt dann stimmt mit deiner ADC-Auswertung was 
nicht.

MFG
Falk

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es nun mal so gemacht:
adcwert=542;
itoa(adcwert,buf,10);
lcd_string(buf);

Und dann erscheint auf dem Display 542, also stimmt warsch. was mit der 
ADC-Routine nicht.
Aber ich hab doch alles so konfiguriert, wie es hier im wiki, bzw. im 
Datenblatt des ATmega8 steht, oder?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es vielleicht daran liegen, dass es nicht funktioniert, weil ich 
die Spannungsversorgung (5V) des Mega8 an den ADC-Eingang gehängt habe? 
Dann sollte doch der ADC eigentlich den höchsten Wert anzeigen, den er 
kann.

Gruß, Steffen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal bessser so.
ADMUX  = (0<<REFS1) | (1<<REFS0);   //VCC als Referenz
ADCSRA = (1<<ADEN) | (0<<ADPS2) | (1<<ADPS1) | (1<< ADPS0);  //Frequenzvorteiler auf 8
ADMUX |= (1<<MUX0);

MFG
Falk

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine schnelle Hilfe, nun klappts.
Allerdings werden irgendwie ganz komische Werte angezeigt.
Wenn ich den ADC Eingang an VCC halte, werden erwartungsgemäß 1023 
angezeigt, und wenn ich ihn an GND halte, ca. 3.
Verbinde ich nun aber den ADC mit dem Schleifer eines 50k Potis, und die 
beiden anderen Kontakte des Potis jeweils mit VCC und GND, dann werden 
mir ganz komische Werte angezeigt, manchmal bis in die 7000-er gehend.
Woran liegt das? Sind 50K irgendwie zu hoch?

Gruß, Steffen

Autor: MAX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich hab zur zeit das gleiche Problem....
wollte dich fragen ob du die Lösung gefunden hast...
Über eine Antwort würde ich mich freuen
bis dann

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Stell dir vor du hast ein magisches kariertes Papier.
Jedesmal wenn du eine Ziffer in ein Kästchen schreibst, verscheindet die 
bereits dort stehende Ziffer und die neue erscheint. Sonst passiert 
nichts. Insbesondere werden andere Kästchen nicht verändert, nur weil du 
in eines davon eine Ziffer schreibst.

Du schreibst da jetzt die Zahl 23 hin

      +---+---+---+---+---+---+
      | 2 | 3 |   |   |   |   |
      +---+---+---+---+---+---+

und jetzt schreibst du (wieder von vorne beginnend) die Zahl 1018 drüber

      +---+---+---+---+---+---+
      | 1 | 0 | 1 | 8 |   |   |
      +---+---+---+---+---+---+

nicht sonderlich aufregend. Aber jetzt schreibst du (wieder von vorne 
beginnend) die Zahl 234 drüber

      +---+---+---+---+---+---+
      | 2 | 3 | 4 | 8 |   |   |
      +---+---+---+---+---+---+

Hoppala. Was ist jetzt passiert. Auf deinem Papier steht 2348 und nicht 
234!
Warum?
Ganz klar, weil die 8 immer noch von den 1018 dort steht. 1018 hat 4 
Ziffern, 234 aber nur 3. Und damit ist die 8 von den 1018 nie 
überschrieben worden und täuscht dir eine Zahl vor, die du so nie 
ausgegeben hast.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.