UART
-
Upload
jefferson-santos -
Category
Documents
-
view
9 -
download
0
Transcript of UART
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
2
Comunicación Serial Asíncrona
3
Bit de Inicio
Bits de Datos
Bit de Paridad
Bit de Parada
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 ½ o 2
Modulo USART del PIC
• PIC16F877A, 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
4
TXSTA
5
TXSTA
6
Velocidad Comunicación
9
Velocidad Comunicación
10
Util_877a.c void UART_init(int bps)
{
TXIE = 0;
RCIE = 1;
PEIE = 1;
SPEN = 1;
CREN = 1;
SPBRG = ((int)(_XTAL_FREQ*1000/(16UL*(bps+1))));
BRGH = 1;
SYNC = 0;
TXEN = 1;
TX9 = 0;
RX9 = 0;
TRISC = 0x80;
}
14
Util_877a.c void UART_putc(char c)
{
while(!TXIF)
continue;
TXREG = c;
}
char UART_getc(void)
{
while(!RCIF)
continue;
return RCREG;
}
15
Comunicación Serial #include "pic.h"
#include "util_877a.h"
#include <stdio.h>
char text[20];
char kb, kbr, cont = 0;
void main()
{
LCD_init(LCD_4LSB | LCD_DATA_B | LCD_CONTROL_B |
LCD_RS_4 | LCD_EN_5);
KB_init(KB_DATA_D);
UART_init(9600);
// cod main
}
18
Comunicación Serial GIE = 1;
LCD_clear();
while(1)
{
kb = KB_get(KB_PRESS);
if(kb!='N')
{
UART_putc(kb);
}
__delay_ms(100);
}
}
19
Comunicación Serial void interrupt s()
{
if(RCIF)
{
kbr = UART_getc();
if(cont==15)
{
cont = 0;
LCD_clear();
}
else
cont++;
LCD_putc(kbr);
RCIF = 0;
}
}
20
Util_877a.c
33
void RS485_init(int bps)
{
TXIE = 0; RCIE = 1; PEIE = 1;
SPEN = 1; CREN = 1;
SPBRG = ((int)(_XTAL_FREQ*1000/(16UL*(bps+1))));
BRGH = 1;
SYNC = 0; TXEN = 1;
TX9 = 0; RX9 = 0;
TRISC = 0x80;
RC5 = 0;
__delay_ms(5);
}
Util_877a.c
34
void RS485_putc(char c)
{
RC5 = 1;
__delay_ms(5);
while(!TXIF)
continue;
TXREG = c;
__delay_ms(5);
RC5 = 0;
}
char RS485_getc(void)
{
while(!RCIF)
continue;
return RCREG;
}
Comunicación Serial RS485 #include "pic.h"
#include "util_877a.h"
#include <stdio.h>
char text[6], rtext[6];
char temp, temp_ant = 0, rtemp;
void main()
{
LCD_init(LCD_8B | LCD_DATA_B | LCD_CONTROL_C |
LCD_RS_0 | LCD_EN_1);
ADC_init(ADC_FOSC2 | ADC_RIGHT | ADC_A_RA0);
RS485_init(9600);
// cod main
}
36
Cod main LCD_clear();
LCD_gotoxy(0,0);
LCD_puts("local Temp=");
LCD_gotoxy(0,1);
LCD_puts("remot Temp=");
GIE = 1;
while(1)
{
// cod while
}
37
Cod while
temp = (char)(ADC_get(0)/100);
if(temp != temp_ant)
{
GIE = 0;
temp_ant = temp;
sprintf(text,"%d ",temp);
RS485_putc(temp);
LCD_gotoxy(12,0);
LCD_puts(text);
GIE = 1;
}
38