TUTORIAL: Real Time Clock com PIC
Neste post estarei falando sobre como usar o PIC como um relógio de tempo real (RTC).
Trabalhando o Timer1 do PIC com uma fonte de clock externa de 32768Hz você poderá obter tempos bem precisos.
O Timer1 deve ser configurado da seguinte forma:
Bit3: T1OSCEN = 1: Habilita o oscilador do Timer1. ( Pinos T1OSO e T1OSI ).
Bit1: TMR1CS = 1: Fonte de clock externa.
Para fazer um RTC, você precisará de um tempo preciso de 1 segundo. Como o cristal gera 32768 pulsos em 1 segundos, definindo o valor do (TMR1H:TMR1L) para 32768, ele levará exatamente 1 segundo para ocorrer o estouro e a interrupção. ( O Timer1 contará de 32768 até 65536 em 1 segundo e após, ocorrerá o estouro ).
Criei uma biblioteca para facilitar o trabalho com o Timer. Achei interessante também mostrar pra vocês como passar uma função como parâmetro numa função, utilizando o compilador MikroC.
BIBLIOTECA
typedef struct
{
char sec;
char min;
char hrs;
}RTC;
RTC time;
void RTC_Interrupt()
{
if(TMR1IF_Bit) //Se ocorreu a interrupção
{
TMR1IF_Bit = 0; //Limpa a flag de interrupção
TMR1H = 0x80;
TMR1L = 0;
time.sec++;
if( time.sec == 60 )
{
time.sec = 0;
time.min++;
if(time.min == 60)
{
time.sec = 0;
time.min = 0;
time.hrs++;
}
}
}
}
void RTC_Init()
{
T1CON = 0b00001111; //Prescaler 1:1, Oscilador ligado, Clock Externo
TMR1H = 0x80;
TMR1L = 0; //Carrega valor de (TMR1H:TMR1L) com 32768
time.sec = 0;
time.min = 0;
time.hrs = 0;
TMR1IE_Bit = 1; //habilita interrupção do timer1
PEIE_Bit = 1; //habilita interrupção dos periféricos
GIE_Bit = 1; //Habilita interrupção global
}
//Esta funcao verifica o tempo do RTC com um
// determinado tempo e executa a funcao do parametro
char RTC_Check_Time( char _seg, char _min, char hr, void (*func)() )
{
if( time.sec == _seg && time.min == _min && time.hrs == hr)
{
func(); //Executa a funcao do parametro
return 1;
}
return 0;
}
EXEMPLO: Temporizador
//Copie e cole o código da biblioteca aqui
void LigarLED()
{
PORTB.B0 = 1;
}
void DesligarLED()
{
PORTB.B0 = 0;
}
void Interrupt()
{
RTC_Interrupt();
}
void main()
{
RTC_Init();
CMCON = 7;
TRISB.B0 = 0;
PORTB.B0 = 0;
while(1)
{
//Passados 10 segundos, executa a funcao LigarLED()
RTC_Check_Time( 10, 0, 0, &LigarLED );
//Passados 20 segundos, executa a funcao DesligarLED()
if( RTC_Check_Time( 20, 0, 0, &DesligarLED ) )
{
time.sec = 0;
time.min = 0;
time.hrs = 0; //Reinicia o RTC
}
}
}


"Show de bola" Tiago. Obrigado pela ajuda. Deus te abençõe !!!
ResponderExcluirTiago, tentei este tutorial em protoboard com o pic 12F675, mas não funcionou. Sabe me dizer como fica os fusíveis e os pinos exatos para ligar o cristal ? Estou tentando, mas sem sucesso.
ResponderExcluirO datasheet do PIC12F675 , para configuração do T1CON está me deixando confuso. Se puder, me ajuda com o uso do cristal de 32768hz e o pic12F675, mostrando a configuração dos fuses e como fazer a configuração do oscilador. Muito obrigado.
ExcluirVocê deve ter percebido que os pinos de entrada para o cristal do Timer1 são os mesmo do PIC( pinos 2 e 3 ). Então você deve desativar o cristal do pic alterando o fusivel para INTOSC oscillator: I/O Function on GP4....
ExcluirDepois é so configurar o Timer1:
bit 7-6 = 00;
bit 5-4 = 00; prescaler 1:1
bit 3 = 1; habilita o oscilador para timer1
bit 2 = 1; não sincronizado
bit 1 = 1; clock externo
bit 0 = 1; timer1 ligado
Tambem deverá desativar o comparador e o canal analogico para trabalhar com as outras portas digitais:
ANSEL = 0;
CMCON = 7;
Tiago, os ensinamentos acima ate funcionaram, mas ainda me resta duvidas. Veja se pode esclarecer. A fusível INTOSC oscillator: I/O Function on GP4.... ativa o oscilador interno certo? e vendo o datasheet, traduzindo algumas partes encontrei isso:
Excluir"O oscilador Timer1 é compartilhada com o sistema LP
oscilador . Assim, Timer1 pode usar este modo apenas quando
o relógio do sistema é derivado do oscilador interno .
Tal como acontece com o sistema de oscilador LP , o utilizador deve fornecer
um tempo de atraso de software para assegurar oscilador correcta
start-up
Enquanto ativado, TRISIO4 e TRISIO5 estão definidos. GP4
e GP5 ler '0 ' e TRISIO4 e TRISIO5 são lidos
'1 ' . "
Nessa situação, o correto não seria usar o fusível LP ? E se for, como preencher o valor do oscilador pedido pelo mikroC em MHz ?
Agradeço toda a sua ajuda... Parabéns pelo empenho em ensinar!!!
O problema de ativar o fusivel LP, é que o clock do PIC será de 32768Hz( 0.032768 ), que é muito lento comparado com os 4Mhz interno.
ExcluirMuito bom! Tiago, teria como fazer utilizando o clock interno do pic? O que eu uso no meu projeto é o PIC18F1220.
ResponderExcluirMuito bom Tiago, já vi um Hardware ligando o Cristal 32.768khz exatamente desta forma sempre quis entender como se usava obrigado por compartilhar, muito satisfeito!
ResponderExcluirCOMO USAR A FUNÇÃO ACIMA PARA FASER UM RELOGIO COM DISPLAY LCD 2X16
ResponderExcluircomo mostrar horas, minutos e segundos para um relogio? é melhor esse metodo ou ds1307 para o relogio?
ResponderExcluirCOMO HAGO PARA INSTALAR Y AGREGAR BIBLIOTECA?
ResponderExcluir