Monday, December 16, 2013

Comunicación Serial (UART)

Los PIC utilizan, entre otros, dos modos de transmisión serie:

  • El puerto serie síncrono (SSP).
  • La interfaz de comunicación serie (SCI) o receptor transmisor serie síncrono-asíncrono universal (USART).

El SSP se suele utilizar en la comunicación con otros microcontroladores o con periféricos. Las dos interfaces de trabaja son:

  • Interfaz serie de periféricos (SPI): desarrollada por Motorola para la comunicación entre microcontroladores de la misma, o diferente familia en modo maestro-esclavo; full-duplex.
  • Interfaz Inter-circuitos (I2C):Interfaz desarrollada por Philips, con una gran capacidad para comunicar microcontroladores y periféricos, half-duplex.

La configuración USART (transmisor-receptor serie síncrono-asíncrono universal), también conocido SCI (Interfaz de Comunicación Serie), permite la comunicación con un ordenador trabajando en modo full-duplex asíncrono o con periféricos trabajando en modo half-duplex. En general, pueden trabajar de dos formas:

  • Asincrono (full-duplex).
  • Sincrono (half-duplex).

Otros tipos de comunicación soportados por los PIc son: 1-Wire bus, LIN (Local Interconnect Network),USB(Universal Serial Bus), el CAN (Controller Area Network) y Ethernet

Figura 1.- UART - Diagrama a bloques simplificado.

Algunos PIC disponen del modulo de comunicación serie USART/SCI, tal vez el más utilizado entre los módulos de interfaz serie. La principal función del USART es la de transmitir o recibir datos en serie. Esta operación puede dividirse en dos categorias: síncrona o asíncrona. La transmisión síncrona utiliza una señal de reloj y una linea de datosl mientras que en la transmisión asíncrona no se envía la señal de reloj, por lo que el emisor y el receptor deben de tener relojes con la mismamfrecuencia y fase. Cuando la distancia entre el emisor y el receptor es pequeña se suele utilizar la transmisión síncrona, mientras que para distancias mayores se utiliza la transmisión asíncrona.

El USART puede transmitir o recibir datos serie. Puede transferir tramas de satos de 8 o 9 bits por transmisión y detectar errores de transmisióm. Tambien puede generar interrupciones cuando se produce una recepción de datos o cuando la transmisión ha sido completada.

Algunos PIC tienen un USART direccionable o AUSART (Addresable USART) que utiliza el noveno bit de datos para distinguir entre la recepción de datos o de dirección. En algunos PIC se ha mejorado el modulo USART dando lugar al EUSART o USART mejorado, el cual permite la detección automatica de baudios, el despertar automatico al recibir la señal de sincronismo o la transmisión del caracter break de 12 bits, permitiendo su utilización en sistemas de redes de interconexión local (bus LIN). Basicamente la transmision serie consiste en enviar los datos bit a bit a traves de una linea comun en periodos de tiempos fijos, dando lugar a la llamada velocidad de transmisión o número de bits enviados por segundo (baudios). Tanto el emisor como el receptor poseen registros de desplazamiento para realizar la comunicación. Los bits estan codificados en NRZ (nivel alto:1, nivel bajo:0), NRZI (cambio de nievl:1, sin cambio de nivel:0)

La gran mayoría de los sistemas de comunicación de datos digitales actuales utilizan la comunicación en serie, debido a las grandes ventajas que representa esta manera de comunicar los datos:

  • Económica Utiliza pocas líneas de transmisión inclusive puede usar sólo una línea.
  • Confiable Los estándares actuales permiten transmitir datos con bits de paridad y a niveles de voltaje o corriente que los hacen poco sensibles a ruido externo. Además por tratarse de información digital, los cambios en amplitud de las señales (normalmente causadas por ruido) afectan muy poco o nada a la información.
  • Versátil No está limitada a usar conductores eléctricos como medio de transmisión, pudiendo usarse también: fibra óptica, aire, vacío, etc. Además el tipo de energía utilizada puede ser diferente: luz visible, infrarroja, ultrasonido, pulsos eléctricos, radio frecuencia, microondas, etc.

Una gran cantidad de periféricos se comunican actualmente en serie con una micro computadora: líneas telefónicas, terminales remotas, unidades de cassette magnético, el ratón, teclados, etc.

Esquematico

Concrete

Comunicación Serial (UART)[Emisor Firmware "Emisor.h"]

#include <18F2520.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=8MHz)
#use rs232(baud=115200,UART1,stream=Emisor)

Comunicación Serial (UART)[Emisor Firmware "Emisor.c"]

#include 

void Enviar(){
int i;
   for(i = 0; i < 10; i ++){
      fputc(i,Emisor);
      delay_ms(1000);
   }
}

void Mensaje(){
char Msj[64] = "Hola Mundo!";
int i;
   for(i = 0; i < sizeof(Msj); i ++){
      fputc(Msj[i], EMisor);
   }
}

void main()
{
   while(TRUE)
   {
      //TODO: User Code
      //Enviar();
      Mensaje();
      delay_ms(2000);
   }

}

Comunicación Serial (UART)[Receptor Firmware "Receptor.h"]

#include <18LF2520.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=8MHz)
#use rs232(baud=115200,UART1,stream=Receptor)

Comunicación Serial (UART)[Receptor Firmware "Receptor.c"]

#include 

#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_A0
#define LCD_DATA5 PIN_A1
#define LCD_DATA6 PIN_A2
#define LCD_DATA7 PIN_A3

#include 

int i;
char Msj[64];
char Data;


void Leer(){
do{
   Data = fgetc(Receptor);
   if(Data == '\0'){
      break;
   }
   else{
   Msj[i] = Data;
   i++;
   }
}
while(Kbhit(Receptor));   
}

void Limpiar(char *var){
   int i = 0;
   while(var[i] != '\0'){
      var[i] = '\0';
      i ++;
   }
}

#INT_RDA
void  RDA_isr(void) 
{
   //i = fgetc(Receptor);
   //lcd_putc("\f");
   Leer();
}


void main()
{

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   lcd_init();

   while(TRUE)
   {
      //TODO: User Code
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%s",Msj);
      Limpiar(Msj);
   }
}
If you like our work in Jeal's Blog just subscribe yourself. Get our posts in your RSS reader or by email.
Written by Jefferson GoVa

Ingeniero en electronica con aficiones a escribir y compartir todo aquello que le llama la atencion o que su curiosidad atrapa..

#Curioseando #Perdiendoeltiempo #sinnadamejorquehacer.

1 comment:

  1. hola, una consulta yo tengo implementado el siguiente codigo, pero al simular en proteus, el do while de la interrupcion RDA solo me esta capturando el valor del caracter que llega, la variable data se esta actualizando pero no se adiciona a la variable cadena, es decir no se esta juntando los caracteres en el array cadena. podrias ayuarme con esta duda por favor, puedo enviarte el codigo y el diagrama en proteus.

    #include <16f877a.h>
    #include
    #include
    #fuses NOWDT,HS,NOLVP
    #use delay(clock=10M)

    #use RS232(baud=9600,XMIT=PIN_C6,RCV=PIN_C7,stream=receptor)

    #bit RB0=0x06.0
    #bit RB1=0x06.1
    #bit RC3=0x07.3
    #bit RC4=0x07.4
    #bit RC7=0x07.7

    int i;
    int const length=10;
    char data;
    char cadena[length];
    short flagcomand=0;
    signed int16 p=0;

    #int_RDA
    void RDA_isr(void)
    {
    do
    {
    data=fgetc(receptor);
    if(data=='\0')
    {
    break;
    }
    else
    {
    cadena[i]=data;
    i++;
    }
    }while(kbhit(receptor));
    flagcomand=1;
    }


    void limpiar_buffer()
    {
    int j;
    for(j=0;jel ciclo de trabajo sera de 0-255
    set_timer2(0);
    set_pwm1_duty(0);
    enable_interrupts(INT_RDA);
    enable_interrupts(INT_EXT); //habilito interrupcion RB0
    ext_int_edge(L_TO_H); //configuro interrupcion por flanco de subida
    enable_interrupts(GLOBAL); // habilito interrupcion global


    while(TRUE)
    {
    //gets(valorRec);
    c=cadena[0];
    if(flagcomand==1)
    {
    flagcomand=0;
    switch(c)
    {
    case 's':
    {
    //printf("%3Lu",p);
    //putc(p);
    //printf("%3u",pv);
    //delay_ms(500);
    break;
    }
    case 'i':
    {
    RC3=0;
    RC4=1;
    break;
    }
    case 'd':
    {
    RC3=1;
    RC4=0;
    break;
    }
    default:
    {
    d=atoi(cadena);
    set_pwm1_duty(d);
    //putc(p);
    //printf("%3Lu",p);
    break;
    }
    }
    limpiar_buffer();
    }
    }

    }

    ReplyDelete