Forum: Mikrocontroller und Digitale Elektronik Analog Wert über LCD ausgeben


von Mash110 (Gast)


Lesenswert?

Hallo,

Ich habe eine Feuchtigkeitssensormodul welches eine Analoge Spannung 
ausgibt. Ich möchte den wert auf einem LCD (HD44780) ausgeben. Ich kann 
normale strings ausgeben. Wie muss der ADC am Atmega 32 konfiguriert 
werden ? Ich bin mit dem Tutorial dazu nicht ganz klar gekommen.? Das 
ist der C Code bis jetzt.
1
#define F_CPU 1000000
2
#define ADATE 5
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include "lcd-routines.h"
7
8
int main(void)
9
{
10
  char outpt[16];
11
  //int luft;
12
  uint16_t lu;
13
  void ADC_Init(void){
14
  //ADC Laden
15
  ADMUX = (1<<REFS0); //AVcc als Referenz
16
  ADCSRA = (1<<ADPS1) | (1<<ADPS0); //Frequenzvorteiler
17
  ADCSRA |= (1<<ADEN); //ADC Aktivieren
18
  //Dummy readaot
19
  ADCSRA |= (1<<ADSC);
20
  while (ADCSRA & (1<<ADSC)){
21
    }
22
    (void) ADCW;
23
  }
24
  
25
    while(1)
26
    {
27
    //einzelmessung
28
    uint16_t ADC_Read( uint8_t channel )
29
    {
30
      //Kanal wählen
31
      ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
32
      ADCSRA |= (1<<ADSC); //Eine Wandllung sigel conversion
33
      while (ADCSRA & (1<<ADSC)) //Auf Abschluss warten
34
      {
35
        return ADCW;
36
        lu = ADCW;
37
      }
38
    }
39
    itoa(lu, outpt,10);
40
    lcd_clear();
41
    lcd_string("Luft.: ");
42
    lcd_string(outpt);
43
    lcd_string("%");
44
    _delay_ms(5000);
45
    }
46
}

Gruß
Mash110

von Wolfgang (Gast)


Lesenswert?

Mash110 schrieb:
> Wie muss der ADC am Atmega 32 konfiguriert werden ?

Das kommt drauf an, was dein Feuchtigkeitssensormodul für Spannungen 
ausgibt und ob die Werte abhängig oder unabhängig von der 
Versorgungsspannung sind.

von Karl M. (Gast)


Lesenswert?

Mash110,

lerne erst mal 2-5 Jahre die C Grundlagen, das was Du da ablieferst, ist 
sehr sehr schlecht !

von Ralph S. (jjflash)


Lesenswert?

hmm, sehr "arger" C-Kauderwelsch (schlecht zu lesen):

Wolfgang schrieb:
> Das kommt drauf an, was dein Feuchtigkeitssensormodul für Spannungen
> ausgibt und ob die Werte abhängig oder unabhängig von der
> Versorgungsspannung sind.

Recht gebe (ohne jetzt die Initialisierungs- und Leseroutinen des 
ATmega32 zu überprüfen) !

Folgende Fehler zudem:

Du hast innerhalb deiner Main eine Funktion

void ADC_Init(void)

... rufst diese aber nirgendwo auf !!! Von daher ist dein ADC NICHT 
initialisiert !!!


Du hast weiterhin innerhalb deiner Main eine Funktion

uint16_t ADC_Read( uint8_t channel )

... rufst diese aber ebenfalls nirgendwo auf !!!

Mir scheint, als hättest du diese beiden Funktionen irgendwoher kopiert, 
in deinen Editor eingefügt ohne zu verstehen, dass diese Funktionen 
"Unterprogramme" sind (die sicherlich außerhalb der Main stehen 
sollten)...


Irgendwie in dieser Art sollte dein Programm aussehen:
1
#define F_CPU 1000000
2
#define ADATE 5
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include "lcd-routines.h"
7
8
9
void ADC_Init(void){
10
11
  // Dein Initialisierungscode steht hier
12
}
13
14
uint16_t ADC_Read( uint8_t channel ){
15
16
  // Der Code zum Auslesen des ADC steht hier
17
}
18
19
int main (void){
20
  char outpt[16];       // dein Textpuffer der einen String aufnehmen soll
21
22
  uint16_t lu;          // deine Variable fuer deine Luft
23
24
  lcd_clear();          // wahrscheinlich nimmt lcd_clear auch eine
25
                        // Initialisierung vor, ansonsten wuerdest du auf
26
                        // dem Display auch nichts sehen. Wenn es ein 
27
                        // lcd_init() gibt, waere dieses aufzurufen besser
28
  ADC_Init();           // initialisiert deinen ADC 
29
  while(1)
30
  {
31
    // hier stehen jetzt erst mal Textausgaben fuers Display
32
33
    lu= ADC_Read(0);    // hier musst du wissen, an welchen ADC-Pin du den
34
                        // Sensor angeschlossen hast. lu wird der Wert der
35
                        // Funktion zugewiesen
36
    itoa(lu, outpt,10); // Wandlung einer Integervariable in einen AsciiZ
37
                        // String
38
39
    // hier steht dann die Stringausgabe deines Displays
40
  }
41
}

(Das ganze jetzt ohne auf Fehler zu prüfen... denn deine Struktur im
Programm ist meiner Meinung nach grundsätzlich falsch). Du schreibst 
Funktionen (Unterprogramme) um diese später aufzurufen. Hier 
unterscheidest du Funktionen die "einfach nur etwas machen" ohne etwas 
"zurückzuliefern" : void (steht für nullkommagarnixgibtszurück") und
Funktionen die einen Rückgabewert eines bestimmten Typs haben (in deinem 
Fall liefert ADC_Read etwas vom Typ int zurück... diese Rückgabe kannst 
du einer Variablen zuweisen).

Vllt. solltest du (ohne es so krass wie Karl M. zu sagen) die einmal ein 
paar einfache Programme ansehen um zu ergründen wie die Struktur eines 
C-Programms aussehen kann).

Gute Nacht,

Ralph

von Ralph S. (jjflash)


Lesenswert?

Noch etwas:

return ADCW;
lu = ADCW;


in "return ADCW" wird das Ergebnis der Analog-Digital Wandlung 
zurückgegeben und die Funktion (das Unterprogramm verlassen).

die Zeile "lu = ADCW" wird nie ausgeführt !

von Mash110 (Gast)


Lesenswert?

Danke Ralph S.

Jetzt habe ich das hinbekommen, dass der Wert ausgegeben wird.

Zugegeben der Code war nicht meine Meisterleistung, aber sowas kann mal 
passieren wenn man einfach nicht weiter kommt.

Jetzt würde ich den Wert noch gerne in % umrechnen wollen. Ich suche mal 
nach einer Lösung.

einen schönen Abend noch

Mash110

von Karl M. (Gast)


Lesenswert?

Mash110 hat weiterhin von nichts eine Ahnung.

Prozentrechnung, wie war das 4 Klasse?

Der n.te Teil von 100 Teilen..
1% entspricht 1/100 usw.

von W.A. (Gast)


Lesenswert?

Mash110 schrieb:
> Jetzt würde ich den Wert noch gerne in % umrechnen wollen. Ich suche mal
> nach einer Lösung.

"Dreisatz" könnte ein gutes Stichwort für die Suche sein.

von Mash110 (Gast)


Lesenswert?

Ahhh ja .... :D

Karl M. schrieb:
> Mash110 hat weiterhin von nichts eine Ahnung.
>
> Prozentrechnung, wie war das 4 Klasse?
>
> Der n.te Teil von 100 Teilen..
> 1% entspricht 1/100 usw.

von Marc S. (marc_s86)


Lesenswert?

Mash110 schrieb:
> aber sowas kann mal passieren wenn man einfach nicht weiter kommt.

Nein sowas kann nie passieren.

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.