Skip to content

Commit 4da9b1f

Browse files
committed
feat: interval and timing measurement functions
1 parent 2c42af5 commit 4da9b1f

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
@@ -228,13 +228,13 @@ command_func_t* const cmd_table[NUM_PRIMARY_CMDS + 1][NUM_SECONDARY_CMDS_MAX + 1
228228
},
229229
{ // 10 TIMING
230230
// 0 1 GET_TIMING 2 3
231-
Undefined, Unimplemented, Undefined, Undefined,
231+
Undefined, INTERVAL_UntilEvent, Undefined, Undefined,
232232
// 4 START_ONE_CHAN_LA 5 START_TWO_CHAN_LA 6 START_FOUR_CHAN_LA 7 FETCH_DMA_DATA
233233
LOGICANALYZER_OneChannel, LOGICANALYZER_TwoChannel, LOGICANALYZER_FourChannel, Removed,
234234
// 8 FETCH_INT_DMA_DATA 9 FETCH_LONG_DMA_DATA 10 COMPARATOR_TO_LA 11 GET_INITIAL_STATES
235235
BUFFER_FetchInt, BUFFER_FetchLong, Unimplemented, INTERVAL_GetState,
236236
// 12 TIMING_MEASUREMENTS 13 INTERVAL_MEASUREMENTS 14 CONFIGURE_COMPARATOR 15 START_ALTERNATE_ONE_CHAN_LA
237-
Unimplemented, Unimplemented, Removed, LOGICANALYZER_OneChannelAlt,
237+
INTERVAL_TimeMeasure, INTERVAL_IntervalMeasure, Removed, LOGICANALYZER_OneChannelAlt,
238238
// 16 START_THREE_CHAN_LA 17 STOP_LA 18 19
239239
LOGICANALYZER_ThreeChannel, LOGICANALYZER_Stop, Undefined, Undefined,
240240
// 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

@@ -196,3 +197,111 @@ response_t INTERVAL_GetState(void) {
196197

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

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/logicanalyzer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ response_t LOGICANALYZER_FourChannel(void) {
140140
INTERVAL_CaptureFour(points, mode, prescaler);
141141

142142
if (trigger & 1) {
143-
LA_TRIGGER_STATE = trigger & 2 ? RISING_EDGE : FALLING_EDGE;
143+
LA_TRIGGER_STATE = trigger & 2 ? FALLING_EDGE : RISING_EDGE;
144144
LA_TRIGGER_CHANNEL = 0;
145145

146146
if ((trigger >> 2) & 1) {

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)