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. /* ---------------------------------------------------------------------------*/
#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');
}
}