Hilfe bei ADC Übung

Gast #792595
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
}
Gast #792608
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()"
Gast #792613
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
#792645
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
 }
#792649
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren