Sei sulla pagina 1di 3

TIMER0 COM INTERRUPO

Andrei Carvalho Ribeiro


Universidade Federal do Piau Matrcula: 201265795 and.car.rib@hotmail.com Resumo Este documento apresenta os resultados e dados da prtica 03 do laboratrio de microcontroladores, que consiste em desenvolver dois programas em assembly para o PIC 16F877A a partir da IDE do MPLAB. As interrupes no TIMER0 e por evento externo so empregadas para fazer um LED comutar o estado e para no modo SLEEP fazer um LED piscar duas vezes via boto, respectivamente. Palavras-chave Interrupo, TMR0, SLEEP, assembly. I. INTRODUO Como o prprio nome diz, uma interrupo serve para interromper o programa imediatamente. Desta maneira, pode-se tomar atitudes instantneas. As interrupes so aes tratadas diretamente pelo hardware, o que as torna muito rpidas e disponveis em qualquer ponto do sistema. Assim sendo, quando uma interrupo acontece, o programa paralisado, uma funo especfica (definida pelo programador) executada e depois o programa continua a ser executado do mesmo ponto em que estava. Existem modelos que nem possuem interrupes, como o caso, por exemplo dos PICs 12C50X,16C54, 16C55 e outros de geraes mais antigas, mas em todos os modelos mais novos as interrupes esto presentes. As principais interrupes so: 1 Interrupes de TIMERS 2 Interrupo Externa 3 Interrupo por Mudana de Estado 4 Interrupo de Fim na Escrita da EEPROM 5 Interrupo de Comparador 6 Interrupes de USART 7 Interrupo de CCP II. PROCEDIMENTOS E RESULTADOS Foi desenvolvido dois programas em assembly com o objetivo de identificar e o que acontece aps ser gerada uma interrupo. O primeiro programa comutaria o estado de um LED conectado no pino RB0 da porta B a cada 0,5 s aproximadamente, utilizando uma interrupo do timer0.

Figura 1 - LED piscando atravs de interrupo gerada pelo TMR0 O cdigo desenvolvido apresentado no quadro abaixo:
#INCLUDE <P16F877A.INC> __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF #DEFINE BANK0 BCF STATUS, RP0 #DEFINE BANK1 BSF STATUS, RP0 #DEFINE LED PORTB, 0 CBLOCK 0X20 CONTADOR ENDC ORG 0X00 GOTO INICIO ORG 0X04 BCF INTCON, 2 DECFSZ CONTADOR RETFIE MOVLW .8 MOVWF CONTADOR MOVLW B'00000001' XORWF PORTB RETFIE INICIO CLRF PORTB BANK1 MOVLW B'00000000' MOVWF TRISB MOVLW B'10000111' MOVWF OPTION_REG MOVLW B'10100000' MOVWF INTCON BANK0 MOVLW .8 MOVWF CONTADOR GOTO $ END

Algoritmo 1 - Programa pisca LED

No primeiro programa RB1 da PORTB foi utilizado para o LED, e portando configurado atravs do bit 1 do TRISB como sada. A configurao do OPTION_REG permitiu desabilitar os resistores de pull-up e habilitar o prescaler no TMR0 com 1:256. Portando, considerando atravs do prescaler que o ciclo de mquina levasse agora 256 s e que o estouro do TMR0 ocorre na transio do 0xFF para 0x00, levaria: 256 s * 256 = 65536 s fcil notar que o tempo de 8 estouros do TMR0 toleravelmente igual a 0,5 s. Uma varivel CONTADOR recebe o valor da quantidade de estouros necessrios para o TMR0, e a cada interrupo seu valor decrementado, quando seu contedo zero, acontece a comutao de estado do LED e o valor da varivel CONTADOR inicializado para que o mesmo funcionamento seja sucessivamente obtido. Vale lembrar que para utilizarmos uma determinada interrupo, devemos primeiramente ligar sua chave individual, ligando depois a chave de grupo (se existir) e por ltimo a chave geral. Essas configuraes so alcanadas a partir do devido manuseio dos bits do registrador INTCON. Nesse exemplo foi setado o bit GIE (chave geral) e o bit TMR0IE (chave individual). O segundo programa faria um LED piscar duas vezes e em seguida o microcontrolador seria colocado em modo de baixo consumo, a partir de uma interrupo externa um boto conectado no pino RB0/INT faria o LED piscar novamente, retornando para o modo SLEEP.
#INCLUDE <P16F877A.INC> __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF #DEFINE BANK0 BCF STATUS, RP0 #DEFINE BANK1 BSF STATUS, RP0 #DEFINE BOTAO PORTB, 0 #DEFINE LED PORTB, 1 CBLOCK 0X20 AUX1 AUX2 AUX3 ENDC VALOR EQU .255 ORG 0X00 GOTO INICIO ORG 0X04 BCF INTCON, 1 MOVLW B'00000010' XORWF PORTB CALL DELAY RETFIE INICIO BANK1 MOVLW B'00000001' MOVWF TRISB MOVLW B'11000000' MOVWF OPTION_REG MOVLW B'10010000' MOVWF INTCON BANK0 CALL DELAY

SLEEP GOTO $-1 DELAY MOVLW .3 MOVWF AUX3 LOOP0 MOVLW VALOR MOVWF AUX2 LOOP1 MOVLW VALOR MOVWF AUX1 LOOP2 DECFSZ AUX1 GOTO LOOP2 DECFSZ AUX2 GOTO LOOP1 MOVLW B'00000010' XORWF PORTB DECFSZ AUX3 GOTO LOOP0 RETURN END

Algoritmo 2 - Programa pisca LED com boto Uma configurao bem semelhante em relao ao programa anterior foi empregada, porm dois pinos da PORTB foram usados. O pino RB0 foi configurado como entrada e o pino RB1 como sada representando, respectivamente, o boto e o LED. Variveis auxiliares foram manuseadas para o desenvolvimento de uma rotina de delay onde aconteceria as quatro comutaes de estado do LED. A principal diferena em relao ao programa anterior pode ser vista no tratamento do registrador INTCON, mais uma vez a chave geral foi setada, porm dessa vez a chave habilitadora INTE foi setada, indicando o tratamento de uma interrupo externa. importante ressaltar que as flags de interrupo so setadas quando ocorre uma interrupo, independentemente do estado de sua chave geral ou individual, e antes do trmino da interrupo o software do usurio deve assegurar que as flags j tenham sido limpas.

Figura 2 - C em modo SLEEP, LED piscando atravs de interrupo externa.

Como o prprio nome j diz, o modo Sleep coloca o C para dormir. Esta uma das melhores maneiras de economizar energia em sistemas que podem ficar paralisados temporariamente. Como o objetivo do sistema piscar o LED apenas quando o boto for acionado, a utilizao do modo Sleep torna-se ideal. Este modo tambm muito utilizado em sistemas alimentados por pilhas ou baterias, pois o PIC pode passar a consumir menos que 1 A. Para entrarmos no modo Sleep, devemos executar a instruo SLEEP. Uma vez dentro desse, podemos sair dele atravs de uma interrupo externa gerada no pino RB0.
#INCLUDE <P16F877A.INC> __CONFIG _XT_OSC & _LVP_OFF & _WDT_OFF #DEFINE BANK0 BCF STATUS, RP0 #DEFINE BANK1 BSF STATUS, RP0 CBLOCK 0X20 CONTADOR ENDC ORG 0X00 GOTO INICIO ORG 0X04 BCF INTCON, 2 DECFSZ CONTADOR RETFIE MOVLW .154 MOVWF CONTADOR MOVLW .131 MOVWF TMR0 RETFIE INICIO BANK1 MOVLW B'10000110' MOVWF OPTION_REG MOVLW B'10100000' MOVWF INTCON BANK0 MOVLW .154 MOVWF CONTADOR MOVLW .131 MOVWF TMR0 GOTO $ END

BIBLIOGRAFIA [1] Notas de aulas da disciplina de microcontroladores do professor Zurita. Acesso em 6 de janeiro de 2014. http://www.ufpi.edu.br/subsiteFiles/zurita/arquivos/files/ UFPI-Microcontroladores_5-Microcontroladoresv1_1.pdf [2] Microchip Tec. Inc., PIC16F87XA - 28/40/44-Pin Enhanced Flash Microcontrollers, Data Sheet, 2003. [3] Desbravando o PIC Ampliado e Atualizado para PIC 16F628A. Editora rica. 8 ed. [4] Conectando o PIC 16F877A Recursos Avanados. Editora rica. 3 ed.

Algoritmo 3 - Rotina de Interrupo de 1,0 s com tolerncia de 1% III. CONCLUSO A prtica se mostrou satisfatria e esclarecedora acerca do tratamento de interrupes devido ao TMR0 e a eventos externos via pino RB0. A utilizao de interrupo do Timer0 e o uso e tratamento da interrupo pelo RB0/INT ocorreram sem grandes problemas. Contudo devido falta de tempo no foi possvel gravar os programas no PIC16F877A e to pouco fazer medies com multimetro a respeito do seu consumo no modo Sleep.

Potrebbero piacerti anche