Autor Tema: PPS(peripheral pin select)... me gustan  (Leído 9665 veces)

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

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
PPS(peripheral pin select)... me gustan
« en: 30 de Julio de 2010, 01:03:33 »
Hola, en mi proyecto estoy utilizando un micro de muy pocos pines 28 para ser precisos, ante el agregado de componentes y funciones decayeron considerablemente la cantidad de pines hasta quedar libres unos 4 o 5, ninguno de ellos ligado a una interrupción externa. Mi proyecto necesitaba la posibilidad de interrumpir en cualquier momento el sistema, por lo tanto, en arquitecturas menos evolucionadas estaba destinado a combatir mi problema por software utilizando recursos y podía llegar al punto de tener que optar por otro micro con más pines. Aquí ingresan al juego los PPS como héroes, dicho a lo bruto los PPS son registros que permiten asignar funciones a pines que no las tenían por defecto, pero cualquier pin? cualquier modulo o función? bueno la respuesta es no a ambas preguntas. Primero no cualquier pin puede ser remapeado en el diagrama de pines se observa los que pueden ser remapeados destacados como Rpx donde x va de 1 a 15.


se observa por ejemplo que el pin 11 correspondiente a RB4 (Rp4) no esta asignado a ninguna interrupción externa y también puede verse que este micro contiene 3 interrupciones externas INT0, INT1 e INT2 solo la primera de estas tiene asignado un pin por defecto e incluso en la siguiente tabla puede verse que la función INT0 no permite PPS !  genial!


Bien, entonces si podemos asignar en cualquier punto del programa esa interrupción INT1 a RP4 sería perfecto. Pero un momento, no tenemos que pisar en la trampa y apresurarnos ya que quedan otros detalles por ver... 
 Los registros PPS se dividen en 2 grupos: uno para mapear periféricos de entrada y otro para mapear periféricos de salida. Los registro utilizados para configurar el mapeo de las entradas son los denominados RPINRx y Como en este caso el periférico es efectivamente de entrada, entonces, en este conjunto esta el registro que debemos afectar. En la siguiente imagen se ve una representacion de multlipexación que haría un registro de entrada PPS en este caso para UIRX

 

Pero si la idea era ligar la interrupción externa INT1 a RP4 el registro que debemos modificar sería RPINR0, del registro se observa que solo son necesarios 5 bits para asignar la interrupción a cualquiera de las Rpx. Para este caso Rp4 es decir debemos ubicar el dato 0x40 en dicho registro.


Pero hay que tener en cuenta que el registro de PPS no tiene prioridad sobre otros registros como por ejemplos TRIS... De esta manera nuestro pin tiene que estar correctamente configurado como entrada digital.
Uno podría pensar que el remapeo solo implica el cambio de un registro para que funcione, pero como esto puede hacerse en tiempo de ejecución, este simple hecho puede causar que nuestro micro se estrelle como en caída libre y termine en la hecatombe total. Por esta razón las PPS se encuentran bloqueadas por hardware normalmente y existen codigos de bloqueos y desbloqueos de los PPS. Existen ademas registros transparentes al usuario que monitorean por hardware el estado de estos registros de tal manera que si existen cambios no habilitados se resetea la cosa.

Como desbloqueamos?, tenemos que desbloquear el bits IOLOCK bit (OSCCON<6>) y borrarlo para permitir la escritura, para hacer eso necesitamos escribir una secuencia de codigos tal cual una caja de seguridad sobre OSCCON<7:0>.
 la secuencia exacta sería:
   
1. escribir 0x46 sobre OSCCON<7:0>.
2. escribir 0x57 sobre OSCCON<7:0>.
3. borrar IOLOCK para desbloquear o setear para bloquear.

No hay mucho más por decir, solo que C30 nos facilita el trabajo con funciones integradas para el proceso anterior __builtin_write_OSCCONL(value), de esta manera y sin más chachará vemos el código para ligar INT1 a RP4 como

Código: [Seleccionar]
.h

#define  desbloquearPPS      __builtin_write_OSCCONL(OSCCON & 0xbf)
#define  bloquearPPS         __builtin_write_OSCCONL(OSCCON | 0x40)


//------------------------------------------------------------------
.c

.....
.....


AD1PCFGL=0xFFFF;                         //todas salidas digitales
TRISBbits.TRISB4=1;                      //RB4 como entrada

desbloquearPPS;
RPINR0=0b0000010000000000;              //0000 0100 0000 0000 (0x40) ligamos interrupción externa INT1 a RP4->RB4 pin11
bloquearPPS;

// seteo de la interrupción externa INT1
INTCON2bits.INT1EP=1;  //sucede cada flanco descendente
IPC5bits.INT1IP=7;     // 111 máxima prioridad
IFS1bits.INT1IF=0;     //reset flag de interrupción   
IEC1bits.INT1IE=1;     //interrupción habilitada

.....
.....


Queda ahora como futuro próximo poner en práctica un periférico de salida. Sinceramente me he quedado encantado con este detalle y creo que todas las familias deberían contener estas cosas que convierten a nuestros micros mucho más versatiles.

Saludos
LAS MALVINAS SON ARGENTINAS!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PPS(peripheral pin select)... me gustan
« Respuesta #1 en: 30 de Julio de 2010, 01:45:26 »
Sí, Cerebro, realmente el PPS es una función estupenda.

Muchas gracias por tu generosa explicación.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: PPS(peripheral pin select)... me gustan
« Respuesta #2 en: 30 de Julio de 2010, 02:14:20 »
Genial!! Algo habia escuchado en el seminario de microchip del año pasado y me gusto mucho la idea. Pero no lo habia visto en la practica.
Ahora q me fijo, hay unos ejemplos para CCS, y yo tengo un par de pics con esta posibilidad. Le voy a echar mano a ver q tal :D
saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PPS(peripheral pin select)... me gustan
« Respuesta #3 en: 31 de Julio de 2010, 12:45:29 »
Muy utiles, esta utilidad me ha servido mucho en un par de proyectos  :-/


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: PPS(peripheral pin select)... me gustan
« Respuesta #4 en: 31 de Julio de 2010, 13:22:35 »
Vienen muy bien para el ruteo de las pcbs  8)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PPS(peripheral pin select)... me gustan
« Respuesta #5 en: 31 de Julio de 2010, 17:52:37 »
Sí que sí, es como en un pic24 que le pasé a Akena. Me resultó conveniente poner los pines RS232 RX y TX en los pines PGD y PGC del ICSP para usar directamente el Pickit2 sin MAX232  :D

Un aplauso a la gente de Microchip que nos consiente  :D  <3

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: PPS(peripheral pin select)... me gustan
« Respuesta #6 en: 02 de Agosto de 2010, 19:32:19 »
Hace poco que me enteré del PPS y me pareció genial

me parece que varios 18FxxJxx poseen PSS también.

saludos
« Última modificación: 01 de Septiembre de 2010, 22:37:19 por Cryn »
.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: PPS(peripheral pin select)... me gustan
« Respuesta #7 en: 08 de Agosto de 2010, 10:04:49 »
Hola cerebro,

Hace tiempo utilicé el PPS de PIC24FJ64GA002 para un mini-proyecto y la configuración me resultó poco intuitiva, así que escribí un par de librerías que permiten configurar los periféricos (modo de funcionamiento y pines) de una manera fácil. Creo que la técnica o paradigma de programación se llama "wired", como la que se usa con el arduino, pero tampoco estoy seguro...y da igual.

Código: [Seleccionar]
#include "SPIX.h"

PIN SPI1PINS[5] = {
{ &PORTB, 0x01<<0 }, // RB0 is MOSI1
{ &PORTB, 0x01<<1 }, // RB1 is MISO1
{ &PORTB, 0x01<<2 }, // RB2 is SCK1
{ &PORTB, 0x01<<3 }, // RB3 is SS1
};

int main(){

SPIX *pSPIX1;

pSPIX1 = SPIXConstruct( NEXT_FREE, SPIPINS1 );

SPIXOpen( pSPIX1,
ENABLE_SCK_PIN & ENABLE_SDO_PIN & SPI_MODE16_OFF & SPI_SMP_OFF & SPI_CKE_ON & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_HIGH & MASTER_ENABLE_ON & SEC_PRESCAL_1_1 &PRI_PRESCAL_1_1 ,
   FRAME_ENABLE_ON & FRAME_SYNC_OUTPUT & FRAME_POL_ACTIVE_LOW & FRAME_SYNC_EDGE_PRECEDE & FIFO_BUFFER_DISABLE ,
  SPI_ENABLE & SPI_IDLE_STOP & SPI_RX_OVFLOW_CLR
);

while(1){
SPIXPuts( pSPIX1, "Hello World! from SPI1" );
}
SPIXClose( pSPIX1 );
}

El miniproyecto con el codigo necesario se puede leer y descargar en este post: http://www.todopic.com.ar/foros/index.php?topic=27339.0
Adjunto aquí también los archivos necesarios para el driver.
Saludos
« Última modificación: 08 de Agosto de 2010, 10:07:05 por jgpeiro06 »

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: PPS(peripheral pin select)... me gustan
« Respuesta #8 en: 10 de Agosto de 2010, 09:27:05 »
Hola jgpeiro, muy interesante lo que has hecho me lo bajo y lo le pego una leída a ver si en el trayecto aprendo algo nuevo. Saludos!
LAS MALVINAS SON ARGENTINAS!

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: PPS(peripheral pin select)... me gustan
« Respuesta #9 en: 11 de Agosto de 2010, 19:47:45 »
Citar
Código: [Seleccionar]
#define  desbloquearPPS      __builtin_write_OSCCONL(OSCCON & 0xbf)
#define  bloquearPPS         __builtin_write_OSCCONL(OSCCON | 0x40)

Creo que estas macros ya estan definidas en el archivo PPS.h que viene con las "Peripheral Library" de microchip.

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: PPS(peripheral pin select)... me gustan
« Respuesta #10 en: 31 de Agosto de 2010, 21:59:08 »
Hola:

Precisamente que hablan del tema quizas me puedan hechar una mano.
Estoy trabajando al dspic33fjmc128mc802, aterioemente trabajaca con la familia 30f.
Estoy tratando de habilitar el puerto SPI a trabajar, para lo cual requiero de usar PPS.
Sin embargo no logro hacer que salga una sola señal del m[odulo. Nada de pulsos de reloj ni daots de salida de SDO.
Segun yo ya ha configurado todo correctamente y he deshabilitado IOlock pero aun asi no funciona. Me encuetro perdido espero me puedan ayudar.
El codigo es el siguiente:

Asociacion delos pines al modulo SPI:
Código: [Seleccionar]
TRISBbits.TRISB7=1; //las entradas deben ser señaladas tambien en el registro TRIS
__builtin_write_OSCCONL(OSCCON & ~(1<<6));
RPINR20bits.SDI1R=7; //SDI fijado a RP7 (entrada)
RPOR3bits.RP6R=8;// sck asociado a rp6
RPOR4bits.RP8R=7; //sdo asociado a rp8
__builtin_write_OSCCONL(OSCCON | (1<<6));


Configuracion del modulo SPI, aqui no deberia haber problemas pues es sumamente parecido al del la familia 30f:
Código: [Seleccionar]
void spi_init(void){
SPI1STATbits.SPISIDL=1;
SPI1CON1bits.DISSCK=0;
SPI1CON1bits.DISSDO=0;
SPI1CON1bits.MODE16=1;
SPI1CON1bits.SMP=0;
SPI1CON1bits.CKE=1;
SPI1CON1bits.SSEN=0;
SPI1CON1bits.CKP=0;
SPI1CON1bits.MSTEN=1;
SPI1CON1bits.SPRE=7;
SPI1CON1bits.PPRE=2;
SPI1CON2bits.FRMEN=0;
IFS0bits.SPI1IF=0;
IEC0bits.SPI1IE=1;
IPC2bits.SPI1IP=7;
}

Y finalmente para transmitir:
Código: [Seleccionar]
void espera(void){
while(SPI1STATbits.SPITBF){
}
}
//
void escritura_dac(int data){
data&=0x0FFF;
data|=0x3000;
ChipSelect=0;
PORTBbits.RB0++;
WriteSPI1(data);
espera();
}
//
void __attribute__((interrupt, no_auto_psv)) _SPI1Interrupt(void)
{
IFS0bits.SPI1IF=0;
dummy=ReadSPI1();
ChipSelect=1;
}
La verdad no logro entender que he hecho mal. Cualquier ayuda se las agradecere en gran medida.
Saludos

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PPS(peripheral pin select)... me gustan
« Respuesta #11 en: 31 de Agosto de 2010, 22:28:22 »
Yo he trabajado con los PIC24H, y en éste está el bit SPIEN para encender el módulo  :? No lo veo configurado por ningún lado


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: PPS(peripheral pin select)... me gustan
« Respuesta #12 en: 01 de Septiembre de 2010, 11:01:04 »
Suky tienes mucha razon. :-/
Me siento tan tonto por no haber visto ese detalle, creo que ya estaba muy casado. jeje

Muchisimas gracias por tu ayuda ya me estaba desesperando.

Saludos!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PPS(peripheral pin select)... me gustan
« Respuesta #13 en: 30 de Noviembre de 2010, 08:51:07 »
Gera, ¿lo probaste en CCS?
Yo he tenido un acercamiento al tema en C30 y era un rollo configurarlos, pero he mirado los ejemplos CCS y se ve tan sencillo que resulta sumamente tentador:

#pin_select U2TX = PIN_C9
#pin_select U2RX = PIN_C3

#pin_select INT1 = PIN_B4   // Setup External Interrupt INT_EXT1
#pin_select IC4  =  PIN_B8  // setup Input Capture  INT_IC4
#use rs232(baud=9600, UART2)

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: PPS(peripheral pin select)... me gustan
« Respuesta #14 en: 01 de Diciembre de 2010, 08:24:08 »
Buenas nocturno, lo habeis probado en CCS?? es que yo necesitaba la funcion esta porque tengo un 16F687 y necesito 5 interrupciones, y solo tengo 4 (las del RB7-RB4), me podeis hechar una mano...

Grácias


 

anything