Sunteți pe pagina 1din 59

Comunicação serial: I2C, RS232, HT1380, ME1000RW

Rodrigo Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 1 / 59
Revisão

Revisão

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 2 / 59
Revisão

Conversor AD

5 5,00

Limites da comparação
11
4

Valor original, em Volts


3,75

3 10
2,50
2 01
1,25
1
00

Valor convertido
para binário

Faixa de valores na conversão de AD com 2 bits

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 3 / 59
Revisão

Conversor AD

1 # include " pic18f4520 . h "


2 # include " config . h "
3 # include " ssd . h "
4 # include " adc . h "
5 void main ( void ) {
6 unsigned int i ;
7 int temp = 0 ;
8 ssdInit () ;
9 adcInit () ;
10 for (;;) {
11 temp = adcRead () ;
12 ssdDigit (( temp / 1000 ) % 10 , 3);
13 ssdDigit (( temp / 100 ) % 10 , 2);
14 ssdDigit (( temp / 10 ) % 10 , 1);
15 ssdDigit (( temp / 1 ) % 10 , 0);
16 ssdUpdate () ;
17 for ( i = 0 ; i < 1000 ; i ++) ;
18 }
19 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 4 / 59
Revisão

Saı́das PWM
Início do
Baixo: Saída desligada
ciclo
Alto: Saída ligada

10%

50%

90%

Sinais PWM com variação do duty cycle


ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 5 / 59
Revisão

Saı́das PWM

1 # include " config . h "


2 # include " pic18f4520 . h "
3 # include " pwm . h "
4 # include " adc . h "
5 // inı́cio do p r o g r a m a
6 void main ( void ) {
7 int value ;
8 pwmInit () ;
9 adcInit () ;
10 for (;;) {
11 value = adcRead () ;
12 // a j u s t a n d o a f r e q u ^
e n c i a de acordo com entrada a n a l ó g i c a
13 pwmFrequency ( value ) ;
14 // a j u s t a n d o o duty−cycle para 50 %
15 pwmSet1 ( 50 ) ;
16 }
17 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 6 / 59
Comunicação Serial

Comunicação Serial

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 7 / 59
Comunicação Serial

Comunicação Serial

Vantagens
Simplificação do hardware
Aumento da taxa de transmissão devido a redução de problemas de
sincronia
Economia de cabos

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 8 / 59
Comunicação Serial

Comunicação Serial

Protocolo Taxa (bits/s) Taxa (bytes/s)


Serial MIDI 31.25 kbit/s 3.9 kB/s
Serial EIA-232 max. 230.4 kbit/s 28.8 kB/s
Serial UART max 2.7648 Mbit/s 345.6 kB/s
I2c 3.4 Mbit/s 425 kB/s
Serial EIA-422 max. 10 Mbit/s 1.25 MB/s
SPI Bus (Up to 100MHz) 100 Mbit/s 12.5 MB/s
USB super speed (USB 3.0) 5 Gbit/s 625 MB/s
HDMI v. 1.3 10.2 Gbit/s 1.275 GB/s
Ultra DMA ATA 133 (16 bits) 1,064 Mbit/s 133 MB/s
Serial ATA 3 (SATA-600) 6,000 Mbit/s 600 MB/s
Ultra-640 SCSI (16 bits) 5,120 Mbit/s 640 MB/s
Serial Attached SCSI (SAS) 3 9,600 Mbit/s 1,200 MB/s

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 9 / 59
Protocolo I2C

Protocolo I2C

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 10 / 59
Protocolo I2C

Comunicação Serial
Comunicação serial I2C - Inter-Integrated Circuit
1982 - Protocolo I2C criado pela Phillips (100 kHz)
1992 - Versão 1.0: Adicionada a frequência de 400 kHz (Fast mode) e
endereçamento de 10 bit addresses
1998 - 2.0: Frequência de 3.4 MHz (High-speed mode)
2007 - 3.0: Frequência de 1.0 MHz (Fast mode plus)
2012 - 4.0: Frequência de 5.0 MHz (Ultra fast mode plus) e criada
tabela com identificadores de fabricantes
É um protocolo serial, sı́ncrono e multi-mestre

Figura: Barramento I2C com vários dispositivos


ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 11 / 59
Protocolo I2C

Comunicação Serial
A comunicação I2C é feita de modo sı́ncrono: os bits são enviados de
acordo com um sinal de clock.
Para isso são necessários pelo menos 2 fios:
Transmissão dos dados, SDA ou serial data
Transmissão do clock, SCL ou serial clock
Os terminais são implementados como coletor aberto, exigindo um
pull-up para funcionamento.

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 12 / 59
Protocolo I2C

Comunicação Serial
A comunicação é feita como nos LCD’s, mas nesse caso apenas um
bit é enviado por vez:
1 SDA e SCL começam em nı́vel alto
2 SDA é levado para nı́vel baixo como sinal de inı́cio
3 SCL é levado para nı́vel baixo
4 o primeiro bit (menos significativo) é colocado em SDA
5 SCL é levado para nı́vel alto, aguarda-se o tempo do sistema e
abaixa-se novamente SCL
6 repete-se o processo do item 3 até o fim da transmissão
7 SDA é levado para nı́vel alto indicando fim de transmissão

SDA e SCL no envio de um dado


http://en.wikipedia.org/w/index.php?title=File:I2C data transfer.svg

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 13 / 59
Criação da biblioteca para comunicação I2C

Criação da biblioteca para comunicação I2C

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 14 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

É possı́vel que o microcontrolador já possua um hardware dedicado


para o envio e recepção dos dados
O controle do envio e recepção dos dados é feita por hardware
O sistema identifica o endereço e cuida da serialização
Na ausência de um periférico dedicado, é comum realizar a
implementação deste protocolo utilizando apenas 2 terminais digitais
1 deles deve ser capaz de ser configurado como entrada ou saı́da com o
sistema em funcionamento
Todo o gerenciamento dos endereços, leitura/escrita de dados e o clock
fica a cargo do programador.

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 15 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

Para a biblioteca são necessárias 3 funções básicas


writeByte() : Realiza a escrita de 1 byte no barramento I2C
readByte() : Realiza a leitura de 1 byte no barramento I2C
i2cStart() : Realiza o setup do hardware

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 16 / 59
Criação da biblioteca para comunicação I2C

Serial
1 # include " i2c . h "
2 # include " pic18f4520 . h "
3
4 char de ;
5 # define DELAY () for ( de = 0 ; de < 100 ; de ++)
6
7 # define RESET_ON () ( BitSet ( PORTC , 7 ) )
8 # define RESET_OFF () ( BitClr ( PORTC , 7 ) )
9 # define RESET_IN () ( BitSet ( TRISC , 7 ) )
10 # define RESET_OUT () ( BitClr ( TRISC , 7 ) )
11
12 # define SDA_ON () ( BitSet ( PORTB , 0 ) )
13 # define SDA_OFF () ( BitClr ( PORTB , 0 ) )
14 # define SDA () ( BitTst ( PORTB , 0 ) )
15 # define SDA_IN () ( BitSet ( TRISB , 0 ) )
16 # define SDA_OUT () ( BitClr ( TRISB , 0 ) )
17
18 # define SCL_ON () ( BitSet ( PORTB , 1 ) )
19 # define SCL_OFF () ( BitClr ( PORTB , 1 ) )
20 # define SCL_IN () ( BitSet ( TRISB , 1 ) )
21 # define SCL_OUT () ( BitClr ( TRISB , 1 ) )

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 17 / 59
Criação da biblioteca para comunicação I2C

Serial

1 void i2cStart () {
2 RESET_OUT () ;
3 SDA_OUT () ;
4 SCL_OUT () ;
5 BitClr ( INTCN2 , 7 ) ; // liga pull up
6 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 18 / 59
Criação da biblioteca para comunicação I2C

Serial

1 void writeByte ( unsigned char dados ) {


2 unsigned char i ;
3 for ( i = 0 ; i < 8 ; i ++) {
4 // Analisa o bit a ser t r a n s m i t i d o
5 if ( dados & 0x01 ) {
6 SDA_ON () ;
7 } else {
8 SDA_OFF () ;
9 }
10 // geraç~
a o do pulso de clock
11 SCL_ON () ;
12 DELAY () ; // i n f o r m a ç ~
a o válida
13 SCL_OFF () ;
14 DELAY () ;
15 // pega o próximo bit
16 dados > >= 1 ;
17 }
18 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 19 / 59
Criação da biblioteca para comunicação I2C

Serial

1 unsigned char readByte () {


2 unsigned char i ;
3 unsigned char dados ;
4 dados = 0 ;
5 for ( i = 0 ; i < 8 ; i ++) {
6 SCL_ON () ;
7 DELAY () ; // i n f o r m a ç ~
a o válida
8 if ( SDA () ) {
9 dados |= 0x80 ;
10 }
11 SCL_OFF () ;
12 DELAY () ;
13 dados > >= 1 ;
14 }
15 return dados ;
16 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 20 / 59
Criação da biblioteca para comunicação I2C

Serial

1 # ifndef I2C_H
2 # define I2C_H
3 unsigned char readByte () ;
4 void writeByte ( unsigned char dados ) ;
5 void i2cStart () ;
6 # endif

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 21 / 59
Criação da biblioteca para comunicação I2C

Serial

Exemplo de interface com dispositivo


usando I2C

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 22 / 59
Criação da biblioteca para comunicação I2C

Serial

Figura: Ligação do RTC HT1380 no barramento de dados I2C

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 23 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

Relógio de tempo real ou RTC (real time clock)


É um componente que tem como função especı́fica efetuar a contagem
de tempo de maneira precisa
Geralmente requer seu próprio cristal para ficar independente do
sistema principal
Possui baixo coeficiente de atraso/adiantamento
Pode conter, além do relógio, um calendário

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 24 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

HT1380
O HT1380 é um relógio de tempo real com interface de comunicação
serial ”tipo”I2C
No datasheet do dispositivo não é citada a nomenclatura I2C,
provavelmente por motivos de royalties, mas a análise das linhas
temporais indicam a compatibilidade
Além das duas linhas padronizadas: SCL (chamada SCKL) e SDA
(chamada I/O) existe uma terceira linha para habilitação do chip
(reset)

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 25 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial
A leitura/escrita de informações no HT1380 é feita em dois
momentos
Primeiro envia-se um comando de 8 bits indicando o endereço e o
sentido (leitura/escrita)
Depois envia-se o valor em caso de escrita ou aguarda o recebimento
do valor em caso de leitura

Figura: Envio de dados para o HT1380

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 26 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

1 bit indica leitura/escrita


3 bits indicam o campo de interesse
1 bit controla o clock do chip

Figura: Byte de comando do HT1380

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 27 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial
Existem ao todo 8 endereços no HT1380
segundo, minuto, hora, dia (do mês), mês, dia (da semana), ano e
proteção contra escrita
Estes valores estão codificados em BCD compactado

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 28 / 59
Criação da biblioteca para comunicação I2C

Comunicação Serial

Para facilitar o uso do RTC foram criadas duas rotinas principais:


uma para leitura e outra para escrita
HT1380write() : Realiza a escrita em um registro do HT1380 via
barramento I2C
HT1380read() : Realiza a leitura de um registro do HT1380 via
barramento I2C
Com base nestas duas funções foram criadas rotinas para acessar cada
uma das variáveis internas do RTC
rtcGetSeconds() : Lê o valor de segundos do RTC
rtcPutSeconds() : Grava o valor de segundos no RTC
rtcGet...
rtcPut...

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 29 / 59
Criação da biblioteca para comunicação I2C

Serial

1 void ht1380write ( unsigned char addr , unsigned char dados ) {


2 RESET_OFF () ;
3 SCL_OFF () ;
4 SDA_OFF () ;
5
6 // liga o RTC
7 RESET_ON () ;
8
9 addr < <= 1 ; // corrige e n d e r e ç o
10 addr |= 0x80 ; // h a b i l i t a clock
11 writeByte ( addr ) ;
12 writeByte ( dados ) ;
13
14 RESET_OFF () ;
15 SCL_OFF () ;
16 SDA_OFF () ;
17 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 30 / 59
Criação da biblioteca para comunicação I2C

Serial
1 unsigned char ht1380read ( unsigned char addr ) {
2 unsigned char dados ;
3 RESET_OFF () ;
4 SCL_OFF () ;
5 SDA_OFF () ;
6
7 RESET_ON () ;
8
9 addr < <= 1 ; // corrige e n d e r e ç o
10 addr |= 0x81 ; // liga bit de leitura e hab . clk
11 writeByte ( addr ) ;
12 SDA_IN () ; // muda para entrada
13 DELAY () ; DELAY () ; DELAY () ; DELAY () ; // aguarda mudança
14 dados = readByte () ;
15
16 RESET_OFF () ;
17 SCL_OFF () ;
18 SDA_OFF () ;
19 SDA_OUT () ;
20 return dados ;
21 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 31 / 59
Criação da biblioteca para comunicação I2C

Serial

1 unsigned char rtcGetSeconds ( void ) {


2 unsigned char value ;
3 value = ht1380read ( 0 ) ; // read seconds
4 // c o n v e r t e de BCD para decimal
5 return ((( value >> 4 ) & 0x07 ) * 10 + ( value & 0x0f ) ) ;
6 }
7
8 void rtcPutSeconds ( char seconds ) {
9 // c o n v e r t e de decimal para BCD
10 ht1380write (0 , ( seconds % 10 ) | (( seconds / 10 ) << 4 ) ) ;
11 }
12
13 // demais funç~
o es criadas de modo similar

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 32 / 59
Criação da biblioteca para comunicação I2C

Serial

1 # ifndef RTC_H
2 # define RTC_H
3 void ht1381write ( unsigned char addr , unsigned char data ) ;
4 unsigned char ht1381read ( unsigned char addr ) ;
5
6 unsigned char rtcGetSeconds ( void ) ;
7 void rtcPutSeconds ( unsigned char seconds ) ;
8
9 unsigned char rtcGetMinutes ( void ) ;
10 void rtcPutMinutes ( unsigned char minutes ) ;
11 // o mesmo para horas , dia ( m^
e s ) , m^
e s , ano , dia ( semana )
12
13 # endif

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 33 / 59
Protocolo TIA RS232

Protocolo TIA RS232

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 34 / 59
Protocolo TIA RS232

Comunicação Serial

RS232 versus UART


Similaridades, diferenças e observações:
UART é uma versão generalizada dos protocolos 232, 485, 422, EIA.
Visa fornecer uma base padrão para todos estes protocolos
As tensões são em geral no mesmo nı́vel do processador
As conversões para os protocolos ficam a cargo de chips externos
MAX232 (ICL232, ST232, ADM232, HIN232)
FT232
SP3485

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 35 / 59
Protocolo TIA RS232

Comunicação Serial

Exemplo de circuitos para interface com UART

Comunicação UART
Comunicação RS232

Comunicação USB
Comunicação RS485
ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 36 / 59
Protocolo TIA RS232

Comunicação Serial

Comunicação serial 232


1962 - Recommended Standard 232
1969 - Recommended Standard 232 rev. C
1986 - EIA 232 rev C
1997 - TIA 232 rev F
Procedimento de envio
Um bit de marcação de inı́cio de mensagem
Os 8 bits de dados1
Um bit de paridade (opcional)
Um bit de marcação de fim de mensagem

1
Primeiro o menos significativo. Alguns sistemas mais antigos operam com 5 ou 7
bits por vez
ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 37 / 59
Protocolo TIA RS232

Comunicação Serial

Sinal serializado para transmissão em RS232

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 38 / 59
Protocolo TIA RS232

Comunicação Serial

Para dois dispositivos se comunicarem é necessário compatibilizar o


sistema fı́sico e o sistema lógico.
Fı́sico (Hardware)
Tipo de conector
Pinagem do conector
Nı́veis de tensão
Lógico (Software)
Codificação utilizada
Tamanho da palavra
Tamanho do stop/start bits
Bit de paridade
Taxa de transmissão

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 39 / 59
Protocolo TIA RS232

Comunicação Serial

A configuração da comunicação serial é feita 2 através de 5 registros.


TXSTA e RCSTA : configura o meio de transmissão
BAUDCON : controle de velocidade
SPBRGH e SPBRG : configuração da velocidade

2
Para o microcontrolador PIC18F4550. Outros microcontroladores possuem formato
de configuração parecido.
ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 40 / 59
Protocolo TIA RS232

Comunicação Serial

Bits de Configuração Precisão Taxa de transmissão


Txsta:4 Baudcon:3 Txsta:2
FOSC
0 0 0 8bits F232 =
[64 ∗ (n + 1)]
0 0 1 8bits FOSC
F232 =
0 1 0 16bits [16 ∗ (n + 1)]
0 1 1 16bits
FOSC
1 0 x 8bits F232 =
[4 ∗ (n + 1)]
1 1 x 16bits
x – não importa, n – valor do par SPBRGH:SPBRG

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 41 / 59
Protocolo TIA RS232

Comunicação Serial

Exemplo: Configurar para uma taxa de transmissão de 57,6 kbps. A


frequência de oscilação é um cristal de 8MHz. Usando as três fórmulas:
n1 = 1; F232 = 62.500, err = -7,64%
n2 = 8, F232 = 55.555, err = 3,63%
n3 = 32, F232 = 57.142, err = 0,79%
A fórmula que gera menos erro é a de número 3, por isso ela será a
escolhida.

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 42 / 59
Protocolo TIA RS232

Serial

1 BitClr ( BAUDCON , 0 ) ; // D e s a b i l i t a auto d e t e c ç ~a o de v e l o c i d a d e


2 BitSet ( BAUDCON , 3 ) ; // R e g i s t r o de geraç~ a o de sinal com 16 bits
3 BitClr ( BAUDCON , 6 ) ; // O p e r a ç ~
a o de r e c e p ç ~a o esta ativa
4 BitClr ( RCSTA , 1 ) ; // D e s a b i l i t a bit de erro de overrun
5 BitClr ( RCSTA , 2 ) ; // D e s a b i l i t a bit erro na c o m u n i c a ç ~ ao
6 BitClr ( RCSTA , 4 ) ; // H a b i l i t a bit de r e c e p ç ~ ao
7 BitClr ( RCSTA , 6 ) ; // S e l e c i o n a 8 bits
8 BitSet ( RCSTA , 7 ) ; // C o n f i g u r a RX / TX como pinos de c o m u n i c a ç ~ ao
9 BitSet ( TXSTA , 2 ) ; // Modo de alta v e l o c i d a d e h a b i l i t a d o
10 BitSet ( TXSTA , 3 ) ; // Envia bit de parada ( break c h a r a c t e r bit )
11 BitClr ( TXSTA , 4 ) ; // Modo a s s ı́ n c r o n o
12 BitSet ( TXSTA , 5 ) ; // H a b i l i t a t r a n s m i s s ~
ao
13 BitClr ( TXSTA , 6 ) ; // S e l e c i o n a 8 bits
14 SPBRGH = 0x00 ; // C o n f i g u r a para 56k ( SPBRGH | SPBRG = 34 )
15 SPBRG = 0x22 ; // C o n f i g u r a para 56k ( SPBRGH | SPBRG = 34 )
16 BitSet ( TRISC , 6 ) ; // C o n f i g u r a pino de r e c e p ç a ~ o como entrada
17 BitClr ( TRISC , 7 ) ; // C o n f i g u r a pino de envio como saı́da

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 43 / 59
Protocolo TIA RS232

Comunicação Serial

Sinal serializado para transmissão em RS232

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 44 / 59
Criação da biblioteca para comunicação serial

Criação da biblioteca para comunicação serial

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 45 / 59
Criação da biblioteca para comunicação serial

Serial
1 # include " serial . h "
2 # include " pic18f4520 . h "
3 void serialSend ( unsigned char c ) {
4 while (! BitTst ( PIR1 , 4 ) ) ; // aguarda o r e g i s t r o ficar ←-
d i s p o n ı́ v e l
5 TXREG = c ; // coloca o valor para ser enviado
6 }
7 unsigned char serialRead ( void ) {
8 if ( BitTst ( RCSTA , 1 ) ) { // V e r i f i c a se há erro de overrun
9 BitClr ( RCSTA , 4 ) ; // limpa código de erro
10 BitSet ( RCSTA , 4 ) ;
11 }
12
13 if ( BitTst ( PIR1 , 5 ) ) { // V e r i f i c a se existe valor ←-
d i s p o n ı́ v e l
14 return RCREG ; // retorna o valor
15 }
16 return 0 ; // c o n d i ç ~
a o de erro
17 }
18 void serialInit ( void ) {
19 TXSTA = 0b00101100 ; // c o n f i g u r a a t r a n s m i s s ~
ao
20 RCSTA = 0b10010000 ; // c o n f i g u r a a r e c e p ç ~ao
21 BAUDCON = 0b00001000 ; // c o n f i g u r a v e l o c i d a d e
22 SPBRGH
ECOP04 = 0b00000000 ;
Comunicação // cI2C,
serial: o nRS232,
f i g u rHT1380,
a para 56k
ME1000RW
rodrigomax@unifei.edu.br 46 / 59
Criação da biblioteca para comunicação serial

Serial

1 # ifndef SERIAL_H
2 # define SERIAL_H
3 void serialSend ( unsigned char c ) ;
4 unsigned char serialRead ( void ) ;
5 void serialInit ( void ) ;
6 # endif // S E R I A L H

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 47 / 59
Criação da biblioteca para comunicação serial

Serial
1 # include " pic18f4520 . h "
2 # include " config . h "
3 # include " serial . h "
4 void main ( void ) {
5 unsigned int i , j = 0 ;
6 char msg [] = " Hello World ! " ;
7 unsigned char resp ;
8 TRISD = 0x00 ; // acesso aos leds
9 serialInit () ;
10 for (;;) {
11 for ( i = 0 ; i < 65000 ; i ++) ; // delay
12 serialSend ( msg [ j ]) ; // envia dados
13 j ++;
14 if ( j > 11 ) {
15 j=0;
16 serialSend ( 13 ) ; // envia quebra de linha
17 }
18 resp = serialRead () ; // recebe dados
19 if ( resp != 0 ) {
20 PORTD = resp ;
21 }
22 }
23 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 48 / 59
Exemplo de interface com dispositivos usando UART/RS232

Exemplo de interface com dispositivos usando


UART/RS232

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 49 / 59
Exemplo de interface com dispositivos usando UART/RS232

Comunicação Serial

GPS integrado com antena ME-1000RW


Comunica-se usando padrão UART 9600 bps
Os dados são passados através de uma string
Implementa vários padrões NEMA
GPGSA - Precisão e quantidade de satélites ativos
GPGCA - Dados fixados (lat/long/alt/diferencial)
GPRMC - Dados mı́nimos (lat/long/alt)
GPVTG - Velocidade e deslocamento
GPGSV - Dados dos satélites visı́veis

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 50 / 59
Exemplo de interface com dispositivos usando UART/RS232

Comunicação Serial

Mensagem do GPRMC
Formada por 14 campos:
0 - ID da mensagem
1 - Tempo (UTC)
2 - Rastreando (R) ou Aceitável (A)
3 - Latitude
4 - Norte/Sul
5 - Longitude
6 - Leste/Oeste (E/W)
7 - Velocidade (magnitude)
8 - Velocidade (ângulo)
9 - Data (UTC)
10 - Variação Magnética (ângulo em graus)
11 - Variação Magnetica (direção, E/W)
12 - Modo de operação (N não válido, A autônomo, D diferencial, E
estimado, M manual, S simulação)
13 - Checksum

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 51 / 59
Exemplo de interface com dispositivos usando UART/RS232

Comunicação Serial

Formato:

$IDENT,000000,X,0000.00,X,00000.00,X,000.0,000.0,000000,000.0,????

Exemplo:

$GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 52 / 59
Exemplo de interface com dispositivos usando UART/RS232

Comunicação Serial

Rotina para recepção dos dados


Armazenar cada byte recebido num buffer temporário.
Aguardar dois bytes de fim de linha: <cr> e <lf>, ’\n’ e ’\r’, 13 e 10.
Caso chegar ”fim de linha”, resetar o buffer e processar a linha
No processamento do buffer
Verificar o ID da mensagem ($GPRMC)
Cada campo é separado por vı́rgulas
Percorrer o campo atual e realizar conversão dos dados ou enviar p/ o
LCD
Não esquecer de verificar o checksum para segurança

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 53 / 59
Exemplo de interface com dispositivos usando UART/RS232

Serial
1 # include " pic18f4520 . h "
2 # include " config . h "
3 # include " serial . h "
4 # include " lcd . h "
5 void main ( void ) {
6 unsigned char pos = 0 ; // posiç~ a o atual do buffer
7 char buffer [ 100 ]; // buffer t e m p o r á r i o
8 char data ;
9 serialInit () ;
10 lcdInit () ;
11 for (;;) {
12 // r e c e b i m e n t o dos dados
13 data = serialRead () ;
14 if ( data != 0 ) {
15 buffer [ pos ] = data ;
16 pos ++;
17 if ( pos >= 100 ) {
18 pos = 0 ;
19 }
20 }
21 //
22 }
23 }
ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 54 / 59
Exemplo de interface com dispositivos usando UART/RS232

Serial

1 // teste de fim de m e n s a g e m
2 if (( pos > 2 ) &&
3 ( buffer [ pos - 2 ] == 13 ) && // CR
4 ( buffer [ pos - 1 ] == 10 ) ) { // LF
5 pos = 0 ;
6 // se o ID estiver correto p r o c e s s a o buffer
7 if ( ( buffer [ 0 ] == '$ ' ) &&
8 ( buffer [ 1 ] == ' G ' ) &&
9 ( buffer [ 2 ] == ' P ' ) &&
10 ( buffer [ 3 ] == ' R ' ) &&
11 ( buffer [ 4 ] == ' M ' ) &&
12 ( buffer [ 5 ] == ' C ' ) )
13 {
14 // parser da m e n s a g e m $GPRMC
15 // ...
16 }
17 }

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 55 / 59
Exemplo de interface com dispositivos usando UART/RS232

Serial

1 // Parser
2
3 // começa depois do ID
4 pos = 7 ;
5
6 // 1 − Hora UTC
7 while ( buffer [ pos ] != ' , ' ) {
8 // lcdData ( buffer [ pos ]) ;
9 pos ++;
10 }
11 pos ++; // pula a vı́rgula
12
13 // 2 A ( OK )
14 while ( buffer [ pos ] != ' , ' ) {
15 // lcdData ( buffer [ pos ]) ;
16 pos ++;
17 }
18 pos ++; // pula a vı́rgula

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 56 / 59
Exemplo de interface com dispositivos usando UART/RS232

Serial

19 // 3−L a t i t u d e
20
21 lcdCommand ( 0x80 ) ;
22 lcdData ( ' L ' ) ;
23 lcdData ( ' A ' ) ;
24 lcdData ( ' T ' ) ;
25
26 while ( buffer [ pos ] != ' , ' ) {
27 lcdData ( buffer [ pos ]) ;
28 pos ++;
29 }
30 pos ++; // pula a vı́rgula
31 // 4 N / S
32 while ( buffer [ pos ] != ' , ' ) {
33 lcdData ( buffer [ pos ]) ;
34 pos ++;
35 }
36 pos ++; // pula a vı́rgula

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 57 / 59
Exemplo de interface com dispositivos usando UART/RS232

Serial

37 // 5−L o n g i t u d e
38
39 lcdCommand ( 0xC0 ) ;
40 lcdData ( ' L ' ) ;
41 lcdData ( ' O ' ) ;
42 lcdData ( ' N ' ) ;
43
44 while ( buffer [ pos ] != ' , ' ) {
45 lcdData ( buffer [ pos ]) ;
46 pos ++;
47 }
48 pos ++; // pula a vı́rgula
49 // 6−Leste ( E ) / Oeste ( W )
50 while ( buffer [ pos ] != ' , ' ) {
51 lcdData ( buffer [ pos ]) ;
52 pos ++;
53 }
54 pos ++; // pula a vı́rgula
55 // .. c o n t i n u a para os demais campos

ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW


rodrigomax@unifei.edu.br 58 / 59
Exemplo de interface com dispositivos usando UART/RS232

Comunicação Serial

Figura: Leitura do GPS e escrita no LCD


ECOP04 Comunicação serial: I2C, RS232, HT1380, ME1000RW
rodrigomax@unifei.edu.br 59 / 59

S-ar putea să vă placă și