TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: FlyingVector en 10 de Febrero de 2009, 16:09:28

Título: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: FlyingVector 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');
}
}



Título: Re: UART en dsPIC33F
Publicado por: Renatox_ 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.
Título: Re: UART en dsPIC33F
Publicado por: FlyingVector 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?  :? :? :?
Título: Re: UART en dsPIC33F - Resuelto
Publicado por: FlyingVector 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¡
Título: Re: UART en dsPIC33F - Resuelto
Publicado por: Nocturno en 11 de Febrero de 2009, 03:23:48
¿Cuál era el problema hardware?
Título: Re: UART en dsPIC33F - Resuelto
Publicado por: blackcat en 11 de Febrero de 2009, 14:23:13
Si yo tambien quede con duda!
Título: Re: UART en dsPIC33F - Resuelto
Publicado por: FlyingVector 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¡
Título: Re: UART en dsPIC33F - Resuelto
Publicado por: FlyingVector 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
}
}



Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: blackcat 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;
Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: FlyingVector 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.


Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: FlyingVector 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 :( :(

Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: blackcat 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.

Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: FlyingVector 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

Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: blackcat 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 ...

Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: FlyingVector 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.
Título: Re: UART en dsPIC33F - OTRO PROBLEMA--EN Rx :-(
Publicado por: RiBerZerO en 18 de Mayo de 2009, 06:36:07
Creo que ya paso un buen de rato de que pusiste este post, pero creo saber que es lo que falla, yo realize este programa e igual no me servia con la interrupción. lo que hice fue quitar la optimización del C30 en Project-->Build option-->temp_6014.c en mi caso en el tuyo solo cambia por el nombre de tu proyecto igual esto te sirva o a quien utilize esta configuración :-/

a y tambien se tiene que leer el valor en la interrupcion para que el buffer quede vacio