Você está na página 1de 10

Universidade Federal de Mato Grosso – UFMT

Faculdade de Arquitetura, Engenharia e Tecnologia – FAET


Departamento de Engenharia Elétrica

Microprocessadores

Laboratório 08: Tacômetro e Interrupções

Prof. Nicolás Eusebio Cortez Ledesma

2018/1
Projeto 1: Tacômetro – Contador de giros de um motor DC

+5V Sensor Timer 0


330 óptico 253
252
251
255
254
4
5
3
2
1
0
RD0
RA4/T0CKI
RD1
Vcc Vcc
RD2 Motor

PIC16F877A
RD3 DC
RD4
RD5 RB4
RD6 Ponte H
RD7
RB5
LEDs
Projeto 1: Tacômetro – Contador de giros de um motor DC

Programa principal
Início • Para o Timer 0 funcionar como contador,
pulsos de clock deverão ser fornecidos
Configuração de FSR e GPR: por meio do pino RA4/T0CKI.
• Porta B à para acionar motor DC
• Porta D à para acionar LEDs • O motor DC é acionado habilitando
• Config. TMR0 como contador com apenas um dos ramos da ponte H, que
prescaler =1 se encontra ligado aos pinos RB4 e RB5,
• TMR0 = 0
portanto, se RB4 = 1 ⇒ RB5 = 0 ou vice-
versa.
Exibe TMR0 em LEDs: • A Porta D recebe o valor de TMR0,
• Aciona motor durante 2ms
• Desliga motor durante 10ms
porém complementado, porque os LEDs
se acionam com lógica negativa.
• PORTD ß TMR0
Projeto 2: Interrupção externa via RB0/INT

330 +5V
RB3 Se as teclas [1], [4] ou [7] fossem
RD0
RB2 pressionadas, ocorrerão eventos
PIC16F877A
RD1 de interrupção.
RB1
RD2
RB0
RD3 Linha 1 10k
RC3 on 0 = +
RD4
RD5 RC2 1 2 3 - Teclado
Básico
RD6 RC1 4 5 6 ×
RD7 RC0 7 8 9 ÷

OPTION_REG<INTDEG> = 0
Interrupção externa
INTCON<INTE> = 1
Projeto 2: Interrupção externa via RB0/INT
Programa principal Rotina de Interrupção
• Cada vez que alguma
Início ISR (org 0x04)
das teclas [1], [4] ou [7]
Salva: Wreg e STATUS é pressionada, ocorrerá
Configuração de FSR e GPR:
• Porta C à para acionar teclado um evento de interrup-
• Porta A, D à para acionar Displays Atraso de 20ms ção, então, o código de
• Config. INT. externa via RB0/INT 7seg apontado por FSR
Sim
RB0 = 0? é usado para atualizar o
• Copiar num buffer RAM, na faixa de Não valor do Display.
endereços 0x40 – 0x4F, os códigos de Sim código
FSR++; aponta outro
• RB0 = 0, indica que uma
7seg dos 16 dígitos hexadecimais
• FSR = 0x40 Não tecla está pressionada.
FSR = 0x50?
• Habilita as linhas 2,3 e 4 do teclado
Sim
FSR = 0x40; inicio do buffer recupera: Wreg e STATUS
• Display ß MDADOS[FSR]
• Sleep à µC INTF ß 0; limpa flag Fim_ISR
Interrupção por mudança de nível nos pinos RB4 – RB7

Conectando com terra qualquer


RD0
Buzzer pino: RB4, RB5, RB6 ou RB7,
PIC16F877A
RD1 ocorrerão eventos de interrupção.
RA2
RD2 Na rotina de interrupção será
RD3 ativado um buzzer durante 1s.
RB4
RD4
RD5 RB5

RD6 RB6 Interrupção


RD7 RB7

INTCON<RBIE> = 1
Interrupção por mudança de nível nos pinos RB4 – RB7

Rotina de Interrupção
ISR (org 0x04) • Cada vez que existir uma
Programa principal
mudança de nível nos
Início Salva: Wreg e STATUS
pinos RB4, RB5, RB6 ou
RB7, ocorrerá um evento
Configuração de FSR e GPR: Atraso de 20ms
de interrupção, então, o
• Porta A à para acionar buzzer
Não buzzer será acionado
• Config. INT. por RB4 – RB7 PORTB mudou?
durante 1s.
Sim • O fato de testar a PORTB
Aciona buzzer durante 1s é para ver se apresenta
• Sleep à µC
um estado diferente ao
RBIF ß 0; limpa flag
estado que disparou a
interrupção.
recupera: Wreg e STATUS

Fim_ISR
Configuração de OPTION_REG
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
OPTION_REG RBPU’ INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit 0

• Bit 7: RBPU’ 0: habilita os resistores pull-up do µC PIC; 1: desabilita os resistores pull-up ;

• Bit 6: INTDEG define borda de sensibilidade para interrupção externa via RB0/INT (0 para ↓ e 1 para ↑);

• Bit 5: T0CS 0: Timer 0 funcionara como temporizador, recebendo pulsos do clock do sistema (clock/4);

1: Timer 0 funcionara como contador, recendo pulsos desde o pino RA4/T0CKI;

• Bit 4: T0SE define borda de sensibilidade para Timer0 como contador (0 para ↑ e 1 para ↓);

• Bit 3: PSA 0: módulo prescalador atribuído para Timer0; 1: prescalador atribuído para WDT;

• Bits 2:0 PS2:PS0 define o valor do prescalador: 000, 001, ..... 111 à 2, 4, 8, 16, 32, 64, 128, 256;
Configuração de interrupções
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit 7 bit 0
• Bit 7: GIE 1: habilitação global de interrupções; 0: desabilita disparo de interrupções;
• Bit 6: PEIE 1: habilita interrupções “periféricas”; 0: desabilita interrupções “periféricas”;
• Bit 5: T0IE 1: habilita interrupção por transbordo de Timer 0;
0: desabilita interrupção por transbordo de Timer 0;
• Bit 4: INTE 1: habilita interrupção nomeada externa, via borda de subida ou descida no pino RB0/INT;
0: desabilita interrupção externa;
• Bit 3: RBIE 1: habilita interrupção por mudança de nível (↑ e ↓) nos pinos RB4, RB5, RB6 ou RB7;
0: desabilita interrupção mudança de nível ;
• Bit 2: T0IF 1: flag que indica que foi detectado um transbordo de Timer 0;
• Bit 1: INTF 1: flag que indica que foi detectado a borda definida pelo bit INTDEG (↑ ou ↓);
• Bit 0: RBIF 1: flag que indica que foi detectado uma mudança de nível (↑ ou ↓) em qualquer pino RB4,
RB5, RB6 ou RB7;
Esquema simplificado de habilitação de interrupções

TMR0IF
Int. Timer 0 Acorda ao CPU
TMR0IE
(tira do SLEEP)

INTF
Int. Externa
INTE
Interrupção
do CPU
RBIF
Int. Porta B
RBIE

Interrupções
externas

GIE Note-se que os IF serão


PEIE setados se uma condição
Habilitação global de
Habilita Interrupções de interrupção ocorrer,
Interrupções
nomeadas “Periféricas” independente de IE.

Você também pode gostar