Skip to content

Commit 1b7df8a

Browse files
committed
Make interrupt routine from mcpwm sync simpler
1 parent 22da029 commit 1b7df8a

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

DCCRMT.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ static void IRAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
124124
// is only ONE common ISR routine for all channels.
125125
RMTChannel *channelHandle[8] = { 0 };
126126

127-
static volatile uint8_t cutoutCounter = 0;
127+
// When cutoutFlag == 0 then it is the first
128+
// interrupt and we do the cutout
129+
static volatile uint8_t cutoutFlag = 0;
128130

129131
// define time values for cutout
130132
#define CUTOUT_TOTAL 486 // usec
@@ -140,10 +142,11 @@ void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {
140142
if (channel == 0) {
141143
DCCTimer::updateMinimumFreeMemoryISR(0);
142144
MCPWM1.operators[0].gen_stmp_cfg.gen_a_upmethod = 4; // bit 4 means "on sync"
143-
cutoutCounter = 0;
145+
cutoutFlag = 0;
144146
// not needed here, we keep it enabled all the time
145147
//MCPWM1.int_ena.timer0_tez_int_ena = 1; // Enable interrupt on TEZ
146-
__digitalWrite(13 /*BRKA*/, 0);
148+
//DEBUG __digitalWrite(13 , 0);
149+
//DEBUG __digitalWrite(26 , 1);
147150
mcpwm_set_duty_in_us(MCPWM_UNIT_1, MCPWM_TIMER_0, MCPWM_GEN_A, CUTOUT_PULSE);
148151
mcpwm_sync_config_t sync_conf = {
149152
.sync_sig = MCPWM_SELECT_GPIO_SYNC0,
@@ -158,26 +161,24 @@ void IRAM_ATTR interrupt(rmt_channel_t channel, void *t) {
158161
static void IRAM_ATTR mcpwmIsrHandler(void* arg) {
159162
if (MCPWM1.int_st.timer0_tez_int_st) {
160163
MCPWM1.int_clr.timer0_tez_int_clr = 1;
161-
if (cutoutCounter == 1) {
162-
__digitalWrite(13 /*BRKA*/, 1);
163-
// this does not work as the enable does not go into effect immidiately
164-
// MCPWM1.int_ena.timer0_tez_int_ena = 0; // Disable interrupt on TEZ
165-
//cutoutCounter = 0;
166-
}
167-
if (cutoutCounter == 2) {
168-
__digitalWrite(13 /*BRKA*/, 0);
169-
cutoutCounter++;
170-
DCCWaveform::incCutoutCounter();
171-
} else if (cutoutCounter == 3) {
172-
__digitalWrite(13 /*BRKA*/, 1);
173-
cutoutCounter++;
174-
}
175-
if (cutoutCounter < 2) {
164+
if (cutoutFlag == 0) {
165+
//DEBUG __digitalWrite(26, 0);
166+
// The cutout has not happened yet
167+
// This interrupt is on cutout start
168+
// but we reset already the mcpwm into standby mode
176169
MCPWM1.operators[0].gen_stmp_cfg.gen_a_upmethod = 1; // bit 1 means "TEZ = timer zero"
177170
mcpwm_set_duty_in_us(MCPWM_UNIT_1, MCPWM_TIMER_0, MCPWM_GEN_A, 0);
178171
mcpwm_sync_disable(MCPWM_UNIT_1, MCPWM_TIMER_0);
179-
cutoutCounter++;
172+
cutoutFlag++;
173+
} else if (cutoutFlag == 1) { // the else is important
174+
//DEBUG __digitalWrite(13 , 1);
175+
// Cutout is done
176+
DCCWaveform::incCutoutCounter();
177+
cutoutFlag++;
178+
// this does not work as the enable does not go into effect immidiately
179+
// MCPWM1.int_ena.timer0_tez_int_ena = 0; // Disable interrupt on TEZ
180180
}
181+
// when cutoutFlag has reached 2 this routine does nothing
181182
}
182183
}
183184

@@ -189,10 +190,9 @@ static void IRAM_ATTR mcpwmIsrHandler(void* arg) {
189190
// pin through the mux)
190191
static void IRAM_ATTR mcpwmPulseOn() {
191192

192-
// for debug
193-
//gpio_set_direction((gpio_num_t)13, GPIO_MODE_OUTPUT);
194-
pinMode(13, OUTPUT);
195-
digitalWrite(13, 1);
193+
//DEBUG pinMode(13, OUTPUT);
194+
//DEBUG pinMode(26, OUTPUT);
195+
196196
DCCWaveform::setRailcomPossible(true);
197197
mcpwm_config_t pwm_config = {
198198
.frequency = CUTOUT_BASE_FREQ, // calculation see above

0 commit comments

Comments
 (0)