diff --git a/firmware/main.c b/firmware/main.c index f6e1301..5a3a3c5 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,28 @@ static uint8_t newThermoData = 1; static uint16_t thermoData[] = {1024, 814, 2475, 2243}; +volatile uint16_t timer1_acc; + +#define SOFTTIMERNUMS 4 +uint16_t softtimer_last[SOFTTIMERNUMS]; + +void softtimer_reset(uint8_t timernum){ + softtimer_last[SOFTTIMERNUMS] = timer1_acc; +} + +uint8_t softtimer(uint8_t timernum, uint16_t interval){ + uint16_t timer1_acc_tmp = timer1_acc; // because of volatile + if((uint16_t)(timer1_acc_tmp - (uint16_t)(softtimer_last[timernum]) >= interval )){ + softtimer_last[timernum] = timer1_acc_tmp; + return(1); + } + return(0); +} + +#define SOFTTIMER(n,a) if(softtimer((n),(a*4))) + + + void hardinit() { @@ -100,7 +123,9 @@ int __attribute__((noreturn)) main(void) { for(;;){ usbPoll(); - updateDisplay(); + SOFTTIMER(1,100){ + updateDisplay(); + } thermoData[0]=thermoData[0]+5; thermoData[1]=thermoData[1]+15; @@ -108,8 +133,6 @@ int __attribute__((noreturn)) main(void) { thermoData[3]=thermoData[3]+18; i++; if(i%200 == 0) newThermoData = 1; } - - } /* @@ -119,3 +142,16 @@ int __attribute__((noreturn)) main(void) { asm volatile ("out %1, %0\n" : "=r" (sreg_store) : "I" (_SFR_IO_ADDR(SREG))); reti(); }*/ +ISR(TIMER1_OVF_vect,ISR_NOBLOCK){ + uint16_t temp; + temp=timer1_acc; + temp++; + ATOMIC_BLOCK(ATOMIC_FORCEON){ + timer1_acc=temp; + } + /* the ATOMIC is acutally only needed if timer1_acc is never read from an ISR, which + * is probably the case. + * ATOMIC_FORCEON: the ISR_NOBLOCK sets sei() a few cycles before. + */ +} + diff --git a/firmware/main.h b/firmware/main.h index 2f91f00..a3f9254 100644 --- a/firmware/main.h +++ b/firmware/main.h @@ -1,15 +1,12 @@ /* Anschlüsse sind: - * B0 - 1wire + * B0 - LCD (RS) * B1 - Kontrast-PWM * B2 - Backlight-PWM - * B3-B5 - ISP - * C0-C1 - 2farb-LED - * C2 - LED - * C3-C4 - Knopf-drehung - * C5 - Knopf-taster - * C6 - ISP - * D0-6 - LCD (DB4-7, RS, R/W, EN) - * D7 - LED + * B3-B5 - ISP/SPI + * C0-5 - LCD (DB4-7, R/W, EN) + * D2,D4 - USB + * D7 - SPI (SS master) + * */ @@ -30,63 +27,8 @@ #define BACKLIGHTPIN 2 -// button handling -#define BUTTPIN PINC -#define BUTTLPIN 5 -#define BUTTRPIN 4 -#define BUTTTPIN 3 -#define BUTTEV_PUSH 1 -#define BUTT_BOUNCE 25 //approx ms debounce time -extern uint8_t buttonevent; -extern int8_t buttoninc; // how much the button turned. - // you might want to subtract turns you consumed since the variable - // is updated in an interrupt -//uint8_t volatile timer1_acc; - -#define FLOWTEMP_MAX 100 -#define FLOWTEMP_MIN 5 -#define FLOWTEMP_DEFAULT 70 -#define FLOWTEMP_ALARM_MIN 50 -#define FLOWTEMP_ALARM_MAX 100 -#define FLOWTEMP_ALARM_DEFAULT 87 -#define FLOWTEMP_RANGE_MAX 40 -#define FLOWTEMP_RANGE_DEFAULT 15 -extern uint8_t flowtemp_alarm; -extern uint8_t flowtemp_range; -extern uint8_t flowtemp; - - - -void set_display_brightness(uint8_t display_brightness); -void store_display_brightness(uint8_t new_brightness); -uint8_t load_display_brightness(); - -void set_display_contrast(uint8_t display_contrast); -void store_display_contrast(uint8_t new_contrast); -uint8_t load_display_contrast(); - -void set_flowtemp(uint8_t new_flowtemp); -void store_flowtemp(uint8_t new_flowtemp); -uint8_t load_flowtemp(); - -void set_flowtemp_range(uint8_t new_flowtemp_range); -void store_flowtemp_range(uint8_t new_flowtemp_range); -uint8_t load_flowtemp_range(); - -void set_flowtemp_alarm(uint8_t new_flowtemp_alarm); -void store_flowtemp_alarm(uint8_t new_flowtemp_alarm); -uint8_t load_flowtemp_alarm(); - - -// clock -extern struct clockfmt { - uint8_t hour; - uint8_t minute; - uint8_t second; -} clock; - #endif //__MAIN_H