CONTADOR VAR BYTE
TRISC = %00000000 ;PORTC saida PORTC = %00000000 ;limpa PORTC Lcdout $fe, 1
FOR CONTADOR = 0 to 20 step 1
LCDOUT $FE,$C0
LCDOUT "ROTACAO = ", #CONTADOR PORTC = %00001000 ;passo 1 pause 1 PORTC = %00001100 ;passo 2 PAUSE 1 PORTC = %00000100 ;passo 3 PAUSE 1 PORTC = %00000110 ;passo 4 PAUSE 1 PORTC = %00000010 ;passo 5 PAUSE 1 PORTC = %00000011 ;passo 6 PAUSE 1 PORTC = %00000001 ;passo 7 PAUSE 1 PORTC = %00001001 ;passo 8 PAUSE 1 NEXT CONTADOR END
16) Modifique o exemplo 15, para que o motor gire 50 vezes
17) Modifique o exemplo 15, para que o motor gire 1000 vezes para a direita e 1000 vezes para a esquerda. Mostrar no LCD “Rot. Para Dir =”. “Rot . para Esq=”
54 15. Utilizando Interrupções
A interrupção é uma técnica particular do PIC que permite interceptar eventos externos ao programa em execução, interrompe momentaneamente a operação do programa em andamento, controla o evento com uma subrotina apropriada e retorna para a execução do programa.
O PIC16F84 contém 4 tipos de interrupção:
1. A troca de estado em RB0 (External interrupt RB0/INT pin). 2. Ao final da contagem do registro TMR0 (TMR0 overflow interrupt).
3. A troca de estado sobre uma das linhas de RB4 a RB7 (PORTB change interrupts). 4. Ao final da escrita sobre um endereço da EEPROM (EEPROM write complete interrupt). Habilitando interrupções
A interrupção de qualquer um destes eventos pode ser conseguido habilitando ou desabilitando bits do registro INTCON:
1. INTE (bit 4) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre a linha RB0 2. T0IE (bit 5) se este bit estiver em 1 habilitará a interrupção de final de contagem do registro TMR0 3. RBIE (bit 3) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre uma das linhas
de RB4 a RB7
4. EEIE (bit 6) se este bit estiver em 1 habilitará a interrupção de final de escrita sobre um endereço da EEPROM
5. GIE (bit 7) este bit tem que estar em 1 para habilitar qualquer interrupção (Global INterrupt Enable bit) Dado que qualquer interrupção gera uma chamada do endereço 04H, no registro INTCON estará qual
interrupção foi gerada. No registro INTCON se tem:
1. INTF (bit 1) Se vale 1 a interrupção é um estado gerado na troca de estado em RB0.
2. T0IF (bit 2) Se vale 1 a interrupção é um estado gerado no termino da contagem do timer TMR0. 3. RBIF (bit 0) Se vale 1 a interrupção é um estado gerado na troca de estado de uma dos pinos RB4 a
RB7.
Obs.: Como não tem um bit especificando interrupção de fim de esrita na EEPROM, a rotina para tratar essa interrupção deve verificar se os outros bits de sinalização de interrupção estão em 0.
A rotina de interrupção deve zerar o bit sinalizador após tratar a interrupção.
Quando for gerada uma interrupção o PIC desabilita automatimamente o bit GIE (global Interrupt Enable) do registro INTECON de modo a desbilitar todas as interrupções restantes. Para poder retornar ao programa principal e reinicializar em 1 este bit deve-se utilisar a instrução em assembler RETFIE.
Mais informações:
Utilizando interrupções com o PICBASIC
Para se utilizar interrupções com o PICBASIC deve-se utilizar a seguinte estrutura:
ON INTERRUPT GOTO minha_interrupcao ‘rotina de atendimento de interrupção é ‘minha_interrupção
INTCON = %10010000 ‘habilita interrupção no pino RB0 ...
DISABLE ‘desabilita interrupção
minha_interrupcao: LED = 1
RESUME ‘retorna para o programa principal
ENABLE ‘habilita interrupções
Interrupção utilizando o pino RBO/INT
1) Simule o programa e explique seu funcionamento:
CHAVE0 VAR PORTB.0 LED7 VAR PORTB.7
TRISB = %00000001 'configura RB0 como entrada
ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao
INTCON = %10010000 'habilita interrupçao INTE OPTION_REG.6 = 1 'na subida do sinal
LOOP:
LED7 = 1 'faz pino RB7 = 1
GOTO LOOP ' para sempre
'subrotina de atendimento de interrupçao
DISABLE 'desabilita interrupcoes INTERRUPCAO:
'caso ocorra uma interrupcao LED7 = 0 'faz RB7 =0
PAUSE 10 ' espera 10ms
INTCON.1 = 0 'limpa flag de interrupcao RESUME
ENABLE 'retorna para o programa principal
END
Interrupção utilizando a mudança dos pinos RB4-RB7 2) Simule o programa e explique seu funcionamento:
CHAVE7 VAR PORTB.7 LED1 VAR PORTB.1
56
TRISB = %11110001 'configura RB7-RB4 como entradas
ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao
INTCON = %10001000 'habilita interrupçao RB4-RB7
LOOP:
LED1 = 1 'faz pino RB1 = 1 GOTO LOOP ' para sempre 'subrotina de atendimento de interrupçao
DISABLE 'desabilita interrupcoes
INTERRUPCAO:
'caso ocorra uma interrupcao LED1 = 0 'faz RB1 =0
PAUSE 10 ' espera 10ms
INTCON.0 = 0 'limpa flag de interrupcao RESUME
ENABLE 'retorna para o programa principal END
Interrupção como o overflow do TIMER 0 (pino RA4/T0CK)
3) Simule o programa abaixo e explique seu funcionamento:
CHAVE0 VAR PORTB.0 LED1 VAR PORTB.1
TRISB = %00000000 'configura PORTB como saida
ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao TMR0 = 250
OPTION_REG.5 = 1 'na subida do sinal
INTCON = %10100000 'habilita interrupçao TOIE
LOOP:
LED1 = 1 'faz pino RB1 = 1
GOTO LOOP ' para sempre
'subrotina de atendimento de interrupçao
DISABLE 'desabilita interrupcoes
INTERRUPCAO:
'caso ocorra uma interrupcao LED1 = 0 'faz RB1 =0
PAUSE 2 ' espera 10ms
INTCON.2 = 0 'limpa flag de interrupcao TMR0 = 250
RESUME
ENABLE 'retorna para o programa principal END
4) Modifique o programa 1 para que a interrupção ocorra na descida do sinal no pino RB0/INT, anote o programa e simule.
5) Modifique o programa 1 para que quando ocorra a interrupção, faça os pinos RA1=1 e RA2=1 durante 1ms
6) Modifique o programa 2 para que quando ocorra a interrupção, faça o pino RA3=1 durante 2ms. 7) Modifique o programa 3 para que ocorra a interrupção quando forem aplicados 10 pulsos no pino
RA4/T0CKI
8) Modifique o programa 1 para que a cada interrupção, ocorra uma contagem das interrupções em um display de 7 segmentos
9) Modifique o programa 2 para que a cada interrupção, ocorra uma contagem das interrupções em um display LCD
10) Modifique o program 3 para que ocorra uma interrupção quando forem aplicados 8 pulsos no pino RA4/T0CKI, e a cada interrupção, mostrar a mensagem em um display de LCD, "contagem terminada"
58 16. Conectando um teclado no PIC
1) Simule o programa abaixo:
; layout do teclado conectado na PORTB ;B4----[ 1 ]---[ 2 ]---[ 3 ] ; | | | ;B5----[ 4 ]---[ 5 ]---[ 6 ] ; | | | ;B6----[ 7 ]---[ 8 ]---[ 9 ] ; | | | ;B7----[ * ]---[ 0 ]---[ # ] ; | | | ; | | | ; B3 B2 B1
TECLA VAR BYTE