PCF8583
O PCF8583 É UM RTC (REAL TIME CLOCK)
DESENVOLVIDO PELA PHILIPS
SEMICONDUCTOR.
COMO CARACTERÍSTICAS PRINCIPAIS SÃO:
• INTERFACE I2C
• FUNÇÃO DE CLOCK E CALENDÁRIO
• REGISTRADORES ENDEREÇAVEIS (HH,MM...)
• 240 BYTES DE RAM, ALÉM DOS CITADOS
ACIMA
• CRISTAL DE 32768Hz
• FORMATO DE HORA: 24 OU 12
• INCREMENTO DE ENDEREÇO AUTOMÁTICO
• ALARME PROGRAMÁVEL, COM
INTERRUPÇÃO
• ENDEREÇO DO ESCREVO (LEITURA) A1
• ENDEREÇO DO ESCRAVO (ESCRITA) A0
DIAGRAMA DE BLOCOS
PINAGEM
CONTROL/STATUS REGISTER
REGISTROS
FORMATO DA HORA
OS DADOS SÃO ARMAZENADOS EM FORMATO
BCD
4+4 NIBLES = EXEMPLO
64 SEGUNDOS = 01100100
SETANDO HORA
unsigned char sec, min1, hr, day, mn, year;
void Read_Time(char *sec, char
*mn, char *year) {
I2C_Start();
I2C_Wr(0xA0);
I2C_Wr(2);
I2C_Repeated_Start();
I2C_Wr(0xA1);
*sec =I2C_Rd(1);
//while (I2C_Is_Idle() == 0)
*min =I2C_Rd(1);
//while (I2C_Is_Idle() == 0)
*hr =I2C_Rd(1);
//while (I2C_Is_Idle() == 0)
*day =I2C_Rd(1);
//while (I2C_Is_Idle() == 0)
*mn =I2C_Rd(0);
//while (I2C_Is_Idle() == 0)
I2C_Stop();
}//~
*min, char *hr, char *day, char
;
;
;
;
;
void Transform_Time(char *sec, char *min,
*mn, char *year) {
*sec = ((*sec & 0xF0) >> 4)*10 + (*sec
*min = ((*min & 0xF0) >> 4)*10 + (*min
*hr
= ((*hr & 0xF0) >> 4)*10 + (*hr &
*year = (*day & 0xC0) >> 6;
*day = ((*day & 0x30) >> 4)*10 + (*day
*mn
= ((*mn & 0x10) >> 4)*10 + (*mn &
}//~
char *hr, char *day, char
& 0x0F);
& 0x0F);
0x0F);
& 0x0F);
0x0F);
void main()
{
Soft_I2C_Config(&PORTD, 4,3); // Initialize full master mode
Soft_I2C_Start(); // Issue start signal
Soft_I2C_Write(0xA0); // Address PCF8583
Soft_I2C_Write(0); // Start from word at address 0 (config word)
Soft_I2C_Write(0x80); // Write 0x80 to config. (pause counter...)
Soft_I2C_Write(0); // Write 0 to cents word
Soft_I2C_Write(0); // Write 0 to seconds word
Soft_I2C_Write(0x30); // Write 0x30 to minutes word
Soft_I2C_Write(0x11); // Write 0x11 to hours word
Soft_I2C_Write(0x30); // Write 0x24 to year/date word
Soft_I2C_Write(0x08); // Write 0x08 to weekday/month
Soft_I2C_Stop(); // Issue stop signal
Soft_I2C_Start(); // Issue start signal
Soft_I2C_Write(0xA0); // Address PCF8530
Soft_I2C_Write(0); // Start from word at address 0
Soft_I2C_Write(0); // Write 0 to config word (enable counting)
Soft_I2C_Stop(); // Issue stop signal
While(1)
{
Read_Time(&sec,&min1,&hr,&day,&mn,&year);
Transform_Time(&sec,&min1,&hr,&day,&mn,&year);
}
}//~!
Extras
//Relogio DS1307
//Acerta hora
unsigned char txt[6]; //utilizada para conversao de binario para txt
para ser impresso
short hora_atual;
short minuto_atual;
short segundo_atual;
void Escreve_Memoria(unsigned int endereco, unsigned char dado);
unsigned char Le_Memoria(unsigned int endereco);
//Passa como parametro as hora em binario (decimal) e entao converte
para BCD
//para acertar a hora...
void acerta_hora(short hora, short minuto, short segundo)
{
short hora_bcd;
short minuto_bcd;
short segundo_bcd;
hora_bcd = (hora / 10) * 16 + (hora % 10);
minuto_bcd = (minuto / 10) * 16 + (minuto % 10);
segundo_bcd = (segundo / 10) * 16 + (segundo % 10);
Escreve_Memoria(0,segundo_bcd); //11 segundos
Escreve_Memoria(1,minuto_bcd); //11 minutos
Escreve_Memoria(2,hora_bcd); //11 horas
}
//Passa como parametro tres variaveis que receberao a hora
//A hora lida é em bcd e deve novamente ser transformada em Binario
para o usuário
void le_hora(short *hora, short *minuto, short *segundo)
{
short hora_binario;
short minuto_binario;
short segundo_binario;
segundo_binario = Le_Memoria(0);
minuto_binario = Le_Memoria(1);
hora_binario
= Le_Memoria(2);
*hora =
((hora_binario & 0xF0) / 16) * 10 + (hora_binario &
0x0F);
*minuto =
((minuto_binario & 0xF0) / 16) * 10 +
(minuto_binario & 0x0F);
*segundo = ((segundo_binario & 0xF0) / 16) * 10 +
(segundo_binario & 0x0F);
}
void Escreve_Memoria(unsigned int endereco, unsigned char dado){
I2C1_Start();
// issue I2C start signal
I2C1_Wr(0xD0);
// send byte via I2C (device address + W)
I2C1_Wr(endereco);
// send byte (address of EEPROM
location)
I2C1_Wr(dado);
// send data (data to be written)
I2C1_Stop();
delay_ms(16);
}
unsigned char Le_Memoria(unsigned int endereco){
unsigned char dado_lido;
I2C1_Start();
//
I2C1_Wr(0xD0);
//
I2C1_Wr(endereco);
location)
I2C1_Repeated_Start(); //
I2C1_Wr(0xD1);
//
dado_lido = I2C1_Rd(0u);
I2C1_Stop();
return(dado_lido);
}
void main(){
I2C1_Init(100000);
Delay_ms(100);
UART1_Init(9600);
Delay_ms(100);
issue I2C start signal
send byte via I2C (device address + W)
// send byte (address of EEPROM
issue I2C signal repeated start
send byte (device address + R)
// Read the data (NO acknowledge)
// initialize I2C communication
// Wait for UART module to stabilize
// Initialize UART module at 9600 bps
// Wait for UART module to stabilize
UART1_Write_Text("Start");
//Acerta hora para 11:11:11
hora_atual = 11;
minuto_atual = 12;
segundo_atual = 17;
acerta_hora(hora_atual,minuto_atual,segundo_atual);
UART1_Write_Text("CELESC INFORMA...");
while(1)
{
le_hora(&hora_atual,&minuto_atual,&segundo_atual);
UART1_Write(13);
UART1_Write(10);
//converte inteiro para string
inttostr(hora_atual,txt);
UART1_Write_Text(txt);
UART1_Write_Text(":");
//converte inteiro para string
inttostr(minuto_atual,txt);
UART1_Write_Text(txt);
UART1_Write_Text(":");
//converte inteiro para string
inttostr(segundo_atual,txt);
UART1_Write_Text(txt);
delay_ms(1000);
}
}
Download

PCF8583 O PCF8583 É UM RTC (REAL TIME CLOCK