Witam, mam problem z PCF, podlaczylem uklad wg schematu :
Chce sie nauczyc programowo obslugiwac i2c, dlatego nie korzystam ze sprzetowego i2c ATmegi. przesylam moj program. Juz mnie szlag trafia, nie wiem gdzie mam blad. Chcialem odczytac z rejestru sekud jakas wartosc i nic nie dziala pokazuje mi 0 na wyswietlaczu.
Dodam ze korzystam z wewnetrznego kwarcu 1MHz.
Bardzo prosze o pomoc
Chce sie nauczyc programowo obslugiwac i2c, dlatego nie korzystam ze sprzetowego i2c ATmegi. przesylam moj program. Juz mnie szlag trafia, nie wiem gdzie mam blad. Chcialem odczytac z rejestru sekud jakas wartosc i nic nie dziala pokazuje mi 0 na wyswietlaczu.
Dodam ze korzystam z wewnetrznego kwarcu 1MHz.
// I2C
#define I2CDir DDRB
#define I2COut PORTB
#define I2CIn PINB
//
#define SDA PB7
#define SCL PB6
//
#define SET_SDA I2COut |= (1 << SDA)
#define CLR_SDA I2COut &= ~(1 << SDA)
//
#define SET_SCL I2COut |= (1 << SCL)
#define CLR_SCL I2COut &= ~(1 << SCL)
//
#define SDA_OUT I2CDir |= (1 << SDA)
#define SDA_IN I2CDir &= ~(1 << SDA)
//
#define SCL_OUT I2CDir |= (1 << SCL)
#define SCL_IN I2CDir &= ~(1 << SDA)
//
#define GET_SDA (I2CIn & (1 << SDA))
//
#define ACK 0
#define NOACK 1
void delayI2c(void)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void i2cstart(void)
{
SDA_OUT; //
SCL_OUT; // ustawienie linii SDA i SCL w tryb wyjściowy
SET_SDA; //
SET_SCL; // ustawienie na liniach SDA i SCL stanu wysokiego
delayI2c(); // opóźnienie
CLR_SDA;
delayI2c();
CLR_SCL;
}
// funkcja generujaca sygnał stop
void i2cstop(void)
{
SDA_OUT;
CLR_SDA;
delayI2c();
SET_SCL;
delayI2c();
SET_SDA;
delayI2c();
}
// funkcja wysyłająca bajt na szynę I2C
void i2cwrite(unsigned char byte)
{
unsigned char i;
SDA_OUT;CLR_SDA;
for(i=0;i<8;i++)
{
if(byte&0x80) //wyslanie jedynki
{
CLR_SCL;
SET_SDA;
delayI2c();
SET_SCL;
delayI2c();
CLR_SCL;
delayI2c();
}
else //wyslanie zera
{
CLR_SCL;
CLR_SDA;
delayI2c();
SET_SCL;
delayI2c();
CLR_SCL;
//SET_SDA;
delayI2c();
}
byte=byte<<1;
//kolejny bit
}
CLR_SCL;
do
{
SET_SCL;
SDA_IN;
delayI2c();
i=SDA; //odczyt ACK
CLR_SCL;
delayI2c();
}while(!i); //
}
// funkcja odczytujaca bajt z szyny I2C
unsigned char i2cread(unsigned char ack)
{
unsigned char i, byte=0;
{
for(i=0;i<8;i++)
{
SDA_IN;
SET_SCL;
delayI2c();
byte=byte|GET_SDA;
CLR_SCL;
delayI2c();
if(i<7) byte=(byte<<1)&0xfe;
}
SDA_OUT;
SET_SDA;
delayI2c();
SET_SCL;
delayI2c();
CLR_SCL;
return byte;
}
}
void i2czapis(unsigned char byte,char d)
{
i2cstart();
i2cwrite(0xA0);
i2cwrite(byte);
i2cwrite(d);
i2cstop();
}
unsigned char i2codczyt(unsigned char byte)
{
unsigned char t ;
i2cstart();
i2cwrite(0xA0);
i2cwrite(byte);
//i2cstop();
i2cstart();
i2cwrite(0xA1);
t= i2cread(0);
i2cstop();
return (t);
// -----------------------------
}
void sekundy(unsigned char s)
{
char j;
j=s&0x0f;
lcd_xy(1,2);
lcd_xy(1,3);
write_char(j+48);
}
int main (void)
{
unsigned char tm;
lcd_init();
lcd_xy(0,0);
write_text("T=");
UART_init();
while(1)
{
i2cstart();
i2cwrite(0xA0);
i2cwrite(0x02);
i2cstart();
i2cwrite(0xA1);
tm= i2cread(0);
i2cstop();
sekundy(tm);
}
}
Bardzo prosze o pomoc