#include <avr/io.h>
#include <avr/signal.h>
#include <util/delay.h>
#include <LCD.h>// wyswietlacz dział bez zarzutu
//******************** Definicja stałych **********************
#define F_CPU 16000000
//adres ukladu PCF8583P
#define Adres_W 0xa0
#define Adres_R 0xa1
unsigned char sekunda;
//******************** Funkcje ********************************
void I2C_Start()
{
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTA);
while(!(TWCR)&(1<<TWINT));
}
void I2C_Stop()
{
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
}
void I2C_Z(unsigned char dane)
{
TWDR=dane;
TWCR=(1<<TWINT)|(TWEN);
while(!(TWCR)&(1<<TWINT));
}
unsigned char I2C_C(unsigned char koniec)
{
TWCR=(koniec<<TWEA)|(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
return TWDR;
}
void I2C_Config()
{
TWBR=18;
}
//odczyt od podanego adresu
unsigned char I2C_Odczyt_Adres(unsigned char adres_slowa)
{
unsigned char dana;
//start
I2C_Start();
//adres slave odczyt RW=0
I2C_Z(Adres_W);
//adres slowa
I2C_Z(adres_slowa);
//start
I2C_Start();
//adres slave odczyt RW=1
I2C_Z(Adres_R);
// funkcja odbioru danych kolejnych inkrementowanych autoamtycznie
dana=I2C_C(0);
//stop
I2C_Stop();
return dana;
}
//odczyt od bierzacego odresu
unsigned char I2C_Odczyt_AdresB()
{
//start
I2C_Start();
//adres slave odczyt RW=1
I2C_Z(Adres_R);
// funkcja odbioru danych kolejnych inkrementowanych autoamtycznie
//stop
I2C_Stop();
}
void I2C_ZapisB(unsigned char adres_slowa,unsigned char dane)
{
//start
I2C_Start();
//adres slave odczyt RW=0
I2C_Z(Adres_W);
//adres slowa
I2C_Z(adres_slowa);
I2C_Z(dane);
//stop
I2C_Stop();
}
void main(void)
{
PORTC=0xff;
DDRC=0x00;
PORTD|=_BV(2);
DDRB=0xff;
Config_LCD();
I2C_Config();
instrukcja_LCD(0x0c);
I2C_ZapisB(0,0b00000100);
while(1)
{
xy_LCD(0,1);
liczba_LCD(sekunda);
// _delay_ms(20);
sekunda=I2C_Odczyt_Adres(2);
}
}
Ia takie małe pytanko ? Czy ten kod jest zły czy moj układ. I jeszcze jedno pytanie jak sie startuje ten zegar czasu rzeczywistego pcf8583. Czy ustwienie 4 bitu w zerowym rejestrze jest jednoznaczne z uruchomieniem tiomera. Pozdrawaim i czekam na pomoc ?