www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei ADC Übung


Autor: Juston (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>

uint8_t Wert = 0;


void Ausgabe  ()
 {
    PORTB = Wert; 
 }


int main (void)
{
  
 // I/O Konfig.
 DDRB  = 0b11111111; // Ausgänge 
 DDRA  = 0b00000000; // Eingänge 

 // ADC Konfig.
 ADMUX   |= (1<<MUX0); //Welecher ADC benutzt wird
 ADCSRA  |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2);

  
   while (1)
   {
    Wert= MUX0;
    Ausgabe;
   }
  

}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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()"

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und gehts?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian L. (lorio)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht das Programm jetzt aus:
#include <avr/io.h>

uint8_t Wert = 0;


void Ausgabe  ()
 {
    PORTB = Wert; 
 }


int main (void)
{
  
 // I/O Konfig.
 DDRB  = 0b11111111; // Ausgänge 
 DDRA  = 0b00000000; // Eingänge 

 // ADC Konfig.
 ADMUX   |= (1<<MUX0) | (1<<ADLAR); //Welecher ADC benutzt wird
 ADCSRA  |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2);

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

   }
  
 }



  


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.