#include #include #include #include #include #include #include #include #include "usbdrv/usbdrv.h" #include "display.h" #include "spi.h" #include "usb.h" #include "softtimer.h" #include "main.h" uint8_t newThermoData = 1; uint16_t thermoData[] = {1024, 814, 2475, 2243}; void hardinit() { /* initializes the hardware */ DDRB = _BV(1) | _BV(2) | _BV(0); DDRC = 0x3f; // no pullups; all digital outputs can take care of themselves PORTB = 0x00; PORTC = 0x00; PORTD = 0x00; // hardware pwm for brightness/contrast: TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10); TCCR1B = _BV(WGM12) | _BV(CS11); // clk/8 prescaler, 4kHz PWM-freq. OCR1A = 15; // contrast OCR1B = 50; // brightness // enable softtimer isr TIMSK1 |= _BV(TOIE1); // init LCD: lcd_init(1); lcd_clrscr(1); sei(); } void softinit() { lcd_defchar(1, LCD_CHAR_HALFBAR, lcd_halfbar_char); lcd_defchar(1, LCD_CHAR_BAR, lcd_bar_char); lcd_defchar(1, LCD_CHAR_DEGREE, lcd_degree_char); } int __attribute__((noreturn)) main(void) { hardinit(); softinit(); usbInit(); for(;;){ usbPoll(); SOFTTIMER(2,500) { thermoData[0]=thermoData[0]+5; thermoData[1]=thermoData[1]+15; thermoData[2]=thermoData[2]+7; thermoData[3]=thermoData[3]+18; newThermoData = 1; } SOFTTIMER(1,250) { updateTemperature(); } } } /* ISR(TIMER1_OVF_vect, ISR_NAKED){ asm volatile ("in %0, %1\n" : "=r" (sreg_store) : "I" (_SFR_IO_ADDR(SREG))); timer1_acc++; asm volatile ("out %1, %0\n" : "=r" (sreg_store) : "I" (_SFR_IO_ADDR(SREG))); reti(); }*/ ISR(TIMER1_OVF_vect,ISR_NOBLOCK){ uint16_t tmp; tmp=timer1_acc; tmp++; /* 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. */ ATOMIC_BLOCK(ATOMIC_FORCEON){ timer1_acc=tmp; } }