rocketscream / Low-Power

Low Power Library for Arduino
www.rocketscream.com
1.26k stars 345 forks source link

TCB timer on ATMEL ATMEGA4809 not as advertised #106

Open alantrow opened 3 years ago

alantrow commented 3 years ago

I started with microchip's own "TB3214-Getting-Started-with-TCB-90003214A.pdf". in "Example 7-3. TCB Sleep Mode Operation Code Example" I followed their example as closely as I can possibly get in my custom board (one with an RGB LED). The board goes into low power - no CPU - but no LED blinking from the TCB timer interrupt. I have no idea where to turn next.

Here's my code - with changes from the example noted in comments:

include

include <avr/io.h>

include <avr/interrupt.h>

include <avr/sleep.h>

define TCB_CMP_EXAMPLE_VALUE (0x7FFF)

define RGB_R_PORT VPORTE / Change from example /

define RGB_R_PIN PIN0_bm / Change from example /

define RGB_G_PORT VPORTE / Change from example /

define RGB_G_PIN PIN1_bm / Change from example /

define RGB_B_PORT VPORTE / Change from example /

define RGB_B_PIN PIN2_bm / Change from example /

void CLOCK_init (void); void SLPCTRL_init (void); void PORT_init (void); void TCB0_init (void);

void CLOCK_init (void) { / Enable writing to protected register / CPU_CCP = CCP_IOREG_gc; / Disable CLK_PER Prescaler / CLKCTRL.MCLKCTRLB = 0 << CLKCTRL_PEN_bp; / Enable writing to protected register / CPU_CCP = CCP_IOREG_gc; / Select 32KHz Internal Ultra Low Power Oscillator (OSCULP32K) / CLKCTRL.MCLKCTRLA = CLKCTRL_CLKSEL_OSCULP32K_gc; / Wait for system oscillator changing to finish / while (CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) { ; } }

void SLPCTRL_init (void) { / Enable sleep mode and select Standby mode / SLPCTRL.CTRLA = SLPCTRL_SMODE_gm | SLPCTRL_SMODE_STDBY_gc; }

void PORT_init (void) { RGB_R_PORT.DIR |= RGB_R_PIN; / Change from example / RGB_G_PORT.DIR |= RGB_G_PIN; / Change from example / RGB_B_PORT.DIR |= RGB_B_PIN; / Change from example / }

void setRed(bool state) / Change from example / { if (state) RGB_R_PORT.OUT |= RGB_R_PIN; else RGB_R_PORT.OUT &= ~RGB_R_PIN; }

void setGreen(bool state) / Change from example / { if (state) RGB_G_PORT.OUT |= RGB_G_PIN; else RGB_G_PORT.OUT &= ~RGB_G_PIN; }

void setBlue(bool state) / Change from example / { if (state) RGB_B_PORT.OUT |= RGB_B_PIN; else RGB_B_PORT.OUT &= ~RGB_B_PIN; }

void TCB0_init (void) { / Load the Compare or Capture register with the timeout value/ TCB0.CCMP = TCB_CMP_EXAMPLE_VALUE; / Enable TCB and set CLK_PER divider to 1 (No Prescaling) / TCB0.CTRLA = TCB_CLKSEL_CLKDIV1_gc | TCB_ENABLE_bm | TCB_RUNSTDBY_bm; / Enable Capture or Timeout interrupt / TCB0.INTCTRL = TCB_CAPT_bm; }

ISR(TCB0_INT_vect) { TCB0.INTFLAGS = TCB_CAPT_bm; / Clear the interrupt flag / // setRed(true); PORTE.IN = RGB_R_PIN; / Toggle PBE GPIO / / Change from example / }

int main(void) { CLOCK_init(); SLPCTRL_init(); PORT_init(); TCB0_init(); sei(); / Enable Global Interrupts /

setRed(false);      /* Change from example - change the LEDs to off */
setGreen(false);    /* Change from example */
setBlue(false);     /* Change from example */

while (1)
{
    sleep_mode();
}

}

ANY CLUES?