mikrocontroller.net

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


Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...hier meine lcd.h...

Thorsten

Autor: Sprachhüter (Gast)
Datum:

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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sprachhüter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
ADCSRA |= _BV(ADSC);         /*ADC-Wandler neu "ansto�m*/            
while (ADCSRA & _BV(ADSC) )     /*warten bis die AD-Wandlung fertig ist*/
{
}//end while     

für die zweite Wandlung?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sprachhüter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Muss ich dass etwa vor jedem neu einzulesenden ADC-Wert schreiben?

Natürlich.

Autor: Stefan Kleinwort (_sk_)
Datum:

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

Hier stimmt noch was nicht:
#define ADC0 00000;
#define ADC1 00001;
#define ADC2 00010;
#define ADC3 00011;
#define ADC4 00100;
#define ADC5 00101;
#define ADC6 00110;
#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:
#define ADC0 0
#define ADC1 1
#define ADC2 2
#define ADC3 3
#define ADC4 4
#define ADC5 5
#define ADC6 6
#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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich sehe keinen Fehler mehr.

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

Stefan

Autor: Sprachhüter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, das werde ich mal versuchen.

Dankeschön

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.