FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS (VERSÃO PARA DS1307) – COM PIC 16F628A E LCD (REF116)

Acionar dispositivos em determinados momentos programados pode ser muito útil em automação. Veja esta nova versão do controlador de 6 canais usando um RTC DS1307 (comunicação I2C)…

Para facilitar para alguns hobistas que estão tendo dificuldade de encontrar o ci DS1302, de protocolo SPI (3 fios), foi adaptado o código para usar o ci DS1307, de protocolo I2c de 2 fios. Com exceção de usar um fio a menos na ligação com o PIC, poucas coisas mudaram no esquema. Veja abaixo como ficou:

Na parte do arquivo ASM, todas as rotinas de SPI foram substituídas por rotinas I2C. O Programa ficou bem inchado com estas modificações, sendo então necessário a substituição de algumas linhas de código repetidas por chamadas de subrotina. Ainda assim, sobraram poucas linhas de código, sem usar, das 2047 existentes na flash do PIC16F628a.
Com respeito ao uso e aplicações, poderá ver os detalhes no artigo ‘FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS – COM PIC 16F628A E LCD’, uma vez que só foi mudado o chip RTC de ds1302 para DS1307.
Obs.: Esta montagem é de caráter didático, sendo montada e testada apenas em placa de protoboard, sendo sujeita a bugs ainda não detectados. São fornecidos os arquivos ASM e HEX, que poderão ser modificados conforme as necessidades dos hobistas.

Segue o arquivo ASM:

RELOGIO_CONTROL_DS1307_ASM

Segue o arquivo Hex:

RELOGIO_CONTROL_DS1307_HEX

Em 27/11/14 foi feita revisão, conforme pasta abaixo:

relogio_controlador_v2

Também, em 30/11/14 foi feita esta versão usando compilador “C”, e atualizada em 03/03/2015, com vantagem de recuperar a situação programada, mesmo com falta de energia momentânea. Foi feita uma nova forma de mostrar a programação do calendário e canais, piscando os elementos que estão sob ajustes. Confira na pasta zipada abaixo:

RELOGIO_CONTROL_DS1307_V_4

O Sr. Edmilson Spigolan nos envia gentilmente uma versão com apenas um canal, usando o mesmo esquema, mas sem montar fisicamente os canais 2 a 6. Segue a pasta com o asm e hex:

relogio_controlador 1 canal

Em 09/09/2017 foi feita uma revisão neste relógio de 1 canal, eliminando um ‘bug’ que deixava a segunda linha um pouco instável na apresentação. Segue os arquivos desta nova versão de 1 canal:

RELOGIO_CONTROL_1C_E

Caso deseje a versão com o circuito integrado DS1302 clique aqui.

Em 27/07/2015 foi feita esta versão, com programação também do dia(s) da semana além das horas, minutos e segundos. Por exemplo: Como irrigação de jardim: acionando eletroválvula da água (destas de máquina de lavar roupas). Podemos programar para regar nas segundas, quartas, sextas, ligando no horário xx:xx:xx e desligando yy:yy:yy (a diferença será o tempo de rega). Segue a pasta com os arquivos desta montagem:

RELOGIO_CONTROL_SEM_6CAN

Manuais:

DS1307
PIC 16F628A
LCD
Esquemas curiosos

Curiosidades:

Como usar melhor o tempo?
Coleta da água da chuva — métodos antigos e modernos
O que é a Grande Bacia Artesiana?
O que revela a visão do invisível?
Os ciclos que sustentam a vida
Já que não pode guardá-lo, use-o bem
Dê mais vida à sua casa
Ondas assassinas: mitos e verdades
Já sorriu para um crocodilo?
Navegar em água e em terra
O esplendor da areia

Outros assuntos:
Lidar com sogros
Aprenda a perdoar
Lidar com dívidas
Como disciplinar seu filho adolescente
Por que eu me corto?
Desempenhem bem o papel de pais
Como fazer seu segundo casamento dar certo
O que acontece quando morremos?
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

86 comments on “FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS (VERSÃO PARA DS1307) – COM PIC 16F628A E LCD (REF116)

  1. Prezados.
    Montei o circuito e percebi que se desligo e ligo o mesmo, os segundos não são armazenados, ou seja, os segundos sempre começam contando a partir de 00 quando torno a ligar. Alguém saberia como resolver esse problema? Desde já agradeço.

    1. Olá Marcelo!
      Quando foi feito este projeto, a intenção era de ajusta-lo e mante-lo ligado para controlar as carga, geralmente mais preocupados com minutos e horas. Mas se você necessita desta ‘precisão’ dos segundos ao inicializar o microcontrolador, creio que você terá que alterar a seguinte porção do código, que se encontra no início do programa:

      CLRF BUFFER ;LIGA O OSCILADOR DO DS1307
      MOVLW C_SEC ; C_SEG = 0X00 ou seja, está zerando os segundos visto que estou escrevendo…
      CALL DS_WRITE

      Pois ao inicializar, deve-se certificar de estar ligado o RTC (ds1307). Mas na forma que está o código, também ‘zera’ o contador de segundos do RTC. O bit ‘7’ do registrador ‘0’ é o bit liga e desliga do RTC. Os outros bits são das dezenas de segundos e unidade de segundo (veja datasheet DS1307 pag. 8). O que pode-se pensar em fazer? Ler primeiro a posição ‘0’ da ram , zerar o bit 7 sem alterar os outros bits e escrever novamente para gravar o byte 0 da ram. Esta é uma possibilidade. Creio que poderá haver mais de uma solução. Mas é a que me vem a mente agora. Como o programa está bem ‘inchado’, sobrando poucas linhas na Flash, precisa ver se dará para fazer isto.
      Cláudio

    2. Olá Cláudio!
      Obrigado pela resposta. Substitui na linha correspondente C_SEC por 0X00,compilei o arquivo conforme muito bem explicado em outro tópico do site, porém não houve alteração. Caso tenha alguma outra susgestão, agradeço.

      1. Olá Marcelo! Não é apenas substituir uma linha. A idéia seria ler o byte de segundos do RTC e ver se está ligado ou não. Se estiver pula as linhas que ligam.
        Tente fazer a seguinte alteração na porção de código abaixo e recompilar ( não testei):

        INICIO

        BANK1 ;BANCO 1
        CLRF TRISA ;TUDO SAIDA
        CLRF TRISB ;TUDO SAIDA
        CLRF OPTION_REG ;HABILITA PULL UP
        BSF PIE1,0 ;LIGA INTERRUPÇÃO DO TIMER1
        BANK0
        MOVLW .7 ;DESLIGA COMPARADORES
        MOVWF CMCON
        CLRF PORTA ;ZERA SAIDAS
        CLRF PORTB
        CLRF PCAUX
        CLRF PCLATH
        MOVLW 0X21 ;PRESCALLER /4 NO TMR1
        MOVWF T1CON ;LIGA TIMER 1
        MOVLW B’11000000′ ;LIGA INTERRUPÇÃO GERAL E PERIFÉRICOS
        MOVWF INTCON

        CALL LcdInit ;INICIA LCD
        CALL LcdClear
        MOVLW 0XFF
        CALL DELAY_MS
        MOVLW MSG1 ;NOME DO EQUIPAMENTO
        CALL ENV_LCD
        CALL LINHA_2
        MOVLW MSG2 ;BLOG
        CALL ENV_LCD
        MOVLW 0X20 ;TEMPO DA APRESENTAÇÃO
        CALL DELAYW

        CLRF BUFFER ;LIGA O OSCILADOR DO DS1307

        ;aqui tem que ser alterado POR COMENTAR COM ‘;’
        ; MOVLW C_SEC
        ; CALL DS_WRITE

        ;para ler antes de escrever, ACRESCENTE ESTAS LINHAS (ENTRE XXX):

        ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

        MOVLW C_SEC ;ler primeiro o byte de segundos do RTC
        CALL DS_READ ;le e temos em ‘w’ a leitura dos segundos do RTC
        MOVWF AUX ;PEGA A LEITURA E COLOCA EM UM REGISTRADOR
        BTFSS AUX,7 ;TESTA O BIT 7 (chave on/off do RTC, sendo ‘0’=ligado e ‘1’= desligado)
        GOTO SEGUE_PROG
        MOVLW C_SEC ;SE FOR ‘1’ ENTÃO LIGA O RTC
        CALL DS_WRITE
        SEGUE_PROG

        ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

        CLRF R_MENU

        ;=================================================================================================
        ; PROGRAMA PRINCIPAL
        ;=================================================================================================
        MAIN
        BANK0
        ;=================================================================================================
        ; ATUALIZA CONTADORES DE TEMPO E CALENDÁRIO
        ;=================================================================================================
        …………

        Cláudio

  2. olá edmilsom e possivel voce me enviar este relogio com a mudança que voce relizou quero montar uma estufa
    e vou precisar apenas de um relé tambem.jose luiz

  3. Olá Claudio boa tarde valeu pela dica anterior ja coloquei os resistores.Ontem montei o relogio com ds 1307 e minha aplicação para ligar uma maquina de solda requer somente uma saida ai notei que na hora de programar os horarios mesmo que usar somente uma saida tem que passar por todas as outras programações .Então pensa daqui pensa dali acabei apagando no codigo fonte as opções de saida desde dois até seis e mudando de lugar alguns comandos nw é que deu certo agora meu relogio tem somente um programa ligar rele1
    e desligar rele1 apos a mensagem de encerrar ajustes ele volta para o relogio nw passando pelas outras programações e fikou 10 perfeito na verdade eu quis dar um ar de importado ao relogio e mudei os termos todos para ingles tipo on off calendar clock no lugar de canal 1 agora aparece device 1 fikou muito legal .Sei que existe muita literatura sobre programação mas gostaria que vc me indicasse seus livros em asm para eu poder comprar iguais. Mais uma vez sou muito agradecido por vc estar sendo um professor para muitos de nos e que Deus te abençoe . Obrigado Edmilson LS

    1. Olá Edmilson! É isto mesmo. Altere os programas conforme suas necessidades. Invente, personalize, divirta-se com a eletrônica!
      Claudio

  4. Claudio tudo bem com vc ? ja montei este relogio e ficou perfeito agora a maquina de solda aqui da empresa deixou de ter um timer analogico e passou a ter um digital agora deixa eu te perguntar uma coisa os resistores de 220r ligados as teclas para ajustes nw podem ser substituidos somente por um ligado ao terra ? afinal de contas pressiona se uma tecla por vez eu fiz assim e esta funcionando normal tbm omiti os resistores de 470r e esta normal.Mais uma vez obrigado por estar ajudando no aprendizado de pessoas como eu parabens e que Deus te ilumine e de bastante saude força e sabedoria para publicar seus projetos.Edmilson LS

    1. Olá Edmilson! Os pinos ligados as chaves também são ligados aos pinos do LCD. Assim, ora se comportam como entradas, ao ler os interruptores, ora estão fornecendo niveis ‘1’ ou ‘0’ para o LCD, como saídas. Estes resistores servem para limitar a corrente a níveis suportáveis e evitar queimar a saída do PIC em uma situação em que o pino se comporta como saída ‘1’ (quando enviando dado para o LCD) e você aperta o interruptor ligando ao gnd. Sem o resistor, seria um curto. Aconselho a colocar os resistores, para não perder o seu PIC.
      Claudio

Comments are closed.

Back To Top