Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Universidade Federal de Mato Grosso Faculdade de Arquitetura, Tecnologia e Engenharia Departamento de Engenharia Elétrica Laboratório de Eletrônica Geral II Laboratório 6 RTC utilizando o temporizador TMR0 e Interrupções Engenharia Elétrica Docente: Prof. Nicolás Eusebio Cortez Ledesma Discente: Bárbara Morais Gianesini Turma: N1 Data da realização do laboratório: 19 de Fevereiro de 2016 2 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 TMR0 do microcontrolador PIC. 2. Atividades Em um novo projeto, escreva as mudanças necessárias em relação ao programa dado em sala para implementar um relógio de tempo real (RTC). Utilizar a variável ‘min’ para contar os minutos e a variável ‘horas’ para contar as horas. a) Mude o código do programa principal para mostrar nos displays o valor que representa o segundo do RTC. b) Mude o código do programa principal para mostrar nos displays o valor que representa o minuto do RTC. c) Mude o código do programa principal para mostrar nos displays o valor que representa as horas do RTC. O código para implementação de um relógio de tempo real está descrito na página 3. Como serão usados os 2 displays de 7 segmentos da placa de desenvolvimento para mostrar os valores dos segundos, ou dos minutos, ou das horas contadas pelo relógio, o programador deverá escolher qual desses três valores ele deseja expor nos displays. Isso pode ser feito por meio das linhas em negrito do código do programa (página 3). O programador deverá escolher entre a linha dos segundos, minutos ou horas e depois “comentar” as outras duas linhas, de modo que somente o valor escolhido por ele seja enviado aos pinos dos displays. Essa lógica foi utilizada para facilitar a utilização do código e o seu reaproveitamento. Como usamos somente dois displays de 7 segmentos, não conseguimos mostrar os dígitos dos segundos, minutos e horas ao mesmo tempo, e por isso devemos fazer a escolha quando geramos o arquivo .hex e programamos o microcontrolador. Por outro lado, se desejarmos implementar o mesmo relógio usando um display LCD, poderemos mostrar tanto os segundos como os minutos e as horas, e como o nosso código já está preparado para armazenar esses valores, deverão ser feitas poucas mudanças para utilizar o código com o LCD. Durante o desenvolvimento do código, houveram algumas dificuldades quanto á implementação da lógica para incrementar os dígitos das dezenas. Isso ocorreu pois o valor “carregado” não estava sendo apagado a cada vez que o segundo/minuto/hora era enviado para processamento da casa da unidade e dezena que seriam mostradas no display 7 segmentos. 3 list p =16f877a #include <p16f877a.inc> __CONFIG H'3F32' cblock 0x20 unidade dezena contador1 contador2 endc #define K_uni PORTA,5 #define K_dez PORTC,1 org 0x00 goto inicio org 0x04 goto ISR ;rotina de interupcao ISR cblock FATOR seg ;segundos min ;minutos horas ;horas w_temp status_temp display_temp endc movwf w_temp movfw STATUS movwf status_temp btfss INTCON, T0IF goto fim_isr isr_tmr0 movlw d'39' movwf TMR0 incf FATOR, F movf FATOR, W xorlw d'90' btfss STATUS,Z goto fim_isr clrf FATOR incf seg,F movlw .60 xorwf seg, 0 btfss STATUS, Z goto skip_changes clrf seg incf min, F movlw .60 xorwf min, 0 btfss STATUS, Z goto skip_changes clrf min incf horas, F movlw .24 xorwf horas,0 btfss STATUS, Z goto skip_changes clrf horas skip_changes: movfw seg ;segundos movfw min ; minutos movfw horas ; horas movwf display_temp clrf unidade clrf dezena ;passou 1s loop: movlw .10 subwf display_temp,0 btfss STATUS,C goto acha_unidade incf dezena, F movlw .10 subwf display_temp,F goto loop acha_unidade: movfw display_temp movwf unidade fim_isr: bcf INTCON,T0IF movfw status_temp movwf STATUS swapf w_temp,F swapf w_temp,W retfie ;programa principal inicio: bcf K_uni bcf K_dez clrf PORTD bsf STATUS, RP0 movlw 0x07 ;presc=256 movwf OPTION_REG bcf TRISA,5 bcf TRISC,1 clrf TRISD bcf STATUS, RP0 ; para mostrar info no display clrf unidade clrf dezena clrf seg clrf min clrf horas clrf FATOR movlw d'39' movwf TMR0 ;ativa interrupcoes bsf INTCON, T0IE bsf INTCON,GIE mostra_disp: movfw unidade call conv_7seg bcf K_dez movwf PORTD bsf K_uni call ret5ms movfw dezena call conv_7seg bcf K_uni movwf PORTD bsf K_dez call ret5ms goto mostra_disp conv_7seg: addwf PCL, f retlw B'00111111' ;0 retlw B'00000110' ;1 retlw B'01011011' ;2 retlw B'01001111' ;3 retlw B'01100110' ;4 retlw B'01101101' ;5 retlw B'01111101' ;6 retlw B'00000111' ;7 retlw B'01111111' ;8 retlw B'01101111' ;9 ret5ms: movlw D'117' movwf contador1 movlw D'33' movwf contador2 decfsz contador1,1 goto $-1 decfsz contador2,1 goto $-3 return end 4
Compartilhar