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 #2136
Lesenswert?

Hallo!

Will auch gerade erstmals den A/D-Wandler des AT902333 nutzen.... Das 
10bit-Ergebnis, das ich über die Register erhalte, was sagt das aus, bzw 
wie kann ich das in Voltunterschied umrechnen? Sind das Schritte 
zwischen 0V und VRef oder wie funktioniert das?

MfG
Chris
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)
Gast #2140
Lesenswert?

Hallo zusammen,
wenn ich es richtig verstanden habe, wird hier der
single run Modus gebraucht.
Da ich nicht mit der übrigen Programmbearbeitung
auf den Analogwert warten möchte( keine Warteschleife), wie sähe der 
free run Modus zum Auslesen von 3 Analogeingängen aus?

Grüße Axel
Gast #2141
Lesenswert?

du kannst zB nur gucken ob der Wandler fertig ist, brauchst ja nicht 
warten und übernimmst die Werte nur wenn er denn ...

oder mit Interupts, der Wandler löst einen Interupt aus wenn er fertig 
ist

hab zur Zeit keinen Quelltext im Kopf, ist doch ne schöne Aufgabe für 
dich :)
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.