24
1 Microcontroladores PIC Microcontroladores PIC Interrupções e Timers Interrupções e Timers Ricardo de Oliveira Duarte Ricardo de Oliveira Duarte DECOM – UFOP DECOM – UFOP

PIC Timers CCS

Embed Size (px)

Citation preview

Page 1: PIC Timers CCS

1

                                                           

Microcontroladores PICMicrocontroladores PICInterrupções e TimersInterrupções e Timers

Ricardo de Oliveira DuarteRicardo de Oliveira DuarteDECOM – UFOPDECOM – UFOP

Page 2: PIC Timers CCS

2

                                                           

SumárioSumário

InterrupçõesInterrupções Timers e ContadoresTimers e Contadores Contagem do Tempo no PICContagem do Tempo no PIC ExercíciosExercícios

Page 3: PIC Timers CCS

3

                                                           

Interrupções na Linguagem C do PICInterrupções na Linguagem C do PIC

Dependem do Compilador.Dependem do Compilador.

Duas formas para o tratamento de interrupções Duas formas para o tratamento de interrupções no compilador PCHW da CCS:no compilador PCHW da CCS:• Automática:Automática:

O compilador gera todo o código do tratamento da interrupção O compilador gera todo o código do tratamento da interrupção (flags, configuração de registradores, contexto, etc.)(flags, configuração de registradores, contexto, etc.)

A única tarefa do programador é a construção das funções de A única tarefa do programador é a construção das funções de tratamento dos eventos individuais de cada interrupção.tratamento dos eventos individuais de cada interrupção.

• Manual:Manual: O programador deverá se incumbir de tudo: verificar flags de O programador deverá se incumbir de tudo: verificar flags de

interrupção, chamadas específicas para tratamento de cada evento, interrupção, chamadas específicas para tratamento de cada evento, configuraçào dos registradores, salvar e recuperar contexto, etc.configuraçào dos registradores, salvar e recuperar contexto, etc.

Page 4: PIC Timers CCS

4

                                                           

Interrupções na Linguagem C do PICInterrupções na Linguagem C do PIC

Interrupção AutomáticaInterrupção Automática• Vantagens:Vantagens:

SimplicidadeSimplicidade• Desvantagens:Desvantagens:

Gera programas maiores.Gera programas maiores. Gera tempo extra no Gera tempo extra no

tratamento das interrupções, tratamento das interrupções, ou seja, o tempo entre a ou seja, o tempo entre a ocorrência do evento de ocorrência do evento de interrupção propriamente dito interrupção propriamente dito e o tratamento da mesma.e o tratamento da mesma.

• Uso:Uso: Aplicações simples onde o Aplicações simples onde o

tempo não é um fator crítico.tempo não é um fator crítico.

Interrupção ManualInterrupção Manual• Vantagens:Vantagens:

Adequado quando a aplicação Adequado quando a aplicação demanda precisão de demanda precisão de contagem.contagem.

• Desvantagens:Desvantagens: Gera programas menores.Gera programas menores. Mais trabalho para o Mais trabalho para o

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

• Uso:Uso: Aplicações de tempo real e/ou Aplicações de tempo real e/ou

onde pequenos atrasos são onde pequenos atrasos são indesejáveis.indesejáveis.

• Observação!!Observação!! Demanda inclusão de código Demanda inclusão de código

assemblerassembler (diretiva específica) (diretiva específica)

Page 5: PIC Timers CCS

5

                                                           

Priorização de Interrupções na Linguagem C do PICPriorização de Interrupções na Linguagem C do PIC

Automática:Automática:• Através da diretiva:Através da diretiva:

#priority#priority Exemplo: #priority timer1, timer0Exemplo: #priority timer1, timer0 Nesse exemplo a interrupção timer1 tem prioridade sobre a de timer0Nesse exemplo a interrupção timer1 tem prioridade sobre a de timer0

Manual:Manual:• Fica a cargo do programador. A ordem de tratamento que ele Fica a cargo do programador. A ordem de tratamento que ele

definir dita a ordem de prioridade. definir dita a ordem de prioridade.

Page 6: PIC Timers CCS

6

                                                           

Funções do Compilador C usadas no uso de InterrupçõesFunções do Compilador C usadas no uso de Interrupções

Enable_interrupts (valor)Enable_interrupts (valor)• Habilita uma interrupção, segundo uma constante (arquivo Habilita uma interrupção, segundo uma constante (arquivo headerheader).).• Exemplo: Exemplo: enable_interrupts (GLOBAL | INT_TIMER0);enable_interrupts (GLOBAL | INT_TIMER0);

Disable_interrupts (valor)Disable_interrupts (valor)• Desabilita uma interrupção, segundo uma constante (arquivo Desabilita uma interrupção, segundo uma constante (arquivo headerheader).).

/// INT// Interrupt Functions: // ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(), EXT_INT_EDGE()// Constants used in EXT_INT_EDGE() are:#define L_TO_H 0x40#define H_TO_L 0// Constants used in ENABLE/DISABLE_INTERRUPTS() are:#define GLOBAL 0x0BC0#define INT_RTCC 0x0B20#define INT_RB 0x0B08#define INT_EXT 0x0B10#define INT_AD 0x8C40#define INT_TBE 0x8C10#define INT_RDA 0x8C20#define INT_TIMER1 0x8C01#define INT_TIMER2 0x8C02#define INT_CCP1 0x8C04#define INT_CCP2 0x8D01#define INT_SSP 0x8C08#define INT_PSP 0x8C80#define INT_BUSCOL 0x8D08#define INT_EEPROM 0x8D10#define INT_TIMER0 0x0B20

Page 7: PIC Timers CCS

7

                                                           

TIMERS do PIC 16F877ATIMERS do PIC 16F877A

Timers contam tempo.Timers contam tempo. Contadores contam eventos.Contadores contam eventos.

Esse PIC tem 3 timers/contadores com características diferentes de funcionamento:• TIMER 0; TIMER 1 e TIMER 2.

O que varia de um para o outro?• Limite de contagem;• Modo de operação (como contador/timer);• Tipo de incremento;• Prescales e Postscales;• A geração de interrupções;• Os periféricos a eles associados.

Page 8: PIC Timers CCS

8

                                                           

Contagem do Tempo no PIC 16F877AContagem do Tempo no PIC 16F877A TIMER 0 (registrador TMR0) Temporizador e Contador de 8 bits. Pode ser lido e escrito, ou seja, permite ser inicializado. Funcionamento: Incremental (somente). Incremento de 2 formas distintas (OPTION_REG<TOCS>):

• Contador: A cada transição do pino RA4 (TOCKI: pulso de clock externo).• Timer: A cada ciclo de máquina.

TMR0 muda de estado, segundo o valor do Prescaler (PS).• Prescaler é um registrador que permite um recurso de contagem além do limite do

registrador do timer TMR0.• Ex.: PS configurado como 1:4. São necessários 4 ciclos de máquinas ou 4 pulsos

externos, para que o TMR seja incrementado de 1 unidade.• O PS é de 8 bits, mas não está disponível para leitura nem escrita!

Toda vez que se escreve em TMR0, PS é zerado!

Page 9: PIC Timers CCS

9

                                                           

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

TIMER 0 (continuação) Para a utilização do PS em TMR0:

1. Configurar OPTION_REG<PSA>:PSA = 1: Prescale aplicado ao WDT (Watch Dog Timer).PSA = 0; Prescale aplicado ao TMR0.

5. Configurar o valor do PS em OPTION_REG<PS2…PS0>

Qual a forma de incrementarmos o TMR0 com uma relação 1:1 ?

Page 10: PIC Timers CCS

10

                                                           

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

TIMER 0 (continuação) Registradores associados ao Timer 0Registradores associados ao Timer 0

Page 11: PIC Timers CCS

11

                                                           

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

Exemplo: Configurar o TMR0 (8 bits) para que gere Exemplo: Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo.interrupções a cada 1 segundo.• Vamos considerar que o CLK da CPU = 4 MHz.Vamos considerar que o CLK da CPU = 4 MHz.O clock interno será de 1 MHz. Logo, Tcpu = 1 us, ou seja, a cada O clock interno será de 1 MHz. Logo, Tcpu = 1 us, ou seja, a cada

1us TMR0 avança uma unidade.1us TMR0 avança uma unidade.

• Como queremos gerar interrupções a cada 1 segundo, a Como queremos gerar interrupções a cada 1 segundo, a freqüência de geração dessas interrupções deverá ser de 1 Hz.freqüência de geração dessas interrupções deverá ser de 1 Hz.

• Entretanto o clock interno funciona em uma freqüência Entretanto o clock interno funciona em uma freqüência 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 interrupções.contar 1.000.000 / 256 = 3906,25 interrupções.

Page 12: PIC Timers CCS

12

                                                           

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

Exemplo: Configurar o TMR0 (8 bits) para que gere Exemplo: Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo (1 Hz).interrupções 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 freqüência de Se o PRESCALER estiver programado em 1:64, a freqüência 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 sinal 15625 por 125, Se programarmos o TMR0 para dividir esse sinal 15625 por 125, teremos um sinal de saída de teremos um sinal de saída de 125 Hz125 Hz, para isso, basta carregá-lo , para isso, basta carregá-lo a cada estouro de contagem com o valor: a cada estouro de contagem com o valor: 256 (2256 (288) – 125 = 131.) – 125 = 131.

set_timer0 (131);set_timer0 (131);

Dessa forma após 125 interrupções,1s terá passado.

Page 13: PIC Timers CCS

13

                                                           

Funções do Compilador C usadas no uso de TIMERSFunções do Compilador 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 (variáveis no modo (variáveis no headerheader))

set_timer (modo)set_timer (modo)• Modifica o conteúdo Modifica o conteúdo

de um TIMER interno.de um TIMER interno.

get_timer ()get_timer ()• Lê o conteúdo de um Lê o conteúdo de um

TIMER (registrador).TIMER (registrador).

// Timer 0// Timer 0 (AKA RTCC)Functions:// SETUP_COUNTERS() or SETUP_TIMER_0(),// SET_TIMER0() or SET_RTCC(),// GET_TIMER0() or GET_RTCC()// Constants used for SETUP_TIMER_0() are:#define RTCC_INTERNAL 0#define RTCC_EXT_L_TO_H 32#define RTCC_EXT_H_TO_L 48

#define RTCC_DIV_1 8#define RTCC_DIV_2 0#define RTCC_DIV_4 1#define RTCC_DIV_8 2#define RTCC_DIV_16 3#define RTCC_DIV_32 4#define RTCC_DIV_64 5#define RTCC_DIV_128 6#define RTCC_DIV_256 7

Page 14: PIC Timers CCS

14

                                                           

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

Exemplo: Configurar o TMR0 para que gere interrupções a cada 1 segundo.Exemplo: Configurar o TMR0 para que gere interrupções a cada 1 segundo.• Após 125 estouros do TMR0 (125 interrupções), teremos chegado ao tempo de 1 segundo Após 125 estouros do TMR0 (125 interrupções), teremos chegado ao tempo de 1 segundo

(1Hz).(1Hz).

#include <16F877A.h>#include <16F877A.h>#use delay(clock=4000000)#use delay(clock=4000000)#fuses HS,NOWDT,PUT,NOLVP#fuses HS,NOWDT,PUT,NOLVP

#int_timer0#int_timer0void trata_tmr0 () {void trata_tmr0 () {

static boolean LED;static boolean 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 clock interno e prescaler dividindo por 64// configura o TMR0 para clock interno e prescaler dividindo por 64setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);set_timer0 (131); // inicia o timer 0 em 131set_timer0 (131); // inicia o timer 0 em 131// habilita interrupções// habilita interrupçõesenable_interrupts (global | int_timer0);enable_interrupts (global | int_timer0);while (true); // espera pela interrupçãowhile (true); // espera pela interrupção

}}

Page 15: PIC Timers CCS

15

                                                           

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

TIMER 1 (TMR1H e TMR1L) Temporizador e Contador de 16 bits. Podem ser lidos e escritos pelo programador. Origem do sinal: interno ou externo. Para operar com sinais externos (T1CON<TMR1CS=1>):

• Cristal nos pinos RC0 (T1OSO) e RC1 (T1OSI).• Sinal pulsado no pino RC0 (T1CKI).

Para operar com sinais internos (T1CON<TMR1CS=0>):• Incremento interno através dos ciclos de máquina.

Possuí um Prescaler para configurar o incremento.• T1CON<T1CKPS1:T1CKPS0>

Page 16: PIC Timers CCS

16

                                                           

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

TIMER 1 (continuação) Possuí um sincronismo do CLK externo com o CLK

interno T1CON<T1SYNC>.• T1SYNC = 1 (sincronismo desligado);• T1SYNC = 0 (sincronismo ligado).

Quando o sincronismo esta desligado, permite que a contagem continue mesmo que o PIC esteja em modo SLEEP.

Para ler os registradores do TIMER1 (TMR1H e TMR1L):• Modo convencional: pare a contagem e leia.• Modo alternativo: leia TMR1H, guarde em uma variável temporária,

depois leia TMR1L. Depois da leitura de TMR1L compare TMR1H com o valor da variável temporária. Caso afirmativo: OK. Caso negativo: faça isso novamente.

A escrita reseta o Prescaler.A escrita reseta o Prescaler.

Page 17: PIC Timers CCS

17

                                                           

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

TIMER 1 (continuação) Registradores associados ao Timer 1Registradores associados ao Timer 1

Page 18: PIC Timers CCS

18

                                                           

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

TIMER 2 (TMR2) Temporizador de 8 bits. Incremento somente relacionado com o CLK interno. Possuí um Prescale; Possuí um Postscale; Diferente dos 2 Timers anteriores:

• Não conta de 0 até 255.• Conta do conteúdo do registrador PR2 até 255.

O Postscale define o número 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.

Page 19: PIC Timers CCS

19

                                                           

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

TIMER 2 (continuação) O ajuste do O ajuste do PrescalePrescale é feito com T2CON. é feito com T2CON.

O ajuste do O ajuste do PostscalePostscale é feito com o T2CON. é feito com o T2CON.

Page 20: PIC Timers CCS

20

                                                           

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

TIMER 2 (continuação) O Prescaler e o Postscaler serão zerados:O Prescaler e o Postscaler serão 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 específica para habilitar ou desabilitar o Possuí chave específica para habilitar ou desabilitar o incremento T2CON<TMR2ON>.incremento T2CON<TMR2ON>.

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

Page 21: PIC Timers CCS

21

                                                           

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

Exercícios:Exercícios:• Calcule o limite de contagem de cada um dos Timers

do PIC16F877A, supondo que todos operem com o clock interno.

• Configure o TMR2 para contar eventos de 1 em 1 minuto.

• Faça o mesmo com o TMR1.• Como você configuraria os timers do PIC16F877A para

fazer uma contagem regressiva?

Page 22: PIC Timers CCS

22

                                                           

Constantes referentes ao uso do TIMER 1 e 2Constantes referentes ao uso do TIMER 1 e 2Arquivo Header do 16F877A (16f877a.h)Arquivo Header do 16F877A (16f877a.h)

// Timer 1// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1// Constants used for SETUP_TIMER_1() are:// (or (via |) together constants from each group)#define T1_DISABLED 0#define T1_INTERNAL 0x85#define T1_EXTERNAL 0x87#define T1_EXTERNAL_SYNC 0x83

#define T1_CLK_OUT 8

#define T1_DIV_BY_1 0#define T1_DIV_BY_2 0x10#define T1_DIV_BY_4 0x20#define T1_DIV_BY_8 0x30

////////////////////////////////////////////////////////////////// Timer 2// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2// Constants used for SETUP_TIMER_2() are:#define T2_DISABLED 0#define T2_DIV_BY_1 4#define T2_DIV_BY_4 5#define T2_DIV_BY_16 6

Page 23: PIC Timers CCS

23

                                                           

Onde encontrar mais informações…Onde encontrar mais informações…

http://www.microchip.comhttp://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 Avançados – Conectando o PIC 16F877A – Recursos Avançados –

Editora Erica – David José de Souza e Nicholas C. Editora Erica – David José de Souza e Nicholas C. Lavínia Lavínia

PIC – Programação em C – Fábio Pereira – Editora Érica PIC – Programação em C – Fábio Pereira – Editora Érica John Peatman’sJohn Peatman’s

• And corresponding excellent bookAnd corresponding excellent book• http://http://www.picbook.com/index.htmlwww.picbook.com/index.html

http://www.piclist.comhttp://www.piclist.com http://www.geocities.com/picmaniaco/indice.htmlhttp://www.geocities.com/picmaniaco/indice.html

Page 24: PIC Timers CCS

24

                                                           

Onde encontrar mais informações…Onde encontrar mais informações…

“Design with PIC Microcontrollers” by John B. Peatman, published by Prentice Hall, ISBN 0-13-759259-0.

"The C Programming Language - Second Edition", Brian W. Kernigan & Dennis M. Ritchie, Prentice Hall, 1988.

“Programming Embedded Systems, in C and C++”, M. Barr, publ. byO’Reilly, ISBN 1-56592-354-5

“The Art of Electronics” by P. Horowitz and W.Hill. Published by Cambridge University Press, ISBN 0-521-37095-7