Escolar Documentos
Profissional Documentos
Cultura Documentos
Laboratório 7 e 8
RTC utilizando o temporizador TMR1
Engenharia Elétrica
Docente: Prof. Nicolás Eusebio Cortez Ledesma
Discente: Bárbara Morais Gianesini
Turma: N1
Data da realização do laboratório:
26 de Fevereiro de e 04 de Março de 2016
1. Objetivos
2. Atividades
Em um novo projeto, incluir as instruções necessárias, em relação ao programa dado em sala,
para definir os valores iniciais do RTC (hh:mm:ss). Sugestão: utilizar as chaves SW1-SW4
O código em Assembly para controle do RTC foi incluído na próxima página. A partir do
código entregue pelo professor, foram modificadas e/ou incluídas as instruções em negrito.
Essas instruções possibilitaram a definição dos valores iniciais do relógio de tempo real através
de interrupções por mudança de nível nos pinos da porta B.
Quando os push buttons não estão pressionados, por default, eles enviam um sinal alto
aos pinos 4, 5, 6 e 7 da porta B, uma vez que os resistores de pull-up foram ativados na
programação. No entanto, quando qualquer um desses botões são pressionados, através do
circuito, é enviado um sinal baixo ao respectivo pino conectado da porta B. Dessa forma o
microcontrolador pode detectar a mudança de nível e disparar uma interrupção devido a isso.
Teoricamente, quando soltarmos o push button, também seria disparada outra
interrupção por mudança de nível, uma vez que o microcontrolador trabalha em frequências
muito mais rápidas que a nossa velocidade de acionamento do botão. Para que isso não ocorra,
é feita uma lógica onde se testa o pino que foi detectada a primeira mudança; se esse pino
ainda tiver um valor baixo, conta-se um delay e ele é verificado novamente, até que o seu
estado mude para alto (botão não pressionado) e só então as instruções, devidas à essa ação,
são executadas.
Foram utilizados apenas 3 botões, o primeiro (conectado ao pino 4 da porta B) para
definir os segundos, o segundo (conectado ao pino 5 da porta B) para definir os minutos e o
terceiro (conectado ao pino 6 da porta B) para definir as horas.
A cada vez que um desses botões é pressionado, o respectivo “Ponteiro” do relógio é
acrescentado em uma unidade.
Outra ação tomada na interrupção, foi o reinício do temporizador timer 1 quando qualquer
ponteiro do relógio é atualizado. Isso permite que depois da mudança final dos valores se inicie
a contagem. Em outras palavras, independentemente de quantos milésimos de segundos
estiver o contador quando efetuarmos uma mudança em qualquer ponteiro, o contador será
reiniciado em zero, logo, a partir daí se inicia a contagem do segundo.
list p =16f877a clrf FATOR
#include <p16f877a.inc> incf seg,F
__CONFIG H'3F32' movlw .60
xorwf seg, 0
cblock 0x20 btfss STATUS, Z
FATOR goto fim_isr
seg ;segundos clrf seg
min ;minutos incf min, F
horas ;horas movlw .60
w_temp xorwf min, 0
status_temp btfss STATUS, Z
endc goto fim_isr
org 0x00 clrf min
goto inicio incf horas, F
org 0x04 movlw .24
goto ISR xorwf horas, 0
btfss STATUS, Z
seq_ufmt movfw c_seq goto fim_isr
addwf PCL,F clrf horas
dt "FAET-UFMT - 2016"
testa_portaB_interrup
seq_rtc1 movfw c_seq btfss INTCON,0
addwf PCL,F goto fim_isr
dt "RTC-TMR1-clk_int"
btfss PORTB,4
seq_rtc2 movfw c_seq call chave_1
addwf PCL,F btfss PORTB,5
dt "RTC-TMR1-clk_ext" call chave_2
btfss PORTB,6
seq_hora movfw c_seq call chave_3
addwf PCL,F movlw 0x0B ; reinicia o timer 1
dt " hh:mm:ss - RTC " movwf TMR1H
movlw 0xDC
#include "z_mensagens.asm" movwf TMR1L
;rotina de interupcao clrf FATOR
ISR
movwf w_temp fim_isr:
movfw STATUS bcf INTCON,0
movwf status_temp movfw status_temp
bcf STATUS, RP0 movwf STATUS
btfss PIR1,TMR1IF swapf w_temp,F
goto testa_portaB_interrup swapf w_temp,W
bcf PIR1, TMR1IF retfie