www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog Digital Wandlung


Autor: Ingo Bernsdorf (oggy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir (neuer AVR User) helfen, ich möchte eine ad wandlung 
durchführen.

das ist mein quellcode:

//AD-Wandler


#include <avr/io.h>
#include <avr/interrupt.h>

void initT0()
{
  TCNT0 = 0xfd;        // TimerReg. laden
  TIFR |= 0x01;        // Overflag clr
  TCCR0 |= 0x03;        // Teiler 64 eingestellt
  TIMSK |=0x01;        // Overflow Interrupt aktiviert
  sei();            // Globaler Interrupt aktiviert
}

SIGNAL(SIG_OVERFLOW0)
{
  initT0();
}






void initPORT()
{
  DDRB = 0xff;        //PortB ist Ausgabe
  DDRC = 0xff;        //PortC ist Ausgabe
}

void initADWandler()
{
  ADCSRA |= 0x80;        //ADEN = 1 --> Wandler einschalten
  ADCSRA |= 0x05;        //ADPS2...ADPS0 0b101 --> Frequenzteiler auf 32 
einstellen
  ADCSRA &= 0xdf;        //ADFR = 0 --> Betriebsart --> Einzelbetrieb

  ADMUX |= 0xc0;        //REF1/REF0 0b11 --> Ref.Spg. --> Interne 
Ref.Spg.=2,56V
  ADMUX |= 0x01;        //MUX4..MUX0 0b0001 --> Kanal-Wandlung --> 
Kanal1
  ADMUX &= 0xdf;        //ADLAR = 0 --> Aussehen des Ergebnisses --> 
rechtsbündig

  ADCSRA |= 0xbf;        //ADSC = 1 --> Wandlung findet statt 
(AD-Wandler AUS)

}


int main()
{
  initPORT();
  initADWandler();
  ADCL = 0x01;

  while(1)
  {

    ADCSRA |= 0x40;        //ADSC = 1 -> Wandlung wir gestartet

    while(ADCSRA & 0x40)    //Wartet bis Wandlung fertig ist
    {}

    PORTB = ADCL;      //ADCW --> Wandlungs-Ergebnis


  }




}


für kleine tips wäre ich sehr dankbar.

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SIGNAL(SIG_OVERFLOW0)
{
  initT0();
}

Völliger Quatsch!
(wird zum Glück auch nie ausgeführt. Aber vielleicht liegt es daran...)

  ADCSRA |= 0xbf;        //ADSC = 1 --> Wandlung findet statt
(AD-Wandler AUS)


Verwende bitte Makronamen. Und vermutlich hast du in der Zeile das | mit 
dem & verwechselt.

Lektüre für dich:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
genauer:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man muss jeweils beide ADC register lesen, also ADCH & ADCL, in 
bestimmter Reihenfolge. Und ADCSRA wurde nirgendwo initialisiert. Gleich 
mit
ADCSRA |= 0x80; loszulegen ist unguenstig.
rene

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Man muss jeweils beide ADC register lesen, also ADCH & ADCL, in
> bestimmter Reihenfolge.

Nicht ganz. Man muß ADCH lesen. Wenn man ADCL auch lesen will, muß man 
das davor tun.

Übrigens, was soll ein
  ADCL = 0x01;

bewirken? ADCL ist nicht beschreibbar.

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.