Microprocesadores Comunicación Serial Ası́ncrona Prof. Luis Araujo Universidad de Los Andes Prof. Luis Araujo Microprocesadores Comunicación Serial La comunicación serie se puede dividir en dos categorı́as comunicación: Sı́ncrona: requiere de un reloj y una lı́nea de datos, los datos se van transmitiendo uno a uno con cada pulso de reloj Ası́ncrona: los dispositivos se ponen de acuerdo en la velocidad de comunicación uno de ellos transmite y el otro recibe y/o viceversa Prof. Luis Araujo Microprocesadores Comunicación Serial Ası́ncrona Parámetros: Velocidad de Comunicación (bps): 1200, 2400, 4800, 9600, 19200, etc. Número de bits de Datos: 8 o 9 bits Tipo de Paridad: Par, Impar, Ninguna Número de bits de Parada: 1, 1 1/2 o 2 Prof. Luis Araujo Microprocesadores Modulo USART de los PIC Los PIC tiene un modulo de comunicación serial UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (USART) También conocido como Serial Comunications Interface (SCI) USART puede ser configurado como: full-duplex asynchronous, que permite comunicación con otros dispositivos ası́ncronos como microcontroladores o un PC. half-duplex synchronous system, que permite con otros dispositivos sı́ncronos como ADC, DAC, EEPPOM, etc Prof. Luis Araujo Microprocesadores TXSTA Prof. Luis Araujo Microprocesadores TXSTA Prof. Luis Araujo Microprocesadores RCSTA Prof. Luis Araujo Microprocesadores RCSTA Prof. Luis Araujo Microprocesadores Velocidad de Comunicación Prof. Luis Araujo Microprocesadores Velocidad de Comunicación Prof. Luis Araujo Microprocesadores Velocidad de Comunicación Prof. Luis Araujo Microprocesadores Módulo Transmisor Prof. Luis Araujo Microprocesadores Módulo Receptor Prof. Luis Araujo Microprocesadores uart.h # ifndef UART_H # define UART_H # define _XTAL_FREQ 4000000 UL void UART_init ( int ); void UART_putc ( char ); char UART_getc ( void ); # endif Prof. Luis Araujo Microprocesadores uart.c # include < xc .h > # include " uart . h " void UART_init ( int bps ) { TX9 = 0; RX9 = 0; CREN = 1; SYNC = 0; BRGH = 1; SPBRG = (( unsigned char ) ( _XTAL_FREQ /(16 UL * bps ))) -1; TRISB2 = 1; TRISB5 = 0; TXEN = 1; SPEN = 1; } Prof. Luis Araujo Microprocesadores uart.c void UART_putc ( char c ) { while (! TRMT ) continue ; TXREG = c ; } char UART_getc ( void ) { while (! RCIF ) continue ; return RCREG ; } Prof. Luis Araujo Microprocesadores Ejemplo 21 Prof. Luis Araujo Microprocesadores e21.c # include < xc .h > # include < stdio .h > # include " lcd4bits . h " # include " uart . h " # include " adc_88 . h " // CONFIG1 # pragma config FOSC = # pragma config WDTE = # pragma config PWRTE = # pragma config MCLRE = # pragma config BOREN = # pragma config LVP = # pragma config CPD = # pragma config WRT = # pragma config CCPMX = # pragma config CP = // CONFIG2 Prof. Luis Araujo HS OFF OFF OFF OFF OFF OFF OFF RB0 OFF // // // // // // // // // // Oscillator Selectio Watchdog Timer Enab Power - up Timer Enab RA5 / MCLR / VPP Pin Fu Brown - out Reset Ena Low - Voltage Program Data EE Memory Code Flash Program Memor CCP1 Pin Selection Flash Program Memor Microprocesadores e21.c char texto [17]; char temp_local , t em p _ lo c a l_ a n te r i or = 0; char temp_remota , t e m p _ r e m o t a _ a n t e r i o r = 0; void main ( void ){ LCD_init (); UART_init (9600); ADC_init ( ADC_10bit | ADC_FOSC64 , ADC_AN00 ); RCIE = 1; PEIE = 1; GIE = 1; while (1) { } } Prof. Luis Araujo Microprocesadores e21.c while (1){ temp_local =( char )( ADC_get (0 )* 50 0. 0/ 10 23 .0 ); if ( temp_local != t em p _ lo c a l_ a n te r i or ) { sprintf ( texto , " Temp . local = %02 d " , temp_local ); LCD_gotoxy (0 ,0); LCD_puts ( texto ); UART_putc ( temp_local ); t e mp_local_an t er i o r = temp_local ; } if ( temp_remota != t e m p _ r e m o t a _ a n t e r i o r ) { sprintf ( texto , " Temp . remota = %02 d " , temp_remota ); LCD_gotoxy (0 ,1); LCD_puts ( texto ); t e m p_remota_a n t e r i o r = temp_remota ; } } Prof. Luis Araujo Microprocesadores e21.c void interrupt isr ( void ) { temp_remota = UART_getc (); RCIF = 0; } Prof. Luis Araujo Microprocesadores Comunicación PC - PIC via RS232 Prof. Luis Araujo Microprocesadores Puerto Serial PC Prof. Luis Araujo Microprocesadores Cable de Comunicación RS232 Prof. Luis Araujo Microprocesadores MAX232 Prof. Luis Araujo Microprocesadores Conexión MAX232 con PC y PIC Prof. Luis Araujo Microprocesadores Ejemplo 22 Prof. Luis Araujo Microprocesadores Trama NMEA GPS $GPGGA ,160023.69 ,1130.832 , N ,04344.045 , E ,1 ,04 ,2.6 ,100.00 , M , -33.9 , M , ,0000*7 C $GPGLL ,1130.915 , N ,04344.052 , E ,160024.70 , A *0 C $GPRMC ,160026.73 , A ,1131.081 , N ,04344.067 , E ,300.00 ,4.96 ,110213 ,0.0 , E *5 A ver: http://www.gpsinformation.org/dale/nmea.htm Prof. Luis Araujo Microprocesadores Sentencia GGA Prof. Luis Araujo Microprocesadores e22.c # define MAX_COLA_GPS 15 char data ; char cola_gps_proximo = 0; char cola_gps [ MAX_COLA_GPS ]; char actualizar_HORA = 1; char hor = 0 , min = 0 , seg = 0; char texto [17]; void main ( void ){ LCD_init (); UART_init (9600); LCD_puts ( " Hora GPS " ); RCIE = 1; PEIE = 1; GIE = 1; while (1) { } } Prof. Luis Araujo Microprocesadores e22.c while (1) { if ( actualizar_HORA ) { if (( cola_gps [3]== ’G ’ )&&( cola_gps [4]== ’G ’) &&( cola_gps [5]== ’A ’ )) { hor =10*( cola_gps [7] - ’0 ’ )+( cola_gps [8] - ’0 ’ ); min =10*( cola_gps [9] - ’0 ’ )+( cola_gps [10] - ’0 ’ ); seg =10*( cola_gps [11] - ’0 ’ )+( cola_gps [12] - ’0 ’ ); sprintf ( texto , " %02 d : %02 d : %02 d " , hor , min , seg ); LCD_gotoxy (0 ,1); LCD_puts ( texto ); } cola_gps_proximo = 0; actualizar_HORA = 0; } } Prof. Luis Araujo Microprocesadores e22.c void interrupt isr ( void ) { data = UART_getc (); UART_putc ( data ); if ( data == ’$ ’) cola_gps_proximo = 0; cola_gps [ cola_gps_proximo ] = data ; if ( cola_gps_proximo < 15) cola_gps_proximo ++; if (( cola_gps_proximo == 13) &&( cola_gps [0] == ’$ ’ )) actualizar_HORA = 1; RCIF = 0; } Prof. Luis Araujo Microprocesadores RS485 Prof. Luis Araujo Microprocesadores RS485 Prof. Luis Araujo Microprocesadores RS485 Prof. Luis Araujo Microprocesadores Ejemplo 23 Prof. Luis Araujo Microprocesadores uart 485.h # ifndef UART_485_H # define UART_485_H # define _XTAL_FREQ 4000000 UL void void char void UART_485_init ( int ); UART_485_putc ( char ); UART_485_getc ( void ); UART_485_busy ( void ); # endif Prof. Luis Araujo Microprocesadores uart 485.c # include < xc .h > # include " uart_485 . h " void UART_485_init ( int bps ){ TX9 = 0; RX9 = 0; CREN = 1; SYNC = 0; BRGH = 1; SPBRG = (( unsigned char ) ( _XTAL_FREQ /(16 UL * bps ))) -1; TRISB2 = 1; TRISB5 = 0; TRISA4 = 0; RA4 = 0; TXEN = 1; SPEN = 1; } Prof. Luis Araujo Microprocesadores uart 485.c void UART_485_putc ( char c ){ UART_485_busy (); RA4 = 1; __delay_us (100); while (! TRMT ) continue ; TXREG = c ; __delay_ms (5); RA4 = 0; } char UART_485_getc ( void ) { while (! RCIF ) continue ; return RCREG ; } Prof. Luis Araujo Microprocesadores uart 485.c void UART_485_busy ( void ) { unsigned char i ; for ( i = 0; i < 200; i ++) { if ( RB2 ) i = 0; else __delay_us (50); } } Prof. Luis Araujo Microprocesadores