µTasker Forum
µTasker Forum => µTasker general => Topic started by: Raffaele on January 03, 2020, 01:59:27 AM
-
Hi I have a task that should be executed once (to set up some pins and variables) and then executed based on an external interrupt. However the task is executed periodically and every time it repeats the set-up. Basically, the if (iState) is entered periodically and the OUTPUT_PIN doesn't stay low but goes high between executions
#include "config.h"
#define OUTPUT_PIN PORTB_BIT5
#define SETUP_PIN() _CONFIG_DRIVE_PORT_OUTPUT_VALUE(B, OUTPUT_PIN, OUTPUT_PIN, (PORT_SRE_FAST | PORT_DSE_LOW));
#define SET_PIN_LOW() _CLEARBITS(B, OUTPUT_PIN)
#define SET_PIN_HIGH() _SETBITS(B, OUTPUT_PIN)
static int iState = 0;
static void fn_my_interrupt(void)
{
fnInterruptMessage(TASK_MY_INTERRUPT, 141);
}
extern void fnTaskMyInterrupt(TTASKTABLE *ptrTaskTable) {
QUEUE_HANDLE PortIDInternal = ptrTaskTable->TaskID;
unsigned char ucInputMessage[MEDIUM_MESSAGE];
if (!iState) {
SETUP_PIN();
SET_PIN_LOW();
INTERRUPT_SETUP interrupt_setup; // interrupt configuration parameters
interrupt_setup.int_type = PORT_INTERRUPT; // identifier to configure port interrupt
interrupt_setup.int_handler = fn_my_interrupt; // handling function
interrupt_setup.int_priority = PRIORITY_PORT_B_INT; // interrupt priority level
interrupt_setup.int_port = PORTB; // the port that the interrupt input is on
interrupt_setup.int_port_bits = PORTB_BIT4; // the IRQ input connected
interrupt_setup.int_port_sense = IRQ_FALLING_EDGE ;// | PULLUP_ON); // interrupt is to be falling edge sensitive
fnConfigureInterrupt((void *)&interrupt_setup);
iState = 1;
//uTaskerStateChange(TASK_MY_INTERRUPT, UTASKER_SUSPENDED);
}
while (fnRead( PortIDInternal, ucInputMessage, HEADER_LENGTH)) {
switch (ucInputMessage[MSG_SOURCE_TASK]) {
case 141 :
// YOUR CODE HERE //
SET_PIN_HIGH();
break;
}
break;
}
}
-
Hi
If iState is set to 0 when the task is entered a second time I expect that there was a reset taking place. Since you are setting it to 1 when the initialisation has been performed it should not otherwise be possible to be reset to 0; this is irrespective of whether the task is scheduled a second time or not.
Check that there is not a periodic watchdog interrupt taking place.
Regards
Mark
-
Thank you Mark,
that is the behavior I was expecting in fact. And the watchdog is disabled, but there is something that every second retriggers it
I use the command {"r", fnTaskMyInterrupt, NO_QUE, (DELAY_LIMIT)(0.5 * SEC), UTASKER_STOP}, in TaskConfig to execute the task the first time. I tried other variations (UTASKER_GO etc) but no much luck
-
I've been doing few tests, unless there is something wrong in my code, it looks like there is a reset every second. In fact the static or global iState variable switches between 0 and 1 every (DELAY_LIMIT)(0.5 * SEC)
-
Hi
Check the reset cause in the
SIM_SRSID, RCM_SRS0 or MC_SRSH / MC_SRSL register(s), depending on the processor used.
If you have disabled the watchdog task make sure that you have
#define WATCHDOG_DISABLE() 1
Regards
Mark
-
ok I was able to fix the problem. The only thing now is that my handler function doesn't get called. I was expecting that whenever a FALLING_EDGE signal is on PTB4 the function fn_my_interrupt should be called but nothing happens
-
Hi
Which processor are you using? Not all support interrupts on every port - if you build and test in the simulator there is generally an exception when configuring for a non-supported interrupt.
Verify also that SUPPORT_PORT_INTERRUPTS is enabled so that the port interrupt driver is present.
Regards
Mark
-
The microcontroller is the KL03 so the Cortex M0+
-
Verify also that SUPPORT_PORT_INTERRUPTS is enabled so that the port interrupt driver is present.
Great, this was part of the problem.
Also my code works on a KL03 20-pin WLCSP, but didn't fully work on the FRDM-LK03Z.
But essentially this solved my issue.
Thank you again Mark :)