Escolar Documentos
Profissional Documentos
Cultura Documentos
6.2 Reset
• Os PIC18 possuem diversas fontes de reset e funcionalidades associadas que visam principalmente
manter a confiabilidade e segurança das aplicações. As fontes de reset possíveis são:
- POR (Power-On Reset), causado pela detecção da alimentação quando o circuito e ligado;
- Nível lógico baixo no pino MCLR durante a execução normal;
- Nível lógico baixo no pino MCLR com o microcontrolador em modo SLEEP;
- PWRT (Power-up Timer)
- OST (Oscillator Start-up Timer)
- BOR (Brown-out Reset) reset por queda de tensão;
- Estouro do WatchDog timer durante a operação normal;
- Instrução RESET;
- Estouro da pilha (overflow e underflow).
• As configurações de reset podem ser realizadas através de diretivas CONFIG (Seção 2.4.2 da
apostila de programação).
6.2.1 MCLR
• A forma mais simples de reset e através do pino MCLR: o microcontrolador reseta quanto um nível
lógico e aplicado a esse pino. No PIC18F4550 pode-se desabilitar a função de reset do pino MCLR.
Nesse caso ele passa a operar como um pino de entrada do portal E.
• Uma interrupção é um evento que faz com que o processador pare a execução do programa
corrente e desvie a execução para um bloco de código chamado rotina de interrupção (normalmente
são decorrentes de operações de E/S).
• O vetor de interrupções: endereço de memória que apontam para as rotinas de tratamento de
interrupção. Quando uma interrupção é gerada, o processador salva o seu estado atual e começa a
executar o tratamento de interrupção apontado pelo vetor.
• Sempre que uma interrupção ocorre, o programa guarda o endereço da próxima linha a ser
executada na pilha e desvia a execução do programa para o endereço da memória de programação.
• O PIC18F4550 possui um total de 20 interrupções. Todas as interrupções irão gerar um desvio do
programa para o vetor (0008h) para interrupções de alta prioridade e (0018h) para interrupções de
baixa prioridade.
• Basta escrever nesse endereço a rotina que irá reconhecer e tratar a interrupção. Quando a rotina
de interrupção é terminada, o programa retorna automaticamente para o ponto em que estava antes
de acontecer.
• Interrupções dos Timers: utilizada normalmente para a contagem de tempo.
- Timer 0: ocorre sempre que o contador TMR0 estoura, ou ou seja, sempre que ele passar de 0xFF
para 0x00 (no modo 8 bits) ou de 0xFFFF a 0x0000 (no modo 16 bits) a interrupção é gerada;
- Timer 1: ocorre sempre que o contador TMR1 (16 bits) estoura, ou seja, sempre que ele passa de
0x0000 a 0xFFFF;
- Timer 2: não acontece necessariamente quando o contador TMR2 (8 bits) estoura, mas sim quando
atinge outro valor qualquer especificado no registrador especial PR2;
- Timer 3: igual ao Timer 1.
• Interrupções externas: geradas por um sinal externo ligado às porta RB0, RB1 ou RB2 (caso
configuradas como entrada). Utilizada, por exemplo, para o reconhecimento de botão ou um sinal do
sistema que necessite de uma ação imediata. Pode ser configurada para a borda de subida ou de
descida.
• Interrupções por mudança de estado: acontece na borda de subida e de descida. Ligadas às portas
RB4, RB5, RB6 e RB7, simultaneamente. Se tais portas forem configuradas como entradas,
quaisquer mudanças nelas irá gerar a interrupção.
• Interrupção de Fim de escrita na E2PROM/FLASH: detecta o final de uma rotina de escrita na
memória E2PROM. Como a escrita na E2PROM é lenta, em alguns casos é necessário para evitar
que o programa pare durante a escrita. É válida também para a memória FLASH.
• Outras interrupções: Interrupção de Fim de escrita na E2PROM/FLASH, Interrupção da porta
paralela (PSP), Interrupção dos conversores A/D, Interrupção de recepção da USART, Interrupção de
transmissão da USART, Interrupção da comunicação serial (SPI e I2C), Interrupção do CCP1
(Capture/Compare/PWM) Interrupção do CCP2 (Capture/Compare/PWM), Interrupção de colisão de
dados (Bus Collision na comunicação I2C), Interrupção dos comparadores, Interrupção de FSCM
(Fail Save Clock Monitor - falha do oscilador principal), Interrupção HLVD (High/Low Voltage Detector
– informa se houve sub ou sobretensão de alimentação).
• Para trabalhar com uma interrupção deve-se primeiramente configurar o periférico associado a ela,
o que e feito normalmente uma única vez, na inicialização programa. Nada impede, porem que um
periférico seja configurado, ou re-configurado, em qualquer ponto programa.
• O próximo passo e habilitar as interrupções a serem utilizadas, e isso pode ser feito em dois
momentos. Pode-se determinar que uma interrupção esteja ativa durante toda a execução do
programa, e nesse caso sua habilitação deve ser feita na inicialização. Por outro lado, em algumas
situações deseja-se que a interrupção seja ativada somente a partir de um dado momento ou ainda
que seja ativada e posteriormente desativada. Nessa situação basta habilitar, ou desabilitar, a
interrupção no momento oportuno.
• É importante lembrar que as interrupções habilitadas somente causam chamadas de interrupção se
o bit de habilitação global estiver habilitado.
• Finalmente, deve-se fazer o “tratamento” de interrupção, isto e, construir as rotinas que serão
chamadas quando ocorrer uma determinada interrupção. Essas rotinas deverão seguir as
recomendações dadas acima e deve-se salvar os registros de interesse.
8. CONTADORES E TEMPORIZADORES
• O PIC18F4550 possuem 4 timers que trabalham de forma bastante semelhante: Timer 0, Timer 1,
Timer 2 e Timer 3.
8.1 Timer 0
• O Timer 0 do PIC18 e um timer de 16 bits, mas que pode operar em modo 8 bits. O registrador de
controle do Timer 0 é T0CON.
• A diferença entre a operação no modo 8 bits e no modo 16 bits é que o flag de interrupção seta no
estouro de 8 bits e no estouro de 16 bits, dependendo do modo.
• O sinal de clock do timer 0 pode vir tanto do sinal de clock interno (FOSC/4) quanto do pino
RA4/T0CKI. É possível configurar se o timer incrementará na transição de subida ou de descida.
• A pré-escala do timer 0 permite multiplicar o período do sinal de entrada por 1, 2, 4, 8, 16, 32, 64,
128, e 256.
• O evento que ocasiona a interrupção é o overflow do timer 0, que depende da configuração do
timer, se para 8 ou 16 bits.
• O período de tempo contabilizado pelo Timer0 pode ser calculado através da expressão:
Onde:
T0: período do Timer0
TOSC: período do oscilador
T0PS[2:0]: fator de pré-escala do timer 0
TMR0H: byte mais significativo do valor da carga inicial do contador
TMR0L: byte menos significativo do valor da carga inicial do contador
8.2 Timer 2
• O timer 2 é um temporizador de 8 bits. Ele apresenta algumas características que diferem dos
timers vistos anteriormente.
• Em primeiro lugar, o timer 2 só pode operar com fonte de clock interna, portanto apenas no modo
timer. Ele possui uma pré-escala com fatores de multiplicação de 1, 4 e 16. O sinal de saída da pré-
escala é aplicado ao contador propriamente dito, que e acessível através do registro TMR2.
• O valor desse contador é comparado constantemente com o valor do registro PR2. Quando os dois
valores são iguais é gerado nível lógico alto no sinal de coincidência (TMR2 Output), que é usado
como base de tempo para outros módulos, e o contador é zerado. O sinal de coincidência é aplicado
a uma pós-escala que pode acumular de 1 a 16 ocorrências, ativando o flag de interrupção quando a
contagem chagar ao valor estabelecido.
• O valor de PR2 não é configurado por nenhuma função especifica. Basta atribuir ao valor desejado
ao registrador PR2.
• O evento que dispara a interrupção do timer 2 é a contagem de n eventos de coincidência entre o
timer 2 e PR2, sendo que n e configurável.
• O período de tempo contabilizado pelo Timer0 pode ser calculado através da expressão:
Onde:
T2: período do Timer2
TOSC: período do oscilador
T2CKPS[1:0]: fator de pré-escala do timer 2
PR2: valor de carga de comparação do timer 2 (0 a 255)
9. MÓDULOS CCP - Captura, Comparação e PWM
• Os dois módulos CCP do PIC (CPP1 e CPP2) se originam dos três tipos de recursos oferecidos:
Capture, Compare e PWM.
• Capture (captura): obtém o valor do temporizador em um dado momento determinado por uma ação
em um dos terminais de entrada.
• Compare (comparação): compara o valor do temporizador com o de um registrador e provoca uma
ação.
• PWM: gera um sinal modulado por largura de pulso.
• Neste curso será utilizado apenas o módulo CPP2, já que o módulo CCP1 possui algumas
características especiais para chaveamento usadas em UPS e controle de motores que não serão
utilizados neste curso.
• Independente do recurso a ser utilizado (Capture, Compare e PWM) é utilizado um pino de I/O
denominado CCP2 que pode ser multiplexado com o pino RB3 ou RC1, o qual deve ser selecionado
através do bit CCP2MX utilizando-se a diretiva #pragma config, como mostrado abaixo:
• No modo captura, o valor do timer 1(TMR1H:TMR1L) é armazenado quando ocorre um evento, que
pode ser:
- 1 transição de descida no pino CCP2;
- 1 transição de subida no pino CCP2;
- 4 transições de subida pino CCP2;
- 16 transições de subida no pino CCP2.
• Quando o evento ocorre, o flag CCP2IF é setado permitindo acionar a interrupção.
• Para operação nesse modo, o terminal CCP2 deve estar configurado como entrada. O timer deve
estar no modo temporizador ou no modo contador síncrono.
• O modo captura pode ser utilizado para determinar a diferença de tempo entre dois eventos, e isso
pode ser feito de duas formas. No primeiro evento, o timer é reiniciado e no segundo o valor
capturado do timer 1 multiplicado pelo período do seu clock corresponde ao tempo transcorrido entre
os dois eventos.
• Outra forma e deixar o timer 1 incrementado livremente e capturar seu valor nos dois eventos.
Fazendo uma subtração entre os dois valores capturados, temos o tempo entre os eventos. Esse
procedimento pode ser utilizado para medir velocidade e frequências (nesse caso temos o período e
sabemos que f = 1/T).
• Os modos onde o evento de captura e a ocorrência de 4 ou 16 transições podem ser vistos como
tendo uma pré-escala na entrada. Essa pré-escala pode ser útil para trabalhar com sinais de
frequências altas. Sua contagem só pode ser zerada com a mudança de modo do CCP.
• No modo PWM o modulo CCP permite utilizar sinais modulados em largura de pulso (PWM – Pulse
Width Modulation), que consiste em representar um valor pelo duty-cycle (isto é, tempo em nível
lógico alto) de um trem de pulsos de frequência fixa.
• A maior parte das aplicações de PWM para microcontroladores se aproveita da propriedade da
energia de um sinal retangular ser proporcional ao seu duty-cycle (a energia de um sinal está
relacionado com a área entre o sinal e o eixo do tempo).
• Como exemplo, um sinal PWM é aplicado a uma lâmpada DC. Um duty-cycle de 100% (sinal
sempre em ‘1’) fará a lâmpada acender em sua potência máxima; já um sinal com 70% de tempo em
alto entrega a lâmpada 70% da potência máxima, e assim por diante. Essa propriedade é utilizada no
acionamento de cargas DC, controle de motores, etc.
• Outra característica importante do PWM é que, se o sinal for filtrado, pode-se obter níveis
analógicos também proporcionais ao duty-cycle. Isso permite gerar desde níveis analógicos fixos ate
sinais mais complexos, como tons DTMF (de telefonia).
• O PWM precisa de uma base de tempo que dará a frequência do sinal. O modulo CCP utiliza o
Timer 2 para conseguir essa base. Também é necessário que o pino CCP2 seja configurado como
saída.
• A geração do período do sinal PWM ocorre da seguinte maneira: cada vez que TMR2 coincide com
PR2, o pino CCP2 é colocado em nível lógico ‘1’ e TMR2 é reiniciado, gerando assim a frequência do
sinal. O período do sinal PWM pode ser calculado através da expressão:
Onde:
TPWM : período do PWM
TOSC: período do oscilador
T2CKPS[1:0]: fator de pré-escala do timer 2
PR2: valor de carga de comparação do timer 2 (8 bits – 0 a 255)
• A geração do período do duty-cycle do sinal PWM, o qual terá uma percentagem (0-100%) do
período total do sinal PWM, pode ser calculado através da expressão:
Onde:
TDUTY : período do duty-cycle
TOSC: período do oscilador
T2CKPS[1:0]: fator de pré-escala do timer 2
DC[9:0]: valor de carga para determinar o duty-cycle (10 bits – 0 a 1023)
• Os registradores para o módulo CCP2 são: