Pular para o conteúdo principal

6) Contador de Milênios v2 (relógio digital)


Desde a versão 1 do Contador de Milênios, existiram duas outras versões não construídas (v1.2 e v1.3), que contribuíram com melhorias na configuração de hora e na estrutura do circuito, deixando a versão 2 infinitamente melhor que a primeira. Além dessas melhorias, a maior delas sem dúvida é o uso do ci ds1307, que é um chip dedicado apenas a contagem de tempo com consumo muito baixo de corrente (RTC = Real Time Clock), mantendo assim a hora ajustada mesmo quando a alimentação do PIC é rompida (através do uso de uma bateria de 3V na placa).
A comunicação do 1307 com o PIC é feita através do uso de comunicação I2C. Como não entendo muito sobre a programação com esse recurso, copiei o código desse site https://microcontroladores-c.blogspot.com/2010/11/usando-rtc-ds1307.html?m=0 com algumas adaptações na função main, responsáveis por transformar a leitura da hora do 1307 para os displays e verificar se o botão de ajuste de hora é pressionado:

void main() 
{
int config=0;
unsigned int a,b,c,d; //just variables
unsigned int seg[]={0b00111111, //Hex value to display the number 0
                    0b00000110, //Hex value to display the number 1
                    0b01011011, //Hex value to display the number 2
                    0b01001111, //Hex value to display the number 3
                    0b01100110, //Hex value to display the number 4
                    0b01101101, //Hex value to display the number 5
                    0b01111101, //Hex value to display the number 6
                    0b00000111, //Hex value to display the number 7
                    0b01111111, //Hex value to display the number 8
                    0b01101111  //Hex value to display the number 9
                   }; //End of Array for displaying numbers from 0 to 9
                   
set_tris_b(ALL_OUT);
set_tris_d(ALL_OUT);
set_tris_a(ALL_IN);
output_b(0b00000000);
output_d(0b00000000);

DS1307_ler_datas();

while(1)
{
while(config == 0)
{
DS1307_ler_datas();

a = segundos%10; //6th digit is saved here
b = segundos/10;
c = b%10; //5rd digit is saved here
d = b/10;
output_d(seg[a]);output_high(s1);
delay_ms(1);output_low(s1);
output_d(seg[c]);output_high(s2);
delay_ms(1);output_low(s2);

a = minutos%10; //4nd digit is saved here
b = minutos/10;
c = b%10; //3st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s3);
delay_ms(1);output_low(s3);
output_d(seg[c]);output_high(s4);
delay_ms(1);output_low(s4);

a = horas%10; //2st digit is saved here
b = horas/10;
c = b%10; //1st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s5);
delay_ms(1);output_low(s5);
output_d(seg[c]);output_high(s6);
delay_ms(1);output_low(s6);

if(input(ADJ_SALVAR) == 1) // AJUSTAR HORA
{
delay_ms(100);
config = 1;
}
}

a = segundos%10; //6th digit is saved here
b = segundos/10;
c = b%10; //5rd digit is saved here
d = b/10;
output_d(seg[a]);output_high(s1);
delay_ms(5);output_low(s1);
output_d(seg[c]);output_high(s2);
delay_ms(5);output_low(s2);

a = minutos%10; //4nd digit is saved here
b = minutos/10;
c = b%10; //3st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s3);
delay_ms(5);output_low(s3);
output_d(seg[c]);output_high(s4);
delay_ms(5);output_low(s4);

a = horas%10; //2st digit is saved here
b = horas/10;
c = b%10; //1st digit is saved here
d = b/10;
output_d(seg[a]);output_high(s5);
delay_ms(5);output_low(s5);
output_d(seg[c]);output_high(s6);
delay_ms(5);output_low(s6);

if(input(ADJ_SEGUNDOS) == 1) // MINUTOS AJUSTE
{
if(segundos > 58)
{
segundos = 0;
delay_ms(100);
}
else
{
segundos = segundos + 1;
delay_ms(100);
}
}

if(input(ADJ_MINUTOS) == 1) // MINUTOS AJUSTE
{
if(minutos > 58)
{
minutos = 0;
delay_ms(100);
}
else
{
minutos = minutos + 1;
delay_ms(100);
}
}

if(input(ADJ_HORAS) == 1) // HORAS AJUSTE
{
if(horas > 22)
{
horas = 0;
delay_ms(100);
}
else
{
horas = horas + 1;
delay_ms(100);
}
}

if(input(ADJ_SALVAR) == 1) // SALVAR
{
DS1307_programar_tempo();
delay_ms(100);
config = 0;
}
}

}



Positivos:
- Contagem de hora independente da alimentação
- Consumo baixo de energia

Negativos:
- Conector USB esquerdo com mal contato
- Ás vezes a placa o PIC não recebe energia ao conectar

Comentários

Postagens mais visitadas deste blog

Tutorial: PCB pelo método fotográfico

Existem diferentes formas de se fazer uma placa de circuito. O método normalmente utilizado pelos iniciantes é desenhando o circuito a mão na placa através de uma caneta permanente. Apesar desse método ser extremamente consistente, isto é, dificilmente as trilhas apresentarão falhas, ele não permite circuitos complexos e bem acabados. Para uma maior complexidade, é necessário montar o  circuito em algum software e imprimi-lo. O desafio, no entanto, é passar do circuito impresso para a placa, formando assim os famosos PCB's (Printed Circuit Board). Optei por investir no método fotográfico, que depois de alguns meses e muitas tentativas, finalmente valeu a pena. Com ele dá para fazer placas dupla face e com mascara de solda, como demonstrarei a seguir: Materiais fundamentais para esse método: Tinta fotossensível; Fotolito ou papel vegetal; Luz negra; Revelador (barrilha/carbonato de sódio); Removedor (soda cáustica). Outros materiais importantes: Secador de cab

Tutorial: Medição de qualquer grandeza com o ICL7107

O ICL7107 é um ci conversor analógico-digital de três dígitos e meio. O que isso significa é que apesar de usar quatro displays, sua escala absoluta de leitura vai de -1999 até 1999. Ele consegue converter sinais analógios de baixa intensidade (escala de mV) nesses três dígitos e meio, o que permite a leitura de qualquer grandeza que faça variar de forma linear tensão, seja através de um sensor ou não. Para medição de grandezas diretamente delas (sem intermédio de sensores), como tensão, corrente, resistência, etc, temos a seguinte configuração de circuito: Temos duas variáveis de ajuste, uma dada pelo divisor de tensão na entrada e outra dada pela tensão no terminal 36. Essas variáveis nos permite manipular a escala de leitura. Vamos considerar a escala inicial de leitura como sem nenhuma divisão de tensão na entrada e 100mV no terminal 36. Nesse caso, podemos ler de -199,9mV até 199,9mV, traduzidos nos displays como -1999 até 1999. Observe que tudo que precisa

2) Contador de Milênios v1 (relógio digital)

Existem diferentes formas de se montar um relógio digital. A mais didática usa do ci (circuito integrado) 555, que pode ser configurado para gerar um pulso elétrico de um em um segundo (1 Hz). Junto de contadores e decodificadores, esse pulso é transmitido para displays de 7 segmentos que marcam a hora. A desvantagem desse circuito é a quantidade de ci's e a quantidade de ligações necessárias. Outra forma de se montar um relógio é através dos PIC's (Programmable Intelligent Computer), que são uma família de ci's programáveis. A linguagem de programação pouco importa, contanto que a lógica possa ser traduzida para comandos. Utilizo linguagem C para programar e para passar do computador para o PIC, o gravador K150. Aprendi a gravar aqui  https://www.filipeflop.com/blog/como-utilizar-gravador-de-pic-usb-k150/ . A vantagem de se utilizar um PIC para montar um relógio está em reduzir o tamanho do circuito e atribuir mais funções além de simplesmente contar o tempo,