Você está na página 1de 54

Curso de desenvolvimento profissional

de sistemas embarcados

Pedro Bertoleti

e-stude.com
Tópicos

● Relação complexidade x performance


● Principais formas de comunicação dos microcontroladores (com
dispositivos na mesma placa)
● Comunicação com mundo externo: como fazer e quais as principais
existentes

e-stude.com
Relação complexidade x performance

e-stude.com
Relação complexidade x performance

Em software embarcado, boa performance é um dos maiores


objetivos a serem alcançados.

Para isso, as vezes é necessário recorrer a recursos da programação


que tornam um software embarcado um pouco mais difícil de
compreender por nós, seres humanos.

Isto ocorre pois, o microcontrolador processa informações


diferente de nós, humanos. Portanto, as vezes é preciso fazer com
que um algoritmo ou lógica esteja mais adequado a maneira como o
microcontrolador processa informações do que como nós, humanos,
processamos as mesmas informações.

e-stude.com
Relação complexidade x performance

Exemplo: verificação se um número é par ou ímpar

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

Exemplo : verificação se um número é par ou ímpar

Porque é menos complexa e menos


Forma menos complexa e com menos performática?
performance:
- Fácil entendimento por nós humanos (pois o
If ( (Numero % 2) == 0 ) símbolo % representa resto da divisão)
- Demanda várias operações matemáticas: a CPU
{
faz a divisão e obtém o resto, para depois fazer a
//número par comparação com zero.
} A divisão e multiplicação são as operações
else matemáticas que mais demandam
{ processamento e tempo da CPU
//número ímpar
}

- 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

Forma mais complexa e com maior Porque é mais complexa e mais


performance: performática?
If ( (Numero && 0x01) == 0 ) - Entendimento mais complexo por nós humanos
{ (pois é feita operação com o número binário /
//número par lógica booleana)
}
else - Demanda somente a operação AND da CPU.
{ Esta, juntamente com as operações OR e XOR, é
//número ímpar uma das operações mais rápidas que podem ser
executadas pela CPU.
}

- 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”?

Saber os pontos certos de onde deixar o código mais complexo e


onde deixar mais humanamente compreensível pode ser a
diferença entre um software embarcado performático e um
software com desempenho ruim.

Para saber quando e como agir, destaco o seguinte:

1- Quando “complicar” / deixar mais fácil pro microcontrolador:


- Em rotinas executadas várias vezes em um período de tempo
curto ou em rotinas essenciais ao software embarcado
- Quando se está com pouquíssima memória de programação
disponível (sendo assim necessário ganhar qualquer espaço que
for possível)

2- Quando “descomplicar” / deixar mais fácil para nós humanos:


- Quando a rotina é executada de vez em quando / rotina não tão
essencial ao software embarcado.
- Quando a lógica por si só já é complicada, portanto
“descomplicar” a escrita do código facilita futuras manutenções
de código.

e-stude.com
Em suma:

Complexidade Quando ser assim:

-Códigos com preocupação extrema de baixo


Código fácil de ler
e entender
tempo de execução e menor tamanho final
possível de código compilado.
-Em rotinas chamadas milhares de vezes em
um período curto de tempo.

Quando ser assim:


Código fácil de ler
e entender -Em rotinas chamadas de vez em quando
Complexidade -Quando a lógica em si da rotina já é
complexa.

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

Portanto, evite complicar mais que o necessário e


só apele para o código mais rebuscado quando
você se sentir seguro para isso (e quando for
REALMENTE necessário).

Pense como se estivesse fabricando um carro:


Quanto menos peças complicadas, menores serão
minhas dores de cabeça na manutenção do veículo.

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

Entretanto, são funções muito grandes e e lentas, o


que aumenta muito o consumo da memória de
programação do microcontrolador e consome muito
processamento, deixando assim o software
embarcado menos performático.
Evite usá-las nas seguintes situações:

•Dentro de laços (for, while, do-while), sobretudo


aqueles laços com muitas iterações / extensos.
•Em rotinas que são chamadas muitas vezes em um
curto período de tempo.
•Em camadas mais baixas do software embardado
(sobretudo na camada de drivers)

e-stude.com
Dica do Pedrão!

Nos casos de precisar utilizar um ou mais arrays em


uma função diferente da que o array está localizado,
sempre os referencia-lo(s) com ponteiros.

Isso evita consumo excessivo de memória RAM.

e-stude.com
Comunicação entre dispositivos de mesma placa

e-stude.com
Comunicação entre dispositivos de mesma placa

Os microcontroladores, apesar de integrarem uma série de


funcionalidades dentro de si, precisam muitas vezes se comunicar
com outros dispositivos ligados a mesma placa onde ele está.

Um exemplo clássico disso é a comunicação com teclado (para


entrada de dados) e display (para saída de dados).

Para este tipo de comunicação, há protocolos e padrões de


comunicação adequados.

e-stude.com
Comunicação entre dispositivos de mesma placa

Por se tratarem de comunicações velozes e entre curtas distâncias (algo na


ordem de poucos centímetros), é muito comum que este tipo de
comunicação ocorra em uma frequência elevada (na ordem de dezenas ou
centenas de MHz, por exemplo).

Por esta razão, a boa especificação e fabricação da PCI (Placa de Circuito


Impresso) é essencial para o bom funcionamento.

Logo, não é exagero dizer que:

Quanto maior a frequência de comunicação

Melhor deve ser o padrão de qualidade da empresa que fará a PCI

e-stude.com
Comunicação entre dispositivos de mesma placa

A comunicação entre dispositivos, quanto ao sincronismo, pode ser:

Comunicação síncrona Comunicação assíncrona

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 ponto-a-ponto Comunicação em rede / barramento

Possibilita comunicação multiponto, ou seja,


Envia-se e recebe-se um dado mais de dois dispositivos em comunicação.
somente entre dois dispositivos em Utilizando este conceito, derivam-se:
conexão direta. •Comunicação em estrela

Utilizando este conceito, deriva-se:

•Comunicação em anel

•Rede Mesh

e-stude.com
Comunicação entre dispositivos de mesma placa

Ainda quanto a classificação:

Leitura não diferencial

As tensões das linhas de comunicações são lidas em relação ao GND

Exemplo: RS232

Leitura diferencial

As tensões das linhas de comunicação são lidas sempre com uma em


referência a outra (fisicamente, é comum elas estarem entrelaçadas).
Isso reduz substancialmente a incidência de ruídos, aumenta muito a
imunidade da comunicação à interferências e aumenta o alcance
máximo.
Exemplo: RS485.

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.

Nos seus primeiros projetos (ou em projetos onde


for permitido ser mais simples), opte sempre por
uma estrutura mais simples (1 mestre fixo para N
escravos).
Isso vai facilitar a comunicação como um todo e
evitar erros de difícil solução.

Novamente: menos é mais!

e-stude.com
Comunicação entre dispositivos de mesma placa

Exemplos de protocolos comunicação:

• I²C: síncrono, multiponto e não diferencial

• SPI: síncrono, multiponto e não diferencial

• RS232: assíncrono, ponto-a-ponto e não diferencial

• RS485: assíncrono, multiponto e diferencial (muito utilizado nos


primórdios das comunicações em rede local)

• CAN: assíncrono, multiponto e diferencial (muito aplicado no meio


automotivo)

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.

- Capacitância máxima entre trilhas:


400pF
- SDA e SCL necessitam de Pull-Up.

e-stude.com
Comunicação entre dispositivos de mesma placa
I²C (Inter-Integrated Circuit)

• SDA – Serial DAta (linha de dados)


• SCL – Serial Clock (linha de clock)

• 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 negaivas (logo, não há necessidade de fontes
simétricas). Logo, o nível baixo é 0V / GND.
• O mestre da comunicação é quem gera o clock (pois ele que controla o “ritmo” em quem os dados serão enviados)
• O momento de envio (start e stop de envio de dados) é ditada por um tempo de clock em nível alto mais longo.
• A leitura de linha de dados (SDA) deve ser feita enquanto a linha de clock (SCL) estiver em nível alto. Logo, o clock
informa quando os dados devem ser lidos.
• As mudanças de estado nos dados (SDA) devem ser feitas enquanto a linha de clock (SCL) estiver em nível baixo.
Logo, o clock informa também quando os dados devem ser escritos.

Dado enviado pelo mestre

Dado enviado pelo escravo

*Nas transições (envio pelo mestre-> envio pelo


escravo, vice versa), a direção do pino que está o
SDA muda também.

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)

A comunicação mestre-escravo é bidirecional, porém por vias distintas. Observe:

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

Fonte da figura: https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

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):

• Conhecer exatamente o protocolo que os periféricos se comunicam (não somente utilizar


bibliotecas prontas e ligar os fios seguindo uma “receita de bolo”)

• Dar preferência a microcontroladores que já tem o hardware necessário para as comunicações


do projeto (o que resumirá o trabalho do desenvolvedor de software embarcado a manipular
registradores).

• Respeitar SEMPRE as limitações elétricas e de volume de dados trafegáveis do protocolo.


Caso contrário, pode não funcionar ou ter funcionamento intermitente (o que é muito difícil de
se detectar).

e-stude.com
Comunicação com mundo externo

e-stude.com
Comunicação com mundo externo

Os sistemas embarcados, embora sejam feitos para rodarem e


“serem esquecidos”, necessitam ter interface com o mundo externo.

Em mundo externo, incluem-se: outros dispositivos embarcados,


sistemas não-embarcados e, além disso, sistemas de interface
homem-máquina (IHM).

Neste quesito, aplicam-se padrões e protocolos de comunicação


adequados, os quais veremos nesta aula.

Antes de continuar, é importante ressaltar o seguinte:

Dispositivos se comunicando com outros formam,


necessariamente, uma rede.

e-stude.com
Comunicação com mundo externo

Antes de escolher um padrão e protocolo de comunicação é preciso


ter em mente os seguintes pontos:

1 – Canal de comunicação: cabeado ou sem-fio

2 – Estrutura da rede de comunicação: ponto-a-ponto ou multi-ponto

3 – Topologia da rede de comunicação: estrela, anel ou mesh

4- Taxa de transferência / banda necessária

5- Alcance: rede de comunicação local ou a nível mundial

e-stude.com
Comunicação com mundo externo

Principais padrões e protocolos existentes:

- RS232 *

- Internet Cabeada (Ethernet)

- RS485 * Sem-fio (Wireless)

* Porquê RS232 e RS485 são utilizados para comunicação com mundo externo?

A grande maioria dos módulos de comunicação prontos e certificados de mercado


(ZigBEE, Bluetooth e até mesmo WiFi) utilizam comunicação serial para “conversar”
com as placas as quais serão plugados.
Logo, estes protocolos servem tanto para comunicação local ou comunicação com
módulos que permitem alcance global.

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.

Essa é uma boa opção pois, além de deixar a


responsabilidade de comunicação com um
hardware a parte (dedicado a isso), tem-se a
segurança, certificações e garantia de
funcionamento do fabricante (o que pode ajudar o
projeto a ter mais mercado / poder ser vendido e
usado em alguma região específica).

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:

-Preveja, na placa do seu projeto, pelo menos uma


conexão UART livre (para módulos externos) para o
futuro do projeto. Mesmo que futuros módulos não
se comuniquem diretamente com sua placa via
UART, há muitos conversores de diversos padrões
para UART disponíveis no mercado, sendo assim
esta uma “interface coringa”

-Na medida do possível, tente deixar um espaço livre


de memória de programação. Isso será necessário
para implementar o código responsável por
comunicar com futuras expansões.
Não há um número específico de bytes ou
porcentagem da memória a ser reservada a isso,
mas, na prática, deixar 10% da memória de
programação livre/reservada é uma boa prática.

e-stude.com
Comunicação com mundo externo
Na prática:

Sistema Módulo de P.R.


embarcado comunicação
Protocolo serial
RS232, RS485,
etc.
P.R.
Dispositivo 1
da rede P.R.
P.R.
Dispositivo 2 P.R.
da rede

Dispositivo 3
da rede

P.R. – Protocolo da
Rede Dispositivo N
da rede

e-stude.com
Comunicação com mundo externo

Conforme verificamos, se soubermos realizar


comunicação serial (RS232, RS485, por exemplo),
consequentemente sabemos nos comunicar com
módulos de comunicação dos mais diversos
protocolos e interfaces.

Desta forma, podemos comunicar com os mais


diversos tipos de dispositivos, tais como:
dispositivos WiFi, dispositivos bluetooth,
dispositivos ZigBEE, etc.

Vejamos agora o que é e como funciona uma


comunicação serial por uma UART.

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

Na UART, há as seguintes configurações:

• Baud Rate: Velocidade da transmissão e recepção dos dados (medidas em baud).


• Número de bits: A UART pode enviar ou receber 7, 8 ou 9 bits por frame de dados
• Paridade: é possível configurar o bit de paridade para par, ímpar ou nenhum
• Stop Bits: é possível configurar 1 ou 2 bits de parada.
• Controle de fluxo (RTS e CTS): são utilizados para os dispositivos “saberem” quando
podem enviar um dado.
1) Transmissor quer enviar um dado, então coloca em nível alto o RTS (Request to Send).
É como se estivesse perguntando ao receptor: “ei, tenho um dado para te enviar, posso
mandar?”
2) O receptor, se estiver em condições de receber um dado, coloca em nível alto o CTS
(Clear To Send). É como se ele estivesse respondendo ao transmissor: “Sim, pode
enviar o dado.”

e-stude.com
Comunicação com mundo externo

Frame serial da UART:

Start Bit D0 D1 D2 D3 D4 D5 D6 D7 Bit de Stop


Paridade Bit

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

Estado “idle” Dado transmitido (1 Byte)


(repouso) – nível
alto

Stop bit - nível alto


por um tempo
determinado
Start bit - nível baixo
por um tempo
determinado

* 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:

• Baud Rate: Velocidade da transmissão e recepção dos dados (medidas em


baud).
• Número de bits: A UART pode enviar ou receber 7, 8 ou 9 bits por frame de
dados
• Paridade: é possível configurar o bit de paridade para par, ímpar ou nenhum
• Stop Bits: é possível configurar 1 ou 2 bits de parada.
• Controle de fluxo (RTS e CTS): são utilizados para os dispositivos “saberem”
quando podem enviar um dado.
1) Transmissor quer enviar um dado, então coloca em nível alto o RTS (Request
to Send). É como se estivesse perguntando ao receptor: “ei, tenho um dado
para te enviar, posso enviar?”
2) O receptor, se estiver em condições de receber um dado, coloca em nível
alto o CTS (Clear To Send). É como se ele estivesse respondendo ao
transmissor: “Sim, pode enviar o dado.”

e-stude.com
Comunicação com mundo externo
Especialmente no caso do microcontrolador PIC 16F628A, há as seguintes observações:

-A UART deste PIC somente opera com 1 stop-bit.


-Os pinos de TX e RX devem ser configurados como entrada no registrador TRISB (conforme orientação do
datasheet)
-O registrador diretamente vinculado ao baudrate chama-se SPBRG
-Há dois modos de operação da UART: low speed e high speed.
Embora sejam vinculados, como sugerem os nomes, a altos e baixos baudrates, é aconselhavel testar as
duas condições para verificar qual oferece melhor baudrate final (pois há uma fórmula/cálculo de
baudrate para cada modo). Observe o exemplo:
- Baudrate desejado: 9600
- Frequência do clock : 4MHz (Fosc = 4MHz = 4000000)
• Modo low speed (BRGH = 0) • Modo high speed (BRGH = 1)

- Substituindo os valores na fórmula, temos: - Substituindo os valores na fórmula, temos:


SPBRG = 5 (arredondado). SPBRG = 25 (arredondado)
- Substituindo SPBRG na fórmula acima, temos: Substituindo SPBRG na fórmula acima, temos:
Baudrate_real = 10416,6 (erro de 7,8%) Baudrate_real = 9615,38 (erro de 0,1%)

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:

•Os dois dispositivos devem ter, obrigatoriamente, a mesma


configuração (número de bits, baud rate, stop bits, paridade e
controle de fluxo)

•As tensões de nível alto e nível baixo de transmissão nos dois


dispositivos devem ser iguais.
Se não forem, é necessário colocar entre os
dispositivos um circuito que compatibilize as
tensões.

•SEMPRE o terra (GND) dos dois dispositivos devem ser iguais


(isto é chamado de “terra grampeado”). Ou seja, na UART há
as vias de RX, TX e GND.
•Baud rates muito altos (>115200 bauds) podem não
funcionar se o canal de transmissão for cabeado (com fios
longos, maiores que alguns centímetros). Portanto, evite
baud rates maiores que 115200 bauds em transmissões
cabeadas.

e-stude.com
Dica do Pedrão!

Se você quiser comunicar o microcontrolador do


seu projeto diretamente com a porta serial de um
computador via UART, será necessário utilizar um
conversor de UART-TTL para RS232.

O circuito integrado mais comum, barato e fácil de


usar para isso é o MAX232.

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

#define _XTAL_FREQ 4000000 //operando com clock geral de 4MHz (interno)

//defines gerais
#define LIGA_LED 0x4C
#define DESLIGA_LED 0x44

//prototypes das funções globais


void InicializaUART(void);
void TransmiteUART(char ByteParaTransmitir);

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

BRGH = 1; //modo UART high speed


SPBRG = 25;

//registrador de transmissão (TXSTA)


SYNC = 0; //USART em modo assíncrono
TX9D = 0; //sem paridade
TX9 = 0; //8 bits
TXEN = 1; //habilita transmissão via UART

//registrador de recepção (RXSTA)


RX9D = 0; //sem paridade
RX9 = 0; //8 bits
CREN = 1; //permite recepção contínua
SPEN =1; //habilita a uart
}

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;

//aguarda dado ser transmitido


while(!TRMT);

TXREG: registrador (1 byte) que contém o byte a ser


enviado pela UART

OBS: é necessário aguardar o byte ser transmitido. Caso


contrário, pode-se ter risco de sobrescrever o registrador
TXREG durante a transmissão do mesmo, o que ocasiona
mudança do valor do byte transmitido.

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;

//inicialização do array sem letras A


for (i=0; i<TamanhoDosArrays; i++)
ArraySemLetrasA[i]=' ';

//busca de letras A e montagem do array sem letras A


j=0;
for (i=0; i<TamanhoDosArrays; i++)
{
if (Dados[i]=='A')
{
NumeroLetrasA++;
printf("Numero de letras A: %d\r\n",NumeroLetrasA);
}
else
{
ArraySemLetrasA[j] = Dados[i];
j++;
}
}
if ((NumeroLetrasA % 2) == 0)
return 1;
else
return 0;
}
e-stude.com
Exercício desafio

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

Você também pode gostar