ATtiny13 – LED fading with delay function (Software PWM)

This project shows how to simply Fade-In and Fade-Out a LED by using delay function to control pulse width what is sometimes called Software PWM (Pulse Width Modulation). In our circuit a LED is connected to PB0 and it is made to Fade the LED In and Out alternately. The code is on Github, click here.

Parts Required

Circuit Diagram

blinky-one-led

Firmware

This code is written in C and can be compiled using the avr-gcc. More details on how compile this project is here.

#include <avr/io.h>
#include <util/delay.h>

#define LED_PIN         PB0
#define DELAY_MAX       (512)
#define DELAY_MIN       (1)

#if DELAY_MAX < 1 || DELAY_MIN < 1
# warning "Value of DELAY_MAX and DELAY_MAIN should be from range <1, 2^16>"
#endif
#if !(DELAY_MAX > DELAY_MIN)
# warning "Value of DELAY_MAX should be greater then DELAY_MIN"
#endif

int
main(void)
{
        uint16_t delay = DELAY_MIN;
        uint8_t dir = 0;

        /* setup */
        DDRB = 0b00000001; // set LED pin as OUTPUT
        PORTB = 0b00000001; // set LED pin to HIGH

        /* loop */
        while (1) {

                PORTB &= ~(_BV(LED_PIN)); // LED off
                _delay_loop_2(delay);

                PORTB |= _BV(LED_PIN); // LED on
                _delay_loop_2(DELAY_MAX - delay);

                if (dir) { // fade-in
                        if (++delay >= (DELAY_MAX - 1)) dir = 0;
                } else { // fade-out
                        if (--delay <= DELAY_MIN) dir = 1;
                }

        }
}

Leave a Comment