Você está na página 1de 5

Universidade Federal de Mato Grosso

Faculdade de Arquitetura, Engenharia e Tecnologia


Departamento de Engenharia Elétrica
Laboratório de Microprocessadores

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

 Entender os procedimentos para projetar aplicações que necessitam executar processos


recorrentes, baseados em um relógio de tempo real (RTC) e interrupções geradas pelo
transbordo (overflow) do módulo temporizador TMR1 do microcontrolador PIC.

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

; redefine valores do tmr1, atualiza RTC ;programa principal


bcf T1CON, TMR1ON inicio:
movlw 0x0B bsf STATUS, RP0
movwf TMR1H bcf OPTION_REG, 7
movlw 0xDC bsf TRISA, 0 ; A,0 entrada, ;pois
movwf TMR1L tem o potenciômetro
bsf T1CON, TMR1ON bcf STATUS, RP0
incf FATOR, F movlw 0xF0
movfw FATOR movwf PORTB
xorlw d'10' clrf PORTD
btfss STATUS,Z clrf PORTE
goto fim_isr movlw 0x30
; completou 1 s, atualiza os contadores movwf T1CON
movlw 0x0B movwf binario
movwf TMR1H call bin_bcd
movlw 0xDC movfw deze
movwf TMR1L addlw 0x30
bsf STATUS, RP0 call EnviaCarLCD
movlw B'11110000' movfw unid
movwf TRISB addlw 0x30
movlw B'11111000' call EnviaCarLCD
movwf TRISE movlw ':'
movlw 0x0E call EnviaCarLCD
movwf ADCON1 movfwv seg
bsf PIE1, TMR1IE movwf binario
bcf STATUS, RP0 call bin_bcd
bsf INTCON, PEIE movfw deze
bsf INTCON, GIE addlw 0x30
bsf INTCON, 3 ; habilita inter. call EnviaCarLCD
;por mudanca de estado na porta B movfw unid
bcf INTCON, 0 addlw 0x30
clrf FATOR call EnviaCarLCD
clrf seg goto mostra_hora
clrf min chave_1:
clrf horas call ret20ms
call inicio_LCD btfss PORTB,4
movlw LCD_ON_NOCURSOR goto $-2
call EnviaCmdLCD incf seg, F
movlw .60
;envia mensagem xorwf seg, 0
call mens_ufmt btfsc STATUS, Z
movlw LCD_Linha_2 clrf seg
call EnviaCmdLCD return
call mens_rtc1 chave_2:
call ret1s call ret20ms
bsf T1CON, TMR1ON btfss PORTB,5
goto $-2
;mostra no LDC hh:mm:aa incf min, F
movlw LCD_CLEAR movlw .60
call EnviaCmdLCD xorwf min, 0
movlw LCD_Linha_1 btfsc STATUS, Z
call EnviaCmdLCD clrf min
call mens_hora return
mostra_hora: chave_3:
movlw LCD_Linha_2 call ret20ms
call EnviaCmdLCD btfss PORTB,6
movlw '' goto $-2
call EnviaCarLCD incf horas, F
movfw horas movlw .24
movwf binario xorwf horas, 0
call bin_bcd btfsc STATUS, Z
movwf deze clrf horas
addlw 0x30 return
call EnviaCarLCD
movwf unid ;inclusao de bibliotecas
addlw 0x30 #include "z_atrasos.asm"
call EnviaCarLCD #include "z_driver_lcd.asm"
movlw ':' #include "z_bin8-bcd.asm"
call EnviaCarLCD return
movfw min end

Você também pode gostar