Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCB timer on ATMEL ATMEGA4809 not as advertised #106

Open
alantrow opened this issue Sep 30, 2020 · 0 comments
Open

TCB timer on ATMEL ATMEGA4809 not as advertised #106

alantrow opened this issue Sep 30, 2020 · 0 comments

Comments

@alantrow
Copy link

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 <atmel_start.h>
#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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant