C Programm für AD Wandler

Gast #2134
Lesenswert?

ohne Interupts:

void ADC_Init(void)
{
    outb(BV(ADEN) | BV(ADSC) | BV(ADPS1) | BV(ADPS2), ADCSR);
    while (inp(ADCSR) & BV(ADSC));
}

unsigned int ADCReadChannel(unsigned char Channel)
{
    outp(Channel, ADMUX);
    outp(inp(ADCSR) | BV(ADSC), ADCSR);
    while (inp(ADCSR) & BV(ADSC));        // Wait conversion done
    return (__inw(ADCL));
}
Gast #2137
Lesenswert?

Hallo zusammen,
habe das Beispiel in ein Programm eingebunden und nun einige Fragen:
1) Ist das Programm OK?
2) Wie gross ist der maximale Wert in der Variabele Ana0 ? 1024 ?

Grüße
Axel





#include <io.h>
#include <interrupt.h>
#include <signal.h>


/* ******************************************************* */

void ADC_Init(void)
{
  outb(BV(ADEN) | BV(ADSC) | BV(ADPS1) | BV(ADPS2), ADCSR);
  while (inp(ADCSR) & BV(ADSC));
}


/* *************************************************** */

unsigned int ADCReadChannel(unsigned char Channel)
{
  outp(Channel, ADMUX);
  outp(inp(ADCSR) | BV(ADSC), ADCSR);
  while (inp(ADCSR) & BV(ADSC));     // Wait conversion done
  return (__inw(ADCL));
}

/* ******************************************************* */
/*                       Initialisierung 
*/
/* ******************************************************* */


void initialisierung(void)
{

  outp(0xff, DDRB);          // Port B als Ausgang
  outp(0x00, DDRC);          // Port C als Eingang
  outp(0xff, DDRD);          // Port D als Ausgang

   ADC_Init();      // Initialasierung Analogeingänge
}

/* ******************************************************************* 
*/
/*                       Hauptprogramm 
*/
/* ******************************************************************* 
*/


void main(void)
{
unsigned int Ana0;
unsigned int Ana1;

  initialisierung();

  for (;;)
  {;                  // loop forever

  Ana0= ADCReadChannel(0);   // Lese Chanal 0
  Ana1= ADCReadChannel(1);   // Lese Chanal 1

  Ana0=Ana0/4;      // max Wert 1024 / 4

  outp(Ana0, PORTD);          // Port D als Test Ausgang

  }
}         /* ende main*/
Angehängte Dateien:
Gast #2138
Lesenswert?

Hallo allerseits!

Bräuchte auch den auf dem AT904333 eingebauten AD-Wandler und habe da 
mal ne Frage zu. Die 10 Bit, die ich auslesen kann, geben die die Stärke 
in 1024 Einheiten von 0V bis VRef an, also z.B. bei VRef = 5 Volt ergibt 
eine Analogspannung von 2,5 V eine 512 in dezimal?

MfG Christian Bürger
Gast #2139
Lesenswert?

an Christian:

>Voltunterschied umrechnen? Sind das Schritte zwischen 0V und VRef oder >wie 
funktioniert das?

Spannung = VREF / 1023 * Messwert

an Axel:

>1) Ist das Programm OK?

Hast du es denn getestet?

Mir ist nur aufgefallen:

>outp(Ana0, PORTD); // Port D als Test Ausgang

Ana0 ist ein Int, sollte der Compiler aber richtig casten. Sollte dein 
Programm so nicht laufen, dann versuch mal:

outp((unsigned char)Ana0, PORTD);

>2) Wie gross ist der maximale Wert in der Variabele Ana0 ? 1024 ?

10 Bit Wandler = 2 hoch 10 = 1024 Werte (0-1023)
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.