Microprocesadores - Comunicación Serial Asíncrona

Anuncio
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
Documentos relacionados
Descargar