Você está na página 1de 42

UNIVERSIDADE ESTÁCIO DE SÁ

ENGENHARIA DE CONTROLE E AUTOMAÇÃO

CONFIGURAÇÃO E PROGRAMAÇÃO DE PERIFÉRICOS


EM LINGUAGEM C

Trabalho de Pesquisa Exploratória


sobre Configuração e
Programação de Periféricos em
Linguagem C.
Orientação do Prof. Marco Antônio
Ribeiro De Almeida

RIO DE JANEIRO
2021.2
CONFIGURAÇÃO E PROGRAMAÇÃO DE PERIFÉRICOS
EM LINGUAGEM C

Por:
Paulo Augusto Ferreira Marques – Mat: 202002403251
Pedro Gabriel de Oliveira – Mat: 201508958114
Rodrigo Cesar Martins de Lima – Mat: 20202222168
Rogerio Alves de Souza – Mat: 202002419458
Thomas Jorge Fonseca de Lara – Mat: 201902670311

RIO DE JANEIRO
2021.2
SUMÁRIO

1. INTRODUÇÃO .......................................................................................................................... 1
2. CONFIGURAÇÃO E PROGRAMAÇÃO DE PRIFÉRICOS EM LINGUAGEM C...................................... 1
2.1. HISTÓRIA DA LINGUAGEM C ....................................................................................................... 1
2.2. APLICAÇÕES ................................................................................................................................. 2
3. CONTROLE DE INTERRUPÇÕES .................................................................................................. 2
3.1. O QUE É A INTERRUPÇÃO............................................................................................................ 2
3.2. TIPOS DE INTERRUPÇÃO.............................................................................................................. 3
3.2.1.Polling .................................................................................................................................. 3
3.2.2.Interrupt Service Routine - ISR............................................................................................. 3
4. PORTAS DE E/S ........................................................................................................................ 4
4.1. EXEMPLO DE ENTRADA COM A FUNÇÃO PRINTF ....................................................................... 4
4.2. EXEMPLO DE SAÍDA COM A FUNÇÃO SCANF .............................................................................. 4
4.3. EXEMPLO COMPLETO .................................................................................................................. 4
5. RTC.......................................................................................................................................... 5
6. TIMER...................................................................................................................................... 6
6.1. TEMPORIZADORES DO 8051 E SEUS REGISTROS ASSOCIADOS ................................................... 7
6.1.1.Registro do Timer 0......................................................................................................... 7
6.1.2.Temporizador 1 Registro ................................................................................................ 7
6.1.3.Registro TMOD (Timer Mode) ........................................................................................ 8
6.2. PORTA.......................................................................................................................................... 8
6.3. C/T (RELÓGIO; TEMPORIZADOR) ................................................................................................. 9
6.3.1.Diferentes modos de temporizadores ............................................................................ 9
6.3.1.1.Modo 0 (13-Bit Timer Mode) ............................................................................... 9
6.3.1.2.Modo 1 (16-Bit Timer Mode) ............................................................................. 10
6.3.1.3.Modo 2 ............................................................................................................... 11
6.3.1.4.Modo 3 (Modo Timer Split Timer) ..................................................................... 11
5. UART ..................................................................................................................................... 12
5.1. REGISTROS UART: DESCRIÇÃO DOS REGISTROS.................................................................... 12
5.2. PASSOS PARA CONFIGURAÇÃO DA UART0: .......................................................................... 13
6. SPI ......................................................................................................................................... 13
7. CONVERSOR A/D ................................................................................................................... 16
7.1. PARALELO OU FLESH ................................................................................................................. 19
7.2. CONVERSOR EM RAMPA ........................................................................................................... 20
7.3. CONVERSOR DE APROXIMAÇÃO SUCESSIVA............................................................................. 21
8. CONTROLADOR DE MEMÓRIA FLESH (FPEC)............................................................................ 22
9. INFERFACE USB ...................................................................................................................... 27
9.1. SIMULAÇÃO ............................................................................................................................... 31
10.REFERÊNCIAS ......................................................................................................................... 37
1

1. INTRODUÇÃO

O avanço da tecnologia nos últimos anos proporcionou uma revolução na forma como
os seres humanos utilizam equipamento e dispositivos. A evolução trouxe
naturalmente formas de aumentar a multifuncionalidade de equipamentos e sistemas.
Com isso a tecnologia em sistemas embarcados deixou de ter uma mera função de
inicializar serviços dos dispositivos, mas agregou funções complexas que necessitam
cada vez mais de linguagens, algoritmos e outros recursos cada vez mais
desenvolvidos. A Linguagem C contribuiu inegavelmente com essa evolução.

Através da configuração de periféricos para microprocessadores, foi possível avançar


na Revolução Tecnológica de forma muito mais abrangente do que foi vivido na
revolução industrial, no século XXIII.

2. CONFIGURAÇÃO E PROGRAMAÇÃO DE PRIFÉRICOS EM LINGUAGEM C

2.1. HISTÓRIA DA LINGUAGEM C

A linguagem C foi criada e implementada para o sistema operacional (S.O.)


Unix por Dennis Ritchie.
Ritchie foi um dos criadores do sistema operacional Unix e da linguagem de
programação C, recebendo pelas suas contribuições o prêmio Turing em 1983, a
medalha nacional de tecnologia dos Estados Unidos em 1999 e o Prêmio Japão
para Informação e Comunicação em 2011.

O histórico a seguir mostra a evolução das linguagens de programação que


certamente influenciaram a linguagem C.

Algol60 – Projetado por um comitê internacional.


CPL –Combined Programming Language. Desenvolvida em Cambridge e na
Universidade de Londres em1963.
BCPL –Basic Combined Programming Language. Desenvolvida em Cambridge por
Martin Richardsem1967.
2

B – Desenvolvida por Ken Thompson, nos Laboratórios Bell em 1970, a partir da


linguagem BCPL.
C – Desenvolvida por Dennis Ritchie, nos Laboratórios Bell em 1972. Brian
Kernighan também é reconhecido como colaborador.
ANSI C – O comitê ANSI (American National Standards Institute) Foi reunido com a
finalidade de padronizar a linguagem C em 1983.
C++ – A linguagem C se torna ponto de concordância entre teóricos do
desenvolvimento da teoria de Object Oriented Programming (programação orientada
a objetos): surge a linguagem C++ com
alternativa para a implementação de grandes sistemas. Essa linguagem consegue
interpretar linhas de código escritas em C.

A criação da linguagem C é atribuída a Dennis Ritchie, que restaurou algumas


das generalidades perdidas pela BCPL e B. Isso foi conseguido através do hábil uso
dos tipos de dados enquanto mantinha a simplicidade e o contato com o
computador.

2.2. APLICAÇÕES

A linguagem C foi projetada para a construção de sistemas operacionais, e


consequentemente para controle do hardware. Em aplicações de engenharia, a
linguagem é utilizada frequentemente para implementação de Software básico e de
média complexidade, controle eletrônico automático na indústria em geral, sistemas
de comunicação (gateways etc.), programas executivos e aplicativos em
controladores lógicos programáveis (CLPs).
A linguagem C é a indicada em sistemas que envolvem software e hardware, e
onde se deseja ter o controle total da máquina digital.

3. CONTROLE DE INTERRUPÇÕES

3.1. O QUE É A INTERRUPÇÃO

A interrupção é um evento externo ou interno que obriga o microcontrolador a


suspender suas atividades temporariamente, para atender a esse evento que a
3

interrompeu. Em resumo é uma ocorrência que faz o microprocessador parar sua


rotina e desviar para outra função do programa, em que se localiza o serviço de
interrupção que foi gerado pela ocorrência. Após o tratamento da rotina de
interrupção, normalmente o microcontrolador retorna ao ponto do programa em que
havia sido interrompido.

3.2. TIPOS DE INTERRUPÇÃO

3.2.1. Polling

Quando são recebidos dados e há mudança no status das portas de I/O,


existem, basicamente, dois métodos disponíveis de utilização. Pode-se "perguntar"
(Poll) à porta, efetuando uma leitura do status da mesma, em certos intervalos fixos
de tempo, para determinar se algum dado tem sido recebido ou se houve alguma
mudança em relação ao estado anterior. Caso tenha acontecido alguma alteração,
então o programa deve ser desviado para as rotinas de serviço apropriadas.
Como se pode imaginar este método anterior, pode consumir muito tempo.
Este tempo, pode ser utilizado para efetuar alguma outra tarefa, como por exemplo,
repintar a tela do monitor, mostrar as horas num relógio, etc.

3.2.2. Interrupt Service Routine - ISR

Neste tipo de método, o processador efetua as suas tarefas comuns, tais


como, a atualização da tela, atualização do relógio, etc., e quando acontecer algum
evento num dispositivo de I/O, no caso da chegada de um byte, ou a mudança no
status da porta, este solicitará a atenção do processador, enviando um sinal de
requisição de interrupção (InterruptRequest).
Quando o processador receber um sinal de requisição de interrupção, este
finaliza a instrução corrente, armazena algumas informações prévias numa área de
memória chamada de pilha ou stack, para posterior restauração, e executa as
rotinas de atendimento a interrupção (Interrupt Service Routine - ISR), que por
exemplo, poderá capturar o byte da porta e colocá-lo num buffer. Uma vez acabada
4

a rotina ISR, o processador retorna à execução que tinha sido interrompida,


utilizando a informação deixada no stack.
Usando este método, o processador não perde tempo, procurando ver se um
dispositivo de I/O precisa da sua atenção, mas no lugar disso, o próprio dispositivo
irá solicitara interrupção da execução, quando for necessário.

4. PORTAS DE E/S

Uma das principais características da linguagem C é o fato da manipulação


de dados (entradas e saídas) não fazer parte das palavras reservadas da linguagem.
Todo o tratamento de dados requer a inclusão de uma biblioteca de funções de
manipulação de entradas e saídas.
A linguagem C trata todas operações de I/O como uma sequencia de caracteres, e a
a biblioteca padrão C é a stdio.h.
A entrada e saída em C se dá através de funções específicas para isso,
descritas no header stdio.h

4.1. EXEMPLO DE ENTRADA COM A FUNÇÃO PRINTF

int i;
scanf("%d", &i);

4.2. EXEMPLO DE SAÍDA COM A FUNÇÃO SCANF

int i = 5;
printf("O valor de i é: %d\n", i);

Obs: Há a necessidade de usar o operador & e também de indicar o tipo da variável


(%d - inteira), conforme a tabela 1.

4.3. EXEMPLO COMPLETO

#include <stdio.h>

int main()
{
5

int valor1, valor2;


printf("Digite os dois valores: ");
scanf("%d %d", &valor1, &valor2);
printf("Você digitou: %d e %d\n", valor1, valor);
}

TABELA 1

5. RTC

Na medida em que os usos de sistemas de computação se proliferaram na


sociedade atual, suas aplicações com necessidades de medição de tempo real
tornaram-se cada vez mais comuns. Tais necessidades eram variadas em sua
complexidade: lavadoras de roupas, videocassetes, e na outra extremidade do
espectro, sistemas militares de defesa, controle de plantas industriais, e controle de
tráfego aéreo e ferroviário.
Ao decorrer do tempo, muitas soluções foram encontradas, dentre elas o RTC
(real-time-clock) em sua língua nativa, o inglês. O relógio de tempo real em sua
tradução para o português, é um pequeno dispositivo eletrônico, geralmente
manifestado em forma de circuito integrado, que é utilizado para manter o controle do
tempo real, armazenando data e hora de maneira precisa ao longo do tempo, e fazem
isso em unidades humanas de tempo.
6

FIGURA 1 - Módulo Real Time Clock RTC DS1307


Fonte: blogmasterwalkershop (2021)
O uso de RTCs é prevalente na sociedade de hoje em dia, estando presentes
em quase todos os dispositivos eletrônicos que precisam manter um controle preciso
do tempo, e também muitas vezes se encontrado embutidos em microcontroladores
com muitos recursos e periféricos.
Também é muito utilizada em conjunção com o Arduino, uma placa de
prototipação que pode interagir com o ambiente por meio de hardware e software.

FIGURA 2 – Arduíno conectado ao Módulo Real Time Clock RTC DS1307

Fonte: blogmasterwalkershop (2014)

6. TIMER

Um timer é um tipo especializado de relógio que é usado para medir intervalos


de tempo. Um cronômetro que conta de zero para cima para medir o tempo decorrido
é frequentemente chamado de cronômetro. É um dispositivo que conta para baixo a
partir de um intervalo de tempo especificado e usados para gerar um atraso de tempo,
por exemplo, uma ampulheta é um cronômetro.
7

Um contador é um dispositivo que armazena (e às vezes exibe) o número de


vezes que um determinado evento ou processo ocorreu, com respeito a um sinal de
relógio. Ele é usado para contar os eventos que acontecem fora do microcontrolador.
Na eletrônica, os contadores podem ser implementados com bastante facilidade
usando circuitos do tipo registro, tais como um flip-flop.

6.1. TEMPORIZADORES DO 8051 E SEUS REGISTROS ASSOCIADOS

O 8051 tem dois temporizadores, o Timer 0 e o Timer 1. Eles podem ser usados
como temporizadores ou como contadores de eventos. Tanto o Timer 0 quanto o
Timer 1 têm uma largura de 16 bits. Como o 8051 segue uma arquitetura de 8 bits,
cada 16 bits são acessados como dois registros separados de byte baixo e byte alto.

6.1.1. Registro do Timer 0

O registro de 16 bits do Timer 0 é acessado como byte baixo e alto. O registro


de byte baixo é chamado de TL0 (Timer 0 byte baixo) e o registro de byte alto é
chamado de TH0 (Timer 0 byte alto). Estes registros podem ser acessados como
qualquer outro registro. Por exemplo, a instrução MOV TL0, #4H move o valor para o
byte baixo do Timer #0.

6.1.2. Temporizador 1 Registro

O registro de 16 bits do Timer 1 é acessado como byte baixo e alto. O registro


de byte baixo é chamado de TL1 (Timer 1 byte baixo) e o registro de byte alto é
chamado de TH1 (Timer 1 byte alto). Estes registros podem ser acessados como
qualquer outro registro. Por exemplo, a instrução MOV TL1, #4H move o valor para o
byte baixo do Timer 1.
8

6.1.3. Registro TMOD (Timer Mode)

Tanto o Timer 0 quanto o Timer 1 usam o mesmo registro para definir os vários
modos de operação do timer. É um registro de 8 bits no qual os 4 bits inferiores são
reservados para o Temporizador 0 e os 4 bits superiores para os Temporizadores. Em
cada caso, os 2 bits inferiores são usados para definir o modo de temporizador com
antecedência e os 2 bits superiores são usados para especificar a localização.

Porta - Quando ajustado, o temporizador só funciona enquanto a INT(0,1) estiver alta.


C/T - Contador/Timer seleciona o bit.
M1 - Modo bit 1.
M0 - Bit de modo 0.

6.2. PORTA

Cada timer tem um meio de iniciar e parar. Alguns temporizadores fazem isso
por software, outros por hardware e alguns têm controles tanto de software quanto de
hardware. Os temporizadores 8051 têm controles tanto de software como de
hardware. A partida e a parada de um timer são controladas por controlada por
software usando as instruções SETB TR1 e CLR TR1 para o timer 1, e SETB TR0 e
CLR TR0 para o timer 0.
A instrução SETB é usada para iniciá-la e é interrompida pela instrução CLR. Estas
instruções iniciam e param os temporizadores desde que GATE = 0 no registro TMOD.
9

Os temporizadores podem ser iniciados e parados por uma fonte externa, fazendo a
GATE = 1 no registro TMOD.

6.3. C/T (RELÓGIO; TEMPORIZADOR)

Este bit no registro TMOD é usado para decidir se um temporizador é usado


como gerador de atraso ou como gerenciador de eventos. Se C/T = 0, ele é usado
como um timer para geração de atraso de temporizador. A fonte do relógio para criar
o retardo de tempo é a frequência de cristal do 8051. Se C/T = 0, a frequência do
cristal anexado ao 8051 também decide a velocidade na qual o timer 8051 faz tic-tac
em um intervalo regular.
A frequência do temporizador é sempre 1/12 da frequência do cristal anexado
ao 8051. Embora vários sistemas baseados no 8051 tenham uma frequência XTAL
de 10 MHz a 40 MHz, normalmente trabalhamos com a frequência XTAL de 11,0592
MHz. É porque a taxa de bauds para comunicação serial do 8051.XTAL = 11,0592
permite que o sistema 8051 se comunique com o PC sem erros.

6.3.1. Diferentes modos de temporizadores

6.3.1.1. Modo 0 (13-Bit Timer Mode)

Tanto o Timer 1 quanto o Timer 0 no Modo 0 operam como contadores de 8


bits (com um pré-calibrador dividido por 32). O registro do temporizador é configurado
como um registro de 13 bits que consiste de todos os 8 bits de TH1 e os 5 bits
inferiores de TL1. Os 3 bits superiores de TL1 são indeterminados e devem ser
ignorados. O ajuste da bandeira de execução (TR1) não limpa o registro. A bandeira
de interrupção do temporizador TF1 é definida quando a contagem rola de todos os
1s para todos os 0s. A operação do modo 0 é a mesma para o Timer 0 e para o Timer
1.
10

6.3.1.2. Modo 1 (16-Bit Timer Mode)

Tanto o Timer 1 quanto o Timer 0 no Modo 0 operam como contadores de 8


bits (com um pré-calibrador dividido por 32). O registro do temporizador é configurado
como um registro de 13 bits que consiste de todos os 8 bits de TH1 e os 5 bits
inferiores de TL1. Os 3 bits superiores de TL1 são indeterminados e devem ser
ignorados. O ajuste da bandeira de execução (TR1) não limpa o registro. A bandeira
de interrupção do temporizador TF1 é definida quando a contagem rola de todos os
1s para todos os 0s. A operação do modo 0 é a mesma para o Timer 0 e para o Timer
1.

O modo Timer "1" é um timer de 16 bits e é um modo comumente utilizado. Ele


funciona da mesma forma que o modo de 13 bits, exceto que todos os 16 bits são
usados. O TLx é incrementado a partir de 0 até um máximo de 255. Uma vez atingido
o valor 255, o TLx é reajustado para 0 e depois o THx é incrementado em 1. Como
sendo um timer de 16 bits completo, o timer pode conter até 65536 valores distintos e
transbordará de volta para 0 após 65.536 ciclos de máquina.
Modo 2 (Recarregamento automático de 8 bits)

Ambos os registros temporizadores são configurados como contadores de 8


bits (TL1 e TL0) com recarga automática. O overflow de TL1 (TL0) configura TF1 (TF0)
e também recarrega TL1 (TL0) com o conteúdo de Th1 (TH0), que é pré-definido por
software. A recarga deixa o TH1 (TH0) inalterado.

O benefício do modo de recarga automática é que você pode ter o timer para sempre
conter um valor de 200 a 255. Se você usar o modo 0 ou 1, você teria que verificar no
código para ver o transbordo e, nesse caso, redefinir o temporizador para 200. Neste
caso, instruções preciosas verificam o valor e/ou são recarregadas.
11

6.3.1.3. Modo 2

No modo 2, o microcontrolador se encarrega disso. Uma vez configurado um


timer no modo 2, você não precisa se preocupar em verificar se o timer transbordou,
nem precisa se preocupar em repor o valor, pois o hardware do microcontrolador fará
tudo isso por você. O modo de auto-recarga é usado para estabelecer uma taxa de
bauds comum.

6.3.1.4. Modo 3 (Modo Timer Split Timer)


O modo temporizador "3" é conhecido como modo de temporizador dividido.
Quando o temporizador 0 é colocado no modo 3, ele se torna dois temporizadores de
8 bits separados. O Timer 0 é TL0 e o Timer 1 é TH0. Ambos os temporizadores
contam de 0 a 255 e em caso de estouro, reajuste para 0. Todos os bits que são do
Timer 1 serão agora amarrados ao TH0.
Quando o Timer 0 está em modo dividido, o verdadeiro Timer 1 (isto é, TH1 e TL1)
pode ser ajustado nos modos 0, 1 ou 2, mas não pode ser iniciado/parado como os
bits que fazem isso agora estão ligados ao TH0. O temporizador real 1 será
incrementado a cada ciclo da máquina.

Inicialização de um temporizador
Decida o modo de temporizador. Considere um timer de 16 bits que funcione
continuamente, e seja independente de quaisquer pinos externos.

Inicialize o TMOD SFR. Use os 4 bits mais baixos do TMOD e considere o


Temporizador 0. Mantenha os dois bits, GATE 0 e C/T 0, como 0, pois queremos que
o temporizador seja independente dos pinos externos. Como o modo de 16 bits é o
modo de temporizador 1, limpe T0M1 e defina T0M0. Efetivamente, o único bit a ser
ligado é o bit 0 do TMOD. Agora execute a seguinte instrução -

MOV TMOD,#01h
Agora, o Timer 0 está no modo de timer de 16 bits, mas o timer não está funcionando.
Para iniciar o timer no modo de funcionamento, defina o bit TR0 executando a seguinte
instrução -
12

SETB TR0
Agora, o Timer 0 começará imediatamente a contar, sendo incrementado uma vez a
cada ciclo da máquina.

Leitura de um temporizador
Um timer de 16 bits pode ser lido de duas maneiras. Ou você lê o valor real do timer
como um número de 16 bits, ou você detecta quando o timer transbordou.

Detectando estouro do Timer Overflow


Quando um temporizador transborda de seu valor mais alto para 0, o microcontrolador
ajusta automaticamente o bit TFx no registro TCON. Assim, ao invés de verificar o
valor exato do timer, o bit TFx pode ser verificado. Se o TF0 estiver ajustado, então o
Timer 0 transbordou; se o TF1 estiver ajustado, então o Timer 1 transbordou.

5. UART

Módulo UART e registros. LPC1768 tem 4-UARTs numeradas 0-3, da mesma


forma, os pinos também são nomeados como RXD0-RXD3 e TXD0-TXD3. Como os
pinos LPC1768 são multiplexados para múltiplas funcionalidades, primeiro eles têm
que ser configurados como pinos UART.

5.1. REGISTROS UART: DESCRIÇÃO DOS REGISTROS

▪ RBR Contém os dados recentemente recebidos


▪ THR Contém os dados a serem transmitidos
▪ Registro de Controle FCR FIFO
▪ LCR controla a formatação da estrutura UART (Número de bits de dados, bits de
parada)
▪ DLL Byte menos significativo do valor do gerador de taxa de bauds UART.
▪ DLM Byte mais significativo do valor do gerador de taxa de transmissão UART.
▪ FCR ( Registro de Controle FIFO )
13

A LPC1768 tem embutido FIFO de 16byte para receptor/transmissor. Assim,


ele pode armazenar 16 bytes de dados recebidos no UART sem sobrescrever. Se os
dados não forem lidos antes que a Fila (FIFO) seja preenchida, então os novos dados
serão perdidos e o bit de erro OVERRUN será definido.
▪ LCR ( Line Control Register )
Este registro é utilizado para definir o formato de quadro UART, ou seja, número
de bits de dados, bits STOP, etc.
▪ LSR (Line Status Register)
Trata-se de um registro somente leitura que fornece informações de status dos
blocos UART TX e RX.
▪ TER (Registro de habilitação de transmissores)

Este registro é utilizado para Habilitar/Desabilitar a transmissão

5.2. PASSOS PARA CONFIGURAÇÃO DA UART0:

Passo1: Configurar o pino GPIO para a função UART0 usando o registro PINSEL.
Passo2: Configurar o FCR para habilitar o FIXO e Reste tanto o Rx/Tx FIFO.
Passo3: Configurar a LCR para 8 bits de dados, 1 bit de parada, Desabilitar Paridade
e Habilitar DLAB.
Passo4: Obtenha o PCLK do registro PCLKSELx 7-6 bits.
Passo5: Calcular o DLM,DLL vaues para baudrate requerido a partir do PCLK.
Passo6: Atualize o DLM,DLL com os valores calculados.
Passo6: Finalmente, desabilitar o DLAB para desativar o acesso ao DLM,DLL.
Depois disso, a UART estará pronta para transmitir/receber dados na taxa de bauds
especificada.

6. SPI

Os equipamentos eletrônicos vêm agregando mais e mais funções, a utilização


de diversos circuitos integrados torna-se cada vez mais comum. No entanto, não é
14

mais possível estender longos barramentos de comunicação paralelos, pois tornariam


as placas de circuito impresso caras e muito grandes. Logo, uma comunicação serial
entre esses dispositivos se torna necessária.
Diversas tecnologias de interligação serial entre dispositivos foram
desenvolvidas, podendo ser separadas em duas grandes categorias, a comunicação
síncrona e a comunicação assíncrona. Dentre os métodos de comunicações mais
conhecidos, destacam-se três:

• UART: Universal Asynchronous Receiver Transmitter;

• SPI: Serial Peripheral Interface;

• I2C: Inter Integrated Circuit.

FIGURA 4 - Tipos de Comunicação


Fonte: Sacco (2014)

O SPI (Serial Peripheral Interface) é um protocolo que permite a comunicação


do microcontrolador com diversos outros componentes, formando uma rede. É uma
especificação de interface de comunicação série síncrona usada para comunicação
de curta distância, principalmente em sistemas embarcados. A interface foi
desenvolvida pela Motorola e tornou-se um padrão de facto. Aplicações típicas
incluem cartões SD e mostradores de cristal líquido.
Os dispositivos SPI comunicam entre si em modo "full duplex" usando uma
arquitetura "master-slave" com um único mestre. O dispositivo mestre origina a trama
para a leitura e a escrita. Múltiplos dispositivos escravos são suportados através de
seleção com linhas de seleção de escravos individuais (SS).
15

Às vezes SPI é chamado de barramento serial de quatro fios, contrastando com


os barramentos seriais de três, dois (como o I2C) e um (como o One Wire) fio. O SPI
pode ser descrito com precisão como uma interface de série síncrona, mas é diferente
do protocolo síncrono de interface de série (SSI), que também é um síncrono protocolo
de comunicação em série de quatro fios, mas emprega sinal diferencial e fornece
apenas um único canal de comunicação simples.
Em modo "escravo", o microcontrolador comporta-se como um componente da
rede, recebendo o sinal de Clock. Em modo "mestre", o microcontrolador gera um
sinal de relógio e deve ter um pino de entrada/saída para habilitação de cada
periférico.
O barramento SPI é composto por quatro sinais:
• SCLK (Clock), sinal estabelecido pelo mestre;
• MOSI (Master Out Slave In) sinal de transferência de dados do mestre para o
escravo;
• MISO (Master In Slave Out) sinal de transferência de dados do escravo para o
mestre;
• CS (Chip Select) sinal de seleção de dispositivo e início de transferência.

Como grande vantagem desta interface podemos citar a velocidade de


comunicação devido ao barramento full duplex, ou seja, toda a comunicação pode ser
realizada em ambas as direções e, também, devido ao fato do clock ser definido pelo
Mestre.
Já como desvantagens podemos citar o maior número de conexões para
estabelecer a comunicação, suporta apenas um dispositivo mestre e não possui
protocolo de verificação de erros. (Nunes, 2019).
16

FIGURA 5 – Barramento SPI


Fonte: Sacco (2014)

7. CONVERSOR A/D

Sinais analógicos dos sensores, após devidamente condicionados, devem ser


convertidos em digitais antes de serem processados
O conversor analógico-digital (também conhecido como A/D ou ADC) é um
dispositivo capaz de reproduzir uma representação digital a partir de um sinal
analógico, como um nível de tensão ou intensidade de corrente elétrica. Os
conversores analógicos digitais são bastante utilizados na interface entre os
dispositivos digitais.
Um ADC é um componente que fornece a representação digital de um sinal
analógico em um instante do tempo. Na prática, os sinais analógicos variam
continuamente ao longo do tempo e um ADC coleta amostras periódicas de um sinal
em uma taxa predefinida chamada de frequência ou taxa de Amostragem (ƒs). A
amostragem se dá através de um trem de pulso de largura infinitesimal e área unitária.
Devido a infinidade de valores de tensão ou corrente existentes em um sinal analógico
em um determinado espaço de tempo, torna-se impossível converter todos os valores
para forma digital, desta forma é necessário fazer uma amostragem de alguns valores
sendo que o intervalo entre duas amostras não é convertido. (Silva, 2005).
17

FIGURA 6: Amostragem de sinais


Fonte: Silva (2005)
Como os conversores são limitados em banda, ou seja, trabalham apenas em
uma faixa específica de frequência (1 a 10kHz), normalmente [0,fN], onde fN
representa o dobro da frequência do maior sinal passível de ser adquirido (fN/2 -
frequência de Nyquist), normalmente utiliza-se um filtro passa-baixas com a
finalidade de evitar que amplitudes de harmônicas de alta frequência apareçam na
entrada do conversor.
De acordo com o teorema de amostragem, para que seja possível reconstruir
um sinal, é necessário que a ƒs seja no mínimo igual ao dobro da frequência máxima
do sinal amostrado, caso contrário produz-se um fenômeno chamado de aliasing que
é uma sobreposição que inviabiliza a recuperação do sinal.
18

FIGURA 7: Efeito aliasing


Fonte: QSL.NET (2021)

Uma outra característica a ser observada em um ADC é o número de bits


utilizados nos sinais digitais para representar um valor analógico. Quanto maior o
número de bits, mais valores analógicos podem ser representados. (Silva, 2005).
A precisão da conversão é dependente da resolução e linearidade do
conversor. Geralmente a precisão de um ADC é melhor definida através da soma de
três componentes: a leitura, a escala e o bit menos significativo (LSB).
Quando esses componentes são computados, a precisão do dispositivo (ou
incerteza) é maior que 1 LSB. (Batista, 2006)
Outra característica a ser observada em um ADC é a taxa de desempenho ou
taxa de processamento (throughput) que é o tempo necessário para conversão,
aquisição e transferência dos dados.
Uma conversão analógico-digital leva uma quantidade de tempo para ser
realizada, desta forma, é necessário assegurar que o sinal analógico na entrada do
conversor permaneça constante em amplitude até que a conversão se complete a fim
de minimizar o erro na sua representação. Isso é realizado por um circuito chamado
de sample and hold (S/H).
O subsistema de amostragem e retenção ou Sample & Hold é responsável por
efetuar a amostragem do sinal analógico antes de proceder à sua quantificação. Em
uma comparação simples, é a associação de um
interruptor analógico com um capacitor para a manutenção do valor da
tensão amostrada. (Ferreira, 2015)
19

FIGURA 8 – Circuito Sample & Hold


Fonte: Nunes (2019)

De um modo geral, os conversores AD podem ser divididos de acordo com os


métodos utilizados para conversão sendo que cada método apresenta vantagens em
áreas específicas de utilização de acordo com a utilização como em sensores
analógicos, áudio e vídeo, rádio frequência e outros. (Ferreira, 2015). Dentre estes
métodos podemos destacar alguns tipos:

7.1. PARALELO OU FLESH

O método flash, considerado o mais rápido podendo operar na faixa de MHz,


ideal para conversões de alta velocidade e baixa resolução. É baseado na
comparação de sinal analógico com valores de referência obtidos por comparadores.
Para uma resolução de n bits são necessários (2N – 1) comparadores e igual
quantidade de níveis de referência.
“O seu princípio de funcionamento é comparar a tensão do sinal de entrada
com a tensão de referência e, assim, determinar a posição na série de resistências
que corresponderia ao código de saída do conversor”. (Pereira, 2013).
20

Os conversores tipo paralelo têm como circuito básico de entrada um


pré-amplificador e um latch, que atuam juntos em uma configuração de
circuito comparador. Na saída dos comparadores é necessária a colocação
de um circuito de codificação que irá receber os sinais dos comparadores e
codificar o sinal de saída em código binário. (Pomilio, 2007)
A vantagem deste tipo de conversor é que a conversão teoricamente pode ser
realizada em apenas um ciclo de clock mas apresenta a desvantagem de aumentar o
custo e o consumo de potência proporcionalmente ao aumento de resolução uma vez
que dobra a quantidade de comparadores a cada bit a mais de resolução.

7.2. CONVERSOR EM RAMPA

O conversor em rampa é um conversor A/D simples e que pode ser projetado


para que tenha uma alta resolução. Quando a taxa de amostragem não necessita ser
elevada, mas não dispensa alta resolução, este tipo de conversor é a melhor opção.
O funcionamento deste dispositivo baseia-se na integração de sinais e seus
componentes básicos são: um comparador, um contador e um integrador de Miller.
Esse é seu princípio de funcionamento: primeiramente se integra o sinal de
entrada (Vin) durante um tempo fixo, posteriormente move-se a chave presente na
entrada do integrador para o ponto onde está conectada a tensão referência
conhecida (Vref), de sinal contrário em relação à tensão de entrada, nesta fase faz-se
a integração da Vref que se volte ao estado inicial, ou seja, tensão nula na saída do
integrador. O contador citado anteriormente como um dos componentes básicos deste
tipo de conversor é responsável por determinar o tempo da rampa de subida
(integração de Vin) e realizar a contagem do tempo de descida (integração de Vref).
A inclinação da rampa de subida é dependente da amplitude do sinal de
entrada, por isso, para diferentes sinais de entrada teremos um valor de tensão (Vm)
diferente ao final da primeira etapa de integração. Já a rampa de descida irá
apresentar sempre a mesma inclinação, pois o valor do sinal de entrada do integrador
é sempre o mesmo nesta fase, apenas o tempo de duração desta rampa de descida
irá alterar, e é justamente este tempo que é utilizado para a determinação da amplitude
do sinal de entrada.
21

A simplicidade deste tipo de conversor, aliada a seu baixo consumo de energia,


faz com que ele seja escolhido, geralmente, para aplicações de instrumentação de
baixo custo, como multímetros digitais.

7.3. CONVERSOR DE APROXIMAÇÃO SUCESSIVA

O conversor AD de aproximações sucessivas (SAR) é um dos tipos mais


utilizados devido ao tempo de conversão pois sua técnica de conversão está muito
próxima a do conversor “Flash” sem as desvantagens já conhecidas. Na arquitetura
SAR o tempo de conversão é fixo e independente do valor na entrada analógica.
Segundo Pomilio (2007), “Este tipo de conversor utiliza uma técnica de
realimentação para relacionar uma voltagem analógica de entrada com um código
digital correspondente (conforme os N bits de resolução do conversor)”.
O conversor SAR ADC (ou conversor de aproximação sucessiva) representam
a maior parte de conversores de resoluções médio-grande. Eles possuem pouco
consumo de energia, uma alta resolução e precisão, e o fato de serem fisicamente
pequenos também ajuda. Devido a esses benefícios os ADCs SAR podem ser
integrados com outras funções maiores.
As suas maiores limitações são as pequenas taxas de amostragem, uma
resolução limitada devido aos limites do DAC e comparador, e, também o fato de seu
tamanho aumentar com o número de bits. É ideal para sistemas com dados de
multicanais e frequências de amostras abaixo de 10MHz e resoluções entre 8 e 16
bits.
Seus circuitos são mais complexos do que os do conversor em rampa, porém
seu tempo de conversão é muito menor, o que torna seu uso bastante atrativo. Além
disso, os conversores A/D por aproximações sucessivas têm um tempo de conversão
fixo, que não depende do sinal analógico presente em sua entrada. O esquema básico
deste conversor é similar ao do conversor em rampa.
No entanto o conversor A/D por aproximações sucessivas não utiliza um
contador para gerar a entrada do conversor D/A, usando, em seu lugar, um registrador
comum. A lógica de controle modifica o conteúdo deste registrador bit a bit, até que o
dado armazenado no registrador seja equivalente à entrada VA, dentro da resolução
do conversor.
22

8. CONTROLADOR DE MEMÓRIA FLESH (FPEC)

Um controlador de memória flash (ou controlador de flash) gerencia os dados


armazenados na memória flash e se comunica com um computador ou dispositivo
eletrônico. Controladores de memória flash podem ser projetados para operar em
baixos ciclo de trabalho ambientes como cartões SD, CompactFlash cartões, ou
outros semelhantes de mídia para uso em câmeras digitais, PDAs, telefone celulares,
etc.drives flash USB usar controladores de memória flash projetadas para se
comunicar com pessoal computadores através da porta USB em um ciclo de trabalho
baixo. Os controladores Flash também podem ser projetados para ambientes de ciclo
de trabalho mais elevados, como unidades de estado sólidos (SSD) usadas como
armazenamento de dados para sistemas de laptop e até arrays de armazenamento
corporativo de missão crítica.

FIGURA 9: Lexar USB stick 8 GB - Silicon Motion SM3253L - Controlador flash


USB 2.0 de canal único.

Depois que um dispositivo de armazenamento flash é fabricado inicialmente, o


controlador flash é usado primeiro para formatar a memória flash. Isso garante que o
dispositivo esteja operando corretamente, mapeia células de memória flash
23

danificadas e aloca células sobressalentes para serem substituídas por futuras células
com falha. Alguma parte das células sobressalentes também é usada para conter o
firmware que opera o controlador e outros recursos especiais para um dispositivo de
armazenamento específico. Uma estrutura de diretório é criada para permitir que o
controlador converta solicitações de setores lógicos em locais físicos nos chips de
memória flash reais.

Quando o sistema ou dispositivo precisar ler ou gravar dados na memória flash,


ele se comunicará com o controlador de memória flash. Dispositivos mais simples,
como cartões SD e unidades flash USB, normalmente têm um pequeno número de
dados de memória flash conectados simultaneamente. As operações são limitadas à
velocidade do dado individual da memória flash. Em contraste, uma unidade de estado
sólido de alto desempenho terá até 100 ou mais matrizes organizadas em uma matriz
com caminhos de comunicação paralelos para permitir velocidades muitas vezes
maiores do que a de uma única matriz flash.[citação necessária]

A memória flash pode suportar um número limitado de ciclos de apagamento


de programa. Se um determinado bloco de memória flash fosse programado e
apagado repetidamente sem gravar em nenhum outro bloco, um bloco se desgastaria
antes de todos os outros blocos, encerrando assim prematuramente a vida útil do
dispositivo de armazenamento. Por esse motivo, os controladores de flash usam uma
técnica chamada nivelamento de desgaste para distribuir as gravações da maneira
mais uniforme possível em todos os blocos de flash no SSD. Em um cenário perfeito,
isso permitiria que cada bloco fosse gravado em sua vida máxima, de forma que todos
falhassem ao mesmo tempo.

Normalmente, os controladores de memória flash também incluem a "camada


de tradução flash" (FTL), uma camada abaixo do sistema de arquivos que mapeia o
lado do host ou endereços de bloco lógico (LBAs) do sistema de arquivos para o
endereço físico da memória flash (lógico para físico mapeamento). Os LBAs referem-
se a números de setor e a uma unidade de mapeamento de 512 bytes. Todos os LBAs
que representam o tamanho lógico visível e gerenciado pelo sistema de arquivos são
mapeados para um local físico (ID de bloco, ID de página e ID de setor) do Flash.
Como parte do nivelamento de desgaste e outros algoritmos de gerenciamento
de flash (gerenciamento de blocos defeituosos, gerenciamento de perturbações de
24

leitura, manuseio seguro de flash, etc.), a localização física de um LBA pode mudar
dinamicamente com frequência. As unidades de mapeamento de um FTL podem
diferir, de modo que os LBAs são mapeados com base em bloco, página ou mesmo
subpágina. Dependendo do padrão de uso, uma granularidade de mapeamento mais
fina pode reduzir significativamente o desgaste do flash e maximizar a durabilidade de
uma mídia de armazenamento baseada em flash.

Como os metadados FTL ocupam seu próprio espaço flash, eles também
precisam de proteção em caso de perda de energia. Além disso, é possível que a
tabela de mapeamento se desgaste antes que outras partes da memória flash se
desgastem, encerrando prematuramente a vida útil de um dispositivo de
armazenamento. Isso geralmente é evitado em dispositivos corporativos alocando um
espaço superdimensionado para peças sobressalentes, embora formas mais
duráveis, de armazenamento como MRAM também tenham sido propostas para FTL.

Depois que cada bloco de um dispositivo de armazenamento de estado sólido


for gravado uma vez, o controlador flash precisará retornar a alguns dos blocos iniciais
que não têm mais dados atuais (também chamados de blocos obsoletos). Os dados
nesses blocos foram substituídos por blocos recém-gravados e agora eles estão
esperando para serem apagados para que novos dados possam ser gravados neles.
Este é um processo denominado coleta de lixo (GC). Todos os SSDs, cartões CF e
outros dispositivos de armazenamento flash incluirão algum nível de coleta de lixo. A
velocidade com que um controlador de flash fará isso pode variar.

O firmware embarcado das estações remotas de entrada e saída industriais é


responsável pelo gerenciamento das funcionalidades do módulo. Nas estações
fabricadas pela empresa Altus, o firmware é armazenado em uma memória flash de
acesso paralelo interna ao processador. A memória flash também é utilizada na
sequência de boot do processador.

Deseja-se poder utilizar uma memória flash externa SPI, portanto de acesso
serial, para o processo de boot do processador embarcado. Entretanto, as soluções
oferecidas pelas ferramentas de programação utilizadas pressupõem acesso paralelo
às memórias de código.
25

Inicialmente, foi feito um estudo para entender a programação da flash interna


do módulo, solução usada atualmente. Neste estudo, foi utilizado como ferramenta
um IDE de programação. Identificou-se que a ferramenta utiliza um algoritmo escrito
em C para definir o funcionamento do processo de programação da memória. Com o
uso de um debug adapter conectado ao hardware através de uma interface JTAG, foi
possível transferir o código do firmware para a memória da estação e depurar o
algoritmo orientado a programação de memórias flash internas de acesso paralelo.

Consultando-se a documentação disponibilizada pela própria desenvolvedora


da ferramenta, foi realizado um estudo sobre todas as funções que compõem um
algoritmo. Assim, foi possível criar um outro código, baseado nos templates de
algoritmos já existentes.

FIGURA 10 - Processo de programação de memória flash

FIGURA 11: Debuger Adapter


26

Utilizando-se o entendimento obtido a partir da programação da flash interna,


desenvolveu-se o procedimento para a programação da flash externa SPI, que exige, além
de serialização, mecanismos de verificação e temporização diferentes das etapas de escrita
em memórias não voláteis de interface paralela.

O procedimento funcionou corretamente. Entre os resultados, temos o know-how


acerca dos diversos componentes que fazem parte do processo de gravação da memória
flash e o desenvolvimento de um algoritmo para a programação de memórias flash externas
conectadas a uma interface SPI. O procedimento foi devidamente implementado e testado,
atingindo resultados satisfatórios, e será utilizado em um circuito integrado de comunicação
industrial em desenvolvimento.

FIGURA 12: Unidade eletrônica de controle embutida 4602

A Unidade de Controle Epec 4602 tem uma vasta gama de E/S programáveis
para diferentes implementações. Epec 4602 pode controlar 10 blocos hidráulicos
simultaneamente usando 20 saídas PWM e 10 feedbacks. Pode ser usado como
controlador autônomo ou como parte de um sistema de controle descentralizado. O
invólucro de forma elegante da unidade funciona para proteger a eletrónica contra o
desgaste mecânico. A carcaça de alumínio/plástico à prova de vazamentos também
foi amplamente testada contra diferentes condições ambientais. A unidade está
equipada com um LED de sinalização para diagnóstico. Uma CAN também está
27

equipada com pinos duplos para facilitar o cabeamento, uma vez que não há
necessidade de ramificações no chicote de fios.

9. INFERFACE USB

Nesse tópico será abordado de forma prática alguns passos para realizar a
comunicação enviando e recebendo dados de um microprocessador PIC 18F4550
pela interface USB. O compilador utilizado foi o MIkroC Pro 5.3 e o simulador foi o
Proteus Isis 7.7.

Para configurar o PIC como um USB HID Device, é necessário gerar um arquivo
de descrição de funções de acordo com os padrões USB HID encontrados em
http://www.usb.org/developers/hidpage/. Nessa página há um programa chamado
“Hid Descriptor Tool” para gerar suas próprias configurações de dispositivos. É
possível gerar teclados, mouses, game controllers entre outros, esse artigo foca em
comunicação padrão via terminal e não aprofunda esses tópicos.

Após criar um projeto no MikroC Pro, deve-se abrir a ferramenta “HID Terminal”
que se encontra no menu Tools. Na aba Descriptor deve-se preencher os dados de
configuração do arquivo a ser gerado conforme mostra a figura 13, em seguida deve-
se clicar em “Save Descriptor” e salvar.

FIGURA 13: Configuração do Arquivo Descriptor


28

FIGURA 14: Salvando um arquivo Descriptor

Será gerado um Código gerado pela ferramenta e salvo em USBdsc.c. Esse


arquivo precisa ser incluído no projeto. No menu Project Manager ao lado direito da
interface gráfica do MikroC Pro, deve-se clicar com o botão da direita em Sources,
escolher “Add file to Project”, selecionar o USBdsc.c e verificar se o mesmo foi incluído
ao projeto, conforme demonstra a figura a seguir:

FIGURA 15: Arquivos Fonte do Projeto.


29

Em seguida foi elaborado com base nos arquivos de exemplo da mikroElektronika o


seguinte programa principal:

O programa tem como função receber strings pelo terminal e enviar o que foi
recebido a esse terminal. A figura 10 mostra o fluxograma do programa. As variáveis
readbuff e writebuff são utilizadas pelas funções HID_Write e HID_Read
respectivamente para envio e leitura de mensagens. Essas devem possuir o mesmo
comprimento declarado no arquivo descriptor, em nosso caso 64 posições, conforme
a figura 13. A execução dos serviços USB é realizada dentro de uma rotina interrupt
onde deve estar a função USB_Interrupt_Proc(); No caso aqui apresentado,
realizamos a configuração do microcontrolador para funcionar sem portas analógicas
30

ou comparadores, essas configurações foram realizadas nas variáveis dos


registradores ADCON1 e CMCON. Informamos ao compilador que as variáveis de
buffer de recebimento e escrita para o módulo USB são readbuffer e writebuffer
respectivamente, declaradas como parâmetros da função de habilitação
HID_Enable().

O delay de 5 segundos pode ser aumentado ou até mesmo retirado de acordo


com a necessidade, nesse caso temos 5 segundos para configurar o terminal e
receber as mensagens de boas vindas do PIC, caso a demora em conectar o terminal
ao dispositivo, seja maior do que 5 segundos o funcionamento do restante do
programa não será alterado, apenas não veremos as mensagens de boas-vindas. O
laço infinito executa a operação lógica de acordo com o fluxograma da figura a seguir.
O programa aguarda a leitura de uma informação, em seguida copia posição a
posição os valores lidos para um buffer de leitura e então escreve e aguarda a
conclusão da rotina de escrita, voltando ao início do loop em seguida.

FIGURA 16: Fluxograma do programa


31

Para compilar o programa, não devemos nos esquecer de habilita a biblioteca


USB do compilador no Library Manager, conforme a figura 9.

FIGURA 17: Biblioteca USB habilitada,

9.1. SIMULAÇÃO

Para verificar o funcionamento do programa, optamos por realizar uma


simulação no Proteus Isis. O circuito da figura 18 foi desenhado para executar essa
função.

FIGURA 18: Circuito de Simulação no Proteus Isis

Observação importante: tanto para a compilação como para a simulação foram


utilizados clock de 4MHz.
32

No Isis devemos carregar ao microcontrolador o arquivo. hex gerado pelo


compilador, para isso basta clicar duas vezes sobre o microcontrolador e a tela da
figura 19 aparecerá, escolher o programa em “Program File” e clicar em ok.

FIGURA 19: Configurações do Microcontrolador no Proteus Isis

Basta então iniciar a simulação clicando no botão “play” no canto inferior


esquerdo da tela. Com a simulação em andamento, o Isis irá abrir um analisador USB
chamado “Usb Analyzer”, no qual podemos verificar as comunicações de interface
com o Windows conforme a figura 20:

FIGURA 20: Simulação em Andamento no Proteus Isis


33

A biblioteca de simulação do conector USB do Isis simula uma entrada real no


sistema. Pode-se então verificar ao entrar na pasta de “Dispositivos e Impressoras”
do Windows, conforme demonstra a figura 9 que o hardware simulado foi reconhecido
com sucesso. Mais informações podem ser obtidas clicando com o botão da direita e
abrindo as propriedades do dispositivo, conforme demonstram as figuras 19 e 20
respectivamente. Convém reparar que o nome dado ao dispositivo na figura 1 aparece
na figura 21.

FIGURA 21: Dispositivos e Impressoras no Windows

FIGURA 22: Dispositivo Genérico HID detectado pelo Sistema Operacional


34

FIGURA 23: Propriedades do Dispositivo Criado

Observação importante: a primeira vez em que um dispositivo HID for


conectado ou simulado o Windows poderá levar um tempo para instalar os drivers.
Com a simulação em andamento, ou o circuito conectado à USB, devemos
voltar ao MikroC Pro e abrir novamente o HID Terminal. Selecionar o nosso hardware
na lista de “HID Devices” e verificar o programa rodando no terminal conforme mostra
a figura 23.

Observação Importante: a mensagem de boas vindas aparece após 5


segundos do dispositivo conectado, caso se demore mais do que este tempo entre o
início da simulação, abrir e selecionar o device no terminal a mensagem não irá
aparecer, o que não significa que o circuito não está funcionando, basta aumentar o
delay.
35

FIGURA 24: HID Terminal comunicando com o Hardware USB

Basta então escrever o que se deseja enviar em “Communication” e clicar em


“Send”. Se tudo ocorrer bem, a string enviada deverá aparecer na tela “terminal”. As
figuras 25 e 26 mostram o envio das strings “Teste” , “Comunicação UsB” e seus
devidos resultados.

FIGURA 25 – String “Teste” enviada e recebida.


36

FIGURA 26: String “Comunicação UsB” enviada e recebida.


37

10. REFERÊNCIAS

SILVA, Renato A.; Programando microcontrolador, P. I. C. Linguagem C. São Paulo:


Ensino Profissional, 2006.

Morre Dennis Ritchie pai do Unix e da linguagem de programação C. G1,


Globo.com. 2011. Disponível em:
<http://g1.globo.com/tecnologia/noticia/2011/10/morre-dennis-ritchie-pai-do-
unix-e-da-linguagem-de-programacao-c.html>. Acesso em: 28 de outubro de
2021.

COCIAN, Luis Fernando Espinosa. Manual da linguagem C. Editora da ULBRA,


2004.

Introdução à Linguagem C, PUCRS, 2017. Prof. Marcelo Cohen, 2013. Disponível


em: <https://www.inf.pucrs.br/flash/progswb/present/U01_progC/>. Acesso em:
30 de outubro de 2021

Teoria linguagem C, bemvin.org, 2017. Disponível em: < https://bemvin.org/teoria-


linguagem-c-v2.html?page=18>. Acesso em: 28 de outubro de 2021

autômatoBr. Relógio de Tempo Real - RTC: o que é e quando é necessário usar.


autômatoBr, 2015. Disponível em: <automatobr.blogspot.com/2015/05/relogio-de-
tempo-real-rtc-o-que-e-e.html>. Acesso em: 14 de nov. de 2021.

FARINE, Jean Marie; FRAGA, Joni da Silva; OLIVEIRA, Rômulo Silva de. Sistemas
de Tempo Real. Centro de Informática - UFPE: 2000.

Desenvolvimento de Algoritmo para Escrita em Memória Flash SPI em uma Estação


Remota de Entrada e Saída Industrial, Eduardo Kochenborger Duarte, 2019.
Disponível em:
<https://lume.ufrgs.br/bitstream/handle/10183/176831/Poster_54200.pdf?sequence=
2&isAllowed=y >. Acesso em: 06 de Novembro de 2021

SILVA, Luiz Marcelo Chiesse da. Conversores D/A e A/D. Cornélio Procópio: Utfpr,
2005. 13 p.

POMILIO, José Antenor. Conversão AD: Notas de aula. Campinas: Unicamp, 2007.
25 p.
38

PEREIRA, Roberto Benedito de Oliveira. IMPLEMENTAÇÃO POR SISTEMAS


EMBARCADOS DE PROTÓTIPO PARAMETRIZÁVEL PARA COLETA DE DADOS
MICROCLIMÁTICOS GEORREFERENCIADOS. 2013. 157 f. Tese (Doutorado) -
Curso de Física Ambiental, Universidade Federal do Mato Grosso, Cuiabá Mt, 2013.

BAPTISTA, Manuel. SISTEMAS DE AQUISIÇÃO DE DADOS: SISTEMAS DE


INSTRUMENTAÇÃO - 2.º ANO. Viseu: Escola Superior de Tecnologia de Viseu,
2006

FERREIRA, Marcelo Luiz da Costa. PROPOSTA DE HARDWARE PARA


AQUISIÇÃO SIMULTÂNEA MULTICANAL E SUA APLICAÇÃO NA LOCALIZAÇÃO
DE FONTES SONORAS. 2015. 95 f. Dissertação (Mestrado) -
Curso de Engenharia Elétrica, Universitário da Fei, São Bernardo do Campo, 2015.

QSL.NET. Digitalização de um sinal analógico. Disponível em:


<https://www.qsl.net/py4zbz/teoria/digitaliz.htm>. Acesso em: 14 de nov. de 2021.

NUNES, Alexandre Corrêa. Desenvolvimento de um sistema de aquisição de


dados em tempo real utilizando a PRU da Beaglebone Black. Dissertação
(Mestrado em Mecatrônica) – Instituto Federal de Educação, Ciência e Tecnologia
de Santa Catarina, IFSC. Santa Catarina, p. 101. 2019.

SACCO, Francesco. Comunicação SPI: Parte um. Embarcados, 2014. Disponível


em: <https://www.embarcados.com.br/spi-parte-1/>. Acesso em: 14 de nov. de 2021.

Você também pode gostar