Forum: Mikrocontroller und Digitale Elektronik Hilfe bei ADC Übung


von Juston (Gast)


Lesenswert?

Hallo,
ich möchte mit meinem AT Mega 32 über den ersten Analog Digital 
Converter ein Analoges Signal einlesen, dieses Umwandeln und an Pin B in 
Binerform wieder ausgeben.

Das Problem ist jedoch das ich nicht genau weis wie ich den ADC 
Programmieren muss. Der ADC Takt soll 100kHz sein.

Ich habe mal versucht ein Programm zu erstellen, was mir aber nicht so 
richtig gelungen ist.

Hier das Programm:
1
#include <avr/io.h>
2
3
uint8_t Wert = 0;
4
5
6
void Ausgabe  ()
7
 {
8
    PORTB = Wert; 
9
 }
10
11
12
int main (void)
13
{
14
  
15
 // I/O Konfig.
16
 DDRB  = 0b11111111; // Ausgänge 
17
 DDRA  = 0b00000000; // Eingänge 
18
19
 // ADC Konfig.
20
 ADMUX   |= (1<<MUX0); //Welecher ADC benutzt wird
21
 ADCSRA  |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2);
22
23
  
24
   while (1)
25
   {
26
    Wert= MUX0;
27
    Ausgabe;
28
   }
29
  
30
31
}

von Martin (Gast)


Lesenswert?

Im ersten Schritt würde ich den ADC auf Free Run setzen. Damit wird das 
Register automatisch geupdatet.
"wert = MUX0" ist falsch, du musst ja den gewandeltetn Wert einlesen und 
der steht im Register "ADC" drin.
Und noch was, Funktionen ruft man mit Klammern auf. "Ausgabe()"

von Michael (Gast)


Lesenswert?

du musst den wert aus dem ADC auslesen, nicht aus mux0 lesen.
beachte, wenn ich mich recht erinnere wird mit 10-bit auflösung 
gemessen, also besser ein int16 benutzen.


Wert= ADC;

gruß michael

von Michael J. (juston)


Lesenswert?

Ich habe jetzt folgendes gemacht.:

-  MUX0 durch ADC ersetzt
-  Ausgabe durch Ausgabe()

Ich habe nur int8 benutzt weil ich eine LED Leiste mit 8 LED´s habe.


Gruß
Michael

von Martin (Gast)


Lesenswert?

Und gehts?

von Johannes M. (johnny-m)


Lesenswert?

Du musst aber auch warten, bis der ADC mit der Wandlung fertig ist, 
bevor Du irgendwas ausliest! So wird das nichts. Schau Dir bitte die 
entsprechenden Abschnitte im AVR-GCC-Tutorial an. Da steht wie's 
geht.

Außerdem solltest Du für die Anwendung das Bit ADLAR setzen. Dann 
brauchst Du nur ADCH auszulesen und kannst den 8-Bit-Wert direkt an den 
Port ausgeben.

von Christian L. (lorio)


Lesenswert?

Noch mit while(ADCSRA & (1 << ADSC));
prüfen, ob die Wandlung fertig ist und dann noch:
Weiß jetzt nicht was standartmäßig aktiv ist, aber ADLAR in ADMUX 
setzten und Wert = ADCH;

von Michael J. (juston)


Lesenswert?

So sieht das Programm jetzt aus:
1
#include <avr/io.h>
2
3
uint8_t Wert = 0;
4
5
6
void Ausgabe  ()
7
 {
8
    PORTB = Wert; 
9
 }
10
11
12
int main (void)
13
{
14
  
15
 // I/O Konfig.
16
 DDRB  = 0b11111111; // Ausgänge 
17
 DDRA  = 0b00000000; // Eingänge 
18
19
 // ADC Konfig.
20
 ADMUX   |= (1<<MUX0) | (1<<ADLAR); //Welecher ADC benutzt wird
21
 ADCSRA  |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2);
22
23
  
24
   while (1)
25
   {
26
     while (ADCSRA & (1 << ADSC))
27
     {
28
       Wert=ADCH;
29
       Ausgabe();
30
   }
31
32
   }
33
  
34
 }

von Karl H. (kbuchegg)


Lesenswert?

Michael Justinger wrote:

>      while (ADCSRA & (1 << ADSC))
>      {
>        Wert=ADCH;
>        Ausgabe();
>    }

Anders rum. Solange ADSC im ADCSRA Register gesetzt
ist, ist der ADC beschäftigt.

Warum schaust du nicht wirklich mal ins AVR-Gcc Tutorial?
Da gibt es einen Abschnitt über den ADC, in dem all die
kleinen Feinheiten die es zu beachten gilt erklärt sind.
Und, als Bonus, ist da auch noch eine fix fertige, funktionierende
Funktion um einen ADC auszulesen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

von Michael J. (juston)


Lesenswert?

Hallo,
ja ich bin schon dabei das Tutorial zu lesen, hätte ich das blos schon 
früher entdeckt und nicht jetzt kurz vor der Arbeit.

Gruß
Michael

von Michael J. (juston)


Lesenswert?

Das Programm scheint nun zu funktionieren.
Danke für eure Hilfe.

Jetzt muss ich mir nur noch die PWM ansehen und dann kann die Arbeit am 
Dienstag kommen.

Gruß Michael

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.