Beste,
Ik ben al een tijdje zoet met het programeren van een robotje. Hiervoor gebruik ik C++ en de microprocessor draagt de naam ATMEGA8515. Nu doe ik dit d.m.v. c++ en heb het onderstaande programma. Maar om hem niet in rondjes te laten rondrijden wil ik graag het volgende doen. Als er een sensor wordt ingedrukt (hij rijd dus ergens tegen aan) dan wordt er een actie uitgevoerd. Na deze actie moeten de waarden van voor en achter worden omgedraaid. Nu heeft voor altijd de waarde 1 en achter altijd de waarde 2. Ik heb het al geprobeerd met een if en een for lus maar dat kreeg ik niet geod voor elkaar. Kan iemand mij misschien helpen?
alvast bedankt.
dit is het programma:
Ik ben al een tijdje zoet met het programeren van een robotje. Hiervoor gebruik ik C++ en de microprocessor draagt de naam ATMEGA8515. Nu doe ik dit d.m.v. c++ en heb het onderstaande programma. Maar om hem niet in rondjes te laten rondrijden wil ik graag het volgende doen. Als er een sensor wordt ingedrukt (hij rijd dus ergens tegen aan) dan wordt er een actie uitgevoerd. Na deze actie moeten de waarden van voor en achter worden omgedraaid. Nu heeft voor altijd de waarde 1 en achter altijd de waarde 2. Ik heb het al geprobeerd met een if en een for lus maar dat kreeg ik niet geod voor elkaar. Kan iemand mij misschien helpen?
alvast bedankt.
dit is het programma:
code:
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
| #include <c:\avrgcc\avr\include\io.h>
#include <c:\avrgcc\avr\include\interrupt.h>
#include <c:\avrgcc\avr\include\signal.h>
#include <c:\avrgcc\avr\include\sig-avr.h>
typedef unsigned char byte;
byte links,rechts,voor,achter,stop, m1,m2,
motor1,motor2,
sensoren, uitgang, teller;
int t;
void init(){
/* deze functie initialiseer de varabelen. */
m1=1; /* m1 t/m m4 zijn motornummers geeft aan welke bitten van poort-B de motor aanstuurt */
m2=4;
links=1;
rechts=2;
voor=1;
achter=2;
stop=0;
t=150; // wachttijd
outp(0xff,DDRB); /* PORTB is de uitgang */
outp(0x00,DDRD); // PORDB is ingang
motor1=0;motor2=0; /* geeft de actuele status van de motor aan t.w.
uit, linksom of rechts om. */
uitgang=0;
}
void actie(byte motornr, byte status){
/* deze functie stuurt een motor. status 1= linksom , 2= rechtsom en 0 stoppen. */
byte hulp = motornr*status;
switch (motornr) {
case 1: uitgang = uitgang &0xFC;break; // tel steeds bij 0 op.
case 4: uitgang = uitgang &0xF3; break;
case 16: uitgang = uitgang &0xCF; break;
case 64: uitgang = uitgang &0x3F; break;
}
uitgang+=hulp;
outp(uitgang,PORTB);
}
void wacht(int tijd){
int j = 0;
int i=0; // Er is tijdnodig voor het proces
for (i=0; i<tijd;i++){
for(j=0; j<tijd; j++){}
}
}
byte detectie(){
/* deze functie detecteert de sensoren en bepaald de status van de motoren*/
byte tmp = inp(PIND);
while (tmp != inp(PIND)){wacht(5);} //anti dender filter
return ~tmp;
}
int main(void) /* het hoofdprogramma */
{
init();
for(;;){
sensoren = detectie();
switch (sensoren){
case 1:
actie(m1,stop); //sensor1
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,achter);
wacht(t);break;
case 2:
actie(m1,stop); //sensor2
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,achter);
wacht(2*t); break;
case 3:
actie(m1,stop); //sensor1+2
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,voor);
wacht(1.2*t); break;
case 4:
actie(m1,stop); //sensor3
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,voor);
wacht(2*t); break;
case 6:
actie(m1,stop); //sensor2+3
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,achter);
wacht(2*t); break;
case 8:
actie(m1,stop); //sensor4
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,voor);
wacht(t); break;
case 12:
actie(m1,stop); //sensor 3+4
actie(m2,stop);
wacht(0.1*t);
actie(m1,achter);
actie(m2,achter);
wacht(1.5*t);
actie(m1,stop);
actie(m2,stop);
wacht(0.5*t);
actie(m1,stop); //robot keert!!
actie(m2,voor);
wacht(1.2*t); break;
default: {actie(m1,voor); //robot keert!!
actie(m2,voor);
}
}
}
} |