Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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.