#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[]; 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); spi_init(); 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(); //hard-reset usb for debugging ease #TODO:remove cli(); usbDeviceDisconnect(); _delay_us(100); usbDeviceConnect(); sei(); display_gotoyx(0,0); display_puts("\nstart"); display_update(); for(;;){ usbPoll(); SOFTTIMER(2,800) { uint16_t recv; for(int i=0; i<4; i++) { thermoData[i] = spi_master_transceive(7, i, 0); } newThermoData = 1; } SOFTTIMER(1,250) { displayTemperature(); } } } 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; } }