Hallo an alle
Ich hab nun die I2C Routine fertig geschrieben
Jedoch funktioniert sie noc nicht. Ich finde jedoch keinen Fehler 
Hier der Code
Code:
#include <avr/io.h>
#include <stdlib.h>
#include "lcd.h"
#define TRUE 1
#define FALSE 0
#define ACK TRUE
#define NACK FALSE
#define START 0x08
#define TW_MT_SLA_ACK 0x18
#define TW_MT_DATA_ACK 0x28
void lm75_read(void);
void i2c_init(void);
int i2c_send_start(uint8_t adress);
int i2c_send_byte(uint8_t data);
void i2c_send_stop(void);
int i2c_read(uint8_t adress, uint8_t ackflag);
struct TEMPERATUR {
uint8_t high;
uint8_t low;
} temp;
void i2c_init(void)
{
TWBR |= (1 << 5); //TWBR = 32 = 10 0000
// Prescaler = 1
}
int i2c_send_start(uint8_t adress)
{
TWCR |= ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); //Sende start Condition
while(!(TWCR & (1 << TWINT))); //Warte bis ende
if((TWSR & 0xF8) != START)
return -1;
TWDR = adress;
TWCR = (1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
if((TWCR & 0xF8) != TW_MT_SLA_ACK)
return -1;
return 0;
}
int i2c_send_byte(uint8_t data)
{
TWDR = data;
TWCR = (1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
if((TWSR & 0xF8) != TW_MT_DATA_ACK)
return -1;
return 0;
}
void i2c_send_stop(void)
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
while(!(TWCR & (1 << TWSTO)));
}
int i2c_read(uint8_t adress, uint8_t ackflag)
{
if(ackflag == ACK)
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
else
TWCR = (1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
return TWDR;
}
void lm75_read(void)
{
i2c_send_stop();
i2c_send_start(0x9E);
temp.high = i2c_read(0x9F,ACK);
temp.low = i2c_read(0x9F, NACK);
i2c_send_stop();
}
int main(void)
{
uint8_t nachkomma, ganzzahl;
i2c_init();
lcd_init(LCD_DISP_ON);
lcd_home();
lcd_clrscr();
lcd_clrscr();
lm75_read();
if(bit_is_set(temp.low, 0))
nachkomma = 5;
else
nachkomma = 0;
temp.low >>= 1;
temp.high <<= 7;
ganzzahl= temp.low | temp.high;
lcd_put_d(ganzzahl);
lcd_putc('A');
lcd_put_d(nachkomma);
return 0;
}
Ich hoffe es kann mir wer helfen.
Danke im Voraus
Gruß Robert
Lesezeichen