So also wenn ich folgenden Code in meinen Controller schreibe:
Dann zeigt mir das Display in der zweiten Zeile an erster Stelle den AD-Wert an (43Code:#include <avr/io.h> #include <inttypes.h> #include <stdlib.h> #include <lcd.h> #define F_CPU = 4000000UL; uint16_t readADC(uint8_t); //Prototyp von readADC void display(uint16_t result); //Prototyp von display char buffer[8]; //Array für itoa anlegen int main(void) { DDRD = 0xff; //PORT D als Ausgang definieren (Hier sind 8 LED`s angeschlossen DDRB = 0xff; //PORT B als Ausgang uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0, // also ADC0. In result steht das Ergebnis. display(result); //Umrechnung und Ausgabe der Temperatur auf Display und LED`s return 0; } void display(uint16_t result) { lcd_init(LCD_DISP_ON_CURSOR); //LCD initialisieren lcd_gotoxy(0,0); //Cursor an erste Stelle setzen lcd_puts("Temperatur:"); //"Temperatur" ausgeben lcd_gotoxy(0,1); // Cursor in die zweite Zeile setzen itoa((int)result,buffer,10); //AD-Wert umrechnen lcd_puts(buffer); //AD-Wert in der zweiten Zeile ausgeben lcd_gotoxy(11,0); // Cursor hinter "Temperatur:" setzen //float f=((float)result*5)/1024; //if(f<0)f=0; //f=(f-(int)f)*1000; //if(f<100)lcd_putc('0'); //if(f<10)lcd_putc('0'); //itoa((int)f,buffer,10); //lcd_putc(','); //lcd_puts(buffer); PORTD = result; //Den Digitalen Wert mit Hilfe der LED`s anzeigen return; } uint16_t readADC(uint8_t channel) { uint8_t i; uint16_t result = 0; // Den ADC aktivieren und Teilungsfaktor auf 32 stellen ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADPS2); // Kanal des Multiplexers waehlen (ADC 0) ADMUX = (!(1<<MUX0)) | (!(1<<MUX1)) | (!(1<<MUX2)); // interne Referenzspannung verwenden (also 2,56 V) ADMUX |= (1<<REFS1) | (1<<REFS0); // Den ADC initialisieren und einen sog. Dummyreadout machen ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)); // Jetzt 3x die analoge Spannung and Kanal channel auslesen // und dann Durchschnittswert ausrechnen. for(i=0; i<3; i++) { // Eine Wandlung ADCSRA |= (1<<ADSC); // Auf Ergebnis warten... while(ADCSRA & (1<<ADSC)); result += ADC; } // ADC wieder deaktivieren ADCSRA &= ~(1<<ADEN); result /= 3; return result; }. Was auch der Spannung entspricht die ich am AD-Wandler Eingang mit dem Multimeter messen kann. Das zeigt mir dass die AD-Wandlung korrekt funktioniert. Nun werde ich mich also noch einmal intensiver mit der Umrechnung beschäftigen müssen...
![]()
![]()
Grüße!!
Bean







Zitieren

Lesezeichen