/*
* MAIN Generated Driver File
*
* @file main.c
*
* @defgroup main MAIN
*
* @brief This is the generated driver implementation file for the MAIN driver.
*
* @version MAIN Driver Version 1.0.2
*
* @version Package Version: 3.1.2
© [2024] Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip
software and any derivatives exclusively with Microchip products.
You are responsible for complying with 3rd party license terms
applicable to your use of 3rd party software (including open source
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
THIS SOFTWARE.
* File: avr-main.c
* Author: User501
*
* Created on November 4, 2024, 5:27 PM
*
* * RoboTiny
*
* MPLAB X ATTINY3226-SU Tester
*
* @category MPLAB X ATTINY3226-SU Advanced Blink
* @package C++ Alarm Sketch
* @author C.A Torino
* @version V1.0.0
* @since 4th Nov 2024
* @hardware ATTINY3226-SU Modified
* @notes null
Pin out of the ATTINY3226-SU:
20 pin SOIC, SSOP
__ __
1 VDD |1 \/20| GND
2 PA4 |2 19| PA3 (EXTCLK)
3 PA5 |3 18| PA2
4 PA6 |4 17| PA1
5 PA7 |5 16| PA0 (UPDI/RESET)
6 PB5 |6 15| PC3
7 PB4 |7 14| PC2
8 PB3 |8 13| PC1
9 (TOSC1)PB2 |9 12| PC0
10 TOSC2 PB1 |10 11| PB0
-------
ATtiny826
Packs
ATtiny_DFP (3.1.260)
PICkit 5 (2.6.557)
Compiler Toolchain
XC8 (v2.50) [C:\Program Files\Microchip\xc8\v2.50\bin]
Production Image: Optimization: +space +asm
Device support information: ATtiny_DFP (3.1.260)
Memory
Data 1,024 (0x400) bytes
Data Used: 1.3%
Data Used: 13 (0xD) Free: 1,011 (0x3F3)
Program 8,192 (0x2000) bytes
Program Used: 6.3%
Program Used: 516 (0x204) Free: 7,676 (0x1DFC)
*/
//this gives an accurate time
#define F_CPU 2500000// 2.5Mhz; cpu frequency in Hz
#include <avr/io.h>//AVR functions
#include <avr/interrupt.h>// for interrupts
#include <util/delay.h>//for delay
#define D_LED_AMOUNT 1//define led amount
const uint16_t interval_time = 2000;// interval at which to blink (milliseconds)
const uint8_t LEDS[D_LED_AMOUNT] = {
PIN3_bm//PA3 LED
};
const uint16_t ON_TIME = 10;//LED on time 10ms=good as well, 50=good flash
volatile uint32_t MIL_counter = 0;// millis counter variable
uint32_t interval, nowmillis, previousMillis = 0;// for timing calculation in millis
_Bool AN_LED_BLINKING = 0;//LED blinking set to false=0
// Init millis counter
void MIL_init(void) {
TCB1.CCMP = (F_CPU / 1000) - 1; // set TOP value (period)
TCB1.CTRLA = TCB_ENABLE_bm; // enable timer/counter
TCB1.INTCTRL = TCB_CAPT_bm; // enable periodic interrupt
}
// Read millis counter
uint32_t MIL_read(void) {
cli(); // disable interrupt for atomic read
uint32_t result = MIL_counter; // read millis counter
sei(); // enable interrupt again
return result; // return millis counter value
}
// TCB0 interrupt service routine (every millisecond)
ISR(TCB1_INT_vect) {
TCB1.INTFLAGS = TCB_CAPT_bm; // clear interrupt flag
MIL_counter++; // increase millis counter
}
void PIN_config()
{
//all pins start as an input but it's good to make a human readable note
VPORTA.DIR = 0b11111111; //read from right to left: 0b11111111 same as p7=1 p6=1 p5=1 p4=1 p3=1 p2=1 p1=1 p0=1; 1=output 0=input
}
void DISABLE_peripherals()
{
ADC0.CTRLA = 0;//Disable ADC, saves ~230uA
TCA0.SPLIT.CTRLA = 0; //If you aren't using TCA0 for anything
TCB0.CTRLA = 0; //disable TCB0
USART0.CTRLA = 0;//disable USART
SPI0.CTRLA = 0;//disable SPI
BOD.CTRLA = 0;//disable bod
AC0.CTRLA = 0;//disable ACl
//DAC0.CTRLA = 0;//disable DAC (not used in Tiny-2 series)
}
void Blink_LED_Blocking() {
VPORTA.OUT |= LEDS[0]; // LED HIGH
_delay_ms(interval_time);//blocking delay
VPORTA.OUT &= ~LEDS[0]; // LED LOW
_delay_ms(interval_time);//blocking delay
}
void Blink_LED_Non_Blocking(uint32_t currentMillis) {
if (currentMillis - previousMillis >= interval_time) {//set rollover and calculate delay time
previousMillis = currentMillis;//set millis global var
VPORTA.IN |= LEDS[0];//toggle LED
}
}
void Blinking_Fast(uint32_t currentMillis) {
if(AN_LED_BLINKING)//if LED is HIGH
{
if( (currentMillis - previousMillis) >= ON_TIME)//on time check rollover
{
AN_LED_BLINKING = 0;// change the state of LED
previousMillis = currentMillis;// remember Current millis() time
}
}
else
{
if( (currentMillis - previousMillis) >= interval_time)//check off time rollover
{
AN_LED_BLINKING = 1;// change the state of LED
previousMillis = currentMillis;// remember Current millis() time
}
}
for (uint8_t i = 0; i < D_LED_AMOUNT; i++) //0,1,2,3 first 4
{
if(AN_LED_BLINKING)//if LED is blinking
{
VPORTA.OUT |= LEDS[i];// LED HIGH
}
if(!AN_LED_BLINKING)//if LED is not blinking
{
VPORTA.OUT &= ~LEDS[i];// LED LOW
}
}
}
int main(void)
{
//volatile uint32_t MIL_counter;
PIN_config();//configure the pins
DISABLE_peripherals();//disable unused
MIL_init();//initiate harware timer TCB1
while(1)
{
nowmillis = MIL_read();// read custom DIY millis counter
Blinking_Fast(nowmillis);//Blink LED fast
//Blink_LED_Non_Blocking(nowmillis);//Blink LED non blocking delay
//Blink_LED_Blocking();//Blink Blocking
}
}