@@ -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.
125125RMTChannel *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) {
158161static 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)
190191static 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