You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
2.6 KiB

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdio.h>
#include <usbdrv/usbdrv.h>
#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;
15 years ago
static uchar dataBuffer[4];
15 years ago
if(rq->bRequest == 1){
dataBuffer[0] = (thermoData [0] & 0xff00)>>8;
dataBuffer[1] = thermoData [0] & 0x00ff;
dataBuffer[2] = (thermoData [1] & 0xff00)>>8;
dataBuffer[3] = thermoData [1] & 0x00ff;
15 years ago
usbMsgPtr = dataBuffer;
return 4;
}
15 years ago
if(rq->bRequest == 2){
dataBuffer[0] = (thermoData [2] & 0xff00)>>8;
dataBuffer[1] = thermoData [2] & 0x00ff;
dataBuffer[2] = (thermoData [3] & 0xff00)>>8;
dataBuffer[3] = thermoData [3] & 0x00ff;
15 years ago
usbMsgPtr = dataBuffer;
return 4;
}
15 years ago
return 0;
}
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();
}*/