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
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)); }
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
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*/
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
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)
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
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 :)
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
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.