#include #include #include #include #include #include #include #include "main.h" #include "display.h" #include "spi.h" static uint8_t newThermoData = 1; static 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 // 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); } usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data; static uchar dataBuffer[4]; /* buffer must stay valid when usbFunctionSetup returns */ if(rq->bRequest == 1){ /* echo -- used for reliability tests */ dataBuffer[0] = (thermoData [0] & 0xff00)>>8; dataBuffer[1] = thermoData [0] & 0x00ff; dataBuffer[2] = (thermoData [1] & 0xff00)>>8; dataBuffer[3] = thermoData [1] & 0x00ff; usbMsgPtr = dataBuffer; /* tell the driver which data to return */ return 4; } if(rq->bRequest == 2){ /* echo -- used for reliability tests */ dataBuffer[0] = (thermoData [2] & 0xff00)>>8; dataBuffer[1] = thermoData [2] & 0x00ff; dataBuffer[2] = (thermoData [3] & 0xff00)>>8; dataBuffer[3] = thermoData [3] & 0x00ff; usbMsgPtr = dataBuffer; /* tell the driver which data to return */ return 4; } return 0; /* default for not implemented requests: return no data back to host */ } void updateDisplay() { if(newThermoData==1) { newThermoData = 0; char str[34]; snprintf(str, 34, "%3d.%02d\x03||%3d.%02d\x03\n%3d.%02d\x03||%3d.%02d\x03", thermoData[0]/100, thermoData[0]%100, thermoData[1]/100, thermoData[1]%100, thermoData[2]/100, thermoData[2]%100, thermoData[3]/100, thermoData[3]%100 ); display_gotoyx(0,0); display_puts(str); display_update(); } } int __attribute__((noreturn)) main(void) { int i=0; hardinit(); softinit(); usbInit(); display_puts("Hallo, Welt!\n\n"); display_update(); for(;;){ usbPoll(); updateDisplay(); thermoData[0]=thermoData[0]+5; thermoData[1]=thermoData[1]+15; thermoData[2]=thermoData[2]+7; thermoData[3]=thermoData[3]+18; i++; if(i%200 == 0) newThermoData = 1; } } /* 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(); }*/