Hallo
Vielen Dank!!! Da hätt ich auch selber drauf kommen könne...![]()
![]()
Aber wäre ich bestimmt auch noch wenn ich mich angestrengt hätte. Ich hab jetzt noch etwas mit den Werten herumgespielt und jetzt wird eine Temp von 22 °C angezeigt. Nur die "Steilheit" stimmt glaube ich noch nicht so ganz. Vielleicht könnte mir wkrug da noch einmal den genauen Zusammenhang erklären. Das wäre super.
Vielen Dank noch einmal für alle Lösungsvorschläge!! Ihr helft einem wirklich weiter!!! =D> =D> =D>
Grüße!!
BeanCode:#include <avr/io.h> #include <inttypes.h> #include <stdlib.h> #include <lcd.h> #define F_CPU = 4000000UL #define ad_nullwert 399 #define si_multiplyer 460 #define si_const 70 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 si_temp; //Hilfvariable für Temperaturberechnung anlegen int si_ones; 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(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 //Berechnung der Temperatur si_temp=((result-ad_nullwert)*si_multiplyer)/si_const; // Die Ganzen Grade Berechnen si_ones=si_temp/10; //Die eine Nachkommastelle Berechnen si_komma=si_temp%10; // Die Zehnerstellen ans Display ausgeben itoa(si_ones,buffer,10); lcd_puts(buffer); lcd_putc(','); itoa(si_komma,buffer,10); lcd_puts(buffer); 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; }







Zitieren
Lesezeichen