Autor Tema: Problemas para recibir datos por la UART  (Leído 3531 veces)

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

Desconectado skull7

  • PIC10
  • *
  • Mensajes: 3
Problemas para recibir datos por la UART
« en: 07 de Diciembre de 2011, 19:31:00 »
Bueno antes k nada hola a todos, soy novato en la programacion, simulacion y no se diga del uso de dsPIC, a duras penas puedo con la configuracion de los pines y de los bites (cosa k me cuesta trabajo distinguir)...

Yendo a mi duda, he realizado un codigo k segun lo k investigue (manuales, datasheet y foros) en teoria debe recibir y transmitir un dato a la vez, pero no lo he logrado, la transmision parece k si funciona puesto k hago una simulacion con el Stimulus (k por cierto lo estoy haciendo en lenguaje C con el mplab), para ahorrarme algunos problemillas la configuracion del oscilador y por si llegase a ocupar algun PORT los configure con el VDI y el cual me genera otro codigo y ese lo ejecuto como una funcion donde lo necesito....

Mi duda sobre todo esto es, k estoy haciendo mal?? como lo menciona el manual de la UART para dsPIC33F configure el codigo de manera k reciba los datos, no me genera error la compilacion, pero al momento de realizar las pruebas con el Stimulus me genera este error

UART-W0002: Read attempted from an Empty FIFO buffer, invalid data

El Stimulus me sirve para darle funcionamiento virtual a los pines k usare en la realidad asi k lo configuro de manera k U1RXREG reciba el dato "1", sin embargo cuando ejecuto el codigo me tira el error antes mencionado, no se si me falte mencionar algun bit en el codigo o k pedo, pero ya me bloquee por completo, les dejo anexo el codigo y me gustaria leer opiniones al respecto o si alguien conoce alguna manera mas simple....

Bueno gracias por leer mi duda....

Código: [Seleccionar]
//nueva prueba de configuracion del UART
#include <p33fj256gp710.h>
#include <stdio.h>

//crear interrupciones  Interrup Enable Control IC
void initUART1()
{
VisualInitialization();
//configuracion de la velocidad de transmision
U1BRG = 45; // oscilador a 7 Mhz, 9600 Baud
//configuracion de los bits del U1MODE modo de registro
U1MODEbits.UARTEN=1; //bit 15 habilitacion de todos los pines del UART1
//U1MODEbits.Unimplemented; //bit 14
U1MODEbits.USIDL=0; //bit 13 continua operando en modo IDLE
U1MODEbits.IREN=0; //bit 12 IREN deshabilitado
U1MODEbits.RTSMD=1; //bit 11 pin U1RTS en modo simple
//U1MODEbits.Unimplemented;//bit 10
U1MODEbits.UEN=0; //bit 9 y 8, pines U1TX y U1RX habilitados;
//los pines U1CTS y U1RTS/BCLK son controlados por los puertos de cierre
U1MODEbits.WAKE=1; //bit 7 UART1 continuara muestreando el pin U1RX;
U1MODEbits.LPBACK=0; //bit 6 modo bucle es deshabilitado
U1MODEbits.ABAUD=0; //bit 5 medicion de la velocidad de transmision deshabilitada o completa
U1MODEbits.URXINV=0; //bit 4 U1RX Idle es 1
U1MODEbits.BRGH=0; //bit 3 Genera 16 clocks por periodo de bit (modo estandar)
U1MODEbits.PDSEL=0; //bit 2 y 1 dato de 8 bits, no paridad
U1MODEbits.STSEL=0; //bit 0 bit de parada en 1
//configuracion de los bits del U1STA estatus y control de registros del UART1
U1STAbits.UTXISEL0=0; //bit 15, 13 interrumpe cuando un caracter es transferido al registro de desplazamiento
U1STAbits.UTXINV=0; //bit 14 como IREN=0 el estado Idle es 1
//U1STAbits.Unimplemented; //bit 12
U1STAbits.UTXBRK=0; //bit 11 sincronizacion de la transmision deshabilitada o completada
U1STAbits.UTXEN=1; //bit 10 transmision habilitada, pin U1TX es controlado por UART1
U1STAbits.UTXBF=0; //bit 9 la transmision del buffer no esta llena (solo lectura)
U1STAbits.TRMT=0; //bit 8 la transmision del registro de desplazamiento no esta vacia (solo lectura)
U1STAbits.URXISEL=0; //bit 7 y 6 el buffer recibe uno o mas caracteres
U1STAbits.ADDEN=0; //bit 5 el modo de deteccion de direccion esta deshabilitada
U1STAbits.RIDLE=0; //bit 4 el receptor es activo
U1STAbits.PERR=0; //bit 3 Error de paridad no es detectado
U1STAbits.FERR=0; //bit 2 error de framing no es detectado
U1STAbits.OERR=0; //bit 1 recibe el buffer no desbordado
U1STAbits.URXDA=1; //bit 0 recibe el buffer vacio
IFS0bits.U1RXIF= 0; //-Clear the Recieve Interrupt Flag
IEC0bits.U1RXIE= 1; //-Enable Recieve Interrupts
IPC2bits.U1RXIP=7; //Interrupt Rx Mayor prioridad
}

void initRecep()
{
char c;
while ( U1STAbits.URXDA); // wait while Tx buffer full
c=U1RXREG;
}
void initTrans () //Funcion para transmision de datos
{
char c;
c=U1RXREG;
//c='c';
while ( U1STAbits.UTXBF); // wait while Tx buffer full
U1TXREG = c;
}
int main (void)
{
initUART1 (); //inicia configuracion del UART1
initRecep();
initTrans();
return (0);
}


Este es el codigo k me genera el VDI para configurar el oscilador y todas las demas funciones del dsPIC, bueno las k ocupe, es lo mismo k lo k he visto en los ejemplo donde en el mismo codigo principal generan los datos de los puertos y eso, pero como soy novato se lo deje al mplab encargarse de ello, cabe mencionar k este codigo no me genera problemas:

Código: [Seleccionar]
; Initialization Code for dsPIC33FJ256GP710, Family: GP control, Package: 100-Pin TQFP 100pins

.include "p33FJ256GP710.inc"



; Filter Controls used to Generate Code:

; POR Match Filter OFF

; Provisioned Feature Filter ON

; Masks are Ignored and uses UnMasked Register Writes

.GLOBAL _VisualInitialization

; Feature=fuses - fuses (DCR) configuration
config __FGS, 0x803F
config __FOSCSEL, 0x8038
config __FOSC, 0x803F
config __FWDT, 0x803F
config __FPOR, 0x803F

.text

_VisualInitialization:

; Feature=Interrupts - Disable Interrupts during configuration
CLR IFS0
CLR IFS1
CLR IFS2
CLR IFS3
CLR IFS4
CLR IEC0
CLR IEC1
CLR IEC2
CLR IEC3
CLR IEC4

; Feature=Reset - Reset configuration
MOV #0x0503, W0
MOV W0, RCON

; Feature=A2D - Force code
MOV #0xFFFF, W0
MOV W0, AD1PCFGH
MOV #0xFFFF, W0
MOV W0, AD1PCFGL
MOV #0xFFFF, W0
MOV W0, AD2PCFGL

; Feature=NVM - NVM configuration - not implemented

; Feature=Oscillator - Oscillator configuration
CLR.B W0

MOV.B #0x78, W1

MOV.B #0x9A, W2

MOV.W #OSCCON, W3

MOV.B W1, [W3+1]

MOV.B W2, [W3+1]

MOV.B W0, [W3+1]
CLR.B W0

MOV.B #0x46, W1

MOV.B #0x57, W2

MOV.B W1, [W3+0]

MOV.B W2, [W3+0]

MOV.B W0, [W3+0]
MOV #0x3040, W0
MOV W0, CLKDIV
MOV #0x0030, W0
MOV W0, PLLFBD
CLR OSCTUN

; Feature=CPU - CPU register configuration
CLR SR
CLR SR
CLR W0
CLR W1
CLR W2

; Feature=required - Interrupt flags cleared and interrupt configuration
MOV #0x4444, W0
MOV W0, IPC0
MOV #0x4444, W0
MOV W0, IPC1
MOV #0x4444, W0
MOV W0, IPC2
MOV #0x0444, W0
MOV W0, IPC3
MOV #0x4044, W0
MOV W0, IPC4
MOV #0x4444, W0
MOV W0, IPC5
MOV #0x4444, W0
MOV W0, IPC6
MOV #0x4444, W0
MOV W0, IPC7
MOV #0x4444, W0
MOV W0, IPC8
MOV #0x4444, W0
MOV W0, IPC9
MOV #0x4444, W0
MOV W0, IPC10
MOV #0x4404, W0
MOV W0, IPC11
MOV #0x4444, W0
MOV W0, IPC12
MOV #0x4444, W0
MOV W0, IPC13
MOV #0x4004, W0
MOV W0, IPC14
MOV #0x0044, W0
MOV W0, IPC15
MOV #0x0440, W0
MOV W0, IPC16
MOV #0x4444, W0
MOV W0, IPC17
CLR INTCON1
CLR INTCON2

; Feature=CPU - CPU register configuration
CLR SR
CLR SR
CLR W0
CLR W1
CLR W2

; Feature=Interrupts - enable interrupts
CLR IEC0
CLR IEC1
CLR IEC2
CLR IEC3
CLR IEC4

return

Desconectado skull7

  • PIC10
  • *
  • Mensajes: 3
Re: Problemas para recibir datos por la UART
« Respuesta #1 en: 07 de Diciembre de 2011, 19:39:56 »
Olvide mencionar el oscilador esta trabajando con el interno a 7.37Mhz me parece, no cambie la frecuencia pork el error k me genera teoricamente en la transmision de datos a 9600bd es muy baja