Prévia do material em texto
Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RW Prof.MSc.Rodrigo Maximiano Antunes de Almeida Universidade Federal de Itajuba´ rodrigomax@unifei.edu.br ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 1 / 59 LCD Revisa˜o ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 2 / 59 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 1Para melhor uso e´ interessante retornar os terminais para o valor que tinham antes de chamar a rotina, ja´ que eles esta˜o multiplexados com outros dispositivos ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 3 / 59 Display de LCD Instruc¸a˜o RS RW Dados (bit) Tempo (ma´x.)7 6 5 4 3 2 1 0 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 Config. 0 0 0 0 0 0 0 1 ID S 37 us Config. 0 0 0 0 0 0 1 D C B 37 us Movim. 0 0 0 0 0 1 SC RL - - 37 us Config. 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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 4 / 59 Display de LCD Definic¸o˜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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 5 / 59 Display de LCD Desenvolvimento da biblioteca Criac¸a˜o de rotinas de delay (2ms e 40us) Func¸a˜o para enviar comandos Func¸a˜o para enviar dados Func¸a˜o de inicializac¸a˜o ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 6 / 59 Display de LCD 1 #include "basico.h" 2 #include "config.h" 3 #include "lcd.h" 4 5 // i n i c i o do programa 6 v o i d main ( v o i d ) 7 { 8 uns igned i n t i , j ; 9 char msg [ ] = "Hello World!" ; 10 InicializaLCD ( ) ; 11 f o r ( i=0;i<11;i++) 12 { 13 EnviaDados ( msg [ i ] ) ; 14 f o r ( j = 0 ; j < 65000 ; j++) ; 15 } 16 f o r ( ; ; ) ; 17 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 7 / 59 Serial Comunicac¸a˜o Serial ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 8 / 59 Comunicac¸a˜o Serial Vantagens Simplificac¸a˜o do hardware Aumento da taxa de transmissa˜o devido a reduc¸a˜o de problemas de sincronia Economia de cabos ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 9 / 59 Comunicac¸a˜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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 10 / 59 Serial Protocolo I2C Inter-Integrated Circuit ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 11 / 59 Comunicac¸a˜o Serial Comunicac¸a˜o serial I2C 1982 - Protocolo I2C criado pela Phillips (100 kHz) 1992 - Versa˜o 1.0: Adicionada a frequencia de 400 kHz (Fast mode) e enderec¸amento de 10 bit addresses 1998 - 2.0: Frequeˆ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 identificadores de fabricantes E´ um protocolo serial, sincrono e multi-mestre Figura : Barramento I2C com va´rios dispositivos ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 12 / 59 Comunicac¸a˜o Serial A comunicac¸a˜o I2C e´ feita de modo s´ıncrono: os bits sa˜o enviados de acordo com um sinal de clock. Para isso sa˜o necessa´rios pelo menos 2 fios: Transmissa˜o dos dados, SDA ou serial data Transmissa˜o do clock, SCL ou serial clock Os terminais sa˜o implementados como coletor aberto, exigindo um pull-up para funcionamento. Figura : Conexa˜o com coletor aberto ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 13 / 59 Comunicac¸a˜o Serial A comunicac¸a˜o e´ feita como nos LCD’s, mas nesse caso apenas um bit e´ enviado por vez: 1 SDA e SCL comec¸am em n´ıvel alto 2 SDA e´ levado para n´ıvel baixo como sinal de in´ıcio 3 SCL e´ levado para n´ıvel baixo 4 o primeiro bit (menos significativo) e´ colocado em SDA 5 SCL e´ levado para n´ıvel alto, aguarda-se o tempo do sistema e abaixa-se novamente SCL 6 repete-se o processo do item 3 ate´ o fim da transmissa˜o 7 SDA e´ levado para n´ıvel alto indicando fim de transmissa˜o SDA e SCL no envio de um dado http://en.wikipedia.org/w/index.php?title=File:I2C data transfer.svg ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 14 / 59 Serial Criac¸a˜o da biblioteca para comunicac¸a˜o I2C ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 15 / 59 Comunicac¸a˜o Serial E´ poss´ıvel que o microcontrolador ja´ possua um hardware dedicado para o envio e recepc¸a˜o dos dados O controle do envio e recepc¸a˜o dos dados e´ feita por hardware O sistema identifica o enderec¸o e cuida da serializac¸a˜o Na auseˆncia de um perife´rico dedicado, e´ comum realizar a implementac¸a˜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 enderec¸os, leitura/escrita de dados e o clock fica a cargo do programador. ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 16 / 59 Comunicac¸a˜o Serial Para a biblioteca sa˜o necessa´rias 3 func¸o˜es ba´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 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 17 / 59 Serial 1 #include "i2c.h" 2 #include "basico.h" 3 4 char de ; 5 #define DELAY ( ) f o r ( 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 ) ) ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br18 / 59 Serial 1 v o i d i2cStart ( ) { 2 RESET_OUT ( ) ; 3 SDA_OUT ( ) ; 4 SCL_OUT ( ) ; 5 BitClr ( INTCON2 , 7) ; // l i g a p u l l up 6 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 19 / 59 Serial 1 v o i d writeByte ( uns igned char dados ) { 2 uns igned char i ; 3 f o r ( i = 0 ; i < 8 ; i++) { 4 // A n a l i s a o b i t a s e r t r a n s m i t i d o 5 i f ( dados & 0x01 ) { 6 SDA_ON ( ) ; 7 } e l s e { 8 SDA_OFF ( ) ; 9 } 10 // g e r a c¸ a˜ o do p u l s o de c l o c k 11 SCL_ON ( ) ; 12 DELAY ( ) ; // i n f o r m a c¸ a˜ o v a´ l i d a 13 SCL_OFF ( ) ; 14 DELAY ( ) ; 15 // pega o pr o´x imo b i t 16 dados >>= 1 ; 17 } 18 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 20 / 59 Serial 1 uns igned char readByte ( ) { 2 uns igned char i ; 3 uns igned char dados ; 4 dados = 0 ; 5 f o r ( i = 0 ; i < 8 ; i++) { 6 SCL_ON ( ) ; 7 DELAY ( ) ; // i n f o r m a c¸ a˜ o v a´ l i d a 8 i f ( SDA ( ) ) { 9 dados |= 0x80 ; 10 } 11 SCL_OFF ( ) ; 12 DELAY ( ) ; 13 dados >>= 1 ; 14 } 15 r e t u r n dados ; 16 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 21 / 59 Serial 1 #ifndef I2C_H 2 #define I2C_H 3 uns igned char readByte ( ) ; 4 v o i d writeByte ( uns igned char dados ) ; 5 v o i d i2cStart ( ) ; 6 #endif ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 22 / 59 Serial Exemplo de interface com dispositivo usando I2C ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 23 / 59 Serial Figura : Ligac¸a˜o do RTC HT1380 no barramento de dados I2C ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 24 / 59 Comunicac¸a˜o Serial Relo´gio de tempo real ou RTC (real time clock) E´ um componente que tem como func¸a˜o espec´ıfica efetuar a contagem de tempo de maneira precisa Geralmente requer seu pro´prio cristal para ficar independente do sistema principal Possue baixo coeficiente de atraso/adiantamento Pode conter, ale´m do relo´gio, um calenda´rio ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 25 / 59 Comunicac¸a˜o Serial HT1380 O HT1380 e´ um relo´gio de tempo real com interface de comunicac¸a˜o serial ”tipo”I2C No datasheet do dispositivo na˜o e´ citada a nomenclatura I2C, provavelmente por motivos de royalties, mas a ana´lise das linhas temporais indicam a compatibilidade Ale´m das duas linhas padronizadas: SCL (chamada SCKL) e SDA (chamada I/O) existe uma terceira linha para habilitac¸a˜o do chip (reset) ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 26 / 59 Comunicac¸a˜o Serial A leitura/escrita de informac¸o˜es no HT1380 e´ feita em dois momentos Primeiro envia-se um comando de 8 bits indicando o enderec¸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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 27 / 59 Comunicac¸a˜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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 28 / 59 Comunicac¸a˜o Serial Existem ao todo 8 enderec¸os no HT1380 segundo, minuto, hora, dia (do meˆs), meˆs, dia (da semana), ano e protec¸a˜o contra escrita Estes valores esta˜o codificados em BCD compactado Figura : Registros internos do HT1380 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 29 / 59 Comunicac¸a˜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 func¸o˜es foram criadas rotinas para acessar cada uma das varia´veis internas do RTC rtcGetSeconds() : Le o valor de segundos do RTC rtcPutSeconds() : Grava o valor de segundos no RTC rtcGet... rtcPut... ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 30 / 59 Serial 1 v o i d ht1380write ( uns igned char addr , uns igned char dados ) { 2 RESET_OFF ( ) ; 3 SCL_OFF ( ) ; 4 SDA_OFF ( ) ; 5 6 // l i g a o RTC 7 RESET_ON ( ) ; 8 9 addr <<= 1 ; // c o r r i g e e n d e r e c¸ o 10 addr |= 0x80 ; // h a b i l i t a c l o c k 11 writeByte ( addr ) ; 12 writeByte ( dados ) ; 13 14 RESET_OFF ( ) ; 15 SCL_OFF ( ) ; 16 SDA_OFF ( ) ; 17 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 31 / 59 Serial 1 uns igned char ht1380read ( uns igned char addr ) { 2 uns igned char dados ; 3 RESET_OFF ( ) ; 4 SCL_OFF ( ) ; 5 SDA_OFF ( ) ; 6 7 RESET_ON ( ) ; 8 9 addr <<= 1 ; // c o r r i g e e n d e r e c¸ o 10 addr |= 0x81 ; // l i g a b i t de l e i t u r a e hab . c l k 11 writeByte ( addr ) ; 12 SDA_IN ( ) ; //muda para e n t r a d a 13 DELAY ( ) ; DELAY ( ) ; DELAY ( ) ; DELAY ( ) ; // aguarda mudanc¸a 14 dados = readByte ( ) ; 15 16 RESET_OFF ( ) ; 17 SCL_OFF ( ) ; 18 SDA_OFF ( ) ; 19 SDA_OUT ( ) ; 20 r e t u r n dados ; 21 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 32 / 59 Serial 1 uns igned char rtcGetSeconds ( v o i d ) { 2 uns igned char value ; 3 value = ht1380read ( 0 ) ; // r e a d s e c o n d s 4 // c o n v e r t e de BCD para d e c i m a l 5 r e t u r n ( ( ( value >> 4)&0x07 ) *10 + ( value & 0x0f ) ) ; 6 } 7 8 v o i d rtcPutSeconds ( char seconds ) { 9// c o n v e r t e de d e c i m a l para BCD 10 ht1380write ( 0 , ( seconds % 10) | ( ( seconds / 10) << 4) ) ; 11 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 33 / 59 Serial 1 #ifndef RTC_H 2 #define RTC_H 3 v o i d ht1381write ( uns igned char addr , uns igned char data ) ; 4 uns igned char ht1381read ( uns igned char addr ) ; 5 6 uns igned char rtcGetSeconds ( v o i d ) ; 7 v o i d rtcPutSeconds ( uns igned char seconds ) ; 8 9 uns igned char rtcGetMinutes ( v o i d ) ; 10 v o i d rtcPutMinutes ( uns igned char minutes ) ; 11 //o mesmo para horas , d i a ( meˆs ) , meˆs , ano , d i a ( semana ) 12 13 #endif ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 34 / 59 Serial Protocolo TIA RS232 Interface Between Data Terminal Equipment and Data Circuit-Terminating Equipment Employing Serial Binary Data Interchange ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 35 / 59 Comunicac¸a˜o Serial RS232 versus UART Similaridades e diferenc¸as e observac¸o˜es: UART e´ uma versa˜o generalizada dos protocolos 232, 485, 422, EIA. Visa fornecer uma base padra˜o para todos estes protocolos As tenso˜es sa˜o em geral no mesmo n´ıvel do processador As converso˜es para os protocolos ficam a cargo de chips externos MAX232 (ICL232, ST232, ADM232, HIN232) FT232 SP3485 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 36 / 59 Comunicac¸a˜o Serial Exemplo de circuitos para interface com UART Comunicac¸a˜o UART Comunicac¸a˜o USB Comunicac¸a˜o RS232 Comunicac¸a˜o RS485 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 37 / 59 Comunicac¸a˜o Serial Comunicac¸a˜o serial 232 1962 - Recommended Standard232 1969 - Recommended Standard 232 rev. C 1986 - EIA 232 rev C 1997 - TIA 232 rev F Procedimento de envio Um bit de marcac¸a˜o de inicio de mensagem Os 8 bits de dados2 Um bit de paridade (opcional) Um bit de marcac¸a˜o de fim de mensagem 2Primeiro o menos significativo. Alguns sistemas mais antigos operam com 5 ou 7 bits por vez ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 38 / 59 Comunicac¸a˜o Serial Sinal serializado para transmissa˜o em RS232 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 39 / 59 Comunicac¸a˜o Serial Para dois dispositivos se comunicarem e´ necessa´rio compatibilizar o sistema f´ısico e o sistema lo´gico. F´ısico (Hardware) Tipo de conector Pinagem do conector N´ıveis de tensa˜o Lo´gico (Software) Codificac¸a˜o utilizada Tamanho da palavra Tamanho do stop/start bits Bit de paridade Taxa de transmissa˜o ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 40 / 59 Comunicac¸a˜o Serial A configurac¸a˜o da comunicac¸a˜o serial e´ feita 3 atrave´s de 5 registros. TXSTA e RCSTA : configura o meio de transmissa˜o BAUDCON : controle de velocidade SPBRGH e SPBRG : configurac¸a˜o da velocidade 3Para o microcontrolador PIC18F4550. Outros microcontroladores possuem formato de configurac¸a˜o parecido. ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 41 / 59 Comunicac¸a˜o Serial Bits de Configurac¸a˜o Precisa˜o Taxa de transmissa˜o Txsta:4 Baudcon:3 Txsta:2 0 0 0 8bits F232 = FOSC [64 ∗ (n + 1)] 0 0 1 8bits F232 = FOSC [16 ∗ (n + 1)]0 1 0 16bits 0 1 1 16bits F232 = FOSC [4 ∗ (n + 1)]1 0 x 8bits 1 1 x 16bits x – na˜o importa, n – valor do par SPBRGH:SPBRG ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 42 / 59 Comunicac¸a˜o Serial Exemplo: Configurar para uma taxa de transmissa˜o de 57,6 kbps. A frequeˆncia de oscilac¸a˜o e´ um cristal de 8MHz. Usando as treˆs fo´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 fo´rmula que gera menos erro e´ a de nu´mero 3, por isso ela sera´ a escolhida. ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 43 / 59 Serial 1 BitClr ( BAUDCON , 0 ) ; // D e s a b i l i t a auto d e t e c 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 g e r a c¸ a˜ o de s i n a l com 16 b i t s 3 BitClr ( BAUDCON , 6 ) ; // Operac¸ a˜o de r e c e p c¸ a˜ o e s t a a t i v a 4 BitClr ( RCSTA , 1 ) ; // D e s a b i l i t a b i t de e r r o de o v e r r u n 5 BitClr ( RCSTA , 2 ) ; // D e s a b i l i t a b i t e r r o na comunica c¸ a˜o 6 BitClr ( RCSTA , 4 ) ; // H a b i l i t a b i t de r e c e p c¸ a˜ o 7 BitClr ( RCSTA , 6 ) ; // S e l e c i o n a 8 b i t s 8 BitSet ( RCSTA , 7 ) ; // C o n f i g u r a RX/TX como p i n o s de comunica c¸ a˜o 9 BitSet ( TXSTA , 2 ) ; //Modo de a l t a v e l o c i d a d e h a b i l i t a d o 10 BitSet ( TXSTA , 3 ) ; // Env ia b i t de parada ( b r e a k c h a r a c t e r b i t ) 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 a˜ o 13 BitClr ( TXSTA , 6 ) ; // S e l e c i o n a 8 b i t s 14 SPBRGH = 0x00 ; // C o n f i g u r a para 56 k (SPBRGH |SPBRG = 32) 15 SPBRG = 0x22 ; // C o n f i g u r a para 56 k (SPBRGH |SPBRG = 32) 16 BitSet ( TRISC , 6 ) ; // C o n f i g u r a p i n o de r e c e p c¸ a˜ o como e n t r a d a 17 BitClr ( TRISC , 7 ) ; // C o n f i g u r a p i n o de e n v i o como s a ı´ d a ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 44 / 59 Serial Criac¸a˜o da biblioteca para comunicac¸a˜o serial ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 45 / 59 Serial 1 #include "serial.h" 2 #include "basico.h" 3 v o i d EnviaSerial ( uns igned char c ) { 4 w h i l e ( ! BitTst ( PIR1 , 4 ) ) ; // aguarda o r e g i s t r o f i c a r d i s p o n ı´ v e l 5 TXREG=c ; // c o l o c a o v a l o r para s e r e n v i a d o 6 } 7 uns igned char RecebeSerial ( v o i d ) { 8 i f ( BitTst ( PIR1 , 5 ) ) { // V e r i f i c a s e e x i s t e v a l o r d i s p o n i v e l 9 r e t u r n RCREG ; // r e t o r n a o v a l o r 10 } 11 r e t u r n 0 ; // c o n d i c¸ a˜ o de e r r o 12} 13 v o i d InicializaSerial ( v o i d ) { 14 TXSTA = 0b00101100 ; // c o n f i g u r a a t r a n s m i s s a˜ o 15 RCSTA = 0b10010000 ; // c o n f i g u r a a r e c e p c¸ a˜ o 16 BAUDCON = 0b00001000 ; // c o n f i g u r a v e l o c i d a d e 17 SPBRGH = 0b00000000 ; // c o n f i g u r a para 56 k 18 SPBRG = 0b00100010 ; // c o n f i g u r a para 56 k 19 BitSet ( TRISC , 6 ) ; // p i n o de r e c e p c¸ a˜ o de dados 20 BitClr ( TRISC , 7 ) ; // p i n o de e n v i o de dados 21 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 46 / 59 Serial 1 #ifndef SERIAL_H 2 #define SERIAL_H 3 v o i d EnviaSerial ( uns igned char c ) ; 4 uns igned char RecebeSerial ( v o i d ) ; 5 v o i d InicializaSerial ( v o i d ) ; 6 #endif //SERIAL H ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 47 / 59 Serial 1 #include "basico.h" 2 #include "config.h" 3 #include "serial.h" 4 v o i d main ( v o i d ) { 5 uns igned i n t i , j=0; 6 char msg [ ] = "Hello World!" ; 7 uns igned char resp ; 8 TRISD = 0x00 ; // a c e s s o aos l e d s 9 InicializaSerial ( ) ; 10 f o r ( ; ; ) { 11 f o r ( i = 0 ; i < 65000 ; i++) ; // d e l a y 12 EnviaSerial ( msg [ j ] ) ; // e n v i a dados 13 j++; 14 i f ( j > 11) { 15 j=0; 16 EnviaSerial ( 1 3 ) ; // e n v i a quebra de l i n h a 17 } 18 resp = RecebeSerial ( ) ; // r e c e b e dados 19 i f ( resp !=0){ 20 PORTD = resp ; 21 } 22 } 23 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 48 / 59 Serial Exemplo de interface com dispositivos usando UART/RS232 ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 49 / 59 Comunicac¸a˜o Serial GPS integrado com antena ME-1000RW Comunica-se usando padra˜o UART 9600 bps Os dados sa˜o passados atrave´s de uma string Implementa va´rios padro˜es NEMA GPGSA - Precisa˜o e qnt de satelites ativos GPGCA - Dados fixados (lat/long/alt/diferencial) GPRMC - Dados minimos (lat/long/alt) GPVTG - Velocidade e deslocamento GPGSV - Dados dos sate´lites vis´ıveis ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 50 / 59 Comunicac¸a˜o Serial Mensagem do GPRMC Formada por 14 campos: 0 - ID da mensagem 1 - Tempo (UTC) 2 - Rastreando (R) ou Aceita´vel (A) 3 - Latitude 4 - Norte/Sul 5 - Longitude 6 - Leste/Oeste (E/W) 7 - Velocidade (magnitude) 8 - Velocidade (aˆngulo) 9 - Data (UTC) 10 - Variaca˜o Magne´tica (aˆngulo em graus) 11 - Varia?a˜o Magnerica (direc¸a`o, E/W) 12 - Modo de operac¸a˜o (N na˜o va´lido, A autoˆnomo, D diferencial, E estimado, M manual, S simulac¸a˜o) 13 - Checksum ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 51 / 59 Comunicac¸a˜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 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 52 / 59 Comunicac¸a˜o Serial Rotina para recepc¸a˜o dos dados Armazenar cada byte recebido num buffer tempora´rio. Aguardar dois bytes de fim de linha: <cr> e <lf>, ’\n’ e ’\r’, 13 e 10. Caso chegar ”fimde linha”, resetar o buffer e processar a linha No processamento do buffer Verificar o ID da mensagem ($GPRMC) Cada campo e´ separado por virgulas Percorrer o campo atual e realizar conversa˜o dos dados ou enviar p/ o LCD Na˜o esquecer de verificar o checksum para seguranc¸a ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 53 / 59 Serial 1 #include "basico.h" 2 #include "config.h" 3 #include "serial.h" 4 #include "lcd.h" 5 v o i d main ( v o i d ) { 6 uns igned char pos=0; // p o s i c¸ a˜ o a t u a l do b u f f e r 7 char buffer [ 1 0 0 ] ; // b u f f e r t e m p o r a´ r i o 8 InicializaSerial ( ) ; 9 InicializaLCD ( ) ; 10 f o r ( ; ; ) { 11 w h i l e ( BitTst ( PIR1 , 5 ) != 0) { 12 buffer [ pos ] = RCREG ; 13 pos++; // c u i d a d o com b u f f e r o v e r f l o w 14 // t e s t e de f im de mensagem 15 // . . . 16 } 17 } 18 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 54 / 59 Serial 1 // t e s t e de f im de mensagem 2 i f ( ( pos > 2) && 3 ( buffer [ pos−2] == 13) && //CR 4 ( buffer [ pos−1] == 10) ) { //LF 5 pos = 0 ; 6 // s e o ID e s t i v e r c o r r e t o p r o c e s s a o b u f f e r 7 i f ( ( buffer [ 0 ] == '$' ) && 8 ( buffer [ 1 ] == 'G' ) && 9 ( buffer [ 2 ] == 'P' ) && 10 ( buffer [ 3 ] == 'R' ) && 11 ( buffer [ 4 ] == 'M' ) && 12 ( buffer [ 5 ] == 'C' ) ) 13 { 14 // p a r s e r da mensagem $GPRMC 15 // . . . 16 } 17 } ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 55 / 59 Serial 1 // P a r s e r 2 3 // comec¸a d e p o i s do ID 4 pos = 7 ; 5 6 //1 − Hora UTC 7 w h i l e ( buffer [ pos ] != ',' ) { 8 // EnviaDados ( b u f f e r [ pos ] ) ; 9 pos++; 10 } 11 pos++;// p u l a a v i r g u l a 12 13 //2 A(OK) 14 w h i l e ( buffer [ pos ] != ',' ) { 15 // EnviaDados ( b u f f e r [ pos ] ) ; 16 pos++; 17 } 18 pos++;// p u l a a v i r g u l a ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 56 / 59 Serial 19 //3−L a t i t u d e 20 21 EnviaComando (0 x80 ) ; 22 EnviaDados ( 'L' ) ; 23 EnviaDados ( 'A' ) ; 24 EnviaDados ( 'T' ) ; 25 26 w h i l e ( buffer [ pos ] != ',' ) { 27 EnviaDados ( buffer [ pos ] ) ; 28 pos++; 29 } 30 pos++;// p u l a a v i r g u l a 31 //4 N/S 32 w h i l e ( buffer [ pos ] != ',' ) { 33 EnviaDados ( buffer [ pos ] ) ; 34 pos++; 35 } 36 pos++;// p u l a a v i r g u l a ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 57 / 59 Serial 37 //5−L o n g i t u d e 38 39 EnviaComando (0 xC0 ) ; 40 EnviaDados ( 'L' ) ; 41 EnviaDados ( 'O' ) ; 42 EnviaDados ( 'N' ) ; 43 44 w h i l e ( buffer [ pos ] != ',' ) { 45 EnviaDados ( buffer [ pos ] ) ; 46 pos++; 47 } 48 pos++;// p u l a a v i r g u l a 49 //6−L e s t e (E) / Oeste (W) 50 w h i l e ( buffer [ pos ] != ',' ) { 51 EnviaDados ( buffer [ pos ] ) ; 52 pos++; 53 } 54 pos++;// p u l a a v i r g u l a 55 // . . c o n t i n u a para os demais campos ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 58 / 59 Comunicac¸a˜o Serial Figura : Leitura do GPS e escrita no LCD ELT024 (IESTI) Comunicac¸a˜o serial: I2C, RS232, HT1380, ME1000RWrodrigomax@unifei.edu.br 59 / 59