Forum: Mikrocontroller und Digitale Elektronik C Programm für AD Wandler


von Axel Jeromin (Gast)


Lesenswert?

Hallo an alle,
im Forum gibt es einige Assemblerprogramme zum Auslesen der
analog Eingänge. Hätte jemand ein ähnliches C Programm für mich?
Ich habe einen AT902333 .

Danke im Vorraus
Axel

: Gesperrt durch User
von Lanius (Gast)


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));
}

von Axel Jeromin (Gast)


Lesenswert?

Danke für die Info.

Axel

von Christian Bürger (Gast)


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

von Axel Jeromin (Gast)


Angehängte Dateien:

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*/

von Christian Bürger (Gast)


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

von Lanius (Gast)


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)

von Axel Jeromin (Gast)


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

von Lanius (Gast)


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 :)

von Ates (Gast)


Lesenswert?

Hallo allerseits!

Ich brauche c Programm für 12 Bit 2 Kanal A/D Wandler(IC MAX.144)
kann villeicht jemand helfen?

Grüße Ates

von Karl H. (kbuchegg)


Lesenswert?

Bitte betreibe keine Leichenfledderei von Threads, die nahezu 10 Jahre 
alt sind. Fang einen neuen Thread an. Die Tatsache, dass in diesem 
Thread das Wort ADC vorkommt und dass du nach einer ADC Routine suchst, 
heist noch lange nicht, dass es um dasselbe geht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.