Hallo
Danke für den Tipp! Ich hab jetzt grad noch den Vorschlag von wkrug implementiert. Dann zeigt mir das Display 1,3 an. Da kann also noch etwas nicht stimmen
. Vermute dass es an dem Wert si_multiplyer liegt. Aber weigstens bin ich etwas weiter. Leider hab ich den AD-Wert für 100C nicht. Sonst könnte ich Deinen Vorschlag auch noch versuchen. Was mir auch noch nicht so ganz klar ist wie ich mit den Werten später die Steilheit verändern kann. Das muss ja auch irgendwie gehen. Also mein Code sieht jetzt jedenfalls folgendermaßen aus:
Grüße!!Code:#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 1024 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) { DDRD = 0xff; //PORT D als Ausgang definieren (Hier sind 8 LED`s angeschlossen 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); 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; }
Bean







Zitieren

Lesezeichen