|
|
View previous topic :: View next topic |
Author |
Message |
benoitstjean
Joined: 30 Oct 2007 Posts: 566 Location: Ottawa, Ontario, Canada
|
PIC24EP512 - Interrupt-on-change [Solved] |
Posted: Sun Jan 28, 2024 4:07 pm |
|
|
Device: PIC24EP512GP806
Compiler: 5.026
Hi guys,
Quick question: I'm going through the docs and its been a little while but on my device (see above), I'm trying to find in the docs which pins are allowed to be configured as an INT_CNI. So far I have RE5, RG6, RG7, RG8, RB5 and RB4 set as INT_CNI and only RG6 and RG8 trigger.
Thanks,
Ben
Last edited by benoitstjean on Mon Feb 05, 2024 12:55 pm; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Mon Jan 29, 2024 12:12 am |
|
|
Every input pin can be set to give an interrupt on change.
Post how you are setting this up, and trying to use this.
I also note you have a very old compiler. I'll have to check and see
if yours works correctly for this. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Mon Jan 29, 2024 4:33 am |
|
|
OK.
I did a quick test program, that works, then tried to compile it with 5.026.
Glaring problem. Your compiler does not have the set_analog_pins function.
Now on a lot of the later chips there are separate registers (as distinct from
the ADC setup registers), to configure pins for analog or digital I/O. The
set_analog_pins function controls the bits in these. The setup_adc_ports
function does turn these off, so are you using this?.
This functions, compiled with your compiler works.
Code: |
#include <maincni.h>
//select pins to use
#DEFINE CHANGE0 PIN_E5
#DEFINE CHANGE1 PIN_G6
#DEFINE CHANGE2 PIN_G7
#DEFINE CHANGE3 PIN_G8
#DEFINE CHANGE4 PIN_B5
#DEFINE CHANGE5 PIN_B4
int1 PINstate[6], OLDstate[6];
//Now since variable I/O is very inefficient, using macros instead
#define CAT(a) CHANGE##a
#define TEST_PIN(num) PINstate[num]=input(cat(num)); //test if pin changed
#define CLEAR_PIN(num) OLDstate[num]=PINstate[num]; //reset change
#define SETUP(num) set_pullup(TRUE, cat(num)); \
PINstate[num]=input(cat(num)); \
enable_interrupts(INTR_CN_PIN | cat(num)); //setup interrupt on a pin
#INT_CNI
void change_interrupt(void)
{
//Now we need to read each pin for change
TEST_PIN(0)
{
CLEAR_PIN(0);
//Code for this pin here
}
TEST_PIN(1)
{
CLEAR_PIN(1);
//Code for this pin here
}
TEST_PIN(2)
{
CLEAR_PIN(2);
//Code for this pin here
}
TEST_PIN(3)
{
CLEAR_PIN(3);
//Code for this pin here
}
TEST_PIN(4)
{
CLEAR_PIN(4);
//Code for this pin here
}
TEST_PIN(5)
{
CLEAR_PIN(5);
//Code for this pin here
}
}
void main()
{
//First need to ensure analog features are disabled.
setup_adc_ports(NO_ANALOGS); //ensure ANSEL is set off
//Now on boot need to read the current states, and then enable
SETUP(0);
SETUP(1);
SETUP(2);
SETUP(3);
SETUP(4);
SETUP(5);
//Now the global interrupt
enable_interrupts(GLOBAL);
while(TRUE)
{
//Whatever you want.
delay_us(10);
}
}
|
|
|
|
benoitstjean
Joined: 30 Oct 2007 Posts: 566 Location: Ottawa, Ontario, Canada
|
|
Posted: Mon Jan 29, 2024 8:29 am |
|
|
Thanks for the details info.
I guess I didn't hit "submit" yesterday but I finally got it to work after enabling the set_pullup() for each pin.
And yes, I know for sure that my compiler is old but it does what I need it to do and I'm used to it. I have to check what the new version does... when I have a moment.
Thanks for all your help!
Ben |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|