Forum: Mikrocontroller und Digitale Elektronik Analogwerte auslesen


von Tim (Gast)


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:
1
...
2
3
//Analogwerte lesen
4
uint16_t ReadChannel(uint8_t mux)
5
{
6
  uint8_t i;
7
  uint16_t result;
8
9
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    //Frequenzvorteiler 
10
  // setzen auf 8 (1) und ADC aktivieren (1)
11
12
  ADMUX = mux;                      // Kanal waehlen
13
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen 
14
15
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
16
  also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
17
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
18
  while ( ADCSRA & (1<<ADSC) ) 
19
  {
20
    ;     // auf Abschluss der Konvertierung warten 
21
  }
22
  result = ADCW;  // ADCW muss einmal gelesen werden,
23
  // sonst wird Ergebnis der nächsten Wandlung
24
  // nicht übernommen.
25
26
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
27
  result = 0; 
28
  for( i=0; i<4; i++ )
29
  {
30
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
31
    while ( ADCSRA & (1<<ADSC) ) 
32
    {
33
      ;   // auf Abschluss der Konvertierung warten
34
    }
35
    result += ADCW;        // Wandlungsergebnisse aufaddieren
36
  }
37
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
38
39
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
40
41
  return result;
42
}
43
...


Ausgabe:
1
main (void)            // Hauptprogramm, startet bei Power ON und Reset
2
{
3
  char d=0;
4
  wait_ms(200);
5
  lcd_init();
6
  lcd_dimmer(d+=5);
7
8
  while(1)
9
  {
10
    uint16_t adcval;
11
    adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
12
    lcd_write(adcval);
13
    wait_ms(50000);
14
    lcd_clear();
15
    lcd_home();
16
    wait_ms(100);
17
  }
18
19
  return 0;
20
21
}

von Bastler (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?


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.