Bin zwar nicht MR.Bean, ich verwende die .lib von Codevision AVR.
Bei mir muss es auch
lcd_gotoxy(10,0); heissen, wenn ich auf das 11te Zeichen der ersten Zeile zugreifen will. (0,1) wäre das erste Zeichen der zweiten Zeile.
@Mr Bean Was verwendest du für ein LCD.lib . Ich möchte da keine Grundsatzdiskussion auslösen wegen dem lcd_gotoxy, aber mich würde interessieren ob der Unterschied in der lib oder im LCD ist. Das ist ja eventuell auch für andere interessant das es da Unterschiede gibt.
Bin zwar nicht MR.Bean, ich verwende die .lib von Codevision AVR.
Bei mir muss es auch
lcd_gotoxy(10,0); heissen, wenn ich auf das 11te Zeichen der ersten Zeile zugreifen will. (0,1) wäre das erste Zeichen der zweiten Zeile.
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:
Grüße!!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; }
Bean
Bist du sicher, dass deine Hardware stimmt? Welche Spannungsänderung hast du auf 10°C ???. Wenn du nämlich bei 100°C Temperaturänderung nur 1V Spannungsänderung hast, nützt dir ein 10bit ADC gaaar nix.Wenn ich den Sensor erwärme ändert sich die angezeigte Temperatur max um 2°. Da kann was noch nicht stimmen.
Ich habe noch einen anderen Vorschlag: ich mache das immer in ASM, und zwar so:
man ziehe von der Temperatur (in bin) die Zahl 100 so oft ab bist es negativ ist. dann einmal 100 drauf addieren. Die anzahl wie oft man abgezogen hat bebor es negativ wurde sind dann die hunderter! Wenn man das mit den zehnern auch noch macht bleiben die Einer über und man hat die Temperatur Ziffernweise in 3 Variablen. Geht prima, und supi fix. Ich mache halt alles in ASM, weils spaß macht
Hallo
Ja ich frag mich so langsam auch ob ich nicht doch noch einen Bug in meiner Hardware drin habe.
Ich hab mir das jetzt gestern alles noch einmal überlegt und frage mich ob ich einen OP zum verstärken des Spannungsabfalls über dem KTY element brauche.
Also noch einmal von vorne, ich habe einen 10Bit AD wandler >> 1024
Uref sind 2,56V als entspricht jeder schritt 2,56V/1024 = 0,0025V.
Wenn ich nun mit meinem Multimeter den Spannungsabfall an dem KTY element messe habe ich da bei Zimmertemp. 0,35V also 140 Schritte. Normal sollte sich das doch mit dem AD Wandler gut messen lassen. Auch wenn der Bereich den ich nutze recht klein ist oder sehe ich das jetzt falsch? Wie habt ihr das gemacht? Habt ihr da noch einen OP drin mit dem ihr das Signal verstärkt? Ich werde heute Abend mal noch versuchen die Spannungswerte in Eiswasser und in kochendem Wasser aufzunehmen, damit ich mal ein paar Anhaltspunkte hab.
Grüße!
Bean
Ich hab kürzlich auch ein Thermometer mit einem KTY 84 - 130 gebastelt.
Das ging an 5V mit einem 2,2k Ohm Vorwiderstand ohne OpAmp.
Ich krieg aber auch nur eine Auflösung von 1°C zusammen, weil ich bis 300°C messen will.
Ich hab die interne Referenzspannungsquelle des A/D Wandlers mit 2,56V verwendet und den obligatorischen 100nF Kondensator an AREF angebaut.
AVCC muss auch +5V Spannung angeschaltet haben, man sollte in die Zuleitung dieses Pins eine 10µH Drossel einbauen.
Wenn Du das auch so gemacht hast, sollte am AREF Pin eine Spannung von 2,56V anliegen.
Vor ein paar Tagen hatte ich auch einen ATMEGA8 an den ein A/D Eingang defekt war - Teste doch auch mal nen anderen Controller.
Die Spannung an diesem Pin ging bei einer Beschaltung mit einem 10kOhm Widerstand gegen +5V nicht hoch. Legte man dagegen satte 2,5V an, funktionierte auch der A/D Wandler. Der Pin war also irgendwie niederohmig.
Hallo
Ich möchte auch bis 300°C messen (für meinen Ofen... ). Ich habe allersings einen 1k Widerstand vor meinem KTY-84 130. Werde das heute Abend mal noch mit einem 2K2 ausprobieren.
Es ist doch aber so dass wenn der Widerstand größer wird auch eine größere Spannung über diesem abfällt. Misst Du dann die Spannung über dem Widerstand oder über dem Thermoelement? Oder wie bekommst Du dadurch eine höhere Spannung?
Grüße!!
Bean
Ach ja, den Kondensator an Aref hab ich noch nicht drin, die Spule auch noch nicht. Werde das aber auch heute Abend versuchen nachzurüsten. Muss mir nur noch eine Spule auftreiben... Aber das dient doch eigentlich nur dazu die Messung zu verbessern oder? Grundsätzlich sollte das ganze doch auch ohne den Kondensator und die Spule funktionieren oder?
Grüße!!
Bean
Die Spule ist meiner Meinung nach wirklich nur dazu da um HF- Störungen vom A/D Wandler fernzuhalten.....auch ohne den Kondensator und die Spule funktionieren oder?
Der Kondensator ist, soweit ich weiß, zur Stabilisierung der Referenzspannungsquelle zwingend erforderlich.
Lesezeichen