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
Code:
#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
Code:
#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
Code:
//
// 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=ht...df&chrome=true
Im Anhang habe ich noch mal das komplette Projekt.
Danke.
by Ferdinand.
Lesezeichen