krnl 1
Loading...
Searching...
No Matches
rt-arduino-isrsyncdebounce.ino
Go to the documentation of this file.
1/* critical region - by semaphores - aka mutex
2 Signal from ISR
3
4 Work on uno and mega :-)
5 JDN
6 * */
7
8#include <krnl.h>
9
10#define STK 150
11
12#define TASKPRIO 10
13
14
15struct k_t * pTask1, *pTask2;
16
17struct k_t *mutSem, *syncSem;
18
20
21volatile int t2Missed = 0, t2Hit = 0;
22
23
24volatile int ISRoverflow = 0;
25
26#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
27ISR(INT4_vect, ISR_NAKED) { // digital pin 2 onmega
28#endif
29
30 //UNO set interrupt on pin 2
31#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
32 ISR(INT0_vect, ISR_NAKED) { // digital pin 2 on uno
33#endif
34 static volatile unsigned int lastISR = 0;
36 if (!k_running)
37 goto exitt ;
38
39 // debounce in SW
40
41 if (ki_millis() - lastISR > 1000) { // deounce time 1000 ticks == 1000 msec
43
44 if (-1 == ki_signal(syncSem))
46 else
47 K_CHG_STAK();
48 }
49
50exitt:
51 POPREGS();
53 }
54
55
56 void task1()
57 {
58 int i = 0;
59 int miss = 0;
60 while (1) {
61
62 if (-1 == k_wait(syncSem, 1000)) {
63 miss++;
64 Serial.print("timeout "); Serial.print(miss); Serial.print(" "); Serial.println(ISRoverflow);
65 }
66 else {
67 i++;
68 Serial.print("get kick no "); Serial.print(i); Serial.print(" "); Serial.println(ISRoverflow);
69 }
70 }
71 }
72
73
74 void task2()
75 {
76 int i = 0;
77 int miss = 0;
78 while (1) {
79
80 Serial.println("timeout222 ");
81 k_sleep(100);
82 }
83 }
84
85
86
87
88 void setup() {
89 // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
90 // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
91
92 Serial.begin(115200);
93 delay(2000);
94
95 Serial.println("just bef init part");
96
97 k_init(2, 1, 0); // 2 task, 1 semaphores, 0 messaegQueues */
98
99 pTask1 = k_crt_task(task1, 15, STK);
100 pTask2 = k_crt_task(task2, 15, STK);
101
102 syncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
103
104 Serial.println("just bef k_start");
105
106
107 pinMode(2, INPUT_PULLUP);
108
109 // ABOUT ISR
110 // UNO/LENARDO pp 54 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf p 54
111 //MEGA 2560 pp 110 https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
112
113 __asm__ volatile ("cli"); // disable interrupt
114
115#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
116 EICRB |= (1 << ISC41); // B00000010; // for mega on pin 2
117 EIMSK |= (1 << INT4); //B00010000; // enable INT 4 for mega
118
119 Serial.println(EICRB, HEX);
120 Serial.println(EIMSK, HEX);
121#endif
122
123 //UNO set interrupt on pin 2
124#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
125 EICRA |= (1 << ISC01); // UNON UNO .,. trigger INT0 on falling edge
126 EIMSK |= (1 << INT0); // enable external intr
127#endif
128
129 __asm__ volatile ("sei"); // enable interrupt
130
131 k_start(1); /* start krnl timer speed 1 milliseconds*/
132
133 Serial.println("If you see this then krnl didnt start :-( ");
134 }
135
136 void loop() {}
#define STK
volatile int i
void task2()
void task1()
struct k_t * mutSem
Definition k08isrsem.ino:19
volatile int ISRoverflow
Definition k08isrsem.ino:26
struct k_t * timedSem1
Definition k08isrsem.ino:21
volatile int t2Missed
Definition k08isrsem.ino:23
struct k_t * timedSem2
Definition k08isrsem.ino:21
volatile int t2Hit
Definition k08isrsem.ino:23
struct k_t * syncSem
Definition k08isrsem.ino:19
struct k_t * pTask1
Definition k08isrsem.ino:17
unsigned long lastISR
Definition k08isrsem.ino:30
struct k_t * pTask2
Definition k09msgq.ino:11
unsigned long ki_millis(void)
returns no msec since start - no DI/EI lock Returns nr of milliseconds since krnl was started by k_st...
Definition krnl.c:1240
int ki_signal(struct k_t *sem)
signal a semaphore from AN ISR - no task shift , do not enable intr,...
Definition krnl.c:605
int k_sleep(int time)
let task sleep for a number of milliseconds
Definition krnl.c:445
volatile char k_running
Definition krnl.c:156
int k_wait(struct k_t *sem, int timeout)
stand wait on semaphore call with timeout facility
Definition krnl.c:683
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pStk, int stkSize)
create a task - only to be called before k_start creates a task and put it in the active Q
Definition krnl.c:328
struct k_t * k_crt_sem(int init_val, int maxvalue)
change task priority and reinserts it in task Q and do a task shift
Definition krnl.c:544
int k_init(int nrTask, int nrSem, int nrMsg)
Definition krnl.c:1108
int k_start()
Definition krnl.c:1149
#define K_CHG_STAK()
Definition krnl.h:488
ISR(INT0_vect, ISR_NAKED)
Definition isem.ino:47
RETI()
PUSHREGS()
Definition krnl.h:323