Forum: Compiler & IDEs zweiter ADC-Wert auf LCD ausgeben


von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin gerade dabei ein LCD-Display zu betreiben, hierfür verwende ich 
die fleury-Dateien, welche auch wundebar funktionieren.
Nun will ich auf dem Display einen ADC-Wert ausgeben, was auch wunderbar 
soweit funktioniert.
Versuche ich nun meinen zweiten ADC-Wert auf dem Display auszugeben 
funktioniert das nicht, es wird immer noch der erste Wert ausgegeben, am 
zweiten allerdings tut sich nüschd.
Wenn ich im Multiplexredister den zweiten AD-Kanal (PA1) auswähle, 
meinen unteren Teil (der hinter "//test) ausblende, dann kann ich den 
zweiten Wert über nen Poti verstellen. Also diese Zuweisung 
funktioniert.
Nun will ich aber den PA0 und den PA1 auf dem Display ausgeben, und da 
verliesen sie ihn...

In meinem Projekt verwende ich ein 4-Zweilen Display und einen ATMEGA32.


Im Voraus vielen Dank für eure Hilfe

Thorsten

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

...hier meine lcd.h...

Thorsten

von Sprachhüter (Gast)


Lesenswert?

Wo stößt du denn die zweite Konvertierung an, und wo wartest du auf 
deren Ergebnis?

von Thorsten (Gast)


Lesenswert?

in der lcdadc.c unter dem //test

Also:
ADMUX=ADC1;        /*Ausgabe ADC1-Wert*/

result1=ADC;      /*AD-Wandlungsergebnis aus ADC-Register
            abholen*/
itoa(result1,buffer1,10);  /*10Bit Anpassung des ADC Wertes als
                                    Integer Wert*/
lcd_gotoxy(15,0);      /*Cursor auf Display zweite Temp.*/
lcd_puts(buffer1);

Die Ausgabe erwarte ich dann bei lcd_puts. Für den ersten Wert hat dies 
ja auch genügt, es sind nur die Variablen verändert...

Thorsten

von Sprachhüter (Gast)


Lesenswert?

Da stellst du den Multiplexer um und liest den Wert aus. Nochmals, wo 
stößt du die Wandlung an und wartest auf das Ergebnis, so wie du es bei 
der ersten Wandlung getan hast?

> Für den ersten Wert hat dies ja auch genügt, es sind nur die Variablen
> verändert...

Wo ist dann das
1
ADCSRA |= _BV(ADSC);         /*ADC-Wandler neu "ansto�m*/            
2
while (ADCSRA & _BV(ADSC) )     /*warten bis die AD-Wandlung fertig ist*/
3
{
4
}//end while

für die zweite Wandlung?

von Thorsten (Gast)


Lesenswert?

Muss ich dass etwa vor jedem neu einzulesenden ADC-Wert schreiben?
Hab das nämlich eben gleich probiert, hat aber leider auch nichts 
bewirkt...

Thorsten

von Stefan K. (_sk_)


Lesenswert?

Bring mal ein bischen Ordnung in Dein Program. Diese 4 Teile gehören zu 
JEDER Wandlung:

* Multiplexer setzen
* AD-Wandlung starten
* Warten, bis AD fertig
* Ergebnis aus ADC auslesen

Dass das "auch nichts bewirkt" hat, wird wohl daran liegen, dass Du den 
MUX NACH der 1.Wandlung setzt und VOR der 2.Wandlung.

Häng Deinen Code doch einfach nochmal an, nachdem Du was geändert hast.

Stefan

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

...anbei meine geänderte Datei.
Mach ich da einen prinzipiellen Fehler?!?

* Multiplexer setzen
* AD-Wandlung starten
* Warten, bis AD fertig
* Ergebnis aus ADC auslesen

diese Reihenfolge hab ich eingehalten. Zudem wird mein MUX nun vor jeder 
Wandlung gesetzt...

Thorsten

von Sprachhüter (Gast)


Lesenswert?

> Muss ich dass etwa vor jedem neu einzulesenden ADC-Wert schreiben?

Natürlich.

von Stefan K. (_sk_)


Lesenswert?

Jetzt sieht es eigendlich ganz ok aus, misst Du wirklich noch 2* 
denselben Wert?

Hier stimmt noch was nicht:
1
#define ADC0 00000;
2
#define ADC1 00001;
3
#define ADC2 00010;
4
#define ADC3 00011;
5
#define ADC4 00100;
6
#define ADC5 00101;
7
#define ADC6 00110;
8
#define ADC7 00111;
Im Manual sind die Werte ADC0 - ADC7 in Bitdarstellung gezeigt. Was Du 
hier schreibst, sind aber "normale" Dezimalzahlen. Auch das Semikolon 
hinten ist nicht ok. Besser:
1
#define ADC0 0
2
#define ADC1 1
3
#define ADC2 2
4
#define ADC3 3
5
#define ADC4 4
6
#define ADC5 5
7
#define ADC6 6
8
#define ADC7 7
Für die Werte ADC0 und ADC1 ist das Ergebnis aber (zufällig) dasselbe, 
daran kann Dein Problem also nicht liegen.

Stefan

von Thorsten (Gast)


Lesenswert?

Sorry, ich glaub ich hab mich falsch ausgedrückt, werds aber nocmal 
versuchen...
Ich habe deine Ändeungen in meinen defs nun gemcht und das Ergebnis ist 
immer noch unverändert, ich bekomme nur einen ADC-Wert auf das Display 
ausgegeben, obwohl ich nach der Ausgabe des ersten ADC den MUX neu 
setze, die AD-Wandlung neu anstoße und diesen Wert dann über buffer1[6] 
auf mein Display in Zeile 1 Zeichen 15 schreibe. Tatsächlich aber 
funktioniert dies nicht. Der erste Wert ist vollständig i.O. und wird 
auch ohne Probleme ausgegeben.
Um die Funktion und Anbindung von meinem POTI zu überprüfen habe ich 
spasshalber meinen ersten MUX auf ADC1 (also PA1) gestellt und den 
zweiten auf ADC0. Die Folge war dann dass ich mein zweites Poti 
verstellen konnte und das erste dafür nichtmehr. Also HW ist soweit 
OK....


Thorsten

von Stefan K. (_sk_)


Lesenswert?

sorry, ich sehe keinen Fehler mehr.

Wieviel zeichen hat Dein Display?
Kannst Du "normalen" Text an die Pos(15, 0) schreiben?

Stefan

von Sprachhüter (Gast)


Lesenswert?

> ich bekomme nur einen ADC-Wert auf das Display ausgegeben

Ach, das heißt, ein zweiter Wert wird gar nicht angezeigt? Ich dachte, 
es käme derselbe wie bei der ersten Messung oder immer 0 oder sowas 
raus. Wenn gar nix angezeigt wird, liegt's wohl eher an der 
LCD-Ansteuerung als am ADC-Einlesen.

von Thorsten (Gast)


Lesenswert?

...mittlerweile bin ich einen Schritt weitergekommen, und zwar hab ich 
einfach mal die restliche Ausgabe vom LCD ausgeblendet, und siehe da, es 
kommen zwei ADC-Werte an die ich mit zwei unterschiedlichen POTIS 
unterschiedlich verstellen kann. Also prinzipiell genau dass was ich 
haben möchte.
Nach ner kleinen Untersuchung hab ich nun festgestellt dass mir meine 
"gotoxy-Befehle" irgendwie negativ ins Zeug spielen. Woran kann dass 
liegen und gibt es eine andere Möglichkeit meinen Cursor aufm Display zu 
versetzen?

Thorsten

von Thorsten (Gast)


Lesenswert?

...ich habe den Code nun nochmals geschrieben und der Fehler ist weg...

Vielen lieben Dank für eure Unterstützung....

Thorsten

PS Eine Frage hätte ich aber noch:
Ist es normal dass je mehr adc-Werte auf dem Display ausgegeben werden 
desto blasser (bis fast unsichtbar) werden die einzelnen?!?

von Stefan K. (_sk_)


Lesenswert?

>PS Eine Frage hätte ich aber noch:
>Ist es normal dass je mehr adc-Werte auf dem Display ausgegeben werden
>desto blasser (bis fast unsichtbar) werden die einzelnen?!?

Du machst nichts anderes als auf Dein lcd zu schreiben. Zuerst schreibst 
Du einen festen String rein, dann kommt der AD-Wert drüber, dann wieder 
von vorne. Das das nicht gut aussieht, ist klar.

Warte mal eine Weile zwischen den Ausgaben, dann wird das Bild auch 
korrekt sein.
Oder schreibe nicht ständig die konstanten Strings ins lcd (dabei 
überschreibst Du nämlich die dort stehenden AD-Werte mit Leerzeichen).

Am besten, Du änderst die AD-Werte auf dem lcd nur dann, wenn sie sich 
wirklich geändert haben.

Stefan

von Thorsten (Gast)


Lesenswert?

Klar, das werde ich mal versuchen.

Dankeschön

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.