Forum: Mikrocontroller und Digitale Elektronik Analog Digital Wandlung


von Ingo B. (oggy)


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.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

1
SIGNAL(SIG_OVERFLOW0)
2
{
3
  initT0();
4
}

Völliger Quatsch!
(wird zum Glück auch nie ausgeführt. Aber vielleicht liegt es daran...)
1
  ADCSRA |= 0xbf;        //ADSC = 1 --> Wandlung findet statt
2
(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-Tutorial#ADC_.28Analog_Digital_Converter.29

von rene (Gast)


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

von Rolf Magnus (Gast)


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
1
  ADCL = 0x01;

bewirken? ADCL ist nicht beschreibbar.

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.