dit projekt
k08isrsem.ino
Go to the documentation of this file.
1 //220216
2 
3 /* critical region - by semaphores - aka mutex
4  * Signal from ISR
5  *
6  * Work on uno and mega :-)
7  * JDN
8  * */
9 
10 #include <krnl.h>
11 
12 #define STK 150
13 
14 #define TASKPRIO 10
15 
16 
17 struct k_t * pTask1;
18 
19 struct k_t *mutSem, *syncSem;
20 
22 
23 volatile int t2Missed = 0, t2Hit = 0;
24 
25 
26 volatile int ISRoverflow = 0;
27 
28 
29 #define debounceTime 200
30 unsigned long lastISR = 0;
31 
32 #if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
33 ISR(INT4_vect, ISR_NAKED) // digital pin 2 onmega
34 #endif
35 
36 //UNO set interrupt on pin 2
37 #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
38 ISR(INT0_vect, ISR_NAKED) // digital pin 2 on uno
39 #endif
40 {
41  PUSHREGS();
42 
43  if (!k_running)
44  goto exitt ;
45 
46  // comment out down to endofdebounce if you do not like Sw debounce
48  goto exitt;
49  }
50 
52 
53  // endofdebounce
54 
55  if (-1 == ki_signal(syncSem))
56  ISRoverflow++;
57 
59 
60  exitt:
61  POPREGS();
62  RETI();
63 }
64 
65 
66 /*
67  * sw debounce
68  * #define debounceTime 200
69  * unsigned long lastISR=0;
70  *
71  * ...
72  * PUSHREGS();
73  * if (debounceTime < (k_millis_counter - lastISR)) {
74  * lastISR+=debounceTime;
75  * ISR code
76  * }
77  * POPREGS();
78  * RETI();
79  */
80 
81 void task1()
82 {
83  int i = 0;
84  int miss = 0;
85  int clp, sumclp = 0;
86  while (1) {
87 
88  if (0 > k_wait2(syncSem, 1000, &clp)) { // or k_wait(syncSem,1000) with no clip info
89 
90  //if (-1 == k_wait(syncSem, 1000)) {
91  miss++;
92  Serial.print("Timeout "); Serial.print(miss); Serial.print(" "); Serial.println(ISRoverflow);
93  }
94  else {
95  i++;
96  miss = 0;
97  Serial.print("get kick no "); Serial.print(i); Serial.print(" "); Serial.println(ISRoverflow);
98  }
99  sumclp += clp;
100  Serial.println("lost msg "); Serial.println(sumclp);
101  }
102 }
103 
104 
105 char a[STK];
106 
107 
108 void setup() {
109  // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
110  // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
111 
112  Serial.begin(115200);
113  delay(500);
114 
115  Serial.println("\n\njust bef init part");
116 
117 
118  k_init(1, 1, 0); // 2 task, 1 semaphores, 0 messaegQueues */
119 
120 pTask1 = k_crt_task(task1, 15, a, STK);
121 
122 syncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
123 
124 
125 pinMode(2, INPUT_PULLUP); // on uno - - a button to ground (or wire) every time it goes low vupti an interrupt
126 
127 // ABOUT ISR
128 // UNO/LENARDO pp 54 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf p 54
129 //MEGA 2560 pp 110 https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
130 
131 __asm__ volatile ("cli"); // disable interrupt
132 
133 #if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
134 EICRB |= (1 << ISC41); // B00000010; // for mega on pin 2
135 EIMSK |= (1 << INT4); //B00010000; // enable INT 4 for mega
136 
137 Serial.println(EICRB, HEX);
138 Serial.println(EIMSK, HEX);
139 #endif
140 
141 //UNO set interrupt on pin 2
142 #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
143 EICRA |= (1 << ISC01); // UNON UNO .,. trigger INT0 on falling edge
144 EIMSK |= (1 << INT0); // enable external intr
145 #endif
146 
147 __asm__ volatile ("sei"); // enable interrupt
148 
149 k_start(); /* start krnl timer speed 1 milliseconds*/
150 
151 Serial.println("If you see this then krnl didnt start :-( ");
152 }
153 
154 void loop() {}
volatile int i
Definition: k02twotasks.ino:29
RETI()
#define debounceTime
Definition: k08isrsem.ino:29
void setup()
Definition: k08isrsem.ino:108
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
#define STK
Definition: k08isrsem.ino:12
volatile int t2Hit
Definition: k08isrsem.ino:23
struct k_t * syncSem
Definition: k08isrsem.ino:19
K_CHG_STAK()
struct k_t * pTask1
Definition: k08isrsem.ino:17
unsigned long lastISR
Definition: k08isrsem.ino:30
char a[STK]
Definition: k08isrsem.ino:105
void task1()
Definition: k08isrsem.ino:81
void loop()
Definition: k08isrsem.ino:154
int ki_signal(struct k_t *sem)
Definition: krnl.c:650
int k_wait2(struct k_t *sem, int timeout, int *nrClip)
Definition: krnl.c:736
volatile char k_running
Definition: krnl.c:208
struct k_t * k_crt_sem(int init_val, int maxvalue)
Definition: krnl.c:589
ISR(KRNLTMRVECTOR, ISR_NAKED)
Definition: krnl.c:1337
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pStk, int stkSize)
Definition: krnl.c:374
int k_init(int nrTask, int nrSem, int nrMsg)
Definition: krnl.c:1152
int k_start()
Definition: krnl.c:1192
unsigned long k_millis_counter
Definition: krnl.c:213
Definition: krnl.h:334