Autor Tema: Manejo de puerto UART PIC24  (Leído 1980 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado molecarne

  • PIC10
  • *
  • Mensajes: 5
Manejo de puerto UART PIC24
« en: 25 de Agosto de 2011, 12:39:39 »
Buenos dias gente! Escribo por aca porq actualmente me encuentro realizando un proyecto en donde necesito comunicar una PC con un PIC por el puerto serial; he desarrollado un codigo de acuerdo a diversos materiales que he leido en el foro pero aun asi no me funciona! La funcion del codigo es que yo envie una letra cualquiera y me responda la letra "U". Desde un programa estoy enviando dicha letra y siempre me responde el codigo 3F ("?" en ASCII). La funcion principal del codigo es recibir una letra por el puerto uart 2 (pines 49 y 50 del pic24fj64ga010), el pic la interpreta y realiza una accion en especifico y devuelve la letra "U" como simbolo de q todo esta bien.

Estoy utilizando MPLAB C30, estoy agregado solo el "archivo.c" q contiene el codigo en Source Files y el "24FJ64GA010.gld" en Linker Script, compila correctamente.

Me gustaria si no es mucha molestia que le echaran un ojo a mi codigo y q me pudieran dar una recomendacion que me ayude a ver q error pueda haber tanto en el procedimiento q estoy realizando como en el codigo q tengo.
Código: [Seleccionar]
/* ---------------------------------------------------------------------------*/

#include <p24fj64ga010.h>
#include <uart.h>

/* Configurar Osilador Primario */

_CONFIG1 (JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1)
_CONFIG2 (FNOSC_PRI & OSCIOFNC_OFF & POSCMOD_XT)

/* ---------------------------------------------------------------------------*/
/*                      DEFINICION DE CONSTANTES                              */

#define  BRATE    46 /*9600 Bd (BREGH=1) */
#define  U_TX     0x0400 /* Habilitar Tx, Clear Flags */

/* Habilitacion de UART, BREGH=1, 1-Stop, No Parity                           */

#define U_ENABLE  0x8008

/* -----------------------------------------------------------------------------
          Comunicacion Serial Asincrona entre Modulo IP y Control
               del Sistema Emulador de Fallas Telefonicas                     
------------------------------------------------------------------------------*/

// Espera mientras UART2 se encuentra ocupado

char BusyUART2(void)
{
   return(!U2STAbits.TRMT);
}

// Cerrar UART2

void CloseUART2(void)
{
   U2MODEbits.UARTEN = 0;
   IEC1bits.U2RXIE   = 0;
   IEC1bits.U2TXIE   = 0;
   IFS1bits.U2RXIF   = 0;
   IFS1bits.U2TXIF   = 0;
}

// Configurar UART2

void ConfigIntUART2(unsigned int config)
{
   /* Limpieza de bansderas IF */
   IFS1bits.U2RXIF = 0;
   IFS1bits.U2TXIF = 0;
   
   /* Configurar prioridad */
   IPC7bits.U2RXIP = 0x0007 & config;
   IPC7bits.U2TXIP = (0x0070 & config) >> 4;
   
   /* Habilitar Interrupciones */
   IEC1bits.U2RXIE = (0x0008 & config) >> 3;
   IEC1bits.U2TXIE = (0x0080 & config) >> 7;
}

// Esperar Buffer listo para Rx

char DataRdyUART2(void)
{
   return(U2STAbits.URXDA);
}

// Abrir UART2

void OpenUART2(unsigned int config1, unsigned int config2, unsigned int ubrg)
{
   U2BRG    =  ubrg;       /* Baud Rate */
   U2MODE   =  config1;    /* Operation Settings */ 
   U2STA    =  config2;    /* TX & RX Interrupt Modes */
}

// Lectura de UART2

unsigned int ReadUART2(void)
{
   if(U2MODEbits.PDSEL == 0)
      return (U2RXREG);
   else
      return (U2RXREG & 0xFF);
}

// Escribir en UART

void WriteUART2(unsigned int data)
{
   if (U2MODEbits.PDSEL == 0)
      U2TXREG = data;
   else   
      U2TXREG = data & 0xFF;
}   

/* ---------------------------------------------------------------------------*/
/*                         PROGRAMA PRINCIPAL                                 */
/* ---------------------------------------------------------------------------*/

int main (void)
{
   // Definicion de Variables
   
   char c;
   double i;
   
   // Inicializacion de Parametros, Configuracion de UART y Puertos de Salida
   
   CloseUART2();
   OpenUART2(U_ENABLE,U_TX,BRATE);
     
      TRISB=0;
      TRISC=0;
      TRISD=0;
      TRISE=0;
      TRISF=0;
      TRISG=0;
      PORTB=0;
      PORTC=0;
      PORTD=0;
      PORTE=0;
      PORTF=0;
      PORTG=0;
     
   //Inicio de Loop
   
   while (1)
   {
      // Reseteo de Salidas (Limpieza de Puertos)
      PORTB=0;
      PORTC=0;
      PORTD=0;
      PORTE=0;
      PORTF=0;
      PORTG=0;
     
      // Espera de Caracter en Buffer
      c = ReadUART2();
     
      // Recepcion de Caracter
      switch (c)
      {
         case 'A':   PORTG=8192;
                     break;
         case 'B':   PORTE=4;
                     break;
         case 'C':   PORTE=8;
                     break;
         case 'D':   PORTE=16;
                     break;
         case 'd':   PORTE=16;
     PORTA=64;
                     break;
         case 'E':   PORTE=1; 
     break;
case 'e':   PORTG=256;
     break;
         case 'F':   PORTE=2;   
                     break;
         case 'G':   PORTG=16384;   
                     break;
         case 'g':   PORTG=4096; 
                     break;
         case 'H':   PORTG=2; 
                     break;
         case 'h':   PORTG=2; 
     PORTE=4;
                     break;
         case 'I':   PORTG=1;   
                     break;
case 'J':   PORTA=64;
     break;
case 'K':   PORTA=128;
     break;
case 'k':   PORTD=4;
     break;
case 'L':   PORTD=8;
     break;
case 'M':   PORTD=4096;
     break;
case 'm':   PORTD=8192;
     break;
case 'O':   PORTD=16;
     break;
case 'o':   PORTD=32;
     break;
case 'P':   PORTD=64;
     break;
case 'p':   PORTD=128;
     break;
case 'Q':   PORTD=512;
     break;
case 'q':   PORTD=1024;
     break;
case 'R':   PORTD=2048;
     break;
case 'S':   PORTG=8;
     break;
case 'T':   PORTG=4;
     break;
case 'u':   PORTF=128;
     break;
case 'V':   PORTF=128;
     PORTG=8192;
     break;
case 'W':   PORTF=128;
     PORTF=64;
     break;
case 'X':   PORTF=256;
     break;
case 'Z':   PORTG=8192;
     PORTF=128;
     PORTF=64;
     break;
      }
     
   // Limpieza de Buffer y envio ACK
   
   while (BusyUART2());
   CloseUART2();
   OpenUART2(U_ENABLE,U_TX,BRATE);
   for(i=1;i<1000;i++);
   WriteUART2('U');
   
   }
}