Skip to content
Snippets Groups Projects
Controller.cpp 1.81 KiB
Newer Older
//
// Created by martin.vitek on 10.7.16.
//

#include "Controller.h"

#include <avr/io.h>
#include <avr/interrupt.h>

#include "servo.h"

Controller controller;

static servo_data blue_servo_data
{
        220,	//0°
        2200,	//180°

        5000,	//ICR_value
        17366	//Pulse_duration
};

static usart_regs uart_regs
{
    &UCSRA,
    &UCSRB,
    &UCSRC,
    &UDR,
    &UBRRL,
    &UBRRH
};

Controller::Controller(): servo(&DDRB, PB1, &OCR1A, blue_servo_data),
                          adc(),
                          uart(uart_regs)
{
    //Servo ini
    TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11);	//Fast PWM non-inverted
    TCCR1B |= (1<<WGM13)  | (1<<WGM12)  | (1<<CS11) | (1<<CS10);	//Prescaler 64

    ICR1 = 4000;	//Top value

    //UART ini
    uart.set_operating_mode(uart.ASYNCHRONOUS_NORMAL);
    uart.set_baudrate(115200);
    uart.set_data_bits(8);
    uart.set_stop_bits(1);
    uart.enable_reciver();
    uart.enable_trasmitter();

    //ADC ini
    DDRC = 0;
    PORTC = 0;
    ADMUX  = (1<<REFS1) | (1<<REFS0);
    ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    //adc.set_reference_voltage(adc.INTERNAL_REFERENCE);  //2.56V
    //adc.set_prescaler(adc.PRESCALER_128);               //115kHz
    //adc.enable_interrupt();
    //adc.set_channel(adc.ADC0);
    //adc.enable_adc();

    //TCC0 ini
    TCCR0 = (1<<CS02);  //225Hz
    TIMSK |= (1<<TOIE0);

Martin Vítek's avatar
Martin Vítek committed
    //Ext IRQ ini
    MCUCR |= (1<<ISC11);    //Falling edge
    GICR  |= (1<<INT1);

    //TCC2 ini
    TIMSK |= (1<<TOIE2);

    sei();
}

void Controller::print_debug()
{
    uart.transmit_string("P: ");
    uart.transmit_dec32(current_positive);
    uart.transmit_string("\tN: ");
    uart.transmit_dec32(current_negative);
Martin Vítek's avatar
Martin Vítek committed
    uart.transmit_string("\tL: ");
    uart.transmit_dec32((char)lock_signal);
    uart.transmit_new_line();
}