PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperatur wert wird nicht aktualisiert.



Ferdinand
22.03.2012, 20:57
Hi, ich habe ein Problem mit meinem Programm, und zwar sollte die Temperatur angezeigt werden die über i²c von einem lm75 abgefragt wird und auf einem LCD ausgegeben wird, das klappt aber nur ein Mal, und zwar beim Einschalten oder beim Reset Taste drücken ich verwende ein STK500, nun möchte ich ja die Temperatur laufend aktualisiert haben und nicht erst beim Betätigen des Reset Tasters.

Was stimmt bei mir nicht?


//
// ATMega644
// lcd-routines.c, lcd-routines.h, i2c.h
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <stdbool.h>
#include "lcd-routines.h"
#include "i2c.h"

int main(void) //Hauptschleife
{
DDRA = 0xff; // Pins sind Ausgang
PORTA = 0xff; // LED's Aus
DDRD = 0x00; // Pins sind Eingang
PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND
// Initialisierung des LCD
// Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
// verschwunden sein
lcd_init();
TWI_init(FAKTOR, TEILER);
lcd_string(" LCD Start !!! ");
_delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
lcd_clear();
lcd_home();
lcd_string(" Taste druecken");

char temperatur; //Temperaturvariable
char einer; //Temperaturvariable einer
char zehner; //Temperaturvariable zehner

for(;;) //Programmschleife
{

temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen
einer = ( temperatur % 10 ) + 48;
zehner = ( temperatur / 10 ) + 48;

if (rest >= 128)
{
lcd_setcursor( 0, 2);
lcd_string("Temperatur ");
lcd_data(zehner);
lcd_data(einer);
lcd_string(",5C ");
}

else
{
lcd_setcursor( 0, 2);
lcd_string("Temperatur ");
lcd_data(zehner);
lcd_data(einer);
lcd_string(",0C ");
}
}


return(0);
}



Im Anhang habe ich noch das komplette Projekt.
Danke !

tuxoid
22.03.2012, 23:22
Irgendetwas stimmt da grundsätzlich nicht. Die Variable "rest" existiert in deiner main-Funktion überhaupt nicht und global ist sie auch nicht deklariert. In die Variable "temperatur" bekommst du den Rückgabewert der Funktion TWI_empf vom Datentyp char. Aber die vollständige Temperatur des LM75 ist 11bit groß! Die Umrechnung verstehe ich auch nicht so recht.

Schau dir das Datenblatt des LM75 genau an und schreibe das Programm neu.

Ferdinand
23.03.2012, 06:21
Bitte Lese mein Programm richtig durch befor du mir helfen kannst!

Danke

Ferdinand
31.03.2012, 21:52
Also, ich habe jetzt festgestellt, wen ich das fusse bit CKDIV8 setze aktualisiert sich der Temperatur wert wie gewünscht außer das die nach Komma stelle nicht mit aktualisiert wird. Da ist wohl doch noch was falsch. Ich habe jetzt mal das Projekt besser in *.c und *.h Dateien gegliedert.

Mir scheint, dass mein lcd zu langsam ist, wen der Temperatur wert aktualisiert wird, kommt das lcd nicht hinter her.
Mein LCD ist das "YL 162-90" von Pollin.

Die besagte Umrechnung ist nötig um ASCII Zeichen auf mein lcd aus zu geben.

Der Temperatur wert ist insgesamt 9 bit groß das heißt 8 bit (1 byte) für die vor Komma stelle und das 9te bit für die nach Komma stelle (bit 9 = 0 Dan *,0 oder bit 9 = 1 Dan *,5 (das "*" steht für Temperatur wert))

Die variable "rest" existiert tatsächlich nicht in der main da ich sie global gesetzt habe.

i2c.h



#define TAKT 8000000UL
#define ADRESSE_R 0b10010001 //Lesen
#define ADRESSE_W 0b10010000 //Schreiben
#define FAKTOR 32
#define TEILER 1

char dat1, rest;

////////////////////////////////////////////////////////////////////////////////
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#ifndef F_CPU
#define F_CPU 8000000UL
#endif



void TWI_init(unsigned char faktor, unsigned char teiler);

void TWI_send(unsigned char adres, unsigned char daten);

char TWI_empf(unsigned char adres);



i2c.c



#include <avr/io.h>
#include <util/delay.h>
#include "i2c.h"

////////////////////////////////////////////////////////////////////////////////

void TWI_init(unsigned char faktor, unsigned char teiler)
{
TWBR = faktor;
TWSR = teiler;
}

void TWI_send(unsigned char adres, unsigned char daten)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = adres;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}



char TWI_empf(unsigned char adres)
{

TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWDR = adres;
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
dat1 = TWDR ;
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);

TWCR = (1<<TWINT)|(1<<TWEN);
loop_until_bit_is_set(TWCR, TWINT);
rest = TWDR ;

loop_until_bit_is_set(TWCR, TWINT);
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);

return dat1;
}



Taster_LCD.c



//
// ATMega644
// lcd-routines.c, lcd-routines.h, i2c.h
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <stdbool.h>
#include "lcd-routines.h"
#include "i2c.h"



int main(void) //Hauptschleife
{


DDRA = 0xff; // Pins sind Ausgang
PORTA = 0xff; // LED's Aus
DDRD = 0x00; // Pins sind Eingang
PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND
// Initialisierung des LCD
// Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
// verschwunden sein
lcd_init();
TWI_init(FAKTOR, TEILER);
lcd_string(" LCD Start !!! ");
_delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
lcd_clear();
lcd_home();
lcd_string(" Taste druecken");

char temperatur; //Temperaturvariable
char einer; //Temperaturvariable einer
char zehner; //Temperaturvariable zehner

for(;;) //Programmschleife
{

temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen
einer = ( temperatur % 10 ) + 48;
zehner = ( temperatur / 10 ) + 48;

if (rest >= 128)
{
lcd_setcursor( 0, 2);
lcd_string("Temperatur ");
lcd_data(zehner);
lcd_data(einer);
lcd_string(",5C ");
}

else
{
lcd_setcursor( 0, 2);
lcd_string("Temperatur ");
lcd_data(zehner);
lcd_data(einer);
lcd_string(",0C ");
}
}


return(0);
}



hir das Datenblatt des LM75.
https://docs.google.com/gview?url=http://datasheets.maxim-ic.com/en/ds/LM75.pdf&chrome=true

Im Anhang habe ich noch mal das komplette Projekt.

Danke.
by Ferdinand.