Autor Tema: UARTS pps en dsPIC33EP256MU806  (Leído 1527 veces)

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

Desconectado mizzard

  • PIC10
  • *
  • Mensajes: 32
UARTS pps en dsPIC33EP256MU806
« en: 18 de Octubre de 2012, 12:52:06 »
Hola a todos, os comento el problema que tengo.
Estoy desarrollando un prototipo y para ello utilizo el micro dsPIC33EP256MU806, en el cual tengo que usar 4 UARTS por hardware.
Mi herramienta de desarrollo es PCWHD de CCS la versión  4.128
Según he estado leyendo este micro tiene la posibilidad de configurar los módulos internos a los pines que deseemos (PPS), pues bien, mirando la tabla de pines que se pueden configurar establezco el siguiente criterio:
Todas las UARTS: 115200, 8 bits sin paridad y bit de stop.
El micro está configurado para trabajar a 120 MHz a partir de un cristal de 4 MHz (probado y funciona correctamente).
UART1 -> xmit=PIN_D0, rcv=PIN_D8
UART2-> xmit=PIN_D1, rcv=PIN_D9
UART3 -> xmit=PIN_D2, rcv=PIN_D10
UART4 -> xmit=PIN_B7, rcv=PIN_B6
El caso es que no consigo hacerlo funcionar ya que no soy capaz de ir a la interrupcion del INT_RDA cuando detecte algo.
Adjunto el código diseñado:

<main.h>
Código: [Seleccionar]
#include <33EP256MU806.h>
//#device adc=10

#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES PUT128                   //Power On Reset Timer value 128ms
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PR_PLL
#FUSES HS
#FUSES ICSP1
#FUSES OSCIO
#FUSES CKSFSM  


// CONFIGURACIÓN DEL OSCILADOR
#WORD CLKDIV = 0x0744         //PLLPOST(6,7) - PLLPRE(0,1,2,3,4)

#BIT PLLPOST_0 = CLKDIV.6
#BIT PLLPOST_1 = CLKDIV.7

#BIT PLLPRE_0 = CLKDIV.0
#BIT PLLPRE_1 = CLKDIV.1
#BIT PLLPRE_2 = CLKDIV.2
#BIT PLLPRE_3 = CLKDIV.3
#BIT PLLPRE_4 = CLKDIV.4


#WORD PLLFBD = 0x0746         //PLLDIV(0,1,2,3,4,5,6,7,8)

#BIT PLLDIV_0 = PLLFBD.0
#BIT PLLDIV_1 = PLLFBD.1
#BIT PLLDIV_2 = PLLFBD.2
#BIT PLLDIV_3 = PLLFBD.3
#BIT PLLDIV_4 = PLLFBD.4
#BIT PLLDIV_5 = PLLFBD.5
#BIT PLLDIV_6 = PLLFBD.6
#BIT PLLDIV_7 = PLLFBD.7
#BIT PLLDIV_8 = PLLFBD.8


#WORD OSCCON = 0x0742         // OSWEN(0) - NOSC(8,9,10)

#BIT OSWEN = OSCCON.0

#BIT NOSC_0 = OSCCON.8
#BIT NOSC_1 = OSCCON.9
#BIT NOSC_2 = OSCCON.10

#use delay(clock=120000000)


// CONFIGURACIÓN MAPEO I/O
#BIT IOLOCK = OSCCON.6

// Entradas
#WORD RPINR18 = 0x06C4         // U1RXR(0,1,2,3,4,5,6)

#BIT U1RXR_0 = RPINR18.0
#BIT U1RXR_1 = RPINR18.1
#BIT U1RXR_2 = RPINR18.2
#BIT U1RXR_3 = RPINR18.3
#BIT U1RXR_4 = RPINR18.4
#BIT U1RXR_5 = RPINR18.5
#BIT U1RXR_6 = RPINR18.6

#WORD RPINR19 = 0x06C6         // U2RXR(0,1,2,3,4,5,6)

#BIT U2RXR_0 = RPINR19.0
#BIT U2RXR_1 = RPINR19.1
#BIT U2RXR_2 = RPINR19.2
#BIT U2RXR_3 = RPINR19.3
#BIT U2RXR_4 = RPINR19.4
#BIT U2RXR_5 = RPINR19.5
#BIT U2RXR_6 = RPINR19.6

#WORD RPINR27 = 0x06D6         // U3RXR(0,1,2,3,4,5,6)

#BIT U3RXR_0 = RPINR27.0
#BIT U3RXR_1 = RPINR27.1
#BIT U3RXR_2 = RPINR27.2
#BIT U3RXR_3 = RPINR27.3
#BIT U3RXR_4 = RPINR27.4
#BIT U3RXR_5 = RPINR27.5
#BIT U3RXR_6 = RPINR27.6

#WORD RPINR28 = 0x06D8         // U4RXR(0,1,2,3,4,5,6)

#BIT U4RXR_0 = RPINR28.0
#BIT U4RXR_1 = RPINR28.1
#BIT U4RXR_2 = RPINR28.2
#BIT U4RXR_3 = RPINR28.3
#BIT U4RXR_4 = RPINR28.4
#BIT U4RXR_5 = RPINR28.5
#BIT U4RXR_6 = RPINR28.6

// Salidas
#WORD RPOR0 = 0x0680         // RP64R(0,1,2,3,4,5) - RP65R(8,9,10,11,12,13)

#BIT RP64R_0 = RPOR0.0
#BIT RP64R_1 = RPOR0.1
#BIT RP64R_2 = RPOR0.2
#BIT RP64R_3 = RPOR0.3
#BIT RP64R_4 = RPOR0.4
#BIT RP64R_5 = RPOR0.5

#BIT RP65R_0 = RPOR0.8
#BIT RP65R_1 = RPOR0.9
#BIT RP65R_2 = RPOR0.10
#BIT RP65R_3 = RPOR0.11
#BIT RP65R_4 = RPOR0.12
#BIT RP65R_5 = RPOR0.13

#WORD RPOR1 = 0x0682         // RP66R(0,1,2,3,4,5) - RP67R(8,9,10,11,12,13)

#BIT RP66R_0 = RPOR1.0
#BIT RP66R_1 = RPOR1.1
#BIT RP66R_2 = RPOR1.2
#BIT RP66R_3 = RPOR1.3
#BIT RP66R_4 = RPOR1.4
#BIT RP66R_5 = RPOR1.5

#BIT RP67R_0 = RPOR1.8
#BIT RP67R_1 = RPOR1.9
#BIT RP67R_2 = RPOR1.10
#BIT RP67R_3 = RPOR1.11
#BIT RP67R_4 = RPOR1.12
#BIT RP67R_5 = RPOR1.13


#WORD TRISD = 0x0E30

#BIT TRISD_8 = TRISD.8
#BIT TRISD_0 = TRISD.0

// PUERTOS SERIE POR HARDWARE
#use rs232( stream = U1, xmit=PIN_D0, rcv=PIN_D8, baud=115200, parity=N, bits=8,errors)

//#use rs232(stream = U2, xmit=PIN_D1, rcv=PIN_D9, baud=115200, parity=N, bits=8,errors)

//#use rs232(stream = U3, xmit=PIN_D2, rcv=PIN_D10, baud=115200, parity=N, bits=8,errors)

//#use rs232(stream = U4, xmit=PIN_D3, rcv=PIN_D11, baud=115200, parity=N, bits=8,errors)

// PUERTOS SERIE POR SOFTWARE
#use rs232(stream = DEBUG, xmit=PIN_B7, rcv=PIN_B6, baud=115200, parity=N, bits=8)

<main.c>
Código: [Seleccionar]
#include <main.h>
#include <math.h>
#include <string.h>

#INT_RDA
void uart1_interrupt(void){
   fprintf(DEBUG,"A\r\n");
   clear_interrupt(INT_RDA);
}

#INT_RDA2
void uart2_Interrupt(void){
fprintf(DEBUG,"B\r\n");
clear_interrupt(INT_RDA2);
}

#INT_RDA3
void uart3_Interrupt(void){
fprintf(DEBUG,"C\r\n");
clear_interrupt(INT_RDA3);
}

#INT_RDA4
void uart4_Interrupt(void){
fprintf(DEBUG,"D\r\n");
clear_interrupt(INT_RDA4);
}




void main(){

      // CONFIGURACIÓN DEL OSCILADOR A 120 MHZ A PARTIR DE 4 MHZ DE CRISTAL
   //                     _      _             _                      -
   //                    |    M   |           |       (PLLDIV+2)       |
   // Fosc =    Fin    x | ------ | = Fin  x  | ---------------------- |
   //       (3-5.5MHz)   |  N1xN2 |           | (PLLPRE+2)x2(PLLPOST+1)|
   //                     -      -             -                      -
  
   // Indicamos uso oscilador principal XT/HS con PLL -> Fin = 4 MHz
   OSWEN = 1;

   NOSC_0 = 1;
   NOSC_1 = 1;
   NOSC_2 = 0;

   // PLLPRE=0  Luego N1=2
   PLLPRE_0 = 0;
   PLLPRE_1 = 0;
   PLLPRE_2 = 0;
   PLLPRE_3 = 0;
   PLLPRE_4 = 0;

   // PLLPOST=0  Luego N2=2
   PLLPOST_0 = 0;
   PLLPOST_1 = 0;

   // PLLDIV=118  Luego M=120
   PLLDIV_0 = 0;
   PLLDIV_1 = 1;
   PLLDIV_2 = 1;
   PLLDIV_3 = 0;
   PLLDIV_4 = 1;
   PLLDIV_5 = 1;
   PLLDIV_6 = 1;
   PLLDIV_7 = 0;
   PLLDIV_8 = 0;  

   // Estabilizo el oscilador
   delay_ms(500);

   // Desbloqueo del bit de seguridad
   IOLOCK = 0; 

   // Establecemos las conexiones modificando sólo los bits que nos interesan
   // UART1 RX1 -> PIN RPI72 (PIN_D8)
   U1RXR_0 = 0;
   U1RXR_1 = 0;
   U1RXR_2 = 0;
   U1RXR_3 = 1;
   U1RXR_4 = 0;
   U1RXR_5 = 0;
   U1RXR_6 = 1;
  
   TRISD_8 = 1;
  
   // UART1 TX1 -> PIN RP64 (PIN_D0)
   RP64R_0 = 1;
   RP64R_1 = 0;
   RP64R_2 = 0;
   RP64R_3 = 0;
   RP64R_4 = 0;
   RP64R_5 = 0;
  
   TRISD_8 = 0;
    
   // Bloqueamos el bit de seguridad
   IOLOCK = 1;  
   enable_interrupts(INT_RDA);
   delay_ms(3000);
   fprintf(DEBUG,"Arranco\r\n");

  

   while(true){
         //<----------- DEBUG
   fputc(0xAA,U1);
   fputc(0x01, U1);
   fputc(0x02, U1);
   fputc(0x0d, U1);
   fputc(0x0a,U1);
   delay_ms(1000);
//   fprintf(DEBUG,"NUM UARTS HW: %i\r\n",getenv("UART"));
   }
}

Como podeis ver lo he simplificado al máximo (preparo las 4 UARTS, pero solo configuro la 1). Tengo comprobado que al enviar la secuencia descrita en el main otro módulo responde (funciona OK), por lo que deberia entrar en la interrupcion (lo he simplificado para mostrar por debug como que entra, sin hacer tratamiento).
Solo lo he hecho en 1, porque considero que para las otras será mas de lo mismo.

El problema que tengo es que nunca entra en la interrupción y no se que más hacer. Me gustaría saber qué estoy haciendo mal porque ya llevo días y no se por donde continuar.

Cualquier idea será bienvenida!

Un abrazo a todos!
« Última modificación: 18 de Octubre de 2012, 12:54:51 por mizzard »


 

anything