Skip to content

jvalrog/atmega-scheduler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

atmega-scheduler

atmega-scheduler is an Arduino/Avr compatible 24-hour scheduler with 1 minute resolution.

Description

With this scheduler you can run any function at any time, every day. It uses Timer1 available on most micros.

  • Configuring the scheduler is done by predefined constants in header file atmega-scheduler.h. If you want to use other frequencies, you need to change those values in order to get 1 second resolution. By default it's preconfigured for 16Mhz, like the Arduino:

    • Set the Timer1 prescaler

        #define SCHEDULER_PRESCALER 5
      
    • Set a number of ticks on register OCR1A

        #define SCHEDULER_TICKS 15625U
      

Usage

  • Initializing the scheduler:

      void scheduler_init(uint8_t hour, uint8_t minutes)
      void scheduler_set(uint8_t hour, uint8_t minutes)
    
    • scheduler_init is the initialization function that resets the internal array of tasks and sets initial time. You call this function only once.
    • scheduler_set allows you to set scheduler hours and minutes at any time.
  • Managing tasks:

      int16_t task_add(uint8_t hour, uint8_t minutes, void (*f)())
      void task_del(int16_t index)
      void task_set(int16_t index, uint8_t hour, uint8_t minutes)
    
    • With task_add you add tasks to the scheduler. Set the hour, minutes and function to execute. Return value is the task index for later usage.
    • With task_del you delete a task by using its index.
    • With task_set you set a new time for the task. Tasks can re-schedule using this method if they know their own index.

Sample Code

#include <avr/io.h>
#include "atmega-scheduler.h"

void led_on() {
	PORTB = 0xff;
}

void led_off() {
	PORTB = 0;
}

void main() {
	// set PORTB as output
	DDRB = 0xff;
	PORTB = 0;
	
	// In this example you will see that PORTB turns ON after 1 minute
	// and will turn OFF after 2 minutes, repeating it every day.
	
	// You can synchronize your device by setting scheduler init time
	// to 10:00AM (for example) and then hitting your device's reset at 10:00AM.
	//
	// By wiring some 7-segment displays and some push buttons, you can set
	// the time using `scheduler_set` as a normal watch.
	
	// initialize scheduler time as 10:30
	scheduler_init(10, 30);
	
	// turn led on at 10:31
	task_add(10, 31, led_on);
	
	// turn led off at 10:32
	task_add(10, 32, led_off);
	
	// enable global interrupts
	sei();
	
	while(1) {
		// your code goes here
	}
}

Running it in Arduino

  1. Download the source code by using the Download Button on this page
  2. Rename and install the library as: {arduino_path}/libraries/AtmegaScheduler
  3. Open Arduino and go to "Import Library" option. Choose AtmegaScheduler from menu.

Atmel Model Support

It should work with a long range of devices, for example:

  • atmega48, 88, 168, 328
  • atmega164, 324, 644, 1284
  • atmega640, 1280, 1281, 2560, 2561
  • atmega325, 645
  • ...

About

Arduino/Avr compatible 24-hour scheduler

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages