Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC und LCD


von Christian L. (christianlienen)


Lesenswert?

Guten Abend,
ich habe ein Problem mit meinem ADC bzw. mit meinem LCD.
1
  int main(void)
2
  {
3
4
  uint16_t variable;
5
  char Buffer[10];
6
7
      lcd_init();
8
      ADC_Init();
9
 
10
11
  while(1)
12
      {
13
    lcd_setcursor( 0, 1 );
14
    lcd_string("Analogwert");
15
      lcd_setcursor( 0, 2 );
16
      variable = ADC_Read(0);
17
    itoa( variable, Buffer, 10 ); 
18
      lcd_string( Buffer );
19
      }
20
 
21
    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

von holger (Gast)


Lesenswert?

>Wo liegt das Problem?

Vermutlich in der Funktion ADC_Read()

von Christian L. (christianlienen)


Lesenswert?

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

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

von Christian L. (christianlienen)


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?

von holger (Gast)


Lesenswert?

>Gibt es noch eine elegantere Lösung?

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

von Spess53 (Gast)


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

von Christian L. (christianlienen)


Lesenswert?

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

von Peter D. (peda)


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&file=viewtopic&t=102296


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

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.