View previous topic :: View next topic |
Author |
Message |
Andreas
Joined: 25 Oct 2004 Posts: 136
|
PIC16F1718 Serial Interrupt |
Posted: Thu Oct 22, 2015 5:41 am |
|
|
Hello Friends
Since i am converting to this new chip I have a lot of troubles to solve.
Today I need your help with a very easy problem, but I can't see the solution.
Easy program, serial data out, serial interrupt BUT no interrupt occurs !!!!
Serial data out is working !
Has anybody an idea ????
Code: |
#include <C:/pic_projekte/LEGO_Controller/16F1718.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#fuses INTRC_IO
#FUSES PUT //Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //NO Reset when brownout detected//
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES DEBUG //Debug mode for use with ICD
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#define Com1 Ser1
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=Ser1,errors)
#define TxDat PIN_C6
#define RxDat PIN_C7
int8 ch;
#int_RDA
void RDA_isr(void)
{
ch = getch(Com1);
}
void main()
{
setup_oscillator(OSC_8MHZ);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
output_float(RxDat);
fprintf(Com1,"A5A5A5A5A5A");
while(TRUE)
{
printf(Com1,"123456");
}
}
|
As IDE I use MPLABX because MPLAB is not supporting this chip...
Hope to get some help here.
best regards
Andreas |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9250 Location: Greensville,Ontario
|
|
Posted: Thu Oct 22, 2015 5:44 am |
|
|
Quick look...
Your 'stream' is called Ser1, your ISR getch(COM1). That might be it...
OR
You have ICD and Debug ON, that might be it.
I need more coffee, but that's a start...
Jay |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 6:08 am |
|
|
Hello temtronic
Take your coffee !!!
I just tried your ideas, no change !
BUT I got one new Problem, the line with A5A5A5 has been sent, but not the line with 12345 in the main program !!!!
It looks that there is a more basic problem.
best regards
Andreass |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 6:13 am |
|
|
hello temtronic
Sorry, forget the last problem, was a typo, the program now sends the data in the main every pass !
BUT no rcv interrupt occurs with serial data incoming.
best regards
Andreas |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Oct 22, 2015 8:04 am |
|
|
Hi Andreas,
Well, first off, your test program is *really* weird! I'm really not sure you understand the use of 'streams', because you aren't doing it correctly! I'm also not sure how you *know* that the serial interrupt isn't firing because as-written your code does not provide the necessary feedback. Try this code, and see what happens:
Code: |
#include <C:/pic_projekte/LEGO_Controller/16F1718.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#fuses INTRC_IO
#FUSES PUT //Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //NO Reset when brownout detected//
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES DEBUG //Debug mode for use with ICD
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=Ser1,errors)
int1 CharRcvd = False;
int8 ch = 0;
#int_RDA
void RDA_isr(void)
{
ch = fgetc(Ser1);
CharRcvd = True;
}
void main()
{
setup_oscillator(OSC_8MHZ);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
fprintf(Ser1,"Here at the top of Main!\n\r");
while(TRUE)
{
if(charRcvd)
{
fprintf(Ser1,"%u\n\r", ch);
CharRcvd = False;
}
else
fprintf(Ser1,"Waiting for Character\n\r", ch);
}
}
|
I didn't test this, but it should be OK, and should show you that the serial interrupt is working! _________________ John
If it's worth doing, it's worth doing in real hardware! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Thu Oct 22, 2015 8:51 am |
|
|
The reason is actually rather obvious.
Your chip has PPS. The pins can be programmed to be on particular locations. This _has_ to be setup, or CCS will by default always use software RS232 (hence no interrupt).....
Code: |
//suitable header for your chip
#PIN_SELECT U1RX=PIN_C7
#PIN_SELECT U1TX=PIN_C6
//program UART1 to use it's pins on PORTC
#use rs232(baud=9600,parity=N,UART1,bits=8,stream=SER1)
//now setup this UART
void main()
{
while(TRUE)
{
fprintf(SER1,"Hello"); //send something to the UART
}
}
|
You will then find the interrupts will work (since now the hardware UART is being used). |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Oct 22, 2015 9:44 am |
|
|
Hi,
Err, of course! Highlights the importance of consulting the device datasheet before 'shooting from the hip'..... _________________ John
If it's worth doing, it's worth doing in real hardware! |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 10:13 am |
|
|
Hi All
Strange to me is that the compiler should take care of pin settings??
Okay I will try all Your hints later this night, I should deliver tomorrow.........
Also i am little confused because the whole prog runs on the 886 since 2 years!!!!
BTW is the setting of the PPS possible With compiler functions????
Again thanks for your suggestion.
Best regards Andreas |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Oct 22, 2015 10:25 am |
|
|
Hi,
PPS = 'Peripheral Pin Select', which means that certain peripheral functions, such as the UART, can be 'mapped' by the user to specific user-defined pins on the PIC. Thus, on chips equipped with PPS, you must tell the compiler which peripheral functions get mapped to which pins. In the case of the 16F1718 UART, without explicitly stating the pin assignment using the 'PIN_SELECT' directive, the compiler will default to using a software serial implementation, and thus no interrupt.
I don't think that the 16F886 has PPS, so it wouldn't be an issue for that chip. _________________ John
If it's worth doing, it's worth doing in real hardware! |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 10:47 am |
|
|
Hi ezflyr
I have read the manual but couldn't find an entry for the uart 1.
Also in the uart setup i defined the pins to use, is that not enough ???
Best regards
Andreas |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Oct 22, 2015 11:33 am |
|
|
Hi,
Correct, that is not enough! You must do it like Ttelmah showed you!
Look at the #pin_select entry in the CCS manual... _________________ John
If it's worth doing, it's worth doing in real hardware! |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 12:24 pm |
|
|
Hello To All !
Thanks a lot for your comments, yes the information from Ttelmah was the solution !
I was reading the manual but again, the info that the serial port function is called U1RX I couldn't found, where is this described ?
Best regards and many thanks.
Andreas |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Thu Oct 22, 2015 1:03 pm |
|
|
If you look at the top of the .h file for the processor, it lists the names of all the re-mappable device pins on the chip.
The compiler 'does' take care of it all for you, but you do have to tell it what you want to do. |
|
|
Andreas
Joined: 25 Oct 2004 Posts: 136
|
|
Posted: Thu Oct 22, 2015 3:14 pm |
|
|
Thanks Ttelmah
Sometimes the solution more nearby than you can think !!
best regards
Andreas |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Fri Oct 23, 2015 12:40 am |
|
|
Yes, it is also a thing of 'migration'.
Generally the smaller PIC's all came along, long before any form of peripheral re-mapping existed. So people get into thinking "the peripheral is 'on' these pins". It's only a few of the more recent PIC16's that support PPS (and even then in a slightly more restrictive way than the older chips). However you could (for instance) be setting up the UART on another pair of pins somewhere later, so the compiler cannot assume you want to use the UART, unless it is told that you are connecting the UART to these particular pins...
The way I do it (using the UART _name_ to ensure that the #USE _will_ use the hardware), is the most reliable way of working with the re-mappable peripherals.
Have fun. |
|
|
|