Boolean flags moved into one register
Size optimization enabled
This commit is contained in:
parent
2636181f06
commit
0cb9050e57
@ -36,7 +36,7 @@ AVRDUDE = avrdude
|
|||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
|
|
||||||
# Some C flags
|
# Some C flags
|
||||||
CFLAGS = -Wall -O3
|
CFLAGS = -Wall -Os
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo
|
@echo
|
||||||
|
@ -18,16 +18,16 @@
|
|||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
// variables:
|
// variables:
|
||||||
volatile unsigned int time_counter, user_time_counter = 0, sec_counter = 0; // global and universal time counter (ms) and second-counter (for AutoOff)
|
volatile uint16_t ms_counter = 0; // global and universal time counter (ms) and second-counter (for AutoOff)
|
||||||
volatile unsigned int button_1_cup_counter = 0, button_2_cup_counter = 0; // button counter
|
volatile uint8_t sec_counter = 0;
|
||||||
volatile unsigned char button_power_counter = 0;
|
volatile uint16_t button_1_cup_counter = 0, button_2_cup_counter = 0; // button counter
|
||||||
volatile unsigned char led = 0; // LED status flags
|
volatile uint8_t button_power_counter = 0;
|
||||||
volatile bool water = false, temperature = false, make_clean = false; // water-, temperature-, clean-flags
|
volatile uint8_t led = 0; // LED status flags
|
||||||
volatile unsigned char make_coffee = 0, pump_time = 0; // pump time, clean mode flag
|
volatile uint8_t flags = 0; // Flags: * * * * esc clean temperature water
|
||||||
|
volatile uint8_t make_coffee = 0, pump_time = 0; // pump time, clean mode flag
|
||||||
|
|
||||||
int main (void)
|
int main (void)
|
||||||
{
|
{
|
||||||
@ -39,8 +39,8 @@ int main (void)
|
|||||||
if (sec_counter >= AUTO_OFF_THRESHOLD)
|
if (sec_counter >= AUTO_OFF_THRESHOLD)
|
||||||
button_power_counter = BUTTON_THRESHOLD; // check for AutoOff Timer (generate OnOff-button push)
|
button_power_counter = BUTTON_THRESHOLD; // check for AutoOff Timer (generate OnOff-button push)
|
||||||
|
|
||||||
water = get_water (); // update water state
|
get_water (); // update water state
|
||||||
temperature = get_temperature (); // update temperature
|
get_temperature (); // update temperature
|
||||||
|
|
||||||
if (button_power_counter >= BUTTON_THRESHOLD) // button "OnOff" pushed:
|
if (button_power_counter >= BUTTON_THRESHOLD) // button "OnOff" pushed:
|
||||||
{
|
{
|
||||||
@ -60,7 +60,7 @@ int main (void)
|
|||||||
if (button_1_cup_counter >= BUTTON_CLEAN_THR
|
if (button_1_cup_counter >= BUTTON_CLEAN_THR
|
||||||
&& button_2_cup_counter >= BUTTON_CLEAN_THR) // both coffee buttons pushed: clean mode:
|
&& button_2_cup_counter >= BUTTON_CLEAN_THR) // both coffee buttons pushed: clean mode:
|
||||||
{
|
{
|
||||||
make_clean = true; // clean flag true
|
set_bit(flags, FLAG_CLEAN); // clean flag true
|
||||||
led = BLUE; // set blue LED
|
led = BLUE; // set blue LED
|
||||||
while (button_1_cup_counter > 0 && button_2_cup_counter > 0)
|
while (button_1_cup_counter > 0 && button_2_cup_counter > 0)
|
||||||
; // debounce buttons
|
; // debounce buttons
|
||||||
@ -71,7 +71,7 @@ int main (void)
|
|||||||
{
|
{
|
||||||
sec_counter = 0; // reset AutoOff counter
|
sec_counter = 0; // reset AutoOff counter
|
||||||
|
|
||||||
if (water && temperature) // machine ready:
|
if ((flags & 0b00000011) == 3) // machine ready:
|
||||||
{
|
{
|
||||||
while (button_1_cup_counter > 0) // check if button is pushed long time
|
while (button_1_cup_counter > 0) // check if button is pushed long time
|
||||||
{
|
{
|
||||||
@ -94,7 +94,7 @@ int main (void)
|
|||||||
{
|
{
|
||||||
sec_counter = 0; // reset AutoOff counter
|
sec_counter = 0; // reset AutoOff counter
|
||||||
|
|
||||||
if (water && temperature) // machine ready:
|
if ((flags & 0b00000011) == 3) // machine ready:
|
||||||
{
|
{
|
||||||
while (button_2_cup_counter > 0) // check if button is pushed long time
|
while (button_2_cup_counter > 0) // check if button is pushed long time
|
||||||
{
|
{
|
||||||
@ -112,15 +112,15 @@ int main (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (water) // water OK:
|
if (bit_is_set(flags, FLAG_WATER)) // water OK:
|
||||||
{
|
{
|
||||||
if (make_clean) // if clean-flag is set:
|
if (bit_is_set(flags, FLAG_CLEAN)) // if clean-flag is set:
|
||||||
{
|
{
|
||||||
set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off
|
set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off
|
||||||
bool escape = false; // init escape-flag
|
clear_bit(flags, FLAG_ESC); // clear escape flag
|
||||||
while (water && !escape)
|
|
||||||
{ // pump until water is empty or escape flag is set
|
|
||||||
|
|
||||||
|
while (bit_is_set(flags, FLAG_WATER) && bit_is_clear(flags, FLAG_ESC))
|
||||||
|
{ // pump until water is empty or escape flag is set
|
||||||
unsigned int sense = detect_zero_crossing (); // detect zero crossing
|
unsigned int sense = detect_zero_crossing (); // detect zero crossing
|
||||||
if (sense <= 100)
|
if (sense <= 100)
|
||||||
{
|
{
|
||||||
@ -128,18 +128,17 @@ int main (void)
|
|||||||
_delay_ms (3);
|
_delay_ms (3);
|
||||||
set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin);
|
set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin);
|
||||||
}
|
}
|
||||||
water = get_water (); // update water state
|
get_water (); // update water state
|
||||||
|
|
||||||
if (button_power_counter > BUTTON_THRESHOLD)
|
if (button_power_counter > BUTTON_THRESHOLD)
|
||||||
escape = true; // check for power button counter and set escape flag
|
set_bit(flags, FLAG_ESC); // check for power button counter and set escape flag
|
||||||
}
|
}
|
||||||
make_clean = false; // clear clean flag
|
clear_bit(flags, FLAG_CLEAN); // clear clean flag
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (temperature) // temperature OK:
|
else if (bit_is_set(flags, FLAG_TEMPERATURE)) // temperature OK:
|
||||||
{
|
{
|
||||||
set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off
|
set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off
|
||||||
|
|
||||||
led = GREEN; // set green LED
|
led = GREEN; // set green LED
|
||||||
|
|
||||||
if (make_coffee > 0) // if coffee flag is set:
|
if (make_coffee > 0) // if coffee flag is set:
|
||||||
@ -160,12 +159,13 @@ int main (void)
|
|||||||
else
|
else
|
||||||
make_coffee = 0;
|
make_coffee = 0;
|
||||||
|
|
||||||
user_time_counter = 0; // reset user time counter
|
sec_counter = 0; // reset user time counter
|
||||||
bool escape = false; // init escape flag
|
clear_bit(flags, FLAG_ESC); // clear escape flag
|
||||||
while (user_time_counter < (pump_time * 1000) && water && !escape)
|
|
||||||
|
while (sec_counter < pump_time && bit_is_set(flags, FLAG_WATER) && bit_is_clear(flags, FLAG_ESC))
|
||||||
{ // loop until pump time is reached or water is empty
|
{ // loop until pump time is reached or water is empty
|
||||||
if (make_coffee > 2
|
if (make_coffee > 2
|
||||||
|| (user_time_counter < 2000 || user_time_counter > 4000))
|
|| (sec_counter < 2 || sec_counter > 4))
|
||||||
{ // check for preinfusion break
|
{ // check for preinfusion break
|
||||||
unsigned int sense = detect_zero_crossing (); // detect zero crossing
|
unsigned int sense = detect_zero_crossing (); // detect zero crossing
|
||||||
if (sense <= 100)
|
if (sense <= 100)
|
||||||
@ -176,16 +176,15 @@ int main (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
water = get_water (); // update water state
|
get_water (); // update water state
|
||||||
|
|
||||||
if (button_power_counter > BUTTON_THRESHOLD)
|
if (button_power_counter > BUTTON_THRESHOLD)
|
||||||
escape = true; // check for power button counter and set escape flag
|
set_bit(flags, FLAG_ESC); // check for power button counter and set escape flag
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off
|
set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off
|
||||||
|
clear_bit(flags, FLAG_CLEAN); // clear clean flag
|
||||||
make_coffee = 0; // clear coffee flag
|
make_coffee = 0; // clear coffee flag
|
||||||
|
|
||||||
sec_counter = 0; // reset AutoOff timer
|
sec_counter = 0; // reset AutoOff timer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -284,7 +283,7 @@ void power_off ()
|
|||||||
asm volatile("sleep"::);
|
asm volatile("sleep"::);
|
||||||
|
|
||||||
// entrance after wake-up:
|
// entrance after wake-up:
|
||||||
time_counter = 0; // reset counter
|
ms_counter = 0; // reset counter
|
||||||
sec_counter = 0;
|
sec_counter = 0;
|
||||||
cli (); // disable interrupts
|
cli (); // disable interrupts
|
||||||
clear_bit(GIMSK, INT0); // disable interrupt 0
|
clear_bit(GIMSK, INT0); // disable interrupt 0
|
||||||
@ -293,37 +292,35 @@ void power_off ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* function: get_water()
|
/* function: get_water()
|
||||||
* return: true water OK
|
|
||||||
* false not enough water
|
|
||||||
*
|
*
|
||||||
* Checks hall sensor for water state.
|
* Checks hall sensor for water state.
|
||||||
*/
|
*/
|
||||||
bool get_water ()
|
void get_water ()
|
||||||
{
|
{
|
||||||
ADMUX = SENSOR_MAGNET_adc | (1 << ADLAR); // ADLAR
|
ADMUX = SENSOR_MAGNET_adc | (1 << ADLAR); // ADLAR
|
||||||
set_bit(ADCSR, ADSC);
|
set_bit(ADCSR, ADSC);
|
||||||
loop_until_bit_is_clear (ADCSR, ADSC);
|
loop_until_bit_is_clear (ADCSR, ADSC);
|
||||||
unsigned char sense = ADCH;
|
unsigned char sense = ADCH;
|
||||||
if ((water && sense > WATER_LOW) || (!water && sense >= WATER_OK))
|
if ((bit_is_set(flags, FLAG_WATER) && sense > WATER_LOW) || (bit_is_clear(flags, FLAG_WATER) && sense >= WATER_OK))
|
||||||
return true;
|
set_bit(flags, FLAG_WATER);
|
||||||
return false;
|
else
|
||||||
|
clear_bit(flags, FLAG_WATER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* function: get_temperature()
|
/* function: get_temperature()
|
||||||
* return: true temperature OK
|
|
||||||
* false temperature too low
|
|
||||||
*
|
*
|
||||||
* Checks NTC sensor for temperature state.
|
* Checks NTC sensor for temperature state.
|
||||||
*/
|
*/
|
||||||
bool get_temperature ()
|
void get_temperature ()
|
||||||
{
|
{
|
||||||
ADMUX = SENSOR_TEMP_adc | (1 << ADLAR); // ADLAR
|
ADMUX = SENSOR_TEMP_adc | (1 << ADLAR); // ADLAR
|
||||||
set_bit(ADCSR, ADSC);
|
set_bit(ADCSR, ADSC);
|
||||||
loop_until_bit_is_clear (ADCSR, ADSC);
|
loop_until_bit_is_clear (ADCSR, ADSC);
|
||||||
unsigned char sense = ADCH;
|
unsigned char sense = ADCH;
|
||||||
if (sense >= OPERATING_TEMPERATURE)
|
if (sense >= OPERATING_TEMPERATURE)
|
||||||
return true;
|
set_bit(flags, FLAG_TEMPERATURE);
|
||||||
return false;
|
else
|
||||||
|
clear_bit(flags, FLAG_TEMPERATURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* function: detect_zero_crossing()
|
/* function: detect_zero_crossing()
|
||||||
@ -355,20 +352,15 @@ ISR ( INT0_vect)
|
|||||||
*/
|
*/
|
||||||
ISR ( TIMER1_OVF1_vect)
|
ISR ( TIMER1_OVF1_vect)
|
||||||
{
|
{
|
||||||
if (time_counter < 1000)
|
if (ms_counter < 1000)
|
||||||
time_counter++; // global milliseconds counter and seconds counter (for AutoOff)
|
ms_counter++; // global milliseconds counter and seconds counter (for AutoOff)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
time_counter = 0;
|
ms_counter = 0;
|
||||||
sec_counter++;
|
sec_counter++;
|
||||||
}
|
}
|
||||||
user_time_counter++; // universal counter (for pump time)
|
|
||||||
|
|
||||||
bool leds_blink_on; // status flag for blinking LEDs with 1Hz
|
uint8_t leds_blink_on = (ms_counter < 500); // status flag for blinking LEDs with 1Hz
|
||||||
if (time_counter < 499)
|
|
||||||
leds_blink_on = true;
|
|
||||||
else
|
|
||||||
leds_blink_on = false;
|
|
||||||
|
|
||||||
if (led & (1 << LED_RED_ON) || (led & (1 << LED_RED_BLINK) && leds_blink_on))
|
if (led & (1 << LED_RED_ON) || (led & (1 << LED_RED_BLINK) && leds_blink_on))
|
||||||
set_bit(LED_RED_w, LED_RED_pin);
|
set_bit(LED_RED_w, LED_RED_pin);
|
||||||
|
@ -95,6 +95,7 @@
|
|||||||
#define BUTTON_CLEAN_THR 30 // button threshold for cleaning mode (ms)
|
#define BUTTON_CLEAN_THR 30 // button threshold for cleaning mode (ms)
|
||||||
#define BUTTON_THRESHOLD 100 // button threshold (ms)
|
#define BUTTON_THRESHOLD 100 // button threshold (ms)
|
||||||
#define BUTTON_LONG_THR 1500 // button threshold for long time push (ms)
|
#define BUTTON_LONG_THR 1500 // button threshold for long time push (ms)
|
||||||
|
#define BUTTON_LIMIT 1600
|
||||||
|
|
||||||
#define RED 0b00000001
|
#define RED 0b00000001
|
||||||
#define RED_BLINK 0b00000010
|
#define RED_BLINK 0b00000010
|
||||||
@ -107,9 +108,14 @@
|
|||||||
#define VIOLET 0b00010001
|
#define VIOLET 0b00010001
|
||||||
#define VIOLET_BLINK 0b00100010
|
#define VIOLET_BLINK 0b00100010
|
||||||
|
|
||||||
|
#define FLAG_WATER 0
|
||||||
|
#define FLAG_TEMPERATURE 1
|
||||||
|
#define FLAG_CLEAN 2
|
||||||
|
#define FLAG_ESC 3
|
||||||
|
|
||||||
// prototypes:
|
// prototypes:
|
||||||
void init (); // initialization
|
void init (); // initialization
|
||||||
void power_off (); // power off to sleep mode
|
void power_off (); // power off to sleep mode
|
||||||
bool get_water (); // update water state
|
void get_water (); // update water state
|
||||||
bool get_temperature (); // update tehmerature state
|
void get_temperature (); // update tehmerature state
|
||||||
unsigned int detect_zero_crossing (); // detect zero crossing
|
unsigned int detect_zero_crossing (); // detect zero crossing
|
||||||
|
Loading…
x
Reference in New Issue
Block a user