mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analogwerte auslesen


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte vor ein meinem ATmega8 eine analoge Spannung auszulesen um sie 
dann anschließen auf dem LCD Display auszugeben.Nun habe ich das Problem 
dass auf dem Display nicht der Wert steht sondern irgendwelche Zeichen 
angefangen von geteilt Zeichen bis zum Doppelpunkt. Mir da jemand 
weiterhelfen?

Funktion  zum auslesen:

...

//Analogwerte lesen
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    //Frequenzvorteiler 
  // setzen auf 8 (1) und ADC aktivieren (1)

  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen 

  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
  also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) 
  {
    ;     // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
  // sonst wird Ergebnis der nächsten Wandlung
  // nicht übernommen.

  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) 
    {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)

  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert

  return result;
}
...


Ausgabe:
main (void)            // Hauptprogramm, startet bei Power ON und Reset
{
  char d=0;
  wait_ms(200);
  lcd_init();
  lcd_dimmer(d+=5);

  while(1)
  {
    uint16_t adcval;
    adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
    lcd_write(adcval);
    wait_ms(50000);
    lcd_clear();
    lcd_home();
    wait_ms(100);
  }

  return 0;

}


Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Text-LCD (z.B. HD 44870) will ASCII-Zeichen, du sendest ein 
Binärwert.
Der binäre Wert vom ADU muss in ASCII umgewandelt werden.
Es müssen dann mehrere Zahlen gesendet werden.

z.B.: ADU-Wert = 104  ==> sende 0x31, 0x30 und 0x34 an LCD.

Hatte das gleiche Problem. Hab es über vergleiche gelöst, ist aber etwas 
umständlich.

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

Bewertung
0 lesenswert
nicht lesenswert

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.