View previous topic :: View next topic |
Author |
Message |
jpts
Joined: 08 Mar 2017 Posts: 40
|
Setting PIC Register |
Posted: Sun May 21, 2017 7:57 pm |
|
|
I am trying to setup the register (PIE3) USART Received interrupt
but not using "enable_interrupts(INT_RDA)".
Information from datasheet of PIC16F18857
- Register PIE3 address: 719h
- Bit RCIE = USART Received interrupt enable bit (1 enable / 0 disable)
With information above...I setup.
Code: |
#INT_RDA
void RDA_isr(void)
{
x = getc();
printf("RDA working");
}
// different way of enable_interrupts(INT_RDA)" set up.
#byte PIE3=0x719
#bit PIE3BIT5 = PIE3.1
void main()
{
enable_interrupts(GLOBAL);
}
|
Why its not printing "RDA working" when send a byte by serial com?
Using enable_interrupts(INT_RDA)" instead
#byte PIE3=0x719 works !
Regards, jpts |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Sun May 21, 2017 11:25 pm |
|
|
First thing. Use the register names!...
Then you show no sign of setting the bit in your code.
The compiler supports things by name. So:
Code: |
#BIT RCIE=getenv("BIT:RCIE)
//or for the register
#BYTE PIE3=getenv("SFR:PIE3")
//Then to set RCIE, just use
RCIE=TRUE;
|
You have setup the bit, but never put a value into it. The bit once defined, is just a variable. It still needs a value written to it. |
|
|
jpts
Joined: 08 Mar 2017 Posts: 40
|
|
Posted: Mon May 22, 2017 10:52 am |
|
|
Still not working. The USART Received interrupt not running.
There is a way to check status oF RCIEF ...like Printf(RCIE);
I used:
Code: | #BIT RCIE=getenv("BIT:RCIE")
void main()
{
RCIE=TRUE;
enable_interrupts(GLOBAL);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 22, 2017 11:10 am |
|
|
What's your compiler version ? In vs. 5.071, the two lines shown in main()
produce the same ASM code. Then you see that each line does a BSF
on the RCIE bit.
Code: |
.................... enable_interrupts(INT_RDA);
0010: MOVLB 0E // Set the RAM bank
0011: BSF PIE3.RCIE
.................... RCIE = TRUE;
0012: BSF PIE3.RCIE
....................
.................... while(TRUE);
0013: GOTO 013
.................... }
|
Test program:
Code: |
#include <16F18857.h>
#fuses XT, NOWDT
#use delay(clock=4M)
#BIT RCIE=getenv("BIT:RCIE")
//==========================
void main()
{
enable_interrupts(INT_RDA);
RCIE = TRUE;
while(TRUE); |
|
|
|
jpts
Joined: 08 Mar 2017 Posts: 40
|
|
Posted: Mon May 22, 2017 11:49 am |
|
|
Still not working...following the program. Vs used: 5.071
Code: | int x;
#INT_RDA
void RDA_isr(void)
{ x = getc();
printf("RDA working");
}
#BIT RCIE=getenv("BIT:RCIE")
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
RCIE=TRUE;
while(TRUE)
{
}
} |
|
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Mon May 22, 2017 11:58 am |
|
|
Post a complete program with your #FUSES and serial setup. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Mon May 22, 2017 12:16 pm |
|
|
As a comment, yes, of course you can print the value of RCIE. It is just an int1 variable. So:
printf("%d",RCIE);
will print 0, or 1, according to whether it is clear or set.
It will be being set.
Given you print a lot of characters in the interrupt, your #use rs232 must have 'ERRORS' or the UART will become hung if more than one character arrives.
You need to post a complete program, so that we can compile it 'as is'. Showing all the fuses etc.. Otherwise there are so many other things it could be... |
|
|
jpts
Joined: 08 Mar 2017 Posts: 40
|
|
Posted: Mon May 22, 2017 12:36 pm |
|
|
Code: | #include <16F18857.h>
#use delay(crystal=20MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
#FUSES NOBROWNOUT
#FUSES NOLVP |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 22, 2017 1:13 pm |
|
|
There's your problem. Your #use rs232() is making a soft uart. Of course
there will be no #INT_RDA working with a soft uart. I wondered how you
were making it compile without #pin_select statements.
Do your setup like this, with the lines in this exact order:
Code: | #include <16F18857.h>
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(crystal=20MHz)
#pin_select U1TX=PIN_C6
#pin_select U1RX=PIN_C7
#use rs232(baud=9600, UART1, ERRORS) |
Also, I noticed you have a stream specified in your #use rs232()
statement but you don't use fgetc() or fprintf(), etc., which require a
stream to be specified. So in the program above, I left out the stream
since it's not being used. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Mon May 22, 2017 1:21 pm |
|
|
On this chip the serial is controlled by PPS. 5.071, ought to be setting this, but I'd not assume it:
Code: |
#include <16F18857.h>
#device ADC=10
#use delay(crystal=20000000)
//Fuses should be before UART setup etc..
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOWDT
#FUSES NOPPS1WAY
#FUSES STVREN
#FUSES NOMCLR
//On this chip the UART uses PPS. This is how to setup PPS
#PIN_SELECT U1RX=PIN_C7
#PIN_SELECT U1TX=PIN_C6
#use rs232(baud=9600,parity=N,UART1,bits=8,stream=PORT1,errors)
#BIT RCIE=getenv("BIT:RCIE")
int8 x;
int1 have_chr=FALSE;
#INT_RDA
void RDA_isr(void)
{
x = fgetc(PORT1); //If using streams, fetch from the stream
have_chr=TRUE;
}
void main()
{
enable_interrupts(GLOBAL);
RCIE=TRUE;
while(TRUE)
{
if (have_chr)
{
have_chr=FALSE;
fprintf(PORT1,"CHAR %x\n",x);
}
}
}
|
|
|
|
jpts
Joined: 08 Mar 2017 Posts: 40
|
|
Posted: Mon May 22, 2017 6:29 pm |
|
|
Worked !!!!! you are amazing...thanks a lot !
Happy and same time concerned. I change my project MCU from PIC16F876 to 16F18857. Reason more program memory. I am not familiar with PPS and setups. I am not sure if i will face with more changes like that.
I still need test other functions that work well for 16F876 but not sure with 16F18857.
Thanks a lot !!!
Jpts |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Tue May 23, 2017 12:07 am |
|
|
The data sheet will tell you that 90% of the peripherals on this chip support PPS.
It's a great feature, since it allows you to move peripherals to other pins.
If you look at the top of the processor header file, you will find about 20 lines down, a list of all the peripheral function signal names controlled by PPS.
Hopefully what I've posted, gives you the key 'idea'. You set the signal name, to the pin you want it on, and then configure the peripheral using the peripheral name (not the pin names). So the compiler then knows you want to talk to the hardware peripheral, and this is connected to the specified pins. |
|
|
|