Forum: Mikrocontroller und Digitale Elektronik frage zu programm


von andi (Gast)


Lesenswert?

hallo leute, ich bin gerade dabei meinen roboter mit einem ir 
kollisionssystem auszustatten. dafür habe ich mein system mit einer ir 
sendediode und einem infrarotempfänger ausgestattet. mittlerweile 
funktioniert das erkennen der ir- strahlen.

nun aber möchte ich, dass der roboter fährt, wenn er kein hinderniss 
erkennt und er soll stehen bleiben, sobald ein hinderniss erkannt wird.


hier mein bisheriges programm:
1
#include "RP6ControlLib.h"
2
#include "RP6I2CmasterTWI.h"
3
#include "RP6Control_I2CMasterLib.h"
4
5
uint8_t a;
6
uint8_t interruptcounter;
7
8
9
ISR(TIMER1_COMPA_vect) 
10
  
11
  {interruptcounter++;
12
  
13
if(interruptcounter <21)
14
  {DDRD |= (1<<PD5);  //PD5 als Ausgang
15
  PORTD ^= (1<<PD5);
16
17
}
18
19
if(interruptcounter > 20 && interruptcounter <41)
20
  {DDRD &=~ (1<<PD5);
21
}
22
23
if(interruptcounter == 41)
24
  {interruptcounter =0;}
25
  
26
27
28
}
29
30
31
32
33
34
void infrarotempfang(void)
35
{if (!(PINC & (1<<PC3)))
36
 {a++;  //infrarot empfangen
37
 }
38
39
}
40
41
void RP6_Bewegung(void)
42
{if(a<101)
43
  {changeDirection(BWD);
44
  moveAtSpeed(50,50); //Roboter fährt
45
  }
46
47
if(a>100)
48
  {moveAtSpeed(0,0);
49
  writeString("RP6 anhalten\n"); // Roboter hält an
50
startStopwatch1();}
51
52
if(getStopwatch1() ==1000)
53
  {a=0;
54
  setStopwatch1(0);
55
  writeString("Stopwatch1 auf 0 zurück\n");}
56
}
57
58
  
59
int main(void)
60
{initRP6Control();
61
62
I2CTWI_initMaster(100);  
63
64
DDRC &=~ (1<<PC3);    //PC3 als Eingang infrarotempfänger
65
 
66
a=0;        // a anfangs auf 0 setzen
67
68
while(true)
69
{
70
infrarotempfang();
71
RP6_Bewegung();
72
}
73
return 0;
74
}
zur erklärung: der infrarotempfänger an PC3 schaltet auf low, wenn er ir 
erkennt.
jetzt habe ich nur das problem, dass der µc immer, also auch wenn kein 
ir erkannt wird, "RP6 anhalten" meldet. d.h. der roboter fährt gar nicht 
erst los, was wohl daran liegt, dass die variable a von anfang an nicht 
auf 0 zurückgesetzt wird.

kann mir vielleicht jemand helfen und sagen, was ich bisher noch falsch 
gemacht habe?

mfg andi

von Karl H. (kbuchegg)


Lesenswert?

andi schrieb:

> zur erklärung: der infrarotempfänger an PC3 schaltet auf low, wenn er ir
> erkennt.
> jetzt habe ich nur das problem, dass der µc immer, also auch wenn kein
> ir erkannt wird, "RP6 anhalten" meldet. d.h. der roboter fährt gar nicht
> erst los, was wohl daran liegt, dass die variable a von anfang an nicht
> auf 0 zurückgesetzt wird.

Das denke ich nicht.
Es wird wohl eher so sein, dass das hier

void infrarotempfang(void)
{if (!(PINC & (1<<PC3)))
 {a++;  //infrarot empfangen
 }
}

den Pin PC3 immer (oder meistens) auf LOW vorfinden wird (zb. weil sich 
der Empfänger irgendwelche Reflexionen einfängt. Wenn du dein IR Signal 
nicht moduliert hast, würde mich das nicht weiter wundern. Wie sieht 
denn die Schaltung dazu aus?)

Lass dir doch in dieser Funktion einmal a ausgeben

void writeUint8( uint8_t wert )
{
  char buffer[10];
  itoa( buffer, (int)wert, 10 );
  writeString( buffer );
}

und dann fügst du einen Aufruf ein

void infrarotempfang(void)
{
 if (!(PINC & (1<<PC3)))
 {
   writeString( "IR: " );
   a++;  //infrarot empfangen
   writeUint8( a );
   writeString( " " );
 }
}

dann weißt du was Sache ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.