Hola a todos, estos ultimos dias he estado renegando con esta caracteristica tan interesante que traen los ultimos pics que han venido saliendo: la PPS. Por medio de esta prestacion, podemos seleccionar por que puerto tendra salida o entrada nuestra uart, spi, entre otros modulos que por lo general vienen con pines fijos. Esto abre una gran flexibilidad en el diseño!.
Ahora bien, estoy teniendo problemas para usar esto. Dejo aqui mi codigo (en CCS):
El encabezado:
#include <24FJ64GA004.h>
#include <stdlib.h>
#include <string.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOJTAG //JTAG disabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES ICSP1 //ICD uses PGC1/PGD1 pins
#FUSES NOIOL1WAY //Allows multiple reconfigurations of peripheral pins
#FUSES NOWINDIS //Watch Dog Timer in Window mode
#FUSES WPOSTS16 //Watch Dog Timer PostScalar 1:32768
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES PR //Primary Oscillator
#FUSES NOCKSFSM //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES NOOSCIO //OSC2 is clock output
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES I2C1SELD
#FUSES SOSC_SEC
#FUSES WUT_DEFAULT
#word RPOR0=0x6C0 //registro de configuracion de salida para RP0/1
#word RPOR7=0x6CE //registro de configuracion de salida para RP14/15
#word RPINR18L = 0x6A4 //registro de configuracion de entrada para U1RXd
#bit IOLOCK = 0x742.6
#use delay(clock=20000000)
#pin_select U1TX =PIN_B15
#pin_select U1RX=PIN_B1
#use rs232(UART1,baud=4800,parity=N,bits=8,ERRORS)
Y el cuerpo del codigo: Un bucle infinito de prueba que deberia transmitir en forma alternada entre dos puertos dos mensajes distintos, usando una misma UART
while(1)
{
setup_uart(FALSE);
delay_ms(10);
unlockIO();
RPOR0 = 0x0000; // "Desconecto" RB0 de TX_UART1
RPOR7 = 0x0300; // UART1 TXD1 ---> RP15 RB15
lockIO();
setup_uart(TRUE);
delay_ms(10);
printf ("\n \r Ahora transmito por RB15");
delay_ms(50);
setup_uart(FALSE);
unlockIO();
RPOR7 = 0x0000; "Desconecto" RB15 de TX_UART1
RPOR0 = 0x0003; // UART1 TXD1 ---> RP0 RB0
lockIO() ;
setup_uart(TRUE);
delay_ms(10);
printf ("\n \r Ahora transmito por RB0");
delay_ms(50);
}
/********************************
* Function: lockIO
* Preconditions: None.
* Overview: This executes the necessary process to set the IOLOCK bit
* to lock I/O mapping from being modified.
* Input: None.
* Output: None.
********************************/
void lockIO(){
#asm
mov #0x742,w1
mov #0x46,w2
mov #0x57,w3
mov.b w2,[w1]
mov.b w3,[w1]
bset 0x742,#6
#endasm
}
/********************************
* Function: unlockIO
* Preconditions: None.
* Overview: This executes the necessary process to clear the IOLOCK
* bit to allow I/O mapping to be modified.
* Input: None.
* Output: None.
********************************/
void unlockIO(){
#asm
mov #0x742,w1
mov #0x46,w2
mov #0x57,w3
mov.b w2,[w1]
mov.b w3,[w1]
bclr 0x742,#6
#endasm
}
Mi problema es el siguiente: Por mas que cambie el puerto por el que deberia transmitir UART1, se transmite en los dos puertos a la vez. Dicho de otra forma: Si conecto una virtual terminal en cada puerto de salida, en vez de leer siempre en una terminal:
"
Ahora transmito por RB0
Ahora transmito por RB0
Ahora transmito por RB0
...
"
y en la otra terminal:
"
Ahora transmito por RB15
Ahora transmito por RB15
Ahora transmito por RB15
...
"
lo que veo en ambas terminales es:
"
Ahora transmito por RB0
Ahora transmito por RB15
Ahora transmito por RB0
Ahora transmito por RB0
Ahora transmito por RB15
...
"
Es como si en algun momento se hizo el cambio de puerto pero ademas la configuracion inicial se mantuvo... Alguien podra darme una mano con esto? Ya he comprobado que los registros de OSCCON y de RPORx se escriben correctamente... tambien he seguido paso a paso los cambios de estado en los bits de configuracion de la uart sin mayor suerte...
Como siempre, cualquier ayuda, sera mas que bienvenida!
Saludos!