Autor Tema: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(  (Leído 6710 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« en: 10 de Febrero de 2009, 16:09:28 »
Nueva Modificacion:

Tengo otro problema      :lol:

Ahora que ya tengo la transmision de caracteres funcionando correctamente, quiero que el programa reaccione ante la interrupción de Rx, pero como que no detecta nada, quizas sea por los registros, mmm no se, pero ahora funciona la transmision pero la recepcion no. ¿?... alguna sugerencia, podrian ver los registros, segun yo estoy activando lo necesario no se si faltara algo o por que no funcionara Rx.

El código es el siguiente:
Código: [Seleccionar]
#define FCY                     40000000    //Instruction Cycle Frequency
#define BAUDRATE          9600            //Baudios       
#define BRGVAL              ((FCY/BAUDRATE)/16)-1

/***************************FuncionTx******************************/
void putUART1( char c){
while ( U1STAbits.UTXBF); // wait while Tx buffer full
U1TXREG = c;
}

/**********************Interrupcion_Rx*****************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void){
TRISA = 0x0000;
PORTAbits.RA0 = 1;
putUART1('c');
}

/*****************Inicializar_UART********************************/

void InitUART1(){
TRISBbits.TRISB1=1;
TRISBbits.TRISB0=0;

RPOR0=3; //UTx en el RP0 (PB0) REMAPPABLE PIN
RPINR18bits.U1RXR0=1; //URx en el RP1 (PB1) REMAPPABLE PIN

    U1MODEbits.STSEL = 0; // 1-stop bit
    U1MODEbits.PDSEL = 0; // No Parity, 8-data bits
    U1MODEbits.ABAUD = 0; // Auto-Baud Disabled
    U1MODEbits.BRGH = 0;  // Low Speed mode
    U1BRG = BRGVAL; // BAUD Rate Setting
    U1STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmitted
    U1STAbits.UTXISEL1 = 0;
    IEC0bits.U1TXIE = 0; // Disenable UART Tx interrupt
    IFS0bits.U1RXIF    = 0; //-Clear the Recieve Interrupt Flag
IEC0bits.U1RXIE    = 1; //-Enable Recieve Interrupts
U1MODEbits.UARTEN = 1; // Enable UART
    U1STAbits.UTXEN = 1; // Enable UART Tx 
U1STAbits.URXISEL1 = 0;        //-Enable UART Rx                                 
IPC2bits.U1RXIP=7; //Interrupt Rx Mayor prioridad
}

/*****************************Main********************************/
int main (void){
   CLKDIVbits.PLLPRE=4; //Divisor PLL_1 por 6
   CLKDIVbits.PLLPOST=0; //Divisor PLL_2 por 2
   PLLFBD=128; //Multiplicador PLL por 130
   OSCTUN=0; //Frecuencia del FRC 7.37 MHz

TRISA = 0x0000;
PORTAbits.RA1 = 1;

InitUART1();

 while(1){
//esperando la interrupción de Rx
}
}

--------------------------------------------------------------------------------------------------------------------------------------------------

Hola yo de nuevo, gracias a ustedes ya eh estado haciendo mis primeros programas con el dsPIC, esta vez le toco el turno a la UART, pero me tope con un pequeño problema, lo que pasa es que configuro los registros para mandar un caracter a través de la UART pero el caracter que me llega en la terminal es diferente al que envío. No se exactamente que estará pasando, eh simplificado el programa a nivel que solo este mandando el mismo caracter en el main, y todavía no encuentro la falla.

Estoy trabajando con el MPLAB y con el ISIS de Proteus, al compilarlo no me marca ningun error y al correrlo en el isis si lo corre bien nadamas que los valores que llegan son otros...y el programa es el siguiente:


Código: [Seleccionar]
/*****************************dsPIC33FJ12MC202*********************/
/************************Programa para mandar un caracter**********/
/****************************a travez de la UART*******************/
/******************************************************************/
#include <P33FJ12MC202.h>
#define __33FJ12MC20_H
#include <libpic30.h>
//#include <math.h>

_FOSCSEL(1); //Oscilador FRC interno con PLL
_FOSC (195); //Osc primario desabilitado, Cambio reloj desabilitado

#define FCY               40000000  //Instruction Cycle Frequency
#define BAUDRATE          9600      //Baudios       
#define BRGVAL            ((FCY/BAUDRATE)/16)-1

/*****************Inicializar_UART********************************/

void InitUART1(){
RPOR0=3; //UTx en el RP0
RPINR18=1; //URx en el RP1

    U1MODEbits.STSEL = 0; // 1-stop bit
    U1MODEbits.PDSEL = 0; // No Parity, 8-data bits
    U1MODEbits.ABAUD = 0; // Auto-Baud Disabled
    U1MODEbits.BRGH = 0;  // Low Speed mode
    U1BRG = BRGVAL; // BAUD Rate Setting
    U1STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmitted
    U1STAbits.UTXISEL1 = 0;
    IEC0bits.U1TXIE = 0; // Disenable UART Tx interrupt
    U1MODEbits.UARTEN = 1; // Enable UART
    U1STAbits.UTXEN = 1; // Enable UART Tx 
}

/***************************Funcion********************************/
void putUART1( char c){
while ( U1STAbits.UTXBF); // wait while Tx buffer full
U1TXREG = c;
}

/*****************************Main********************************/
int main (void){
   CLKDIVbits.PLLPRE=4; //Divisor PLL_1 por 6
   CLKDIVbits.PLLPOST=0; //Divisor PLL_2 por 2
   PLLFBD=128; //Multiplicador PLL por 130
   OSCTUN=0; //Frecuencia del FRC 7.37 MHz

InitUART1();

 while(1){
putUART1('a');
putUART1('b');
}
}



« Última modificación: 11 de Febrero de 2009, 23:30:42 por FlyingVector »

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: UART en dsPIC33F
« Respuesta #1 en: 11 de Febrero de 2009, 00:09:24 »
hola, tal ves te falta agregar la librería <uart.h> donde habilitas a putuart1.

saludos.
control de movimiento

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F
« Respuesta #2 en: 11 de Febrero de 2009, 00:23:44 »

no,...  en este caso si estoy recibiendo caracteres en la terminal, por lo que asumo que la funcion putUART1 si esta sirviendo (la funcion esta en el programa, no es necesario llamar a uart.h).

Sospecho que es un problema con algo respecto a la velocidad de los baudios o de la velocidad del micro, ya que, si recibo 2 caracteres, y todo funciona (bueno casi), nadamas que los caracteres son diferentes a los que envio  :-)

mmm se supone que el micro esta corriendo a 40 mips...y la comunicacion es a 96 baudios....

¿que estara mal?  :? :? :?

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - Resuelto
« Respuesta #3 en: 11 de Febrero de 2009, 00:30:04 »


ahh ya... el problema esta resuelto, aclaro que el problema no era software, si no el hardware....

je  :-/ :-/ :-/ :-/ :-/

Gracias¡

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: UART en dsPIC33F - Resuelto
« Respuesta #4 en: 11 de Febrero de 2009, 03:23:48 »
¿Cuál era el problema hardware?

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: UART en dsPIC33F - Resuelto
« Respuesta #5 en: 11 de Febrero de 2009, 14:23:13 »
Si yo tambien quede con duda!
Control Automático, DSP & Microcontroladores

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - Resuelto
« Respuesta #6 en: 11 de Febrero de 2009, 14:29:58 »


El problema del "hardware" es que lo estaba probando con el proteus, y conectando el max232 pero nunca me di cuenta que el max232 invierte los voltajes, y los caracteres en la hyperterminal eran diferentes a los que yo mandaba... después cuando puse un osciloscopio y lo note, me metí a las opciones de la terminal y estaba la opción de invertir los voltajes para tx y rx, la seleccione y voilà.
 :mrgreen: :mrgreen: :mrgreen:

Gracias¡

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - Resuelto
« Respuesta #7 en: 11 de Febrero de 2009, 18:14:41 »

Tengo otro problema  :lol: :lol: :lol: :lol:

Ahora que ya tengo la transmision de caracteres funcionando correctamente, quiero que el programa reaccione ante la interrupción de Rx, pero como que no detecta nada, quizas sea por los registros, mmm no se, pero ahora funciona la transmision pero la recepcion no. ¿?... alguna sugerencia, podrian ver los registros, segun yo estoy activando lo necesario no se si faltara algo o por que no funcionara Rx.

El código es el siguiente:


Código: [Seleccionar]
#include <P33FJ12MC202.h>
#define __33FJ12MC20_H
#include <libpic30.h>
//#include <math.h>

_FOSCSEL(1); //Oscilador FRC interno con PLL
_FOSC (195); //Osc primario desabilitado, Cambio reloj desabilitado

#define FCY                     40000000    //Instruction Cycle Frequency
#define BAUDRATE          9600            //Baudios       
#define BRGVAL              ((FCY/BAUDRATE)/16)-1

/***************************FuncionTx******************************/
void putUART1( char c){
while ( U1STAbits.UTXBF); // wait while Tx buffer full
U1TXREG = c;
}

/**********************Interrupcion_Rx*****************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void){
TRISA = 0x0000;
PORTAbits.RA0 = 1;
putUART1('c');
}

/*****************Inicializar_UART********************************/

void InitUART1(){
TRISBbits.TRISB1=1;
TRISBbits.TRISB0=0;

RPOR0=3; //UTx en el RP0 (PB0) REMAPPABLE PIN
RPINR18bits.U1RXR0=1; //URx en el RP1 (PB1) REMAPPABLE PIN

    U1MODEbits.STSEL = 0; // 1-stop bit
    U1MODEbits.PDSEL = 0; // No Parity, 8-data bits
    U1MODEbits.ABAUD = 0; // Auto-Baud Disabled
    U1MODEbits.BRGH = 0;  // Low Speed mode
    U1BRG = BRGVAL; // BAUD Rate Setting
    U1STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmitted
    U1STAbits.UTXISEL1 = 0;
    IEC0bits.U1TXIE = 0; // Disenable UART Tx interrupt
    IFS0bits.U1RXIF    = 0; //-Clear the Recieve Interrupt Flag
IEC0bits.U1RXIE    = 1; //-Enable Recieve Interrupts
U1MODEbits.UARTEN = 1; // Enable UART
    U1STAbits.UTXEN = 1; // Enable UART Tx 
U1STAbits.URXISEL1 = 0;        //-Enable UART Rx                                 
IPC2bits.U1RXIP=7; //Interrupt Rx Mayor prioridad
}

/*****************************Main********************************/
int main (void){
   CLKDIVbits.PLLPRE=4; //Divisor PLL_1 por 6
   CLKDIVbits.PLLPOST=0; //Divisor PLL_2 por 2
   PLLFBD=128; //Multiplicador PLL por 130
   OSCTUN=0; //Frecuencia del FRC 7.37 MHz

TRISA = 0x0000;
PORTAbits.RA1 = 1;

InitUART1();

 while(1){
//esperando la interrupción de Rx
}
}




Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #8 en: 11 de Febrero de 2009, 20:19:21 »
No estas habilitando la interrupción ...

Te falto:

Código: C
  1. IEC0bits.U1RXIE    = 1;
  2. IFS0bits.U1RXIF    = 0;

Y al principio de la rutina de servicio de la interrupción colocar:

Código: C
  1. IFS0bits.U1RXIF    = 0;
Control Automático, DSP & Microcontroladores

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #9 en: 11 de Febrero de 2009, 20:59:41 »
No estas habilitando la interrupción ...

Te falto:

Código: C
  1. IEC0bits.U1RXIE    = 1;
  2. IFS0bits.U1RXIF    = 0;

Y al principio de la rutina de servicio de la interrupción colocar:

Código: C
  1. IFS0bits.U1RXIF    = 0;


IEC0bits.U1RXIE    = 1;   
IFS0bits.U1RXIF    = 0;

Si estan en el codigo, si te fijas estan en la funcion initUART1(), aclaro que el codigo del que hablo es el segndo que puse, ya que el de hasta arriba fue uno anterior que solo transmitia.

saludos.



Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #10 en: 12 de Febrero de 2009, 17:20:35 »

yo de nuevo... mmm todavía no puedo activar la recepción, de hecho ya probé sin interrupción y tampoco, de ninguna manera me funciona Rx, solo la transmisión esta funcionando correctamente.

Al parecer de ninguna manera me detecta IFS0bits.U1RXIF , siempre esta en 0

Realmente no se que pueda estar fallando...mm :( :(


Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #11 en: 12 de Febrero de 2009, 19:58:47 »
Estas recibiendo almenos 1 caracter o completamente ninguno ?

No me podrias mostrar el circuito completo de lo que estás haciendo?

Apenes llegue a mi casa pondre un ejemplo que si funciona.

Control Automático, DSP & Microcontroladores

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #12 en: 12 de Febrero de 2009, 20:11:58 »
Estaría genial que lo hicieras... para comparar....


Por cierto entre los avances jeje, ya esta funcionando la recepción, aunque no me explico el porque,  pero al cambiar el registro de Rx del pin como por 3° vez , el "remappable pin" lo cambie al rp5,


de 1:
Código: [Seleccionar]
RPINR18bits.U1RXR0=1;   
a 5:
Código: [Seleccionar]

RPINR18bits.U1RXR0=5;

Y curiosamente todo funciono bien...mmm ahora ya active la interrupción y también funciona.... aunque tengo un "pequeño" problemita, ya que solo entra como 5 veces la interrupción de Rx, después ya no vuelve a entrar... :x, espero terminar con estos problemas ya jejejejeje

----------------------------------------------------------------------------------------------------------------------------
 :shock: :shock: :shock: :shock: :shock: :shock:

Ya esta funcionando todo bien.... me sorprende el hecho de que al cambiar una parte en el programa....

En la interrupcion solamente le agregue un renglon, que fue:

Código: [Seleccionar]
PORTA=U1RXREG;
Y ya no se trabo en ningun momento, como es que esas pequeñas partes de codigo como esta, y la del remappable pin, nos hacen la vida tan dificil jejejeje..... anuque se siente bien que todo funcione....

habra sido el Proteus? el MPLAB? o algo que desconosco?... el origen de estos problemas  :? :? :D :D

« Última modificación: 12 de Febrero de 2009, 20:23:11 por FlyingVector »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #13 en: 12 de Febrero de 2009, 20:51:34 »
La recepción tiene un buffer de 4 bytes (si bien recuerdo!) ... si no lees los datos del buffer y este se llena ... se produce un error ...

Control Automático, DSP & Microcontroladores

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
« Respuesta #14 en: 12 de Febrero de 2009, 22:04:04 »

Pues quite la instrucción de leer el dato de la UART y nada, todo funciono bien... y se supone que quedo como cuando no funcionaba...como puede ser eso? jeje es lo que me desconcierta un poco.


 

anything