diff --git a/schaltungen/displayboard_servo/software/src/main.c b/schaltungen/displayboard_servo/software/src/main.c index 9e02ce0..e01b768 100644 --- a/schaltungen/displayboard_servo/software/src/main.c +++ b/schaltungen/displayboard_servo/software/src/main.c @@ -10,6 +10,7 @@ #define POWER_MIN 0 #define POWER_MAX 400 +#define SERVO_STEPS 125 #define BUFSIZE 32 @@ -36,13 +37,19 @@ void reset_input_buffer(void) { data_count = 0; memset(data_in, 0, BUFSIZE); } + +static void update_servo_position() { + uint32_t power; + power = ( (pd.voltage_gen / 100) * (pd.current_gen / 100) ) / 100; + set_servo(power & 0xffff); +} static void timer_init(void) { - // clock is 8MHz - TCCR1B |= _BV(WGM12) | _BV(CS11) | _BV(CS10); // CTC Mode for Timer 1 (16Bit) with prescale of 64 - OCR1A = 2250; // Neutralposition ((2500-2312)*0.008ms)=1,5ms) - TIMSK = _BV(OCIE1A); - TCCR1A = (1<> 8); - uart_putc(c & 0xff); - uart_puts_P(";\r\n"); - */ - /* - uart_puts_P("data: "); - - for(uint8_t i = 0; i < BUFSIZE; i++) { - uart_putc(data_in[i]); - } - uart_puts_P("\r\n"); - */ - if (data_in[data_count] == 'B') { - process_command(data_in); - - reset_input_buffer(); - } - - data_count++; - if(data_count >= BUFSIZE) { + if (data_in[data_count] == 'B') { + process_command(data_in); reset_input_buffer(); - } - } + } + + data_count++; + if(data_count >= BUFSIZE) { // buffer overflow + reset_input_buffer(); + } + } } /** @@ -144,15 +134,22 @@ void set_servo(uint16_t display) { display = POWER_MAX-display; // invert the value / servo - display = display * 10; // shift, since we have to divide by 3,2 (32) - display = display / 32; // instead of dividing by 3,2 - display = display + 125; + display = display * 10; // *10 otherwise we need float + display = display / ( (POWER_MAX*10) / SERVO_STEPS ); + display = display + SERVO_STEPS; - cli(); // read and write atomic - if( display < 125 ) display = 125; - if( display > 250 ) display = 250; - OCR1A = 2500-display; - sei(); + uart_puts_P("display = "); + uart_print_uint16(display); + uart_puts_P("\r\n"); + + //cli(); // read and write atomic + TIMSK &= ~_BV(OCIE1A); + + if( display < 125 ) display = 125; // just make sure, the timer + if( display > 250 ) display = 250; // is never out ouf 20ms grid + OCR1A = 2500-display; + + TIMSK |= _BV(OCIE1A); } @@ -174,25 +171,20 @@ int main(void) { sei(); ports_init(); timer_init(); - uart_init(UART_BAUD_SELECT(38400,F_CPU)); - reset_input_buffer(); + uart_init(UART_BAUD_SELECT(38400,F_CPU)); + reset_input_buffer(); demo_display(); - uint32_t power; - + while(1) { - work_uart(); + work_uart(); - if(syscounter >= 100) { // about every two seconds - memset(data_in, 0, BUFSIZE); - data_count = 0; - uart_putc('a'); // send a to receive values from master box - - power = ( (pd.voltage_gen / 100) * (pd.current_gen / 100) ) / 100; - set_servo(power & 0xffff); - - syscounter = 0; - } + if((syscounter % 25) == 0) { // about every 500ms + reset_input_buffer(); + uart_putc('a'); // send a to receive values from master box + } + + syscounter %= 1000; } return(0); @@ -204,9 +196,9 @@ int main(void) { */ ISR(TIMER1_COMPA_vect) { syscounter++; - OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von - // Periodenlänge (2500*0,008ms=20ms) und letztem - // Vergleichswert (OCR1A) gebildet + OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von + // Periodenlänge (2500*0,008ms=20ms) und letztem + // Vergleichswert (OCR1A) gebildet }