Escolar Documentos
Profissional Documentos
Cultura Documentos
de sistemas embarcados
Pedro Bertoleti
e-stude.com
Tópicos
e-stude.com
Relação complexidade x performance
e-stude.com
Relação complexidade x performance
e-stude.com
Relação complexidade x performance
Forma menos complexa e com menos Forma mais complexa e com maior
performance: performance:
If ( (Numero && 0x01) == 0 )
{
If ( (Numero % 2) == 0 ) //número par
{ }
else
//número par {
} //número ímpar
else }
{ Decimal Binário
//número ímpar
1 0000.0001
}
2 0000.0010
3 0000.0011
4 0000.0100
e-stude.com
Relação complexidade x performance
- Quando maior o tamanho da variável “Numero”, mais tempo será gasto e mais instruções serão
necessárias (maior tamanho de código compilado).
e-stude.com
Relação complexidade x performance
Exemplo : verificação se um número é par ou ímpar
- Como para saber se um número é par basta analisar somente se o bit menos significativo é ‘0’, o
compilador pode otimizar esta operação de comparação para somente uma instrução, tornando
assim o código compilado final pequeno e extremamente rápido.
e-stude.com
Mas...
Até quando vale “complicar”?
e-stude.com
Em suma:
e-stude.com
Dica do Pedrão!
Independente da situação em que você se encontra,
ou seja, em um software complexo ou não, sempre
tenha em mente o seguinte
Menos é mais!!!
e-stude.com
Dica do Pedrão!
As funções sprintf() e printf() são muito úteis para
formatar strings e escrever dados formatados em
um buffer de saída (monitor ou porta serial, por
exemplo).
e-stude.com
Dica do Pedrão!
e-stude.com
Comunicação entre dispositivos de mesma placa
e-stude.com
Comunicação entre dispositivos de mesma placa
e-stude.com
Comunicação entre dispositivos de mesma placa
e-stude.com
Comunicação entre dispositivos de mesma placa
Necessita que, além dos dados, esteja Não há necessidade de enviar clock.
disponível um clock para “ditar o
ritmo” da comunicação.
e-stude.com
Comunicação entre dispositivos de mesma placa
A comunicação entre dispositivos, quanto a topologia, pode ser:
•Comunicação em anel
•Rede Mesh
e-stude.com
Comunicação entre dispositivos de mesma placa
Exemplo: RS232
Leitura diferencial
e-stude.com
Mestre e escravo
Alguns protocolos de comunicação síncronos
suportam estrutura de mestre e escravo variável /
multi-mestre.
Ou seja, um dispositivo pode ser em um determinado
momento mestre e, em outro momento, escravo.
e-stude.com
Comunicação entre dispositivos de mesma placa
e-stude.com
Comunicação entre dispositivos de mesma placa
I²C (Inter-Integrated Circuit)
I²C é um barramento desenvolvido pela Phillips em 1982. A comunicação realizada neste
barramento é síncrona, serial e multi-mestre (porém, sempre com 1 mestre por vez para N
escravos, sendo todo mundo endereçado na rede).
Inicialmente, foi concebido para conectar dispositivos específicos em uma placa-mãe.
Porém, com o passar do tempo, sua utilização foi expandida, sendo hoje utilizada para
comunicar os mais diversos tipos de dispositivos (tais como: sensores, microcontroladores,
memórias EEPROM, controladores de display LCD, ADCs e DACs).
Porém, mesmo com a evolução ao longo dos anos, a velocidade de comunicação deste
barramento não é tão alta. Logo, isto é um impeditivo a sua aplicação em comunicação com
memórias RAM.
e-stude.com
Comunicação entre dispositivos de mesma placa
I²C (Inter-Integrated Circuit)
e-stude.com
Comunicação entre dispositivos de mesma placa
SPI (Serial Peripheral Interface)
SPI é uma comunicação serial que envolve um mestre para N escravos. É síncrona
e serial. Assim como o I²C, tem alcance limitado a poucos centímetros.
Esta comunicação é lenta se comparada a outras (como I²C, por exemplo) e demanda um
número maior de vias no barramento que o habitual em comunicações seriais. Em um barramento SPI, há as
seguintes vias: SS, MOSI, MISO e Clock. Essa comunicação é utilizada por dispositivos com
baixa velocidade de transferência e recepção de dados, tais como ADCs e DACs.
Nesta comunicação, o mestre seleciona / escolhe com qual escravo quer se comunicar, sendo
esta seleção uma das vias do barramento (SS – Slave Select)
• O envio de dados do mestre para um escravo é feito através da via MOSI (Master Output Slave Input)
• O envio de dados do escravo para o mestre é feito através da via MISO (Master Input Slave Output)
e-stude.com
Comunicação entre dispositivos de mesma placa
SPI (Serial Peripheral Interface)
O SPI possui tensões típicas: +3V3 ou +5V (normalmente, corresponde a tensão de alimentação do mestre e
dos escravos). Não há tensões negativas (logo, não há necessidade de fontes simétricas).
Logo, o nível baixo é 0V / GND.
e-stude.com
Comunicação entre dispositivos de mesma placa
Deve-se ter sempre em mente quando for comunicar dispositivos com o microcontrolador
(quando todos estão na mesma placa):
e-stude.com
Comunicação com mundo externo
e-stude.com
Comunicação com mundo externo
e-stude.com
Comunicação com mundo externo
e-stude.com
Comunicação com mundo externo
- RS232 *
* Porquê RS232 e RS485 são utilizados para comunicação com mundo externo?
e-stude.com
Dica do Pedrão!
Exceto no caso de protocolos e padrões de
comunicações que já podem vir implementados no
hardware do microcontrolador (ex: Ethernet), opte
sempre por usar módulos de comunicação prontos
(por exemplo, WiFi) de fabricantes consagrados e
que possuam certificações.
e-stude.com
Dica do Pedrão!
Se você não souber informar ou especificar se o seu
projeto sofrerá expansões quanto à sua rede de
comunicação, segue algumas boas práticas:
e-stude.com
Comunicação com mundo externo
Na prática:
Dispositivo 3
da rede
P.R. – Protocolo da
Rede Dispositivo N
da rede
e-stude.com
Comunicação com mundo externo
e-stude.com
Comunicação com mundo externo
UART: Universal Asynchrounous Receiver/Transmiter
Trata-se da transmissão serial (Full-Duplex) entre dois dispositivos (um sistema embarcado e um
módulo de comunicação, por exemplo)
É muito similar ao protocolo RS232, diferenciando-se pelos níveis de tensão aplicados (em resumo,
o nível de tensão mais alto é, normalmente, a tensão de alimentação do microcontrolador do sistema
embarcado e o nível mais baixo é 0V/GND. Isto também é chamado de UART TTL).
Por esse motivo, a distância máxima entre dispositivos é superior no RS-232 do que em uma
UART-TTL
Todos os microcontroladores modernos possuem UART por hardware, ou seja, gerenciam por
hardware a transmissão e recepção serial (possibilitando geração de interrupção na recepção de um
dado pela UART)
e-stude.com
Comunicação com mundo externo
e-stude.com
Comunicação com mundo externo
Onde:
Start Bit: a linha de TX do transmissor (e, por consequência, RX do receptor) indica que
um dado vai ser transmitido
D0...D7: Dado (byte) transmitido, sendo D0 o bit menos significativo (LSB) e D7 o bit mais
significativo (MSB)
Bit de paridade: Usado para detecção de erros (crossover bit) na transmissão.
O bit de paridade será definido para um valor que garanta que a transmissão (dado e bit
de paridade) tenha um numero par ou ímpar de bits. Por exemplo, se o dado (D0..D7) for
0000.0011, então para paridade par, o bit de paridade será 0 para manter o número de
bits par. Se a paridade fosse ímpar, então o bit de paridade será 1, resultando em 3 bits
‘1’.
Bit(s) de parada: 1 ou 2 bits indicando que o frame acabou de ser transmitido.
e-stude.com
Comunicação com mundo externo
* O bit de paridade (quando há paridade configurada) é enviado logo após o oitavo bit de
dados
e-stude.com
Comunicação com mundo externo
Na UART, há as seguintes configurações:
e-stude.com
Comunicação com mundo externo
Especialmente no caso do microcontrolador PIC 16F628A, há as seguintes observações:
Portanto, devido ao menor erro no baudrate final, é mais adequado usar o modo high speed
neste caso.
e-stude.com
Comunicação com mundo externo
Cuidados e procedimentos necessários ao se comunicar
dois dispositivos por uma UART:
e-stude.com
Dica do Pedrão!
e-stude.com
Comunicação com mundo externo - exemplo
e-stude.com
Comunicação com mundo externo - exemplo
Desenvolver um software embarcado que permita um microcontrolador PIC16F628A controlar,
remotamente via serial, o acender e apagar de um LED em um outro microcontrolador PIC16F628A.
No transmissor:
O PIC transmissor deve enviar, via serial, o byte 0x4C (correspondente a letra L na tabela ASCII) para
ligar o LED no PIC receptor. Para desligar o LED no PIC repector, o PIC transmissor deve enviar o byte
0x44 (correspondente a letra D na tabela ASCII).
O envio é condicionado pela leitura do input RB4. Se estiver em nível alto, o PIC transmissor envia o
byte 0x4C. Caso contrário, envia o byte 0x44.
No receptor:
O PIC receptor deve receber, via interrupção serial, os bytes enviados pelo PIC transmissor. Se for
recebido o byte 0x4C, o output RB5 (o qual tem um resistor e LED) deve ficar em nível alto. Caso for
recebido o byte 0x44, o output RB5 ficará em nível baixo.
Observações:
-No receptor, considerar o estado inicial de RB5 como baixo.
-Utilizar baud rate de 9600, 8 bits de dados, 1 stop-bit, sem paridade e sem controle de fluxo.
e-stude.com
Comunicação com mundo externo - exemplo
Solução – 1/4: definições gerais e prototypes
#include <xc.h>
// 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
//defines gerais
#define LIGA_LED 0x4C
#define DESLIGA_LED 0x44
e-stude.com
Comunicação com mundo externo - exemplo
Solução – 2/4: inicialização da UART
void InicializaUART(void)
{
//bits 1 e 2 do port b (rx e tx) precisam ser setados para permitirem uso como UART.
//Isto é descrito no datasheet do PIC 16F628A
TRISB1 = 1; //configura RB1 para uso na UART
TRISB2 = 1; //configura RB2 para uso na UART
TRISB4 = 1; //configura RB4 como entrada
e-stude.com
Comunicação com mundo externo - exemplo
Solução – 3/4: Transmissão de byte via UART
//Função: Transmite um byte pela UART
//Parâmetros: nenhum
//Retorno: nenhum
void TransmiteUART(char ByteParaTransmitir)
{
TXREG = ByteParaTransmitir;
e-stude.com
Comunicação com mundo externo - exemplo
Solução – 4/4: programa principal
void main(void)
{
//inicializa UART e direção dos pinos do port b
InicializaUART();
while(1)
{
if (RB4 == 1)
TransmiteUART(LIGA_LED);
else
Transmissão contínua
TransmiteUART(DESLIGA_LED);
}
}
e-stude.com
Comunicação com mundo externo - simulação
e-stude.com
Comunicação com mundo externo - exercícios
e-stude.com
Comunicação com mundo externo - exercícios
1) Desenvolver um software embarcado que permita um microcontrolador PIC16F628A obter,
remotamente via serial, o estado lógico da entrada RB4 de um outro microcontrolador PIC16F628A
e mostra-lo via LED ligado a saída RB5.
Funcionamento:
Um dos PICs deve enviar, via serial, o byte 0x4C (correspondente a letra L na tabela ASCII) para
solicitar ao outro PIC o estado lógico da entrada RB4.
Se o estado lógico for ‘1’, o PIC receptor envia ao PIC transmissor o byte 0x53 (correspondente a
letra S na tabela ASCII). Caso contrário, deve enviar 0x4E (correspondente a letra N na tabela ASCII).
O PIC que recebeu S ou N, deve colocar estado lógico ‘0’ ou ‘1’ na saída RB5, seguindo o critério:
- Se recebeu a letra S, RB5 deve ter estado lógico ‘1’
- Se recebeu a letra N, RB5 deve ter estado lógico ‘0’
Observações:
-Ambos os PICs podem solicitar e enviar o estado lógico de sua entrada RB4, logo os dois serão
gravados com o mesmo software embarcado.
-As solicitações devem ser contínuas
-A recepção serial em ambos os PICs deve ser via interrupção.
-Em ambos os PICs, considerar o estado inicial de RB5 como baixo.
-Utilizar a seguinte configuração serial: baud rate de 19200, 8 bits de dados, 1 stop-bit, sem paridade
e sem controle de fluxo.
e-stude.com
2) Analisar o código da função abaixo quanto a performance e complexidade. Modificá-lo de forma que simplifique partes
complexas demais e que deixe mais performáticas partes que necessitam disso.
//Função: conta quantas letras A tem no array “Dados” e envia o resultado desta contagem via serial. Além disso, deve ser preenchido um segundo array,
//onde neste deve conter todos os caracteres do primeiro array, exceto as letras A. Este array sem as letras A deve ser inicializado com espaços.
//Parâmetros: ponteiro para o array inicial, ponteiro para o array sem letras A e tamanho do array a ser avaliado (= tamanho array sem letras A)
//Retorno: Um, se número de letras A encontrado for par. Zero, se número de letras A encontrado for impar
long ContaEMostraLetrasADisplay(char * Dados, char * ArraySemLetrasA, char TamanhoDosArrays)
{
int NumeroLetrasA, i, j;
NumeroLetrasA = 0;
e-stude.com
Exercício desafio
Imagine que você foi encarregado de desenvolver o software embarcado de uma fechadura eletrônica. Esta fechadura
se comunica com um leitor de TAGs via UART (configuração: baudrate igual a 19200, 8 bits, 1 stop-bit, sem paridade e
sem controle de fluxo).
A chave, similar a um crachá, é lida pelo leitor de TAGs que, por sua vez, envia o código lido da chave diretamente para
a UART do microcontrolador que será gravado seu software embarcado. O código que o leitor enviará é puramente
numérico(0x00, 0x01,0x02...0x09), e tem tamanho de 6 dígitos (por exemplo: 123456).
Além disso, o software embarcado comunica-se, também via UART, com um computador (configuração: baudrate igual
a 19200, 8 bits, 1 stop-bit, sem paridade e sem controle de fluxo).O computador informa ao seu software qual é a
chave que ele deve aceitar (a fechadura só abre para uma chave / código específico). O seu software embarcado nunca
estará em comunicação com o computador e com o leitor de TAGs simultaneamente, logo será usada a mesma UART
para os dois fins. Assumir que a troca de comunicação com leitor e computador é feita com o sistema ligado (ou seja,
não é necessário uso de EEPROM ou outro tipo de memória não-volátil para armazenar a chave/código) e que estará
constantemente alimentado.
Funcionamento: para informar ao seu software qual é a chave a ser lida, serão enviados 7 bytes: o computador irá
enviar o byte 0x43 (equivalente a letra C na tabela ASCII) e, em seguida, seis bytes (equivalentes ao código da chave a
ser lida). Após a recepção, colocar em nível alto a saída RB4 (a qual há um LED ligado);
O leitor de TAGs envia, a cada leitura, seis dígitos / bytes (código/chave). Se a sequencia enviada for correta
(corresponder ao código enviando anteriormente pelo computador), colocar em estado lógico ‘1’ por 1 segundo a
saída RB5.(saída esta que está ligada a um circuito que efetuará o destravamento da fechadura). Caso contrário,
coloca-la em estado lógico ‘0’.
Observações:
-A recepção serial deve ser feita, obrigatoriamente, via interrupção.
-O estado lógico inicial de RB5 é ‘0’ e o valor inicial da chave (antes do computador enviar) é 000000.
-Sugestão: faça este software embarcado rodar num PIC e simule o leitor de TAGs e computador com outros 2 PICs.
Assim é possível testar o funcionamento deste software facilmente.
e-stude.com
Fim da terceira aula!
e-stude.com