Escolar Documentos
Profissional Documentos
Cultura Documentos
Interrupcoes e Timers
Interrupcoes e Timers
MicrocontroIadores PIC
MicrocontroIadores PIC
Interrupes e Timers
Interrupes e Timers
2
Sumrio
Sumrio
Interrupes
Interrupes
Timers e Contadores
Timers e Contadores
Exerccios
Exerccios
3
Interrupes na Linguagem C do PIC
Interrupes na Linguagem C do PIC
Dependem do CompiIador.
Dependem do CompiIador.
Automtica: Automtica:
O compiIador gera todo o cdigo do tratamento da interrupo O compiIador gera todo o cdigo do tratamento da interrupo
(fIags, configurao de registradores, contexto, etc.) (fIags, configurao de registradores, contexto, etc.)
A nica tarefa do programador a construo das funes de A nica tarefa do programador a construo das funes de
tratamento dos eventos individuais de cada interrupo. tratamento dos eventos individuais de cada interrupo.
ManuaI: ManuaI:
O programador dever se incumbir de tudo: verificar fIags de O programador dever se incumbir de tudo: verificar fIags de
interrupo, chamadas especficas para tratamento de cada evento, interrupo, chamadas especficas para tratamento de cada evento,
configurao dos registradores, saIvar e recuperar contexto, etc. configurao dos registradores, saIvar e recuperar contexto, etc.
4
Interrupes na Linguagem C do PIC
Interrupes na Linguagem C do PIC
Vantagens: Vantagens:
SimpIicidade SimpIicidade
Desvantagens: Desvantagens:
Uso: Uso:
Vantagens: Vantagens:
Desvantagens: Desvantagens:
Uso: Uso:
Observao!! Observao!!
Automtica:
Automtica:
Nesse exempIo a interrupo timer1 tem prioridade sobre a de timer0 Nesse exempIo a interrupo timer1 tem prioridade sobre a de timer0
ManuaI:
ManuaI:
Fica a cargo do programador. A ordem de tratamento que eIe Fica a cargo do programador. A ordem de tratamento que eIe
definir dita a ordem de prioridade. definir dita a ordem de prioridade.
6
Funes do CompiIador C usadas no uso de Interrupes Funes do CompiIador C usadas no uso de Interrupes
HabiIita uma interrupo, segundo uma constante (arquivo HabiIita uma interrupo, segundo uma constante (arquivo header header). ).
DesabiIita uma interrupo, segundo uma constante (arquivo DesabiIita uma interrupo, segundo uma constante (arquivo header header). ).
/// INT
// Interrupt Functions:
// ENABLE_INTERRUPT!"# $IABLE_INTERRUPT!"# E%T_INT_E$&E!"
// 'onst(nts use) in E%T_INT_E$&E!" (re:
*)e+ine L_T,_- ./4.
*)e+ine -_T,_L .
// 'onst(nts use) in ENABLE/$IABLE_INTERRUPT!" (re:
*)e+ine &L,BAL ./.B'.
*)e+ine INT_RT'' ./.B2.
*)e+ine INT_RB ./.B.0
*)e+ine INT_E%T ./.B1.
*)e+ine INT_A$ ./0'4.
*)e+ine INT_TBE ./0'1.
*)e+ine INT_R$A ./0'2.
*)e+ine INT_TI1ER1 ./0'.1
*)e+ine INT_TI1ER2 ./0'.2
*)e+ine INT_''P1 ./0'.4
*)e+ine INT_''P2 ./0$.1
*)e+ine INT_P ./0'.0
*)e+ine INT_PP ./0'0.
*)e+ine INT_BU',L ./0$.0
*)e+ine INT_EEPR,1 ./0$1.
*)e+ine INT_TI1ER. ./.B2.
2
TIMERS do PIC 16F877A
TIMERS do PIC 16F877A
Limite de contagem;
Tipo de incremento;
Prescales e Postscales;
A gerao de interrupes;
TIMER 0 (continuao)
TIMER 0 (continuao)
ExempIo: Configurar o TMR0 (8 bits) para que gere ExempIo: Configurar o TMR0 (8 bits) para que gere
interrupes a cada 1 segundo. interrupes a cada 1 segundo.
Vamos considerar que o CLK da CPU = 4 MHz. Vamos considerar que o CLK da CPU = 4 MHz.
O cIock interno ser de 1 MHz. Logo, Tcpu = 1 us, ou seja, a cada O cIock interno ser de 1 MHz. Logo, Tcpu = 1 us, ou seja, a cada
1us TMR0 avana uma unidade. 1us TMR0 avana uma unidade.
Como queremos gerar interrupes a cada 1 segundo, a Como queremos gerar interrupes a cada 1 segundo, a
freqncia de gerao dessas interrupes dever ser de 1 Hz. freqncia de gerao dessas interrupes dever ser de 1 Hz.
Entretanto o cIock interno funciona em uma freqncia Entretanto o cIock interno funciona em uma freqncia
1.000.000 maior que 1Hz. 1.000.000 maior que 1Hz.
Usar o TMR0 sem o recurso do PRESCALER, necessitaria Usar o TMR0 sem o recurso do PRESCALER, necessitaria
contar 1.000.000 / 256 = 3906,25 interrupes. contar 1.000.000 / 256 = 3906,25 interrupes.
12
Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A
ExempIo: Configurar o TMR0 (8 bits) para que gere ExempIo: Configurar o TMR0 (8 bits) para que gere
interrupes a cada 1 segundo (1 Hz). interrupes a cada 1 segundo (1 Hz).
Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK
interno de 1 MHz. interno de 1 MHz.
Se o PRESCALER estiver programado em 1:64, a freqncia de Se o PRESCALER estiver programado em 1:64, a freqncia de
entrada no TMR0 ser de 1 MHz : 64 = 15625 Hz. entrada no TMR0 ser de 1 MHz : 64 = 15625 Hz.
setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64); setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64);
Se programarmos o TMR0 para dividir esse sinaI 15625 por 125, Se programarmos o TMR0 para dividir esse sinaI 15625 por 125,
teremos um sinaI de sada de teremos um sinaI de sada de 125 Hz 125 Hz, para isso, basta carreg-Io , para isso, basta carreg-Io
a cada estouro de contagem com o vaIor: a cada estouro de contagem com o vaIor:
256 (2 256 (2
8 8
) 125 = 131. ) 125 = 131.
set_timer0 (131); set_timer0 (131);
$ess( +or4( (p5s
125 interrup67es#
1s ter8 p(ss()o9
13
Funes do CompiIador C usadas no uso de TIMERS Funes do CompiIador C usadas no uso de TIMERS
get_timer () get_timer ()
L o contedo de um L o contedo de um
TIMER (registrador). TIMER (registrador).
// Ti4er .
// Ti4er . !A:A RT''"Functions:
// ETUP_',UNTER!" or ETUP_TI1ER_.!"#
// ET_TI1ER.!" or ET_RT''!"#
// &ET_TI1ER.!" or &ET_RT''!"
// 'onst(nts use) +or ETUP_TI1ER_.!" (re:
*)e+ine RT''_INTERNAL .
*)e+ine RT''_E%T_L_T,_- 32
*)e+ine RT''_E%T_-_T,_L 40
*)e+ine RT''_$I;_1 0
*)e+ine RT''_$I;_2 .
*)e+ine RT''_$I;_4 1
*)e+ine RT''_$I;_0 2
*)e+ine RT''_$I;_16 3
*)e+ine RT''_$I;_32 4
*)e+ine RT''_$I;_64 5
*)e+ine RT''_$I;_120 6
*)e+ine RT''_$I;_256 2
14
Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A
ExempIo: Configurar o TMR0 para que gere interrupes a cada 1 segundo. ExempIo: Configurar o TMR0 para que gere interrupes a cada 1 segundo.
Aps 125 estouros do TMR0 (125 interrupes), teremos chegado ao tempo de 1 segundo Aps 125 estouros do TMR0 (125 interrupes), teremos chegado ao tempo de 1 segundo
(1Hz). (1Hz).
#incIude <16F877A.h> #incIude <16F877A.h>
#use deIay(cIock=4000000) #use deIay(cIock=4000000)
#fuses HS,NOWDT,PUT,NOLVP #fuses HS,NOWDT,PUT,NOLVP
#int_timer0 #int_timer0
void trata_tmr0 () { void trata_tmr0 () {
static booIean LED; static booIean LED;
static int contador; static int contador;
set_timer0(131 + get_timer0()); set_timer0(131 + get_timer0());
contador++; contador++;
if(contador == 125) { if(contador == 125) {
contador = 0; contador = 0;
LED = !LED; LED = !LED;
output_bit(pin_b0, LED); output_bit(pin_b0, LED);
} }
} }
void main() { void main() {
// configura o TMR0 para cIock interno e prescaIer dividindo por 64 // configura o TMR0 para cIock interno e prescaIer dividindo por 64
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64); setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);
set_timer0 (131); // inicia o timer 0 em 131 set_timer0 (131); // inicia o timer 0 em 131
// habiIita interrupes // habiIita interrupes
enabIe_interrupts (gIobaI | int_timer0); enabIe_interrupts (gIobaI | int_timer0);
whiIe (true); // espera peIa interrupo whiIe (true); // espera peIa interrupo
} }
15
Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A
TIMER 1 (continuao)
TIMER 1 (continuao)
TIMER 2 (TMR2)
Temporizador de 8 bits.
Possu um Prescale;
Possu um Postscale;
TIMER 2 (continuao)
O ajuste do
O ajuste do
Prescale
Prescale
feito com T2CON.
feito com T2CON.
O ajuste do
O ajuste do
Postscale
Postscale
feito com o T2CON.
feito com o T2CON.
2.
Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A
TIMER 2 (continuao)
Quando houver um RESET (diferente dos outros Timers 1 e 0). Quando houver um RESET (diferente dos outros Timers 1 e 0).
Possu chave especfica para habiIitar ou desabiIitar o Possu chave especfica para habiIitar ou desabiIitar o
incremento T2CON<TMR2ON>. incremento T2CON<TMR2ON>.
Exerccios:
Exerccios:
<
CaIcuIe o Iimite de contagem de cada um dos Timers
do PIC16F877A, supondo que todos operem com o
cIock interno.
<
Configure o TMR2 para contar eventos de 1 em 1
minuto.
<
Faa o mesmo com o TMR1.
<
Como voc configuraria os timers do PIC16F877A para
fazer uma contagem regressiva?
22
Constantes referentes ao uso do TIMER 1 e 2 Constantes referentes ao uso do TIMER 1 e 2
Arquivo Header do 16F877A (16f877a.h) Arquivo Header do 16F877A (16f877a.h)
// Ti4er 1
// Ti4er 1 Functions: ETUP_TI1ER_1# &ET_TI1ER1# ET_TI1ER1
// 'onst(nts use) +or ETUP_TI1ER_1!" (re:
// !or !=i( >" to?et@er const(nts +ro4 e(c@ ?roup"
*)e+ine T1_$IABLE$ .
*)e+ine T1_INTERNAL ./05
*)e+ine T1_E%TERNAL ./02
*)e+ine T1_E%TERNAL_AN' ./03
*)e+ine T1_'L:_,UT 0
*)e+ine T1_$I;_BA_1 .
*)e+ine T1_$I;_BA_2 ./1.
*)e+ine T1_$I;_BA_4 ./2.
*)e+ine T1_$I;_BA_0 ./3.
////////////////////////////////////////////////////////////////// Ti4er 2
// Ti4er 2 Functions: ETUP_TI1ER_2# &ET_TI1ER2# ET_TI1ER2
// 'onst(nts use) +or ETUP_TI1ER_2!" (re:
*)e+ine T2_$IABLE$ .
*)e+ine T2_$I;_BA_1 4
*)e+ine T2_$I;_BA_4 5
*)e+ine T2_$I;_BA_16 6
23
Onde encontrar mais informaes.
Onde encontrar mais informaes.
http://www.microchip.com http://www.microchip.com
Desbravando o PIC Editora Erica David Jos de Desbravando o PIC Editora Erica David Jos de
Souza Souza
Conectando o PIC 16F877A Recursos Avanados Conectando o PIC 16F877A Recursos Avanados
Editora Erica David Jos de Souza e NichoIas C. Editora Erica David Jos de Souza e NichoIas C.
Lavnia Lavnia
PIC Programao em C Fbio Pereira Editora rica PIC Programao em C Fbio Pereira Editora rica
http://www.picIist.com http://www.picIist.com
http://www.geocities.com/picmaniaco/indice.htmI http://www.geocities.com/picmaniaco/indice.htmI
24
Onde encontrar mais informaes.
Onde encontrar mais informaes.