mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC und LCD


Autor: Christian L. (christianlienen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
ich habe ein Problem mit meinem ADC bzw. mit meinem LCD.
  int main(void)
  {

  uint16_t variable;
  char Buffer[10];

      lcd_init();
      ADC_Init();
 

  while(1)
      {
    lcd_setcursor( 0, 1 );
    lcd_string("Analogwert");
      lcd_setcursor( 0, 2 );
      variable = ADC_Read(0);
    itoa( variable, Buffer, 10 ); 
      lcd_string( Buffer );
      }
 
    return 0;

Der Code liefert mir den Analaogwert von Channel 0 auf meinem Display. 
Nun habe ich jedoch das Problem, dass wenn ich das Poti wieder runter 
drehe, auch in der 0 Stellung des Potis "0520" stehen bleibt.
Starte ich den µC wieder neu, wird auch der Wert wieder auf Null gesetzt 
und ich kann ohne Probleme hoch drehen.
Das Problem beim herunterdrehen bleibt jedoch bestehen.
Wo liegt das Problem?
Viele Grüße

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo liegt das Problem?

Vermutlich in der Funktion ADC_Read()

Autor: Christian L. (christianlienen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
  return ADCW;                    // ADC auslesen und zurückgeben
}

Normalerweise müsste die doch funktionieren, da sie aus dem Tutorial 
stammt.
Viele Grüße

Autor: Christian L. (christianlienen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem liegt anscheinend darin, dass das LCD die Zeichen, die nicht 
geändert werden, einfach stehen lässt.
Ich habe nun am Ende der while Schleife ein lcd_clear() eingebaut.
Jetzt verschwinden die überflüssigen Zeiten.
Nun flackert das Bild jedoch, da es sich ja jedesmal wieder neu aufbauen 
muss.
Gibt es noch eine elegantere Lösung?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es noch eine elegantere Lösung?

Ja, mach mal ne Pause nach der Ausgabe aufs LCD;)

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Gibt es noch eine elegantere Lösung?

Schreibe einfach ein paar Leerzeichen vorher hin oder ersetze die 
führenden Nullen in Buffer durch Leerzeichen.

MfG Spess

Autor: Christian L. (christianlienen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön ;)
Habe jetzt einfach die sprintf-Funktion auf %4u geändert.
Läuft.
Viele Grüße

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Idealer Weise schreibt man sich noch eine Funktion, die eine Anzahl 
Leerzeichen schreibt. Und mit strlen ermittelt man, wieviel es sein 
müssen.
Auch schreibt man Zahlen gerne rechtsbündig.
Hier mal ein Beispiel:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...


Das lcd_clear solte man generell verbannen. Das dadurch hervorgerufene 
Flackern sieht äußerst unprofessionell aus.
Leider sieht man oft auch kommerzielle Geräte, die heftig vor sich hin 
flackern.


Peter

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.