package devices.AVR.ATMega2560;
public class Timer {
private static IOReg TIMSK2;
private static IOReg ASSR;
private static IOReg TCNT2;
private static IOReg TCCR2B;
private static IOReg TIFR2;
static
{
TIMSK2 = new IOReg(IOReg.TIMSK2);
ASSR = new IOReg(IOReg.ASSR);
TCNT2 = new IOReg(IOReg.TCNT2);
TCCR2B = new IOReg(IOReg.TCCR2B);
TIFR2 = new IOReg(IOReg.TIFR2);
}
public native static void enableGlobalInterrupt();
public static void timerInit()
{
/* Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2 */
TIMSK2.reg &= ~(1 << IOReg.TOIE2);
/* Select external 32kHz clock source by setting AS2 as appropriate */
/* For this to work on STK600 you need to place a jumper between the 32KHz and TOSC1 pin on the AUX header */
ASSR.reg |= (1 << IOReg.EXCLK);
ASSR.reg |= (1 << IOReg.AS2);
/* Write new values to TCNT2, OCR2, and TCCR2 */
TCNT2.reg = 0;
TCCR2B.reg |= (1 << IOReg.CS21);
/* To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB */
while ((ASSR.reg & (1 << IOReg.TCR2BUB)) > 0)
;
/* Clear the Timer/Counter2 Interrupt Flags */
TIFR2.reg |= (1 << IOReg.TOV2);
/* Enable Timer2 Overflow interrupt */
TIMSK2.reg |= (1 << IOReg.TOIE2);
enableGlobalInterrupt();
}
}