summaryrefslogtreecommitdiffstats
path: root/source/Concept/Framework/robot.c
blob: 9dc564df2dbc9011739a49cb749312ec6c287d9a (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "robot.h"

//-----------------------------------------------------------------------------
Robot::Robot()
{
	//Hardware

	//Set pin 1-6 output, 0 and 7 input
	DDRA = (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6);
	PORTA = 0;

	//All output
	DDRB = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)  | (1 << 7);
	PORTB = (1 << 1);

	//All output except PC4/PC7 (mousesensor SDA)
	DDRC = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6);
	PORTC = 0;

	//All output except PD0+1(I2C) + 2+3(RS232)
	DDRD = (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)  | (1 << 7);
	PORTD = (1 << 0) | (1 << 1);//Activate pullup at PD0+1

	//PE5 for input
	DDRE = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 6)  | (1 << 7);
	PORTE = 0;

	//All input with pullup
	DDRF = 0;
	PORTF = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)  | (1 << 7);

	//All input
	DDRG = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4); 
	PORTG = (1 << 0) | (1 << 1);

	// activate channel A+B on PWM1 at 8Bit
	TCCR1A = (1<< COM1A1) | (1<< COM1B1) | (1<< WGM10);
	TCCR1B = (1<<ICNC1) | (1<<CS11); // set clock/prescaler 1/8 -> enable counter

	// activate Kanal A+B on PWM3 at 8Bit
	TCCR3A = (1<< COM3A1) | (1<< COM3B1) | (1<< WGM10);
	TCCR3B =  (1<<ICNC3) | (1<<CS31); // set clock/prescaler 1/8 -> enable counter

	//Activate interrupt
	sei();

	// Initialiate TWI
	Init_TWI();

	//Interface
	for(uint8 i = IO_START; i < IO_END; i++)
	{
		modules[i] = NULL;
	}
}

//-----------------------------------------------------------------------------
Robot::~Robot()
{
	for(uint8 i = 0; i < IO_END; i++)
	{
		if(!modules[i]) continue;

		delete modules[i];
		modules[i] = NULL;
	}
}

//-----------------------------------------------------------------------------
bool Robot::AddModule(IO_Module* newModule)
{
	if(modules[newModule->GetId()])
		return false;

	newModule->SetParent(this);

	modules[newModule->GetId()] = newModule;

	return true;
}

//-----------------------------------------------------------------------------
bool Robot::RemoveModule(IO_Module* oldModule)
{
	return RemoveModule(oldModule->GetId());
}

//-----------------------------------------------------------------------------
void Robot::Update()
{
	GetModule<Command_Handler>(IO_COMMAND_HANDLER_MAIN)->Update();

	GetModule<Position_Tracker>(IO_POSITION_TRACKER_MAIN)->Update();

	GetModule<Ball_Tracker>(IO_BALL_TRACKER_MAIN)->Update();

	GetModule<Obstacle_Tracker>(IO_OBSTACLE_TRACKER_MAIN)->Update();

	//GetModule<Logic>(IO_LOGIC_MAIN)->Update();

	GetModule<Navigator>(IO_NAVIGATOR_MAIN)->Update();
}

//-----------------------------------------------------------------------------
uint16 Robot::GetADCValue(uint8 channel)
{
	if(channel > 7) return 0;

	uint32 result = 0;
	
	//Activate ADC and set division factor to 128
	ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

	//Set multiplexer channel
	ADMUX = channel;
	//Use internal referencevoltage (2,56 V for atmega32)
	ADMUX |= (1 << REFS1) | (1 << REFS0);
	
	//Initialise ADC and start dummyreadout
	ADCSRA |= (1 << ADSC);
	while(ADCSRA & (1 << ADSC));
	
	//Get voltage three times and calculate average value
	for(uint8 i = 0; i < 3; i++)
	{
		// Eine Wandlung
		ADCSRA |= (1 << ADSC);
		// Auf Ergebnis warten...
		while(ADCSRA & (1 << ADSC));
		
		result += ADCW;
	}
	
	//Disable ADC
	ADCSRA &= ~(1 << ADEN);
	
	result /= 3;
	
	return (uint16)(result);
}

//--- EOF ---