/******************************************************************************!
 * \file timer0.h
 * \author Sebastien Beaugrand
 * \sa http://beaugrand.chez.com/
 * \copyright CeCILL 2.1 Free Software license
 ******************************************************************************/
#ifndef AVR_TIMER0
#define AVR_TIMER0

#define TIMER0_RESOLUTION 256UL

/******************************************************************************!
 * \fn timer0SetPeriod
 ******************************************************************************/
void timer0SetPeriod(unsigned long microseconds)
{
    uint8_t prescaler;
    uint16_t ocr;

    for (prescaler = 1;
         prescaler < 6;
         ++prescaler) {
        // Clock div: 1 8 64 256 1024
        // Shift: 0 3 6 8 10
        ocr = prescaler << 1;
        if (ocr == 2) {
            ocr = 0;
        } else if (ocr == 4) {
            ocr = 3;
        }
        ocr = ((F_CPU / 1000000 * microseconds) >> ocr) - 1;
        if (ocr <= TIMER0_RESOLUTION) {
            break;
        }
    }
    if (ocr >= TIMER0_RESOLUTION) {
        ocr = TIMER0_RESOLUTION - 1;
    }

    OCR0A = ocr;
    TCCR0A = 0;
    TCCR0B = (TCCR0B & ~((1 << CS12) | (1 << CS11) | (1 << CS10))) | prescaler;

    TCNT0 = 0;
    TIMSK |= (1 << OCIE0A);
}

#endif