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:
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;
}
Grüße!!
Bean
Lesezeichen