Documente Academic
Documente Profesional
Documente Cultură
Rodrigo Almeida
rodrigomax@unifei.edu.br
Revisão
Conversor AD
5 5,00
Limites da comparação
11
4
3 10
2,50
2 01
1,25
1
00
Valor convertido
para binário
Conversor AD
Saı́das PWM
Início do
Baixo: Saída desligada
ciclo
Alto: Saída ligada
10%
50%
90%
Saı́das PWM
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
Comunicação Serial
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
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.
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
Comunicação Serial
Comunicação Serial
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 ) )
Serial
1 void i2cStart () {
2 RESET_OUT () ;
3 SDA_OUT () ;
4 SCL_OUT () ;
5 BitClr ( INTCN2 , 7 ) ; // liga pull up
6 }
Serial
Serial
Serial
1 # ifndef I2C_H
2 # define I2C_H
3 unsigned char readByte () ;
4 void writeByte ( unsigned char dados ) ;
5 void i2cStart () ;
6 # endif
Serial
Serial
Comunicação Serial
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)
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
Comunicação Serial
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
Comunicação Serial
Serial
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 }
Serial
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
Comunicação Serial
Comunicação Serial
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
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
Comunicação Serial
Comunicação Serial
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
Comunicação Serial
Serial
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
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 }
Comunicação Serial
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
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
Comunicação Serial
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 }
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
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
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
Comunicação Serial