Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//
// 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);
//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);
uart.transmit_string("\tL: ");
uart.transmit_dec32((char)lock_signal);