View previous topic :: View next topic |
Author |
Message |
sysc
Joined: 26 Oct 2007 Posts: 8
|
How to configure peripheral pin selection on PIC24[resolved] |
Posted: Wed Mar 09, 2011 8:19 am |
|
|
Hi, I'm trying to configure the peripheral pin selection for UART1 on PIC24.
I tried:
Code: |
#pin_select U1RX=PIN_G8
#pin_select U1TX=PIN_G6
#use rs232(UART1,baud=9600,parity=N,bits=8)
|
And put a break point at main loop,
I opened the Watch to see the registers RPINR18=0x3f3f and RPOR1 = 0x0000.
It's look like that the "#pin_select" isn't been configured properly.
Last edited by sysc on Thu Mar 10, 2011 2:53 pm; edited 2 times in total |
|
![](templates/subSilver/images/spacer.gif) |
jeremiah
Joined: 20 Jul 2010 Posts: 1328
|
|
Posted: Wed Mar 09, 2011 1:05 pm |
|
|
It would be nice to see a small, complete, test program that we can compile and run. It also helps if you post both the compiler version you are using and the particular PIC24 you are using.
The only guess off the top of my head given so little information is that you could be calling #pin_select on the same RP pin more than once somewhere else in your program and haven't enabled writing to that register multiple times. That is only a guess though. We need more info to really evaluate the problem |
|
![](templates/subSilver/images/spacer.gif) |
sysc
Joined: 26 Oct 2007 Posts: 8
|
|
Posted: Wed Mar 09, 2011 2:21 pm |
|
|
The PIC that I'm using is PIC24FJ256GA110.
MPLABIDE vs8.63
PCWHD Compiler vs4.084
It's a start of program, so doesn't have any function call only a main with some initialization port.
Code: | #include <24FG256GA110.h>
//Do some configuration "#fuse"
#pin_select U1RX=PIN_G8
#pin_select U1TX=PIN_G6
#use rs232(UART1,baud=9600,parity=N,bits=8)
void main(){
/* some configuration port
set_trisx()
output_x()
*/
for(;;){
delay_cycles(1);
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
sysc
Joined: 26 Oct 2007 Posts: 8
|
|
Posted: Wed Mar 09, 2011 2:43 pm |
|
|
other information:
at the "Output Window" - "MPLAB SIM"
is showing this error:
UART-W0005: Uart is enabled but no output destination has been assigned (File or Output Window) |
|
![](templates/subSilver/images/spacer.gif) |
jeremiah
Joined: 20 Jul 2010 Posts: 1328
|
|
Posted: Wed Mar 09, 2011 3:27 pm |
|
|
Interestingly enough, I am running the PIC24FJ256GA106, which happens to be in the same family as the 110 (they even use the same datasheet).
I took one of my old test programs and ran it:
Code: |
/*******************************************************************************
* FILENAME: wf.c
* DESC: This is the definition file for main program. It contains the
* main() entry point and interrupt routinse (as well as some utility
* functions.
* COMPILER: CCS PCWHD Revision 4.114
*
* REVISION:
* 2010/09/23 - JHB - Revision 1.0.0.0
*
*******************************************************************************/
#case
#include <24FJ256GA106.h>
//16 bit pointers
#device *=16
//Fuses for this project
#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 WINDIS //Watch Dog Timer in non-Window mode
#FUSES WDT128 //Watch Dog Timer PreScalar 1:128
#FUSES WPOSTS16 //Watch Dog Timer PostScalar 1:32768
#FUSES NOIESO //Internal External Switch Over mode enabled
#FUSES PR //Pimary oscillaotr enabled
#FUSES NOCKSFSM //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES NOOSCIO //OSC2 is clock output
#FUSES HS
//Pin selects for reprogrammable pins
#pin_select U1TX = PIN_B6 //output serial
#pin_select U1RX = PIN_B7
//#use statements for uart
#use delay(clock=22118400)
#use rs232(UART1,baud=9600,parity=N,bits=8,DISABLE_INTS,ERRORS)
////////////////////////////////////////////////////////////////////////////////
// NAME: main()
// DESC: The entry point into this program. Devices and interrupts are setup.
// IN: NONE
// OUT: NONE
////////////////////////////////////////////////////////////////////////////////
void main(){
rs232_errors = 0; //removes warning
//Power up and see reason for power up
printf("\r\n ******** START ******** \r\n");
printf("SYS:\t");
switch(restart_cause()){
case RESTART_POWER_UP: printf("RESTART_POWER_UP\r\n"); break;
case RESTART_BROWNOUT: printf("RESTART_BROWNOUT\r\n"); break;
case RESTART_WATCHDOG: printf("RESTART_WATCHDOG\r\n"); break;
case RESTART_SOFTWARE: printf("RESTART_SOFTWARE\r\n"); break;
case RESTART_MCLR: printf("RESTART_MCLR\r\n"); break;
case RESTART_ILLEGAL_OP: printf("RESTART_ILLEGAL_OP\r\n"); break;
case RESTART_TRAP_CONFLICT: printf("RESTART_TRAP_CONFLICT\r\n"); break;
default: printf("UNKNOWN RESTART\r\n"); break;
}
while(TRUE){}
}
|
I don't run MPLAB, so I can't say anything about how the watch variable will react, but that program will run on my PIC and print data out the serial port (just tested it).
Try taking that program and change:
1. The include to the 110 chip .h file
2. The pin_select statements to match your pins
3. The #use delay() statement to your clock speed
4. The fuses to what your typically use.
After you compile it, check your .lst file. This is what mine had in the pertinent section:
Code: |
.................... void main(){
0033C: BSET.B 81.7
0033E: MOV #1F07,W0
00340: MOV W0,6A4
00342: MOV #3,W0
00344: MOV W0,6C6
00346: MOV #46,W0
00348: MOV.B W0L,742
0034A: MOV #57,W0
0034C: MOV.B W0L,742
0034E: BSET.B 742.6
00350: CLR 800
00352: MOV #8000,W4
00354: MOV W4,220
00356: MOV #400,W4
00358: MOV W4,222
0035A: BCLR.B 220.3
0035C: MOV #47,W4
0035E: MOV W4,228
00360: SETM 32C
00362: MOV #4780,W15
00364: MOV #47FF,W0
00366: MOV W0,20
00368: NOP
|
The first few instructions correctly set the RP registers for me. See if your .lst file does as well (should be right where main() starts).
I'll try out a variant of your code tomorrow. I just got back to my desk and have to leave soon. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Mar 09, 2011 5:03 pm |
|
|
Quote: | PCWHD Compiler vs4.084 |
As far as I remember, #pin_select isn't implemented correctly with this version |
|
![](templates/subSilver/images/spacer.gif) |
sysc
Joined: 26 Oct 2007 Posts: 8
|
|
Posted: Thu Mar 10, 2011 7:56 am |
|
|
Hi,
I did the modifications and i saw the .lst file.
It showed:
Code: | ....................................void main (void){
0036E: MOV #113,W0
00370: MOV W0,698
00372: MOV #300,W0
00374: MOV W0,6D4
..... |
So for the tx option for the PIN_G6 (#pin_select U1TX=PIN_G6) is ok!
00372: MOV #300,W0
00374: MOV W0,6D4
The address "6D4" = RPOR2, with the value = 0x0300 = U1TX
but for the rx option for the PIN_G8 (#pin_select U1RX=PIN_G8) it isn't ok!
0036E: MOV #113,W0
00370: MOV W0,698
The address "698" = restricted memory.
So I have two doubts
1) - I don't understand why "0036E: MOV #113,W0", Byte Hi = 1?
Byte Lo = is ok because 13h = 19d = PIN_G6 = RP19.
2) - And "00370: MOV W0,698" with the wrong address of memory. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Mar 10, 2011 9:31 am |
|
|
At least since PCD V4.098 you get this result
Code: | 00202: MOV #113,W0
00204: MOV W0,6A4
00206: MOV #300,W0
00208: MOV W0,6D4 |
Recent compilers (V4.112 ..) have
Code: | 00202: MOV #F113,W0
00204: MOV W0,6A4
00206: MOV #300,W0
00208: MOV W0,6D4 |
|
|
![](templates/subSilver/images/spacer.gif) |
sysc
Joined: 26 Oct 2007 Posts: 8
|
|
Posted: Thu Mar 10, 2011 10:42 am |
|
|
Hello FvM.
It means that the PCD V4.084 that i'm using won't work?
What are the options to i correct this and work properly?
Thanks. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Mar 10, 2011 11:16 am |
|
|
Quote: | It means that the PCD V4.084 that i'm using won't work? |
Yes, that's what I told you before. You can write the peripheral select SFRs directly in your code. I'm doing this generally in projects that have been started with buggy PCD versions.
Code: | #byte RPOR4L = 0x6C8
RPOR4L = 3; // UART1 Transmit |
|
|
![](templates/subSilver/images/spacer.gif) |
sysc
Joined: 26 Oct 2007 Posts: 8
|
|
Posted: Thu Mar 10, 2011 11:40 am |
|
|
Ok.
Thank you! |
|
![](templates/subSilver/images/spacer.gif) |
jeremiah
Joined: 20 Jul 2010 Posts: 1328
|
|
Posted: Fri Mar 11, 2011 7:44 am |
|
|
Maybe one of the more experienced users here could comment, but I *think* you can also modify the chip database somehow and have it point to the correct address, but I have never messed with that, so I am not 100% on that. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Fri Mar 11, 2011 11:25 am |
|
|
As far as I understand, #pin_select code isn't derived from the device file, or at least not from a part that can be modified with the Device Editor Tool. |
|
![](templates/subSilver/images/spacer.gif) |
|