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

                 ME1000RW



 Prof.MSc.Rodrigo Maximiano Antunes de Almeida

            Universidade Federal de Itajubá



          rodrigomax@unifei.edu.br




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




Revisão




ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Display de LCD




  ˆ Rotina para envio de dados/comando para o LCD
      ˆ Para comando RS = 0; Para dados RS = 1;
      ˆ Habilitar a escrita (RW=1) ou leitura (RW=0)
      ˆ Acionar terminal EN (enable)
      ˆ Delay para o LCD entender o comando
      ˆ Desabilita o terminal EN
      ˆ Retorna os terminais para nível baixo 1




   1
    Para melhor uso é interessante retornar os terminais para o valor que
tinham antes de chamar a rotina, já que eles estão multiplexados com outros
dispositivos
                              ELT024    Comunicação serial: I2C, RS232, HT1380, ME1000RW
Display de LCD




                          Dados (bit)                                     Tempo
Instrução   RS     RW
                          7 6 5 4               3 2          1     0      (máx.)
Limpa       0      0      0 0 0 0               0 0          0     1      37 us
Reset       0      0      0 0 0 0               0 0          1     -      1.5ms
Cong.      0      0      0 0 0 0               0 1          ID    S      37 us
Cong.      0      0      0 0 0 0               1 D          C     B      37 us
Movim.      0      0      0 0 0 1               SC RL        -     -      37 us
Cong.      0      0      0 0 1 DL              N F          -     -      37 us
Move(l,c)   0      0      1 X 0 0               Coluna                    37 us
Ocup.       0      1      BF -    -   -         -   -        -     -      10 us
 http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi




                            ELT024    Comunicação serial: I2C, RS232, HT1380, ME1000RW
Display de LCD




ˆ Denições
    ˆ ID: 1  Incrementa, 0  Decrementa
    ˆ S: 1  O display acompanha o deslocamento
    ˆ SC: 1  Desloca o display, 0  Desloca o cursor
    ˆ RL: 1  Move para direita, 0  Move para esquerda
    ˆ DL: 1  8 bits, 0  4 bits
    ˆ N: 1  2 linhas, 0  1 linha
    ˆ F: 1  5x10 pontos, 0  5x8 pontos
    ˆ BF: 1  Ocupado, 0  Disponível
    ˆ X: 1  2a linha, 0  1a linha
    ˆ Coluna: nible que indica a coluna




                        ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Display de LCD




ˆ Desenvolvimento da biblioteca
    ˆ Criação de rotinas de delay (2ms e 40us)
    ˆ Função para enviar comandos
    ˆ Função para enviar dados
    ˆ Função de inicialização




                         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Display de LCD




 1   #include basico.h
 2   #include config.h
 3   #include lcd.h
 4
 5   //inicio do programa
 6   void main(void)
 7   {
 8       unsigned int i,j;
 9       char msg[] = Hello World!;
10       InicializaLCD();
11       for(i=0;i11;i++)
12       {
13           EnviaDados(msg[i]);
14           for(j = 0; j  65000; j++);
15       }
16       for(;;);
17   }




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




Comunicação Serial




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




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




                        ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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


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




                           Protocolo I2C

                                      .
Inter-Integrated Circuit




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


ˆ Comunicação serial I2C
    ˆ 1982 - Protocolo I2C criado pela Phillips (100 kHz)
    ˆ 1992 - Versão 1.0: Adicionada a frequencia 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: Frequencia de 1.0 MHz (Fast mode plus)
    ˆ 2012 - 4.0: Frequencia de 5.0 MHz (Ultra fast mode plus) e
      criada tabela com identicadores de fabricantes
ˆ É um protocolo serial, sincrono e multi-mestre




         Figura: Barramento I2C com vários dispositivos
                         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 os:
    ˆ 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.




                       ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 signicativo) é 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 m da transmissão
    7   SDA é levado para nível alto indicando m de transmissão




                  SDA e SCL no envio de um dado
         http://en.wikipedia.org/w/index.php?title=File:I2C_data_transfer.svg




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




Criação da biblioteca para

    comunicação I2C




         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 do RTC




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


 1   #include i2c.h
 2   #include basico.h
 3
 4   char de;
 5   #define DELAY() for(de=0;de100;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))

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




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




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



 1   void writeByte(unsigned char dados) {
 2       unsigned char i;
 3       for (i = 0; i  8; i++) {
 4           //Analisa o bit a ser transmitido
 5           if (dados  0x01) {
 6               SDA_ON();
 7           } else {
 8               SDA_OFF();
 9           }
10           //geração do pulso de clock
11           SCL_ON();
12           DELAY();//informação válida
13           SCL_OFF();
14           DELAY();
15           //pega o próximo bit
16           dados = 1;
17       }
18   }



                                 ELT024    Comunicação serial: I2C, RS232, HT1380, ME1000RW
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();// informação válida
 8           if (SDA()) {
 9               dados |= 0x80;
10           }
11           SCL_OFF();
12           DELAY();
13           dados = 1;
14       }
15       return dados;
16   }




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




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




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




Exemplo de interface com dispositivo

            usando I2C




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




ˆ Relógio de tempo real ou RTC (real time clock)
    ˆ É um componente que tem como função especíca efetuar a
      contagem de tempo de maneira precisa
    ˆ Geralmente requer seu próprio cristal para car independente
      do sistema principal
    ˆ Possue baixo coeciente de atraso/adiantamento
    ˆ Pode conter, além do relógio, um calendário
ˆ HT1380
    ˆ O HT1380 é um relógio de tempo real com interface de
      comunicação serial tipoI2C
    ˆ No datasheet do dispositivo não é citada a nomenclatura I2C,
      mas o dispositivo é compatível
    ˆ Além das linhas de SCL e SDA existe uma linha de habilitação
      do chip (Enable)


                         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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


                          ELT024      Comunicação serial: I2C, RS232, HT1380, ME1000RW
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




                          ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 codicados em BCD compactado




              Figura: Registros internos do HT1380
                         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Comunicação Serial




ˆ Para o uso do RTC foram criadas algumas rotinas:
    ˆ HT1380write() : Realiza a escrita em um registro do HT1380
      via barramento I2C
    ˆ HT1380read() : Realiza a leitura de um registro do HT1380
      via barramento I2C
    ˆ rtcGetSeconds() : Le o valor de segundos do RTC
    ˆ rtcPutSeconds() : Grava o valor de segundos no RTC
    ˆ rtcGet...
    ˆ rtcPut...
ˆ Por efeito de simplicidade no uso, foram criadas funções para
  cada campo do RTC




                        ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 endereço
10       addr |= 0x80; //habilita clock
11       writeByte(addr);
12       writeByte(dados);
13
14       RESET_OFF();
15       SCL_OFF();
16       SDA_OFF();
17   }




                                 ELT024    Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 endereç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   }

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




 1   unsigned char rtcGetSeconds(void) {
 2       unsigned char value;
 3       value = ht1380read(0); // read seconds
 4       //converte de BCD para decimal
 5       return (((value  4)0x07)*10 + (value  0x0f));
 6   }
 7
 8   void rtcPutSeconds(char seconds) {
 9   //converte de decimal para BCD
10       ht1380write(0, (seconds % 10) | ((seconds / 10)  4));
11   }




                                 ELT024    Comunicação serial: I2C, RS232, HT1380, ME1000RW
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       unsigned char rtcGetMinutes(void);
 9       void rtcPutMinutes(unsigned char minutes);
10       //o mesmo para horas, dia (mês), mês, ano, dia (semana)
11
12   #endif




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




               Protocolo TIA RS232

                                     .
Interface Between Data Terminal Equipment and Data

Circuit-Terminating Equipment Employing Serial Binary Data Interchange




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




ˆ RS232 versus UART
ˆ Similaridades e 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 cam a cargo de chips
       externos
          ˆ MAX232 (ICL232, ST232, ADM232, HIN232)
          ˆ FT232
          ˆ SP3485




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




ˆ Exemplo de circuitos para interface com UART




 Comunicação UART
                                        Comunicação RS232




  Comunicação USB
                                        Comunicação RS485

                      ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 inicio de mensagem
      ˆ Os 8 bits de dados2
      ˆ Um bit de paridade (opcional)
      ˆ Um bit de marcação de m de mensagem




   2
    Primeiro o menos signicativo. Alguns sistemas mais antigos operam com 5
ou 7 bits por vez
                              ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Comunicação Serial




Sinal serializado para transmissão em RS232

              ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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)
    ˆ Codicação utilizada
    ˆ Tamanho da palavra
    ˆ Tamanho do stop/start bits
    ˆ Bit de paridade
    ˆ Taxa de transmissão



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




  ˆ A conguração da comunicação serial é feita          3
                                                             através de 5
       registros.
         ˆ TXSTA e RCSTA : congura o meio de transmissão
         ˆ BAUDCON : controle de velocidade
         ˆ SPBRGH e SPBRG : conguração da velocidade




   3
    Para o microcontrolador PIC18F4550. Outros microcontroladores possuem
formato de conguração parecido.
                             ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
Comunicação Serial




     Bits de Conguraçã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




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




Exemplo: Congurar para uma taxa de transmissão de 57,6 kbps.
A frequência de oscilação é um cristal de 8MHz. Usando as três
formulas:
  ˆ 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.




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




 1   BitClr(BAUDCON,0);   //Desabilita auto detecção de velocidade
 2   BitSet(BAUDCON,3);   //Registro de geração de sinal com 16 bits
 3   BitClr(BAUDCON,6);   //Operação de recepção esta ativa
 4   BitClr(RCSTA,1);     //Desabilita bit de erro de overrun
 5   BitClr(RCSTA,2);     //Desabilita bit erro na comunicação
 6   BitClr(RCSTA,4);     //Habilita bit de recepção
 7   BitClr(RCSTA,6);     //Seleciona 8 bits
 8   BitSet(RCSTA,7);     //Configura RX/TX como pinos de comunicação
 9   BitSet(TXSTA,2);     //Modo de alta velocidade habilitado
10   BitSet(TXSTA,3);     //Envia bit de parada (break character bit)
11   BitClr(TXSTA,4);     //Modo assíncrono
12   BitSet(TXSTA,5);     //Habilita transmissão
13   BitClr(TXSTA,6);     //Seleciona 8 bits
14   SPBRGH = 0x00;       //Configura para 56k (SPBRGH|SPBRG = 32)
15   SPBRG = 0x22;        //Configura para 56k (SPBRGH|SPBRG = 32)
16   BitSet(TRISC,6);     //Configura pino de recepção como entrada
17   BitClr(TRISC,7);     //Configura pino de envio como saída




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




Criação da biblioteca para

   comunicação serial




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

 1   #include serial.h
 2   #include basico.h
 3   void EnviaSerial(unsigned char c) {
 4     while(!BitTst(PIR1,4)); //aguarda o registro ficar disponível
 5     TXREG=c;                 //coloca o valor para ser enviado
 6   }
 7   unsigned char RecebeSerial(void) {
 8     if (BitTst(PIR1,5))     //Verifica se existe algum valor disponivel
 9     {
10       return RCREG;         //retorna o valor
11     }
12     return 0;               //condição de erro
13   }
14   void InicializaSerial(void){
15     TXSTA = 0b00101100;     //configura a transmissão de dados da serial
16     RCSTA = 0b10010000;     //configura a recepção de dados da serial
17     BAUDCON = 0b00001000;   //configura sistema de velocidade da serial
18     SPBRGH = 0b00000000;    //configura para 56k
19     SPBRG = 0b00100010;     //configura para 56k
20     BitSet(TRISC,6);        //pino de recepção de dados
21     BitClr(TRISC,7);        //pino de envio de dados
22   }

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




1   #ifndef SERIAL_H
2     #define SERIAL_H
3     void EnviaSerial(unsigned char c);
4     unsigned char RecebeSerial(void);
5     void InicializaSerial(void);
6   #endif //SERIAL_H




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

 1   #include basico.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     InicializaSerial();
10     for(;;){
11       for(i = 0; i  65000; i++);   //delay
12       EnviaSerial(msg[j]);          //envia dados
13       j++;
14       if (j  11){
15         j=0;
16         EnviaSerial(13);            //envia quebra de linha
17       }
18       resp = RecebeSerial();        //recebe dados
19       if (resp!=0){
20         PORTD = resp;
21       }
22     }
23   }
                                 ELT024     Comunicação serial: I2C, RS232, HT1380, ME1000RW
Serial




Exemplo de interface com dispositivos

       usando UART/RS232




              ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 qnt de satelites ativos
        ˆ GPGCA - Dados xados (lat/long/alt/diferencial)
        ˆ GPRMC - Dados minimos (lat/long/alt)
        ˆ GPVTG - Velocidade e deslocamento
        ˆ GPGSV - Dados dos satélites visíveis




                         ELT024   Comunicação serial: I2C, RS232, HT1380, ME1000RW
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 - Variacão Magnética (ângulo em graus)
        ˆ 11 - Varia?ão Magnerica (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

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




  ˆ Formato:

$ID,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




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




ˆ Rotina para recepção dos dados
    ˆ Armazenar cada byte recebido num buer temporário.
    ˆ Aguardar os dois bytes de m de linha: cr e lf, 'n' e
       'r', 13 e 10.
    ˆ Caso chegar m de linha, resetar o buer e processar a linha
ˆ No processamento do buer
    ˆ Vericar o ID da mensagem($GPRMC)
    ˆ Cada campo é separado por virgulas
    ˆ Percorrer o campo atual e realizar conversão dos dados ou
       enviar p/ o LCD
ˆ Não esquecer de vericar o checksum para segurança




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



 1   #include basico.h
 2   #include config.h
 3   #include serial.h
 4   #include lcd.h
 5   void main(void) {
 6     unsigned char pos=0; //posição atual do buffer
 7     char buffer[100];    //buffer temporário
 8     InicializaSerial();
 9     InicializaLCD();
10     for(;;) {
11       while(BitTst(PIR1,5) != 0){
12           buffer[pos] = RCREG;
13           pos++; //cuidado com buffer overflow
14           //teste de fim de mensagem
15           // ...
16       }
17     }
18   }



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




 1   //teste de fim de mensagem
 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   processa o buffer
 7     if( (buffer[0] == '$')    (buffer[1] == 'G') 
 8         (buffer[2] == 'P') 
 9         (buffer[3] == 'R') 
10         (buffer[4] == 'M') 
11         (buffer[5] == 'C'))
12     {
13        //parser da mensagem
14        // ...
15     }
16   }




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



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



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




 1   //5-Longitude
 2   EnviaComando(0xC0); EnviaDados('L'); EnviaDados('O'); EnviaDados('N');
 3   while(buffer[pos] != ','){
 4     EnviaDados(buffer[pos]);
 5     pos++;
 6   }
 7   pos++;//pula a virgula
 8   //6-Leste(E)/Oeste(W)
 9   while(buffer[pos] != ','){
10     EnviaDados(buffer[pos]);
11     pos++;
12   }
13   pos++;//pula a virgula
14   //..continua para os demais campos




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




 1   //3 lat
 2   EnviaComando(0x80); EnviaDados('L'); EnviaDados('A'); EnviaDados('T');
 3   while(buffer[pos] != ','){
 4     EnviaDados(buffer[pos]);
 5     pos++;
 6   }
 7   pos++;//pula a virgula
 8   //4 N/S
 9   while(buffer[pos] != ','){
10     EnviaDados(buffer[pos]);
11     pos++;
12   }
13   pos++;//pula a virgula




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

Comunicação serial

  • 1.
    Comunicação serial: I2C,RS232, HT1380, ME1000RW Prof.MSc.Rodrigo Maximiano Antunes de Almeida Universidade Federal de Itajubá rodrigomax@unifei.edu.br ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 2.
    LCD Revisão ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 3.
    Display de LCD ˆ Rotina para envio de dados/comando para o LCD ˆ Para comando RS = 0; Para dados RS = 1; ˆ Habilitar a escrita (RW=1) ou leitura (RW=0) ˆ Acionar terminal EN (enable) ˆ Delay para o LCD entender o comando ˆ Desabilita o terminal EN ˆ Retorna os terminais para nível baixo 1 1 Para melhor uso é interessante retornar os terminais para o valor que tinham antes de chamar a rotina, já que eles estão multiplexados com outros dispositivos ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 4.
    Display de LCD Dados (bit) Tempo Instrução RS RW 7 6 5 4 3 2 1 0 (máx.) Limpa 0 0 0 0 0 0 0 0 0 1 37 us Reset 0 0 0 0 0 0 0 0 1 - 1.5ms Cong. 0 0 0 0 0 0 0 1 ID S 37 us Cong. 0 0 0 0 0 0 1 D C B 37 us Movim. 0 0 0 0 0 1 SC RL - - 37 us Cong. 0 0 0 0 1 DL N F - - 37 us Move(l,c) 0 0 1 X 0 0 Coluna 37 us Ocup. 0 1 BF - - - - - - - 10 us http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 5.
    Display de LCD ˆDenições ˆ ID: 1 Incrementa, 0 Decrementa ˆ S: 1 O display acompanha o deslocamento ˆ SC: 1 Desloca o display, 0 Desloca o cursor ˆ RL: 1 Move para direita, 0 Move para esquerda ˆ DL: 1 8 bits, 0 4 bits ˆ N: 1 2 linhas, 0 1 linha ˆ F: 1 5x10 pontos, 0 5x8 pontos ˆ BF: 1 Ocupado, 0 Disponível ˆ X: 1 2a linha, 0 1a linha ˆ Coluna: nible que indica a coluna ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 6.
    Display de LCD ˆDesenvolvimento da biblioteca ˆ Criação de rotinas de delay (2ms e 40us) ˆ Função para enviar comandos ˆ Função para enviar dados ˆ Função de inicialização ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 7.
    Display de LCD 1 #include basico.h 2 #include config.h 3 #include lcd.h 4 5 //inicio do programa 6 void main(void) 7 { 8 unsigned int i,j; 9 char msg[] = Hello World!; 10 InicializaLCD(); 11 for(i=0;i11;i++) 12 { 13 EnviaDados(msg[i]); 14 for(j = 0; j 65000; j++); 15 } 16 for(;;); 17 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 8.
    Serial Comunicação Serial ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 9.
    Comunicação Serial ˆ Vantagens ˆ Simplicação do hardware ˆ Aumento da taxa de transmissão devido a redução de problemas de sincronia ˆ Economia de cabos ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 10.
    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 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 11.
    Serial Protocolo I2C . Inter-Integrated Circuit ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 12.
    Comunicação Serial ˆ Comunicaçãoserial I2C ˆ 1982 - Protocolo I2C criado pela Phillips (100 kHz) ˆ 1992 - Versão 1.0: Adicionada a frequencia 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: Frequencia de 1.0 MHz (Fast mode plus) ˆ 2012 - 4.0: Frequencia de 5.0 MHz (Ultra fast mode plus) e criada tabela com identicadores de fabricantes ˆ É um protocolo serial, sincrono e multi-mestre Figura: Barramento I2C com vários dispositivos ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 13.
    Comunicação Serial ˆ Acomunicaçã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 os: ˆ 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. ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 14.
    Comunicação Serial ˆ Acomunicaçã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 signicativo) é 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 m da transmissão 7 SDA é levado para nível alto indicando m de transmissão SDA e SCL no envio de um dado http://en.wikipedia.org/w/index.php?title=File:I2C_data_transfer.svg ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 15.
    Serial Criação da bibliotecapara comunicação I2C ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 16.
    Comunicação Serial ˆ Paraa 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 do RTC ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 17.
    Serial 1 #include i2c.h 2 #include basico.h 3 4 char de; 5 #define DELAY() for(de=0;de100;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)) ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 18.
    Serial 1 void i2cStart() { 2 RESET_OUT(); 3 SDA_OUT(); 4 SCL_OUT(); 5 BitClr(INTCON2, 7); //liga pull up 6 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 19.
    Serial 1 void writeByte(unsigned char dados) { 2 unsigned char i; 3 for (i = 0; i 8; i++) { 4 //Analisa o bit a ser transmitido 5 if (dados 0x01) { 6 SDA_ON(); 7 } else { 8 SDA_OFF(); 9 } 10 //geração do pulso de clock 11 SCL_ON(); 12 DELAY();//informação válida 13 SCL_OFF(); 14 DELAY(); 15 //pega o próximo bit 16 dados = 1; 17 } 18 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 20.
    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();// informação válida 8 if (SDA()) { 9 dados |= 0x80; 10 } 11 SCL_OFF(); 12 DELAY(); 13 dados = 1; 14 } 15 return dados; 16 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 21.
    Serial 1 #ifndef I2C_H 2 #define I2C_H 3 unsigned char readByte(); 4 void writeByte(unsigned char dados); 5 void i2cStart(); 6 #endif ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 22.
    Serial Exemplo de interfacecom dispositivo usando I2C ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 23.
    Comunicação Serial ˆ Relógiode tempo real ou RTC (real time clock) ˆ É um componente que tem como função especíca efetuar a contagem de tempo de maneira precisa ˆ Geralmente requer seu próprio cristal para car independente do sistema principal ˆ Possue baixo coeciente de atraso/adiantamento ˆ Pode conter, além do relógio, um calendário ˆ HT1380 ˆ O HT1380 é um relógio de tempo real com interface de comunicação serial tipoI2C ˆ No datasheet do dispositivo não é citada a nomenclatura I2C, mas o dispositivo é compatível ˆ Além das linhas de SCL e SDA existe uma linha de habilitação do chip (Enable) ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 24.
    Comunicação Serial ˆ Aleitura/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 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 25.
    Comunicação Serial ˆ 1bit indica leitura/escrita ˆ 3 bits indicam o campo de interesse ˆ 1 bit controla o clock do chip Figura: Byte de comando do HT1380 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 26.
    Comunicação Serial ˆ Existemao 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 codicados em BCD compactado Figura: Registros internos do HT1380 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 27.
    Comunicação Serial ˆ Parao uso do RTC foram criadas algumas rotinas: ˆ HT1380write() : Realiza a escrita em um registro do HT1380 via barramento I2C ˆ HT1380read() : Realiza a leitura de um registro do HT1380 via barramento I2C ˆ rtcGetSeconds() : Le o valor de segundos do RTC ˆ rtcPutSeconds() : Grava o valor de segundos no RTC ˆ rtcGet... ˆ rtcPut... ˆ Por efeito de simplicidade no uso, foram criadas funções para cada campo do RTC ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 28.
    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 endereço 10 addr |= 0x80; //habilita clock 11 writeByte(addr); 12 writeByte(dados); 13 14 RESET_OFF(); 15 SCL_OFF(); 16 SDA_OFF(); 17 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 29.
    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 endereç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 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 30.
    Serial 1 unsigned char rtcGetSeconds(void) { 2 unsigned char value; 3 value = ht1380read(0); // read seconds 4 //converte de BCD para decimal 5 return (((value 4)0x07)*10 + (value 0x0f)); 6 } 7 8 void rtcPutSeconds(char seconds) { 9 //converte de decimal para BCD 10 ht1380write(0, (seconds % 10) | ((seconds / 10) 4)); 11 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 31.
    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 unsigned char rtcGetMinutes(void); 9 void rtcPutMinutes(unsigned char minutes); 10 //o mesmo para horas, dia (mês), mês, ano, dia (semana) 11 12 #endif ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 32.
    Serial Protocolo TIA RS232 . Interface Between Data Terminal Equipment and Data Circuit-Terminating Equipment Employing Serial Binary Data Interchange ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 33.
    Comunicação Serial ˆ RS232versus UART ˆ Similaridades e 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 cam a cargo de chips externos ˆ MAX232 (ICL232, ST232, ADM232, HIN232) ˆ FT232 ˆ SP3485 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 34.
    Comunicação Serial ˆ Exemplode circuitos para interface com UART Comunicação UART Comunicação RS232 Comunicação USB Comunicação RS485 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 35.
    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 inicio de mensagem ˆ Os 8 bits de dados2 ˆ Um bit de paridade (opcional) ˆ Um bit de marcação de m de mensagem 2 Primeiro o menos signicativo. Alguns sistemas mais antigos operam com 5 ou 7 bits por vez ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 36.
    Comunicação Serial Sinal serializadopara transmissão em RS232 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 37.
    Comunicação Serial ˆ Paradois 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) ˆ Codicação utilizada ˆ Tamanho da palavra ˆ Tamanho do stop/start bits ˆ Bit de paridade ˆ Taxa de transmissão ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 38.
    Comunicação Serial ˆ A conguração da comunicação serial é feita 3 através de 5 registros. ˆ TXSTA e RCSTA : congura o meio de transmissão ˆ BAUDCON : controle de velocidade ˆ SPBRGH e SPBRG : conguração da velocidade 3 Para o microcontrolador PIC18F4550. Outros microcontroladores possuem formato de conguração parecido. ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 39.
    Comunicação Serial Bits de Conguraçã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 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 40.
    Comunicação Serial Exemplo: Congurarpara uma taxa de transmissão de 57,6 kbps. A frequência de oscilação é um cristal de 8MHz. Usando as três formulas: ˆ 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. ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 41.
    Serial 1 BitClr(BAUDCON,0); //Desabilita auto detecção de velocidade 2 BitSet(BAUDCON,3); //Registro de geração de sinal com 16 bits 3 BitClr(BAUDCON,6); //Operação de recepção esta ativa 4 BitClr(RCSTA,1); //Desabilita bit de erro de overrun 5 BitClr(RCSTA,2); //Desabilita bit erro na comunicação 6 BitClr(RCSTA,4); //Habilita bit de recepção 7 BitClr(RCSTA,6); //Seleciona 8 bits 8 BitSet(RCSTA,7); //Configura RX/TX como pinos de comunicação 9 BitSet(TXSTA,2); //Modo de alta velocidade habilitado 10 BitSet(TXSTA,3); //Envia bit de parada (break character bit) 11 BitClr(TXSTA,4); //Modo assíncrono 12 BitSet(TXSTA,5); //Habilita transmissão 13 BitClr(TXSTA,6); //Seleciona 8 bits 14 SPBRGH = 0x00; //Configura para 56k (SPBRGH|SPBRG = 32) 15 SPBRG = 0x22; //Configura para 56k (SPBRGH|SPBRG = 32) 16 BitSet(TRISC,6); //Configura pino de recepção como entrada 17 BitClr(TRISC,7); //Configura pino de envio como saída ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 42.
    Serial Criação da bibliotecapara comunicação serial ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 43.
    Serial 1 #include serial.h 2 #include basico.h 3 void EnviaSerial(unsigned char c) { 4 while(!BitTst(PIR1,4)); //aguarda o registro ficar disponível 5 TXREG=c; //coloca o valor para ser enviado 6 } 7 unsigned char RecebeSerial(void) { 8 if (BitTst(PIR1,5)) //Verifica se existe algum valor disponivel 9 { 10 return RCREG; //retorna o valor 11 } 12 return 0; //condição de erro 13 } 14 void InicializaSerial(void){ 15 TXSTA = 0b00101100; //configura a transmissão de dados da serial 16 RCSTA = 0b10010000; //configura a recepção de dados da serial 17 BAUDCON = 0b00001000; //configura sistema de velocidade da serial 18 SPBRGH = 0b00000000; //configura para 56k 19 SPBRG = 0b00100010; //configura para 56k 20 BitSet(TRISC,6); //pino de recepção de dados 21 BitClr(TRISC,7); //pino de envio de dados 22 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 44.
    Serial 1 #ifndef SERIAL_H 2 #define SERIAL_H 3 void EnviaSerial(unsigned char c); 4 unsigned char RecebeSerial(void); 5 void InicializaSerial(void); 6 #endif //SERIAL_H ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 45.
    Serial 1 #include basico.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 InicializaSerial(); 10 for(;;){ 11 for(i = 0; i 65000; i++); //delay 12 EnviaSerial(msg[j]); //envia dados 13 j++; 14 if (j 11){ 15 j=0; 16 EnviaSerial(13); //envia quebra de linha 17 } 18 resp = RecebeSerial(); //recebe dados 19 if (resp!=0){ 20 PORTD = resp; 21 } 22 } 23 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 46.
    Serial Exemplo de interfacecom dispositivos usando UART/RS232 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 47.
    Comunicação Serial ˆ GPSintegrado 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 qnt de satelites ativos ˆ GPGCA - Dados xados (lat/long/alt/diferencial) ˆ GPRMC - Dados minimos (lat/long/alt) ˆ GPVTG - Velocidade e deslocamento ˆ GPGSV - Dados dos satélites visíveis ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 48.
    Comunicação Serial ˆ Mensagemdo 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 - Variacão Magnética (ângulo em graus) ˆ 11 - Varia?ão Magnerica (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 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 49.
    Comunicação Serial ˆ Formato: $ID,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 ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 50.
    Comunicação Serial ˆ Rotinapara recepção dos dados ˆ Armazenar cada byte recebido num buer temporário. ˆ Aguardar os dois bytes de m de linha: cr e lf, 'n' e 'r', 13 e 10. ˆ Caso chegar m de linha, resetar o buer e processar a linha ˆ No processamento do buer ˆ Vericar o ID da mensagem($GPRMC) ˆ Cada campo é separado por virgulas ˆ Percorrer o campo atual e realizar conversão dos dados ou enviar p/ o LCD ˆ Não esquecer de vericar o checksum para segurança ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 51.
    Serial 1 #include basico.h 2 #include config.h 3 #include serial.h 4 #include lcd.h 5 void main(void) { 6 unsigned char pos=0; //posição atual do buffer 7 char buffer[100]; //buffer temporário 8 InicializaSerial(); 9 InicializaLCD(); 10 for(;;) { 11 while(BitTst(PIR1,5) != 0){ 12 buffer[pos] = RCREG; 13 pos++; //cuidado com buffer overflow 14 //teste de fim de mensagem 15 // ... 16 } 17 } 18 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 52.
    Serial 1 //teste de fim de mensagem 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 processa o buffer 7 if( (buffer[0] == '$') (buffer[1] == 'G') 8 (buffer[2] == 'P') 9 (buffer[3] == 'R') 10 (buffer[4] == 'M') 11 (buffer[5] == 'C')) 12 { 13 //parser da mensagem 14 // ... 15 } 16 } ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 53.
    Serial 1 //Parser 2 3 //começa depois do ID 4 pos = 7; 5 6 //1 - Hora UTC 7 while(buffer[pos] != ','){ 8 //EnviaDados(buffer[pos]); 9 pos++; 10 } 11 pos++;//pula a virgula 12 13 //2 A(OK) 14 while(buffer[pos] != ','){ 15 //EnviaDados(buffer[pos]); 16 pos++; 17 } 18 pos++;//pula a virgula ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 54.
    Serial 1 //5-Longitude 2 EnviaComando(0xC0); EnviaDados('L'); EnviaDados('O'); EnviaDados('N'); 3 while(buffer[pos] != ','){ 4 EnviaDados(buffer[pos]); 5 pos++; 6 } 7 pos++;//pula a virgula 8 //6-Leste(E)/Oeste(W) 9 while(buffer[pos] != ','){ 10 EnviaDados(buffer[pos]); 11 pos++; 12 } 13 pos++;//pula a virgula 14 //..continua para os demais campos ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW
  • 55.
    Serial 1 //3 lat 2 EnviaComando(0x80); EnviaDados('L'); EnviaDados('A'); EnviaDados('T'); 3 while(buffer[pos] != ','){ 4 EnviaDados(buffer[pos]); 5 pos++; 6 } 7 pos++;//pula a virgula 8 //4 N/S 9 while(buffer[pos] != ','){ 10 EnviaDados(buffer[pos]); 11 pos++; 12 } 13 pos++;//pula a virgula ELT024 Comunicação serial: I2C, RS232, HT1380, ME1000RW