Aula 02 - Sistemas Embarcados Profissionais
Aula 02 - Sistemas Embarcados Profissionais
Aula 02 - Sistemas Embarcados Profissionais
de sistemas embarcados
Pedro Bertoleti
e-stude.com
Tópicos
e-stude.com
Observação 1
Esta aula tem todos os seus códigos feitos para microcontroladores
PIC utilizando a IDE MPLAB X, linguagem C e compilador XC8
(compilador grátis feito pela própria fabricante do PIC, a Microchip).
http://www.embarcados.com.br/microchip-mplab-x-e-mplab-xc8-1/
http://www.embarcados.com.br/microchip-mplab-x-e-mplab-xc-
parte-2/
e-stude.com
Observação 2
Todos os exercícios desta aula são simulados no Proteus 7.7 SP2.
e-stude.com
Antes de começar, uma observação importantíssima!
e-stude.com
Interrupções
e-stude.com
Interrupções – o que são?
Para ilustrar o que são interrupções, considere o seguinte exemplo: você é um
professor de uma sala com 40 alunos. Para sanar as dúvidas de todos, há duas
possibilidades:
Método 1: perguntar a todos os alunos (de Método 2: ficar atento para verificar se
forma periódica), um por um, se houve alguém levantou a mão e, se ocorer,
alguma dúvida. Se houver dúvida, saná-la. perguntar qual é a dúvida e saná-la.
e-stude.com
Interrupções – o que são
e-stude.com
Interrupções
POOLING INTERRUPÇÃO
e-stude.com
Interrupções - tipos
Interrupções de hardware:
Interrupções geradas por estímulos no hardware do sistema, fazendo uma
determinada ação somente mediante este estímulo (não sendo necessário verificar
toda hora o hardware, e sim “esperar ser avisado pela interrupção”).
Tais interrupções são chamadas de IRQ (Interrupt ReQuest, onde o hardware solicita
a CPU que atenda uma chamada de hardware)
Ex: interrupção externa, transmissão/recepção serial, estouro de timers e contadores,
etc.
Interrupções de software:
Interrupções geradas mediante acontecimentos específicos no software. Presente em
sistemas que rodam um sistema operacional, onde o mesmo envia uma mensagem a
aplicação sobre algum evento específico.
e-stude.com
Interrupções – em resumo...
Trata a interrupção
Uma interrupção ocorre! ocorrida
e-stude.com
Dica do Pedrão!
Como as interrupções podem ser geradas a
qualquer momento (e, posteriormente, o
software volta a fazer o que estava fazendo
antes de atender a interrupção), é essencial
que o tratamento da interrupção seja o mais
veloz e eficiente possivel para que o software
embarcado como um todo tenha boa
performance.
e-stude.com
Interrupções: concorrência
e-stude.com
Interrupções externas
Das interrupções de hardware mais comuns em softwares embarcados, uma das
mais importantes e utilizadas é a interrupção externa.
Esta interrupção tem por função avisar a CPU que um determinado pino do
microcontrolador sofreu uma transição de sinal. Ou seja:
Portanto, esta interrupção tem como função alertar a CPU do microcontrolador que
algo aconteceu em um dos pinos.
e-stude.com
Interrupções externas
IMPORTANTE:
Os microcontroladores normalmente possuem um número limitado de pinos capazes
de gerar interrupção externa. Portanto, antes de fazer um projeto que exija uso de um
certo número de interrupções externas, deve atentar para este fato ao escolher um
microcontrolador para o projeto.
e-stude.com
Dica do Pedrão!
Como as interrupções (seja interrupções
externas ou não) em seu tratamento manipulam
uma ou mais variáveis, é necessário que tais
variáveis sejam globais.
e-stude.com
Interrupções externas - exemplo
e-stude.com
Interrupções externas - exemplo
b.1) Se forem contados até 100 pulsos (0 até 100), colocar em nível lógico 1 a saída
RB1 e em nível lógico 0 a saída RB2
b.2) Após esta contagem inicial (número de pulsos > 100), aguardar mais 100 pulsos
serem contados. Feito isso, colocar em nível lógico 0 a saida RB1 e em nível lógico 1
a saída RB2.
b.3) Refazer as ações “eternamente” (ou seja, voltar a condição do item b.1 e repetir
indefinidamente).
Deve ser utilizado o oscilador interno do PIC (4MHz) como clock geral.
e-stude.com
Interrupções externas - exemplo
Solução – 1/3: definições gerais e variáveis globais
// CONFIG
#pragma config FOSC = INTOSCCLK // Oscilador interno
#pragma config WDTE = OFF // Watchdog Timer Desabilitado
#pragma config PWRTE = OFF // Power-up Timer desabilitado
#pragma config MCLRE = OFF // Função MCLR desabilitada
#pragma config BOREN = OFF // Operando sem Brown-out detection
#pragma config LVP = OFF // Baixa tensão de programação desabilitada
#pragma config CPD = OFF // Sem proteção de código
#pragma config CP = OFF // Sem proteção de código
//variaveis globais:
Por ser usada em vários pontos do programa, esta variável é
char NumeroPulsos; global
e-stude.com
Interrupções externas - exemplo
Solução – 2/3: tratamento da interrupção externa
//Função: função de tratamento de interrupções do PIC
// (chamada automaticamente no acionamento de toda e qualquer interrupção
// do PIC, cabendo ao programador verificar dentro desta função qual interrupção
// que foi gerada)
// Para esta função ser chamada automaticamente na ocorrência de qualquer
// interrupção, basta a diretiva "interrupt" antes de seu nome.
//Parâmetros: nenhum
//Retorno: nenhum
void interrupt isr(void) Esta função será chamada sempre que ocorrer uma interrupção
{
//primeiro passo: verificar se a interrupção gerada foi mesmo uma interrupção externa
if (INTCONbits.INTF == 1)
{
//trata-se de uma interrupção externa. Faz o tratamento da mesma.
NumeroPulsos++; Como dito anteriormente, o tratamento da interrupção deve ser
} o mais rápido/breve possível
e-stude.com
Interrupções externas - exemplo
Solução – 3/3: Programa principal
void main(void)
{
//configura registrador de direção do PORTB
TRISB = 0x0b11111001; //configura RB1 e RB2 como saídas (0 para saída e 1 para entrada) Diz quais pinos (do PORTB) são
inputs e quais são output
//inicialização da variável global e do estado das saídas RB1 e RB2
NumeroPulsos = 0;
RB1 = 1; Garante que as saídas RB1 e RB2 iniciarão no estado desejado e inicializa número de
RB2 = 0; pulsos contados
e-stude.com
Interrupções externas – simulação
e-stude.com
Timers
e-stude.com
Timers – o que são?
Os Timers são poderosos recursos dos microcontroladores. Eles são capazes de
permitir temporizações (curtas) sem comprometer o processamento do
microcontrolador (de forma simultânea ao processamento do programa
executado).
e-stude.com
Timers
e-stude.com
Timers – como são especificados?
Os Timers são, na verdade, contadores comuns. Porém, cada passo da
contagem ocorre em tempos fixos (os intervalos de contagem ocorrem em
tempos definidos)
0 0 0 0
ΔTempo
0 0 0 1
ΔTempo
0 0 1 0
Contagem
ΔTempo
0 0 1 1
ΔTempo
0 1 0 0
0 1 0 1
ΔTempo
0 1 1 1
ΔTempo
ΔTempo
...
e-stude.com
Timers – como são especificados?
Logo, se entre dois números em sequencia deste contador há um período de
tempo fixo, pode-se contabilizar tempo da forma:
Por esta razão, os timers são especificados em bits, da mesma forma que é
especificado um contador. E a especificação em bits nada mais é que a
informação do valor máximo que o contador pode assumir.
Por exemplo:
- Um timer de 16 bits pode contar até 65536 (2^16) intervalos de tempo.
- Um timer de 8 bits pode contar até 256 (2^8) intervalos de tempo.
e-stude.com
Timers – observação
e-stude.com
Timers – como se apresentam no microcontrolador?
Por este fato, os Timers são limitados em número (o número varia de acordo
com o modelo de microcontrolador). Logo, devem ser sempre sabiamente
utilizados.
e-stude.com
Timers – observação
e-stude.com
Timers – como transformam contador em tempo?
Frequência
Pre-scaler
Timer
Valor inicial de
contagem
e-stude.com
Timers – como transformam contador em tempo?
1) Frequência de entrada do timer: frequência que será o clock-base para o contador
(de tempo) realizar a contagem. Os valores de frequência aceitáveis (e as formas de se
inserir essa frequência no microcontrolador) variam de modelo para modelo de
microcontrolador.
Por exemplo, em boa parte dos microcontroladores PIC 8-bits, a frequência que vai para
os Timers (e que é usada no softwre embarcado todo) é ¼ da frequência de clock.
3) Valor inicial do contador: valor que o contador vai iniciar a contagem. Quanto maior
este valor inicial, menor será a temporização. Em outras palavras, menor será o tempo para
atingir o valor máximo do contador (estouro de Timer)
Este serve para melhor ajustar a temporização (isso ficará mais claro no exemplo).
e-stude.com
Timers – como transformam um contador em tempo?
Passo-a-passo do cálculo de tempo de estouro Timer0 do PIC16F628A. O clock considerado
no exemplo é 4MHz:
a) o Timer0 tem 8 bits, logo o valor de seu "contador interno" (o registrador TMR0) vai de 00h
até FFh.
b) Neste caso, usaremos Pre-scaler igual a 1:32 (a frequência usada pelo Timer é 1/32 da
frequência útil). Sendo assim, o valor preScaler usado nos cálculos a seguir é preScaler = 32
c) Segundo a documentação, neste PIC uma instrução é executada somente após 4
oscilações do clock. Logo, é correto dizer que a frequência útil do PIC (que vai pro Timer0) é
1/4 da frequência de entrada. Portanto:
TempoCicloMaquina = 4*CicloOsc = 4*(1/Fosc) = 4 / Fosc = 4/4MHz = 0,000001
d) O tempo de estouro (para o registrador TMR0 chegar até seu valor FFh) é calculado pela
seguinte fórmula:
onde: 256 = FFh, valor de TMR0 para dar tempo máximo de estouro
O tempo de estouro máximo é dado quando o valor inicial do timer é 0. Portanto, temos :
Testouromaximo = (256 - 0)* 0,000001 * 32 = 8,192ms
e-stude.com
Timers – dicas gerais:
• Sempre que possível, evite ficar reconfigurando um Timer durante a execução do
programa. Isso aumenta o risco de serem gerados bugs de temporização de
difícil depuração.
e-stude.com
Timers – como trabalhar com eles?
Como é conhecido pelo projetista o tempo total para o Timer estourar e se sabe
exatamente o tempo decorrido desde a inicilização/reinício do timer até o
momento da interrupção, logo é possível desenvolver um software embarcado
confiável quanto à temporização (sem perda de processamento).
e-stude.com
Timers – exemplo
e-stude.com
Timers – exemplo
e-stude.com
Timers – exemplo
Solução – 1/4: definições gerais e variáveis globais
#include <xc.h>
//variáveis globais
charContaEstourosTimer0; //contabiliza quantas vezes o Timer0 estourou
char FlagGerouInterrupcaoTimer0; //sinaliza se foi gerada interrupção de TImer0
e-stude.com
Timers – exemplo
Solução – 2/4: inicialização do Timer e tratamento da interrupção de Timer
//Função: configura todos os registradores necessários para colocar o Timer0 operante (em modo temporizador)
//Parâmetros: nenhum
//Retorno: nenhum
void ConfiguraTimer0(void)
{
//Para o cálculo do Timer0, considerar as seguintes fórmulas e observações:
//- o Timer0 tem 8 bits, logo o valor de seu "contador interno" (o registrador TMR0) vai de 00h até FFh no máximo
//- Neste caso, usaremos Pre-scaler igual a 1:32. Logo, o valor preScaler usado nos calculos a seguir é preScaler = 32
//- Nos PICs 8bits, 1 instrução é executada somente após 4 oscilações do clock. Logo, é correto dizer que a frequência útil do PIC é 1/4 da
frequência de entrada. Portanto:
// TempoCicloMaquina = 4*CicloOsc) = 4*(1/Fosc) = 4 / Fosc
//- O tempo de estouro (para o registrador TMR0 chegar até seu valor FFh) é calculado pela seguinte fórmula:
// Testouro = (256-ValorInicialTImer0) * TempoCicloMaquina * preScaler (eq. 1)
// (256 = FFh, valor de TMR0 para dar tempo máximo de estouro)
// Neste caso, temos: Testouromaximo = (256 – 0) * 0,000001 * 32 = 8,192ms
//
// Para atingir 1 seg. precisamos de 122,07 estouros. Para atingir 1s precisamos de um valor inicialdo registro TMR0 de form a que a
quantidade de estouros seja um número inteiro. Logo, vamos mudar o
// tempo de estouro para 8ms, assim precisaremos de 125 estouros para completar 1s temporizado. Assim, utilizando a equação (1):
// 0,008 = (256-TMR0) * 0,000001 * 32 -> TMR0 = 6
e-stude.com
Timers – exemplo
Solução – 3/4: tratamento da interrupção de Timer
//Função: função de tratamento de interrupções do PIC (chamda automaticamente no acionamento de toda e qualquer interrupção
do PIC, cabendo ao programador verificar dentro desta função qual interrupção que foi gerada)
//Parâmetros: nenhum
//Retorno: nenhum
void interrupt isr(void)
{
//se o TMR0 foi a FFh (indicado pelo sinalizador TMR0IF) e o sinalizador de interrupção de estouro de timer0 (T0IF) indicou estouro
de Timer0, logo houve estouro de timer.
if (TMR0IF && T0IF)
{
ContaEstourosTimer0++;
if (ContaEstourosTimer0 == 125)
{
FlagGerouInterrupcaoTimer0 = SIM; //sinaliza, pelo flag, que as operações vinculadas ao Timer0 devem ser realizadas no
loop principal
ContaEstourosTimer0 = 0; //reinicia contador de estouros
}
e-stude.com
Timers – exemplo
Solução – 4/4: inicializações gerais e programa principal
void main(void) {
TRISB = 0x0b11011111; //configura RB5 como saída (0 para saída e 1 para entrada)
PORTB = 0; //força todas as saídas do PORTB para 0
FlagGerouInterrupcaoTimer0 = NAO; //inicia flag de tratamento de ações vinculadas a interrupção de timer0
ContaEstourosTimer0 = 0; //inicializa contador de estouros do Timer0
ConfiguraTimer0(); //configura Timer0 para ser acionado conforme desejamos neste programa
e-stude.com
Timers – simulação
e-stude.com
Exercícios propostos – interrupção externa
1) Desenvolver um software embarcado para o PIC 16F628A capaz de:
a) Contabilizar pulsos de um sinal digital
b) A cada 15 pulsos contabilizados, o estado da saída RB5 é invertido.
c) Após 10 inversões, RB5 e RB6 ficam permanentemente em nível alto.
Observações:
- Utilizar interrupção externa
- Inicialmente, as saídas RB5 e RB6 devem estar em nível baixo
- Utilizar o oscilador interno do microcontrolador (configurado em 4MHz).
Observações:
- Utilizar interrupção externa para ler o botão (utilizar borda de subida)
- Inicialmente, a saída RB5 está em nível baixo
- Neste exercício, pode-se tanto usar a função delay (do compilador XC8) para temporização
quanto interrupção de Timer.
e-stude.com
Exercícios propostos – timers
1) Desenvolver um software embarcado para o PIC 16F628A capaz de piscar um LED (ligado na saída RB5)
somente se a entrada RB4 estiver em nível alto.
O LED deve piscar a uma frequência de 1Hz (0,5s aceso, 0,5s apagado).
Observações:
- Na temporização,utilizar um dos timers do microcontrolador
- Inicialmente, a saída RB5 deve estar em nível baixo
- Utilizar o oscilador externo à cristal (configurado em 10MHz).
- IMPORTANTE: se o valor de cristal exigido não permitir temporização exata de 0,5s (2Hz), é admitido um
erro de até 10%.
2) Desenvolver um software embarcado para o PIC 16F628A capaz de esperar por 10 segundos até que a
entrada RB4 entre em nível lógico alto.
Se a entrada RB4 ficar em nível alto dentro deste tempo, colocar RB3 em nível alto indefinidamente (e RB5
em nível baixo). Caso contrário (demorar mais que 10 segundos para a entrada RB4 ir a nível alto), deve-se
colocar em nível alto a saída RB5 indefinidamente (e RB3 em nível baixo).
Observações:
- Na temporização,utilizar um dos timers do microcontrolador
- Inicialmente, as saídas RB5 e RB3 devem estar em nível baixo
- A leitura da entrada RB4 pode ser tanto em pooling quanto por interrupção externa. Não é preciso considerar
trepidação / bouncing na leitura da entrada.
- Utilizar o oscilador externo (configurado em 20MHz).
e-stude.com
Exercício desafio
e-stude.com
Exercício desafio – parte prática
Imagine que você é um projetista e deve desenvolver um sistema embarcado automotivo com foco em segurança. Este sistema
é responsável por sinalizar (através de um LED) para o motorista quando a velocidade de um determinado modelo de carro for
superior a 120km/h.
Neste modelo de carro, sabe-se que é disponível ao seu sistema um sinal elétrico pulsante diretamente proporcional à
velocidade do veículo. Sabe-se que quatro pulsos lidos equivalem a uma volta completa da roda. Além disso, sabe -se também
que o diâmetro da roda do veículo (desconsiderando o desgaste por rodagem) é de 59cm.
a) A expressão matemática mais otimizada possível para cálculo da velocidade (em m/s) em função do número de pulsos
lidos (em um segundo de leitura).
Lembrete: mais otimizada possível = contém o menor número de multiplicações e divisões possíveis.
b) Com base na expressão obtida no item anterior, determinar quantos pulsos por segundo devem ser lidos para ser
contabilizada velocidade de 120km/h.
c) Desenvolver o software embarcado (no PIC16F628A) para realizar a tarefa descrita (utilizandoa fórmula obtida no item a e
o resultado do item b), assumindo que o LED está na saída RB5 do microcontrolador.
Observações:
- Assumir que os pulsos já possuem tensão elétrica máxima igual a de entrada (5V, no caso) e que já são perfeitamente
quadrados. Ou seja, os pulsos estão em condições ideais de leitura.
- Ter muita atenção com os tipos das variáveis!!!
- Tudo que envolver temporização deve, obrigatoriamente, utilizar Timer (operando por interrupção)
- A leitura dos pulsos deve ser feita, obrigatoriamente, por interrupção externa.
- Considere que a velocidade deve ser calculada e também seu valor analisado a cada segundo.
- A escolha do tipo de oscilador e frequência do mesmo é livre.
- Assumir que o erro máximo permitido é de 2km/h
- Assuma a velocidade máxima do veículo igual a 200km/h
- Lembre-se: 1m/s = 3,6km/h
e-stude.com
Exercício desafio – parte teórica
e-stude.com
Fim da segunda aula!
e-stude.com