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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.