Also ich hab den AtMega8-16PU. Ich bin der Meinung dass im Datenblatt schon 2,56V Uref steht. Finde das schon komisch.
An der Umwandlung in signed long bin ich dran. Hab das jetzt mal soweit gemacht:
Wie habt ihr denn euren AD-Wandler beschaltet? So viel kann man da ja eigentlich nicht falsch machen....Code:#include <avr/io.h> #include <inttypes.h> #include <stdlib.h> #include <lcd.h> #define F_CPU = 4000000UL #define ad_nullwert 311 #define si_multiplyer 60 #define si_const 12 uint16_t readADC(uint8_t); //Prototyp von readADC void display_temp(uint16_t result); //Prototyp von display char buffer[8]; //Array für itoa anlegen signed long int si_temp1; //Hilfvariable für Temperaturberechnung anlegen signed long int si_temp2; signed long int si_temp3; signed long int si_ones; signed long int si_komma; int main(void) { DDRB = 0xff; //PORT B als Ausgang //Auslesen der analogen Spannungen an Pin 0, also ADC0. In result steht das Ergebnis. uint16_t result = readADC(0); display_temp(result); //Umrechnung und Ausgabe der Temperatur auf Display und LED`s return 0; } void display_temp(uint16_t result) { lcd_init(LCD_DISP_ON); //LCD initialisieren lcd_gotoxy(0,0); //Cursor an erste Stelle setzen lcd_puts("Temp.:"); //"Temperatur" ausgeben lcd_gotoxy(0,1); // Cursor in die zweite Zeile setzen itoa(result,buffer,10); //AD-Wert umrechnen lcd_puts(buffer); //AD-Wert in der zweiten Zeile ausgeben lcd_gotoxy(9,0); // Cursor hinter "Temperatur:" setzen //Berechnung der Temperatur si_temp1= (result-ad_nullwert); si_temp2= (si_temp1*si_multiplyer); si_temp3= (si_temp2/si_const); // Die Ganzen Grade Berechnen si_ones=si_temp3/10; //Die eine Nachkommastelle Berechnen si_komma=si_temp3%10; // Die Zehnerstellen ans Display ausgeben itoa(si_ones,buffer,10); lcd_puts(buffer); lcd_putc(','); itoa(si_komma,buffer,10); lcd_puts(buffer); lcd_putc('C'); 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; }
Grüße!!
Bean







Zitieren

Lesezeichen