-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
101 lines (87 loc) · 2.7 KB
/
main.cpp
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
/*========================================================================
FILENAME : main.cpp
CREATED : 28-10-2019 11:48:57
AUTHOR : Andreas og Anders
DESCR. : Main algorithm
==========================================================================*/
#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include "light.h"
#include "carControl.h"
#include "motor.h"
#include "uart.h"
#include "somo.h"
#include "startRestartStop.h"
// Sætter globale variabler, til brug i interrupts
volatile unsigned char btnStatus; // btnStatus styrer om bilen skal gå i tomgang, køre eller lave et reset
volatile signed char quitBtn;// quitBtn terminere programmet ved quitBtn = -1
volatile unsigned char sensorStatus; // bestemer stadie af programmet
volatile signed char statusCounter; // tæller hvor mange 'cases' der er blevet kørt
//INT2_vect og INT3_vect aktiveres af SW2 og SW3 på arduino shield
ISR(INT2_vect)
{
btnStatus++;
}
ISR(INT3_vect)
{
quitBtn = -1;
}
// INT4_vect og INT5_vect aktiveres af venstre og højre sensor
ISR(INT4_vect)
{
sensorStatus = statusCounter;
}
ISR(INT5_vect)
{
sensorStatus = statusCounter;
}
int main(void)
{
// Klargøring af porte
DDRE &= 0b11001111; // Port E, pin 4 og 5 er input
DDRB = 0xFF; // Port B er sat til output
// Interrupt enable og initiering
EIMSK |= 0b00111100; //INT2, INT3, INT4 og INT5 interrupt enable
EICRA |= 0b11110000; //Rising edge af INT2 og INT3 genererer interrupt request
EICRB |= 0b00001111; //Rising edge af INT4 og INT5 genererer interrupt request
sei(); //Global interrupt enable
Motor carMotor; //Klargør motor
Led led; //Klargør LED/lys
//Klargør SOMO/lyd
InitUART(9600, 8, 0);
reset();
playSource();
setVol(0x1D);
while(quitBtn != -1)
{
// Variabler og led initialiseres
statusCounter = 0;
btnStatus = 0;
led.initLED();
// Giver tegn til at bilen kan køre
startBil();
// While loopet stoppe ved restart, carControl er færdig eller brugeren bruger quit
while (btnStatus < 2 && statusCounter != -1 && quitBtn != -1)
{
// Sørger for, at SW2 aktiverer algoritmen
if (btnStatus == 1 && statusCounter == 0)
sensorStatus = 0;
// carControl kaldes når interrupt sætter sensorStatus til sensorCounter
if (sensorStatus == statusCounter && btnStatus == 1)
{
// carControl bliver kaldt til at udføre givende case
// sensorStatus får en incrementeret værdi fra carControl, så næste stadie køres
statusCounter = carControl(sensorStatus, &carMotor, &led);
}
}
// Deinitialize - restart bil
if (statusCounter == -1 || btnStatus > 1 || quitBtn == -1) {
restartBil(&carMotor, &led);
// terminere programmet
if (quitBtn == -1)
stopBil();
}
}
return 0;
}