Hab deinen Code mal auf CodeVision umgestrickt.
Er rechnet mit den vorgegebenen Werten richtig.
Stimmen deine vorgegebenen Konstanten ?
Auf deinem C- Compiler wird aber das vermutlich nicht passen.Code:#include <mega8.h> #include <stdlib.h> #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> #define F_CPU = 4000000UL #define ad_nullwert 311 #define si_multiplyer 60 #define si_const 12 #define ADSC 6 #define ADEN 7 // 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 int uint16_t; 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; void display_temp(unsigned int uint16_t) { lcd_init(16); //LCD initialisieren lcd_gotoxy(0,0); //Cursor an erste Stelle setzen lcd_putsf("Temp.:"); //"Temperatur" ausgeben lcd_gotoxy(0,1); // Cursor in die zweite Zeile setzen itoa(uint16_t,buffer); //AD-Wert umrechnen lcd_puts(buffer); //AD-Wert in der zweiten Zeile ausgeben lcd_gotoxy(0,9); // Cursor hinter "Temperatur:" setzen //Berechnung der Temperatur si_temp1= (uint16_t-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); lcd_puts(buffer); lcd_putchar(','); itoa(si_komma,buffer); lcd_puts(buffer); lcd_putchar(0xdf); lcd_putchar('C'); } int read_adc(unsigned char uc_channel) { unsigned char uc_i=0; unsigned int ui_result; //Den ADC aktivieren und Teilungsfaktor auf 32 stellen ADCSRA = 0b10000101; //(1<<ADEN) | (1<<ADPS0) | (1<<ADPS2); //Kanal des Multiplexers waehlen (ADC 0) uc_channel &=0b00000111; uc_channel |=0b11000000; //interne Referenzspannung verwenden (also 2,56 V) ADMUX = uc_channel; //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(uc_i=0; uc_i<3; uc_i++) { // Eine Wandlung ADCSRA |= (1<<ADSC); // Auf Ergebnis warten... while(ADCSRA & (1<<ADSC)); ui_result += ADCW; } //ADC wieder deaktivieren ADCSRA &= ~(1<<ADEN); ui_result /= 3; return ui_result; } void main(void) { DDRB = 0xff; //PORT B als Ausgang while (1) { //Auslesen der analogen Spannungen an Pin 0, also ADC0. In result steht das Ergebnis. uint16_t = read_adc(0); display_temp(uint16_t); //Umrechnung und Ausgabe der Temperatur auf Display und LED`s } }






Zitieren
Kannst Deine dtostrf Funktion mal genauer beschreiben? Kenne die leider wie so vieles noch nicht.


Lesezeichen