Skip to content

Commit 5b32a33

Browse files
committed
feat: interval and timing measurements
1 parent 588ac81 commit 5b32a33

File tree

10 files changed

+193
-3
lines changed

10 files changed

+193
-3
lines changed

pslab-core.X/commands.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,13 @@ command_func_t* const cmd_table[NUM_PRIMARY_CMDS + 1][NUM_SECONDARY_CMDS_MAX + 1
225225
},
226226
{ // 10 TIMING
227227
// 0 1 GET_TIMING 2 3
228-
Undefined, Unimplemented, Undefined, Undefined,
228+
Undefined, INTERVAL_UntilEvent, Undefined, Undefined,
229229
// 4 START_ONE_CHAN_LA 5 START_TWO_CHAN_LA 6 START_FOUR_CHAN_LA 7 FETCH_DMA_DATA
230230
LOGICANALYZER_OneChannel, LOGICANALYZER_TwoChannel, LOGICANALYZER_FourChannel, Removed,
231231
// 8 FETCH_INT_DMA_DATA 9 FETCH_LONG_DMA_DATA 10 COMPARATOR_TO_LA 11 GET_INITIAL_STATES
232232
BUFFER_FetchInt, BUFFER_FetchLong, Unimplemented, INTERVAL_GetState,
233233
// 12 TIMING_MEASUREMENTS 13 INTERVAL_MEASUREMENTS 14 CONFIGURE_COMPARATOR 15 START_ALTERNATE_ONE_CHAN_LA
234-
Unimplemented, Unimplemented, Removed, LOGICANALYZER_OneChannelAlt,
234+
INTERVAL_TimeMeasure, INTERVAL_IntervalMeasure, Removed, LOGICANALYZER_OneChannelAlt,
235235
// 16 START_THREE_CHAN_LA 17 STOP_LA 18 19
236236
LOGICANALYZER_ThreeChannel, LOGICANALYZER_Stop, Undefined, Undefined,
237237
// 20 21 22 23

pslab-core.X/helpers/interval.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "../registers/memory/dma.h"
1010
#include "../registers/system/interrupt_manager.h"
1111
#include "../registers/system/pin_manager.h"
12+
#include "../registers/system/watchdog.h"
1213
#include "../registers/timers/tmr2.h"
1314
#include "buffer.h"
1415

@@ -210,3 +211,111 @@ response_t INTERVAL_GetState(void) {
210211

211212
return SUCCESS;
212213
}
214+
215+
response_t INTERVAL_IntervalMeasure(void) {
216+
217+
uint16_t timeout = UART1_ReadInt(); // t * 64e6 >> 16
218+
uint8_t pins = UART1_Read();
219+
uint8_t modes = UART1_Read();
220+
221+
IC_PARAMS_ConfigureIntervalCaptureWithIC1AndIC2(pins & 0xF,
222+
IC_PARAMS_CAPTURE_TIMER_PERIPHERAL,
223+
IC_PARAMS_CAPTURE_INTERRUPT_EVERY_EVENT, modes & 0x7);
224+
IC_PARAMS_ConfigureIntervalCaptureWithIC3AndIC4((pins >> 4) & 0xF,
225+
IC_PARAMS_CAPTURE_TIMER_PERIPHERAL,
226+
IC_PARAMS_CAPTURE_INTERRUPT_EVERY_EVENT, (modes >> 3) & 0x7);
227+
228+
IC_PARAMS_ManualTriggerAll();
229+
230+
while ((!_IC1IF) && (IC2TMR < timeout)) WATCHDOG_TimerClear();
231+
UART1_WriteInt(IC1BUF);
232+
UART1_WriteInt(IC2BUF);
233+
234+
while ((!_IC3IF) && (IC2TMR < timeout)) WATCHDOG_TimerClear();
235+
UART1_WriteInt(IC3BUF);
236+
UART1_WriteInt(IC4BUF);
237+
UART1_WriteInt(IC2TMR);
238+
239+
IC_PARAMS_DisableAllModules();
240+
241+
return SUCCESS;
242+
}
243+
244+
response_t INTERVAL_TimeMeasure(void) {
245+
246+
uint16_t timeout = UART1_ReadInt(); // t * 64e6 >> 16
247+
uint8_t pins = UART1_Read();
248+
uint8_t modes = UART1_Read();
249+
uint8_t intrpts = UART1_Read();
250+
251+
if ((pins & 0xF) == 4 || ((pins >> 4) & 0xF) == 4) {
252+
CMP4_SetupComparator();
253+
CVR_SetupComparator();
254+
}
255+
256+
IC_PARAMS_ConfigureIntervalCaptureWithIC1AndIC2(pins & 0xF,
257+
IC_PARAMS_CAPTURE_TIMER2, (intrpts & 0xF) - 1, modes & 0x7);
258+
IC_PARAMS_ConfigureIntervalCaptureWithIC3AndIC4((pins >> 4) & 0xF,
259+
IC_PARAMS_CAPTURE_TIMER2, ((intrpts >> 4) & 0xF) - 1, (modes >> 3) & 0x7);
260+
261+
TMR2_Initialize();
262+
263+
SetDefaultDIGITAL_STATES();
264+
265+
IC_PARAMS_ManualTriggerAll();
266+
TMR2_Start();
267+
268+
if ((modes >> 6) & 0x1) {
269+
RPOR5bits.RP54R = RPN_DEFAULT_PORT; // Disconnect SQR1 pin
270+
((modes >> 7) & 0x1) ? SQR1_SetHigh() : SQR1_SetLow();
271+
}
272+
273+
while ((!_IC1IF || !_IC3IF) && (IC2TMR < timeout)) WATCHDOG_TimerClear();
274+
275+
uint8_t i;
276+
for (i = 0; i < (intrpts & 0xF); i++) {
277+
UART1_WriteInt(IC1BUF);
278+
UART1_WriteInt(IC2BUF);
279+
}
280+
for (i = 0; i < ((intrpts >> 4) & 0xF); i++) {
281+
UART1_WriteInt(IC3BUF);
282+
UART1_WriteInt(IC4BUF);
283+
}
284+
285+
IC1_InterruptFlagClear();
286+
IC3_InterruptFlagClear();
287+
288+
UART1_WriteInt(IC2TMR);
289+
290+
IC_PARAMS_DisableAllModules();
291+
TMR2_Stop();
292+
293+
return SUCCESS;
294+
}
295+
296+
response_t INTERVAL_UntilEvent(void) {
297+
298+
uint16_t timeout = UART1_ReadInt(); // t * 64e6 >> 16
299+
uint8_t mode = UART1_Read();
300+
uint8_t pin = UART1_Read();
301+
302+
IC_PARAMS_ConfigureIntervalCaptureWithIC1AndIC2(pin & 0xF,
303+
IC_PARAMS_CAPTURE_TIMER_PERIPHERAL, (mode & 0x3) - 1, mode & 0x7);
304+
305+
while (!_IC1IF && (IC2TMR < timeout)) WATCHDOG_TimerClear();
306+
307+
IC1_InterruptFlagClear();
308+
309+
UART1_WriteInt(IC2TMR);
310+
311+
uint8_t i;
312+
for (i = 0; i < (mode & 0x3); i++) {
313+
UART1_WriteInt(IC1BUF);
314+
UART1_WriteInt(IC2BUF);
315+
}
316+
317+
IC_PARAMS_DisableAllModules();
318+
TMR2_Stop();
319+
320+
return SUCCESS;
321+
}

pslab-core.X/helpers/interval.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ extern "C" {
8989

9090
response_t INTERVAL_GetState(void);
9191

92+
response_t INTERVAL_IntervalMeasure(void);
93+
94+
response_t INTERVAL_TimeMeasure(void);
95+
96+
response_t INTERVAL_UntilEvent(void);
97+
9298
// Getters and setters
9399

94100
void SetDIGITAL_STATES(uint8_t);

pslab-core.X/instruments/sensors.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,4 @@ response_t SENSORS_GetCounter(void) {
7676
// Fetch timer 2 value and send it over
7777
UART1_WriteInt(TMR2_Counter16BitGet());
7878
return SUCCESS;
79-
}
79+
}

pslab-core.X/registers/comparators/ic1.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ extern "C" {
278278
IC1CON2bits.IC32 = 1;
279279
}
280280

281+
inline static void IC1_InputCaptureInterruptOn(IC_PARAMS_CAPTURE_INTERRUPT i) {
282+
IC1CON1bits.ICI = i;
283+
}
284+
281285
inline static void IC1_UseSourceTo(IC_PARAMS_SOURCE_TASK t) {
282286
IC1CON2bits.ICTRIG = t;
283287
}

pslab-core.X/registers/comparators/ic2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ extern "C" {
284284
IC2CON2bits.IC32 = 1;
285285
}
286286

287+
inline static void IC2_InputCaptureInterruptOn(IC_PARAMS_CAPTURE_INTERRUPT i) {
288+
IC2CON1bits.ICI = i;
289+
}
290+
287291
inline static void IC2_UseSourceTo(IC_PARAMS_SOURCE_TASK t) {
288292
IC2CON2bits.ICTRIG = t;
289293
}

pslab-core.X/registers/comparators/ic3.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ extern "C" {
284284
IC3CON2bits.IC32 = 1;
285285
}
286286

287+
inline static void IC3_InputCaptureInterruptOn(IC_PARAMS_CAPTURE_INTERRUPT i) {
288+
IC3CON1bits.ICI = i;
289+
}
290+
287291
inline static void IC3_UseSourceTo(IC_PARAMS_SOURCE_TASK t) {
288292
IC3CON2bits.ICTRIG = t;
289293
}

pslab-core.X/registers/comparators/ic4.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ extern "C" {
296296
IEC2bits.IC4IE = 1;
297297
}
298298

299+
inline static void IC4_InputCaptureInterruptOn(IC_PARAMS_CAPTURE_INTERRUPT i) {
300+
IC4CON1bits.ICI = i;
301+
}
302+
299303
inline static void IC4_InterruptDisable(void) {
300304
IEC2bits.IC4IE = 0;
301305
}

pslab-core.X/registers/comparators/ic_params.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "ic2.h"
33
#include "ic3.h"
44
#include "ic4.h"
5+
#include "../system/pin_manager.h"
56

67
void IC_PARAMS_InitiateAll(void) {
78
IC1_Initialize();
@@ -63,4 +64,52 @@ void IC_PARAMS_SetCaptureTimer(IC_PARAMS_CAPTURE_TIMER t) {
6364
IC2_SetCaptureTimer(t);
6465
IC3_SetCaptureTimer(t);
6566
IC4_SetCaptureTimer(t);
67+
}
68+
69+
void IC_PARAMS_ConfigureIntervalCaptureWithIC1AndIC2(uint8_t pin,
70+
IC_PARAMS_CAPTURE_TIMER timer,
71+
IC_PARAMS_CAPTURE_INTERRUPT intrpt,
72+
IC_PARAMS_CAPTURE_MODE mode) {
73+
74+
IC1_InterruptFlagClear();
75+
76+
RPINR7bits.IC1R = PIN_MANAGER_DIGITAL_PINS[pin];
77+
78+
IC1_Initialize();
79+
IC1_CombineOddEvenICModules();
80+
IC1_SetCaptureTimer(timer);
81+
IC1_InputCaptureInterruptOn(intrpt);
82+
IC1_UseSourceTo(IC_PARAMS_SOURCE_TASK_TRIGGER);
83+
IC1_SetCaptureMode(mode);
84+
85+
IC2_Initialize();
86+
IC2_CombineOddEvenICModules();
87+
IC2_SetCaptureTimer(timer);
88+
IC2_InputCaptureInterruptOn(intrpt);
89+
IC2_UseSourceTo(IC_PARAMS_SOURCE_TASK_TRIGGER);
90+
IC2_SetCaptureMode(mode);
91+
}
92+
93+
void IC_PARAMS_ConfigureIntervalCaptureWithIC3AndIC4(uint8_t pin,
94+
IC_PARAMS_CAPTURE_TIMER timer,
95+
IC_PARAMS_CAPTURE_INTERRUPT intrpt,
96+
IC_PARAMS_CAPTURE_MODE mode) {
97+
98+
IC3_InterruptFlagClear();
99+
100+
RPINR8bits.IC3R = PIN_MANAGER_DIGITAL_PINS[pin];
101+
102+
IC3_Initialize();
103+
IC3_CombineOddEvenICModules();
104+
IC3_SetCaptureTimer(timer);
105+
IC3_InputCaptureInterruptOn(intrpt);
106+
IC3_UseSourceTo(IC_PARAMS_SOURCE_TASK_TRIGGER);
107+
IC3_SetCaptureMode(mode);
108+
109+
IC4_Initialize();
110+
IC4_CombineOddEvenICModules();
111+
IC4_SetCaptureTimer(timer);
112+
IC4_InputCaptureInterruptOn(intrpt);
113+
IC4_UseSourceTo(IC_PARAMS_SOURCE_TASK_TRIGGER);
114+
IC4_SetCaptureMode(mode);
66115
}

pslab-core.X/registers/comparators/ic_params.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,16 @@ extern "C" {
8888
void IC_PARAMS_CombineOddEvenModules(void);
8989

9090
void IC_PARAMS_SetCaptureTimer(IC_PARAMS_CAPTURE_TIMER);
91+
92+
void IC_PARAMS_ConfigureIntervalCaptureWithIC1AndIC2(uint8_t pin,
93+
IC_PARAMS_CAPTURE_TIMER timer,
94+
IC_PARAMS_CAPTURE_INTERRUPT intrpt,
95+
IC_PARAMS_CAPTURE_MODE mode);
96+
97+
void IC_PARAMS_ConfigureIntervalCaptureWithIC3AndIC4(uint8_t pin,
98+
IC_PARAMS_CAPTURE_TIMER timer,
99+
IC_PARAMS_CAPTURE_INTERRUPT intrpt,
100+
IC_PARAMS_CAPTURE_MODE mode);
91101

92102
#ifdef __cplusplus
93103
}

0 commit comments

Comments
 (0)