Reflow oven controller firmware
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

87 lines
1.5 KiB

/* timer.c */
#include <avr/io.h>
#include <avr/interrupt.h>
#include "common.h"
#include "timer.h"
uint8_t bounce_timer;
uint8_t button;
uint8_t button_port;
#define BOUNCE_TIMER_RESET 10
#define PIN_OUTPUT0 0
#define PIN_OUTPUT1 1
volatile uint8_t output0;
volatile uint8_t output1;
uint8_t tick;
volatile uint32_t seconds;
void timer_init(void)
{
bounce_timer = 0;
button = 0;
button_port = 0;
tick = TICKS_PER_SECOND-1;
seconds = 0;
TCCR0A = (1<<CTC0) | (1<<CS02); /* clk/256 */
OCR0A = TIMER_MAX;
TIMSK0 = (1<<OCIE0A);
output0 = 0;
output1 = 0;
PORTD &= ~((1<<PIN_OUTPUT0) | (1<<PIN_OUTPUT1));
DDRD |= (1<<PIN_OUTPUT0) | (1<<PIN_OUTPUT1);
}
ISR(TIMER0_COMPA_vect)
{
uint8_t port;
uint8_t old_button;
uint8_t button_pressed;
if (tick == 0) {
tick = TICKS_PER_SECOND-1;
seconds++;
} else
tick--;
old_button = button_port;
port = PIND;
port = (~port >> 4);
/*
if (bounce_timer)
bounce_timer--;
else
*/
button_port = port;
if (button_port != old_button)
bounce_timer = BOUNCE_TIMER_RESET;
button_pressed = button_port & ~old_button;
if (button_pressed & 8)
button = 4;
if (button_pressed & 4)
button = 3;
if (button_pressed & 2)
button = 2;
if (button_pressed & 1)
button = 1;
if ((TICKS_PER_SECOND-1 - tick) < output0)
PORTD |= (1<<PIN_OUTPUT0);
else
PORTD &= ~(1<<PIN_OUTPUT0);
if ((TICKS_PER_SECOND-1 - tick) < output1)
PORTD |= (1<<PIN_OUTPUT1);
else
PORTD &= ~(1<<PIN_OUTPUT1);
}