diff --git a/DCCTimerGiga.cpp b/DCCTimerGiga.cpp index b5e25b7..ecd9de6 100644 --- a/DCCTimerGiga.cpp +++ b/DCCTimerGiga.cpp @@ -39,160 +39,6 @@ // which is used by the DC motor types. /////////////////////////////////////////////////////////////////////////////////////////////// -/*INTERRUPT_CALLBACK interruptHandler=0; -// // Let's use STM32's timer #2 which supports hardware pulse generation on pin D13. -// // Also, timer #3 will do hardware pulses on pin D12. This gives -// // accurate timing, independent of the latency of interrupt handling. -// // We only need to interrupt on one of these (TIM2), the other will just generate -// // pulses. - HardwareTimer timer(TIM1); - HardwareTimer timerAux(TIM3); - static bool tim2ModeHA = false; - static bool tim3ModeHA = false; - - // Timer IRQ handler - void Timer_Handler() { - interruptHandler(); -} - -void DCCTimer::begin(INTERRUPT_CALLBACK callback) { - interruptHandler=callback; - noInterrupts(); - - // adc_set_sample_rate(ADC_SAMPLETIME_480CYCLES); - timer.pause(); - timerAux.pause(); - timer.setPrescaleFactor(1); - timer.setOverflow(DCC_SIGNAL_TIME, MICROSEC_FORMAT); - timer.attachInterrupt(Timer_Handler); - timer.refresh(); - timerAux.setPrescaleFactor(1); - timerAux.setOverflow(DCC_SIGNAL_TIME, MICROSEC_FORMAT); - timerAux.refresh(); - - timer.resume(); - timerAux.resume(); - - interrupts(); -} - -bool DCCTimer::isPWMPin(byte pin) { - // Timer 2 Channel 1 controls pin D13, and Timer3 Channel 1 controls D12. - // Enable the appropriate timer channel. - switch (pin) { - case 12: - return true; - case 13: - return true; - default: - return false; - } -} - -void DCCTimer::setPWM(byte pin, bool high) { - // Set the timer so that, at the next counter overflow, the requested - // pin state is activated automatically before the interrupt code runs. - // TIM2 is timer, TIM3 is timerAux. - switch (pin) { - case 12: - if (!tim3ModeHA) { - timerAux.setMode(1, TIMER_OUTPUT_COMPARE_INACTIVE, D12); - tim3ModeHA = true; - } - if (high) - TIM3->CCMR1 = (TIM3->CCMR1 & ~TIM_CCMR1_OC1M_Msk) | TIM_CCMR1_OC1M_0; - else - TIM3->CCMR1 = (TIM3->CCMR1 & ~TIM_CCMR1_OC1M_Msk) | TIM_CCMR1_OC1M_1; - break; - case 13: - if (!tim2ModeHA) { - timer.setMode(1, TIMER_OUTPUT_COMPARE_INACTIVE, D13); - tim2ModeHA = true; - } - if (high) - TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_OC1M_Msk) | TIM_CCMR1_OC1M_0; - else - TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_OC1M_Msk) | TIM_CCMR1_OC1M_1; - break; - } -} - - void DCCTimer::clearPWM() { - timer.setMode(1, TIMER_OUTPUT_COMPARE_INACTIVE, NC); - tim2ModeHA = false; - timerAux.setMode(1, TIMER_OUTPUT_COMPARE_INACTIVE, NC); - tim3ModeHA = false; -}*/ -/////////////////////////////////////////////////////////////////////////////////////////////// -/*INTERRUPT_CALLBACK interruptHandler=0; -extern char *__brkval; -extern char *__malloc_heap_start; - - - void DCCTimer::begin(INTERRUPT_CALLBACK callback) { - interruptHandler=callback; - noInterrupts(); - ADC0.CTRLC = (ADC0.CTRLC & 0b00110000) | 0b01000011; // speed up analogRead sample time - TCB0.CTRLB = TCB_CNTMODE_INT_gc & ~TCB_CCMPEN_bm; // timer compare mode with output disabled - TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc; // 8 MHz ~ 0.125 us - TCB0.CCMP = CLOCK_CYCLES -1; // 1 tick less for timer reset - TCB0.INTFLAGS = TCB_CAPT_bm; // clear interrupt request flag - TCB0.INTCTRL = TCB_CAPT_bm; // Enable the interrupt - TCB0.CNT = 0; - TCB0.CTRLA |= TCB_ENABLE_bm; // start - interrupts(); - } - - // ISR called by timer interrupt every 58uS - ISR(TCB0_INT_vect){ - TCB0.INTFLAGS = TCB_CAPT_bm; // Clear interrupt request flag - interruptHandler(); - } - - bool DCCTimer::isPWMPin(byte pin) { - (void) pin; - return false; // TODO what are the relevant pins? - } - - void DCCTimer::setPWM(byte pin, bool high) { - (void) pin; - (void) high; - // TODO what are the relevant pins? - } - -void DCCTimer::clearPWM() { - // Do nothing unless we implent HA -} - - void DCCTimer::getSimulatedMacAddress(byte mac[6]) { - memcpy(mac,(void *) &SIGROW.SERNUM0,6); // serial number - mac[0] &= 0xFE; - mac[0] |= 0x02; - } - -volatile int DCCTimer::minimum_free_memory=__INT_MAX__; - -// Return low memory value... -int DCCTimer::getMinimumFreeMemory() { - noInterrupts(); // Disable interrupts to get volatile value - int retval = minimum_free_memory; - interrupts(); - return retval; -} - -extern char *__brkval; -extern char *__malloc_heap_start; - -int DCCTimer::freeMemory() { - char top; - return __brkval ? &top - __brkval : &top - __malloc_heap_start; -} - -void DCCTimer::reset() { - CPU_CCP=0xD8; - WDT.CTRLA=0x4; - while(true){} -}*/ INTERRUPT_CALLBACK interruptHandler=0; //HardwareTimer* timer = NULL;