Você está na página 1de 24

1

MicrocontroIadores PIC
MicrocontroIadores PIC
Interrupes e Timers
Interrupes e Timers
2

Sumrio
Sumrio

Interrupes
Interrupes

Timers e Contadores
Timers e Contadores

Contagem do Tempo no PIC


Contagem do Tempo no PIC

Exerccios
Exerccios
3

Interrupes na Linguagem C do PIC
Interrupes na Linguagem C do PIC

Dependem do CompiIador.
Dependem do CompiIador.

Duas formas para o tratamento de interrupes


Duas formas para o tratamento de interrupes
no compiIador PCHW da CCS:
no compiIador PCHW da CCS:

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

Interrupo Automtica Interrupo Automtica

Vantagens: Vantagens:

SimpIicidade SimpIicidade

Desvantagens: Desvantagens:

Gera programas maiores. Gera programas maiores.

Gera tempo extra no Gera tempo extra no


tratamento das interrupes, tratamento das interrupes,
ou seja, o tempo entre a ou seja, o tempo entre a
ocorrncia do evento de ocorrncia do evento de
interrupo propriamente dito interrupo propriamente dito
e o tratamento da mesma. e o tratamento da mesma.

Uso: Uso:

ApIicaes simpIes onde o ApIicaes simpIes onde o


tempo no um fator crtico. tempo no um fator crtico.

Interrupo ManuaI Interrupo ManuaI

Vantagens: Vantagens:

Adequado quando a apIicao Adequado quando a apIicao


demanda preciso de demanda preciso de
contagem. contagem.

Desvantagens: Desvantagens:

Gera programas menores. Gera programas menores.

Mais trabaIho para o Mais trabaIho para o


programador. (contexto, fIags, programador. (contexto, fIags,
registradores, etc.) registradores, etc.)

Uso: Uso:

ApIicaes de tempo reaI e/ou ApIicaes de tempo reaI e/ou


onde pequenos atrasos so onde pequenos atrasos so
indesejveis. indesejveis.

Observao!! Observao!!

Demanda incIuso de cdigo Demanda incIuso de cdigo


assembIer assembIer (diretiva especfica) (diretiva especfica)
5

Priorizao de Interrupes na Linguagem C do PIC Priorizao de Interrupes na Linguagem C do PIC

Automtica:
Automtica:

Atravs da diretiva: Atravs da diretiva:


#priority #priority

ExempIo: #priority timer1, timer0 ExempIo: #priority timer1, timer0

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

EnabIe_interrupts (vaIor) EnabIe_interrupts (vaIor)

HabiIita uma interrupo, segundo uma constante (arquivo HabiIita uma interrupo, segundo uma constante (arquivo header header). ).

ExempIo: ExempIo: enabIe_interrupts (GLOBAL | INT_TIMER0); enabIe_interrupts (GLOBAL | INT_TIMER0);

DisabIe_interrupts (vaIor) DisabIe_interrupts (vaIor)

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

Timers contam tempo.


Timers contam tempo.

Contadores contam eventos.


Contadores contam eventos.

Esse PIC tem 3 timers/contadores com


caractersticas diferentes de funcionamento:

TIMER 0; TIMER 1 e TIMER 2.

O que varia de um para o outro?

Limite de contagem;

Modo de operao (como contador/timer);

Tipo de incremento;

Prescales e Postscales;

A gerao de interrupes;

Os perifricos a eIes associados.


0

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 0 (registrador TMR0)

Temporizador e Contador de 8 bits.

Pode ser Iido e escrito, ou seja, permite ser iniciaIizado.

Funcionamento: IncrementaI (somente).

Incremento de 2 formas distintas (OPTION_REG<TOCS>):


Contador: A cada transio do pino RA4 (TOCKI: puIso de cIock externo).
Timer: A cada cicIo de mquina.

TMR0 muda de estado, segundo o vaIor do Prescaler (PS).


PrescaIer um registrador que permite um recurso de contagem aIm do Iimite do
registrador do timer TMR0.
Ex.: PS configurado como 1:4. So necessrios 4 cicIos de mquinas ou 4 puIsos
externos, para que o TMR seja incrementado de 1 unidade.
O PS de 8 bits, mas no est disponveI para Ieitura nem escrita!

Toda vez que se escreve em TMR0, PS zerado!


3

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 0 (continuao)

Para a utiIizao do PS em TMR0:


1. Configurar OPTION_REG<PSA>:
PSA = 1: PrescaIe apIicado ao WDT (Watch Dog Timer).
PSA = 0; PrescaIe apIicado ao TMR0.
5. Configurar o vaIor do PS em OPTION_REG<PS2.PS0>
Qual a forma de incrementarmos o TMR0 com uma relao 1:1 ?
1.

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 0 (continuao)

Registradores associados ao Timer 0


Registradores associados ao Timer 0
11

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. 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

setup_timer (modo) setup_timer (modo)

Configura um TIMER Configura um TIMER


de acordo com o de acordo com o
modo (variveis no modo (variveis no
header header) )

set_timer (modo) set_timer (modo)

Modifica o contedo Modifica o contedo


de um TIMER interno. de um TIMER interno.

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 (TMR1H e TMR1L)

Temporizador e Contador de 16 bits.

Podem ser Iidos e escritos peIo programador.

Origem do sinaI: interno ou externo.

Para operar com sinais externos (T1CON<TMR1CS=1>):


CristaI nos pinos RC0 (T1OSO) e RC1 (T1OSI).
SinaI puIsado no pino RC0 (T1CKI).

Para operar com sinais internos (T1CON<TMR1CS=0>):


Incremento interno atravs dos cicIos de mquina.

Possu um PrescaIer para configurar o incremento.


T1CON<T1CKPS1:T1CKPS0>
16

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 1 (continuao)

Possu um sincronismo do CLK externo com o CLK


interno T1CON<T1SYNC>.
T1SYNC = 1 (sincronismo desIigado);
T1SYNC = 0 (sincronismo Iigado).

Quando o sincronismo esta desIigado, permite que a


contagem continue mesmo que o PIC esteja em modo
SLEEP.

Para Ier os registradores do TIMER1 (TMR1H e TMR1L):


Modo convencionaI: pare a contagem e Ieia.
Modo aIternativo: Ieia TMR1H, guarde em uma variveI temporria,
depois Ieia TMR1L. Depois da Ieitura de TMR1L compare TMR1H com o
vaIor da variveI temporria. Caso afirmativo: OK. Caso negativo: faa
isso novamente.

A escrita reseta o PrescaIer. A escrita reseta o PrescaIer.


12

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 1 (continuao)

Registradores associados ao Timer 1


Registradores associados ao Timer 1
10

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

TIMER 2 (TMR2)

Temporizador de 8 bits.

Incremento somente reIacionado com o CLK interno.

Possu um Prescale;

Possu um Postscale;

Diferente dos 2 Timers anteriores:


No conta de 0 at 255.
Conta do contedo do registrador PR2 at 255.

O Postscale define o nmero de vezes que o TMR2 ir


contar.

O Postscale incrementado sempre que TMR2 = PR2.

Quando o Postscale terminar a INT referente ao Timer 2


ser gerada.
13

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

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)

O PrescaIer e o PostscaIer sero zerados: O PrescaIer e o PostscaIer sero zerados:

Quando escrever em TMR2; Quando escrever em TMR2;

Quando escrever em T2CON; Quando escrever em T2CON;

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>.

Registradores associados ao Timer 2. Registradores associados ao Timer 2.


21

Contagem do Tempo no PIC 16F877A
Contagem do Tempo no PIC 16F877A

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

John Peatman's John Peatman's

And corresponding exceIIent book And corresponding exceIIent book

http:// http://www.picbook.com/index.htmI www.picbook.com/index.htmI

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.

"Design with PIC MicrocontroIIers" by John B.


Peatman, pubIished by Prentice HaII, ISBN 0-13-
759259-0.

"The C Programming Language - Second Edition",


Brian W. Kernigan & Dennis M. Ritchie, Prentice HaII,
1988.

"Programming Embedded Systems, in C and C++, M.


Barr, publ. byOReilly, ISBN !"#"$%!&"'!"

"The Art of EIectronics" by P. Horowitz and W.HiII.


PubIished by Cambridge University Press, ISBN 0-
521-37095-7

Você também pode gostar