void tone(uint32_t ulPin, uint32_t frequency, int32_t duration) { const uint32_t rc = VARIANT_MCK / 256 / frequency; tone_pin = ulPin; toggle_count = 0; // strange wipe out previous duration if (duration > 0 ) toggle_count = 2 * frequency * duration / 1000; else toggle_count = -1; if (!TCChanEnabled) { pmc_set_writeprotect(false); pmc_enable_periph_clk((uint32_t)TONE_IRQ); TC_Configure(chTC, chNo, TC_CMR_TCCLKS_TIMER_CLOCK4 | TC_CMR_WAVE | // Waveform mode TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC chTC->TC_CHANNEL[chNo].TC_IER=TC_IER_CPCS; // RC compare interrupt chTC->TC_CHANNEL[chNo].TC_IDR=~TC_IER_CPCS; NVIC_EnableIRQ(TONE_IRQ); TCChanEnabled = 1; } if (!pinEnabled[ulPin]) { pinMode(ulPin, OUTPUT); pinEnabled[ulPin] = 1; } TC_Stop(chTC, chNo); TC_SetRC(chTC, chNo, rc); // set frequency TC_Start(chTC, chNo); }
void vMBPortTimersDisable( ) { TC_Stop( TCX, 0 ); #if MB_TIMER_DEBUG == 1 PIO_Clear( &xTimerDebugPins[0] ); #endif }
static void finISR(timer16_Sequence_t timer) { #if defined (_useTimer1) TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); #endif #if defined (_useTimer2) TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); #endif #if defined (_useTimer3) TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); #endif #if defined (_useTimer4) TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); #endif #if defined (_useTimer5) TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); #endif }
void finISR(timer16_Sequence_t timer) { #ifdef _useTimer1 TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); #endif #ifdef _useTimer2 TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); #endif #ifdef _useTimer3 TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); #endif #ifdef _useTimer4 TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); #endif #ifdef _useTimer5 TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); #endif }
// XXX: this function only works properly for timer 2 (the only one we use // currently). for the others, it should end the tone, but won't restore // proper PWM functionality for the timer. void disableTimer(uint8_t _timer) { switch (_timer) { case 0: #if defined(TIMSK0) TIMSK0 = 0; #elif defined(TIMSK) TIMSK = 0; // atmega32 #endif break; #if defined(TIMSK1) && defined(OCIE1A) case 1: bitWrite(TIMSK1, OCIE1A, 0); break; #endif case 2: #if defined(TIMSK2) && defined(OCIE2A) bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt #endif #if defined(TCCR2A) && defined(WGM20) TCCR2A = (1 << WGM20); #endif #if defined(TCCR2B) && defined(CS22) TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); #endif #if defined(OCR2A) OCR2A = 0; #endif break; #if defined(TIMSK3) case 3: TIMSK3 = 0; break; #endif #if defined(TIMSK4) case 4: TIMSK4 = 0; break; #endif #if defined(TIMSK5) case 5: TIMSK5 = 0; break; #endif #if defined(TC0) case 6: TC_Stop(TC1, 0); break; #endif } }
DueTimer& DueTimer::stop(void){ /* Stop the timer */ NVIC_DisableIRQ(Timers[timer].irq); TC_Stop(Timers[timer].tc, Timers[timer].channel); return *this; }
void BaseDMD::end() { NVIC_DisableIRQ(TC7_IRQn); bool still_running = unregister_running_dmd(this); if(still_running) NVIC_EnableIRQ(TC7_IRQn); // Still some DMDs running else TC_Stop(TC2, 1); clearScreen(); scanDisplay(); }
/** * Enable/Disable audio channels */ static void AudioPlayEnable(uint8_t enable) { if (enable == 1) { TC_Start(TC0, 0); DACC_EnableChannel(DACC, CHANNEL_R); DACC_EnableChannel(DACC, CHANNEL_L); } else if (enable == 0) { TC_Stop(TC0, 0); DACC_DisableChannel(DACC, CHANNEL_R); DACC_DisableChannel(DACC, CHANNEL_R); } }
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) { uint8_t prescalarbits = 0b001; long toggle_count = 0; uint32_t ocr = 0; int8_t _timer; _timer = toneBegin(_pin); if (_timer >= 0) { // Set the pinMode as OUTPUT pinMode(_pin, OUTPUT); // if we are using an 8 bit timer, scan through prescalars to find the best fit if (_timer == 0 || _timer == 2) { ocr = F_CPU / frequency / 2 - 1; prescalarbits = 0b001; // ck/1: same for both timers if (ocr > 255) { ocr = F_CPU / frequency / 2 / 8 - 1; prescalarbits = 0b010; // ck/8: same for both timers if (_timer == 2 && ocr > 255) { ocr = F_CPU / frequency / 2 / 32 - 1; prescalarbits = 0b011; } if (ocr > 255) { ocr = F_CPU / frequency / 2 / 64 - 1; prescalarbits = _timer == 0 ? 0b011 : 0b100; if (_timer == 2 && ocr > 255) { ocr = F_CPU / frequency / 2 / 128 - 1; prescalarbits = 0b101; } if (ocr > 255) { ocr = F_CPU / frequency / 2 / 256 - 1; prescalarbits = _timer == 0 ? 0b100 : 0b110; if (ocr > 255) { // can't do any better than /1024 ocr = F_CPU / frequency / 2 / 1024 - 1; prescalarbits = _timer == 0 ? 0b101 : 0b111; } } } } #if defined(TCCR0B) if (_timer == 0) { TCCR0B = prescalarbits; } else #endif #if defined(TCCR2B) { TCCR2B = prescalarbits; } #else { // dummy place holder to make the above ifdefs work } #endif } else { // two choices for the 16 bit timers: ck/1 or ck/64 ocr = F_CPU / frequency / 2 - 1; prescalarbits = 0b001; if (ocr > 0xffff) { ocr = F_CPU / frequency / 2 / 64 - 1; prescalarbits = 0b011; } if (_timer == 1) { #if defined(TCCR1B) TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; #endif } #if defined(TCCR3B) else if (_timer == 3) TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; #endif #if defined(TCCR4B) else if (_timer == 4) TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; #endif #if defined(TCCR5B) else if (_timer == 5) TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; #endif } // Calculate the toggle count if (duration > 0) { toggle_count = 2 * frequency * duration / 1000; } else { toggle_count = -1; } // Set the OCR for the given timer, // set the toggle count, // then turn on the interrupts switch (_timer) { #if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) case 0: OCR0A = ocr; timer0_toggle_count = toggle_count; bitWrite(TIMSK0, OCIE0A, 1); break; #endif case 1: #if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) OCR1A = ocr; timer1_toggle_count = toggle_count; bitWrite(TIMSK1, OCIE1A, 1); #elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) // this combination is for at least the ATmega32 OCR1A = ocr; timer1_toggle_count = toggle_count; bitWrite(TIMSK, OCIE1A, 1); #endif break; #if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) case 2: OCR2A = ocr; timer2_toggle_count = toggle_count; bitWrite(TIMSK2, OCIE2A, 1); break; #endif #if defined(TIMSK3) case 3: OCR3A = ocr; timer3_toggle_count = toggle_count; bitWrite(TIMSK3, OCIE3A, 1); break; #endif #if defined(TIMSK4) case 4: OCR4A = ocr; timer4_toggle_count = toggle_count; bitWrite(TIMSK4, OCIE4A, 1); break; #endif #if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) case 5: OCR5A = ocr; timer5_toggle_count = toggle_count; bitWrite(TIMSK5, OCIE5A, 1); break; #endif #if defined(TC0) && defined(TC1) && defined(TC2) case 6: ocr = VARIANT_MCK / 256 / frequency; TC_Stop(TC1, 0); TC_SetRC(TC1, 0, ocr); TC_Start(TC1, 0); timer6_toggle_count = toggle_count; break; #endif } } }
void noTone(uint32_t ulPin) { TC_Stop(chTC, chNo); // stop timer digitalWrite(ulPin,LOW); // no signal on pin }
void DACClass::end() { TC_Stop(TC0, 1); NVIC_DisableIRQ(isrId); dacc_disable_channel(dac, 0); dacc_disable_channel(dac, 1); }
/*---------------------------------------------------------------------------- * Handles interrupts coming from USART *----------------------------------------------------------------------------*/ void USART_Handler(void) { uint32_t status; unsigned short serialState; status = BASE_USART->US_CSR; status &= BASE_USART->US_IMR; /* If USB device is not configured, do nothing */ if (!isSerialPortON) { BASE_USART->US_IDR = 0xFFFFFFFF; return; } /* Buffer has been read successfully */ if ((status & US_CSR_ENDRX) != 0) { /* Disable timer */ TC_Stop(TC0, 0); /* Send buffer through the USB */ while (CDCDSerial_Write(usartBuffers[usartCurrentBuffer], DATABUFFERSIZE, 0, 0) != USBD_STATUS_SUCCESS); /* Restart read on buffer */ USART_ReadBuffer(BASE_USART, usartBuffers[usartCurrentBuffer], DATABUFFERSIZE); usartCurrentBuffer = 1 - usartCurrentBuffer; /* Restart timer */ TC_Start(TC0, 0); } /* Buffer has been sent */ if ((status & US_IER_TXBUFE) != 0) { /* Restart USB read */ CDCDSerial_Read(usbSerialBuffer0, DATABUFFERSIZE, (TransferCallback) UsbDataReceived, 0); BASE_USART->US_IDR = US_IER_TXBUFE; } /* Errors */ serialState = CDCDSerial_GetSerialState(); /* Overrun */ if ((status & US_CSR_OVRE) != 0) { TRACE_WARNING( "USART1_IrqHandler: Overrun\n\r"); serialState |= CDCSerialState_OVERRUN; } /* Framing error */ if ((status & US_CSR_FRAME) != 0) { TRACE_WARNING( "USART1_IrqHandler: Framing error\n\r"); serialState |= CDCSerialState_FRAMING; } CDCDSerial_SetSerialState(serialState); }