Nabend allerseits!!
Muss mich wohl bei Hubert entschuldigen. Bei mir heißt die Zeile auch lcd_gotoxy(12,0).Weiß auch nicht warum das in dem ersten Code den ich gepostet hab falsch ist. Ich bin überzeugt davon gewesen dass ich da nichtsmehr geändert hab. Muss aber wohl so sein. Tut mir wirklich Leid!
Ich hab meinen Code nun mal nach dem Vorschlag von robocat geändert. Danach hat sich schon etwas mehr getan. Dann hab ich noch etwas an den Werten gespielt um die richtige Temperatur zu errechnen. Aber ich glaube das war der falsche Weg. Jetzt wird zwar die Temperatur richtig angezeigt, aber die Temperturänderung stimmt nichtmehr. Wenn ich den Sensor erwärme ändert sich die angezeigte Temperatur max um 2°. Da kann was noch nicht stimmen...
Hier mal noch mein jetziger Code:
Code:
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <lcd.h>
#define F_CPU = 4000000UL;
uint16_t readADC(uint8_t); //Prototyp von readADC
void display(uint16_t result); //Prototyp von display
int main(void)
{
DDRD = 0xff; //PORT D als Ausgang definieren (Hier sind 8 LED`s angeschlossen
DDRB = 0xff; //PORT B als Ausgang
uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
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(12,0); // Cursor hinter "Temperatur:" setzen
char buffer[8]; //Array für itoa anlegen
float f=((float)result*200)/1023; //
if(f<0)f=0;
itoa((int)f,buffer,10);
lcd_puts(buffer);
lcd_putc(',');
f=(f-(int)f)*1000;
if(f<100)lcd_putc('0');
if(f<10)lcd_putc('0');
itoa((int)f,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<4; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 4;
return result;
}
Grüße!!
Bean
Lesezeichen