Hey Hardest,
Valen schreibt ja schon, dass dein Programm gut aussieht.
Es funktioniert auch gut.
Fahre für 10 Sekunden ohne Hindernis, dann 1 Sec zurück. --> OK
Fahre, und wenn Hindernis rechts/links auftaucht, weiche rückwärts links/rechts aus. --> OK
Wenn ein Hindernis erkannt wurde, die Rückwärtsfahrt gerade beendet ist, und dann auch noch die 10 Sekunden abgelaufen ist, dann sieht es sehr Merkwürdig aus, da nach dem rückwärtigen Ausweichen mit Drehung ja noch ein Stück gerade rückwärts gefahren wird. --> Aber das ist auch OK
Du solltest die beiden Strippen an deinem rechten Motor mal tauschen, dann muss nicht jeder in deinem Programm das RWD und FWD auf einen korrekten Motoranschluss anpassen. 
Valen hat den Spannungsabfall angesprochen.
Wichtig ist der Jumper neben dem Ein-/Ausschalter in Kombination mit der Stromversorgung.
Akku -> Jumper gesteckt
Batterie -> Jumper weglassen
Beide Fälle sind nur so sinnvoll.
Akkus bringen nur 4 * 1,2V = 4,8V. Der Jumper überbrückt eine Diode, so dass die 4,8 V als Betriebspannung da sind. --> Saft reicht gerade noch.
Batterien haben 4 * 1,5V = 6,0V. Ohne Jumper ist nun die Diode noch in Reihe mit der Stromversorgung und reduziert nun die 6,0V um 0,7V auf 5,3V. --> CPU bleibt heile.
Hier nochmal eine von mir 'aufgeräumte' Version von deinem Programm:
Code:
#include "asuro.h"
/*----------------------------------------------------------------------------
Funktionsdeclarationen
----------------------------------------------------------------------------*/
void erwarten (
unsigned int male);
void FWARD (
void);
void RWARD (
void);
void RWDL (
void);
void RWDR (
void);
void STOP (
void);
void collision (
unsigned int lang);
/*----------------------------------------------------------------------------
Hauptprogramm
----------------------------------------------------------------------------*/
int main (
void)
{
Init ();
/*
Ab hier beginnt Rolf zu "Leben"
Morgenmassage senden
*/
SerPrint ("\r\nMuah... muss ich aufstehen?\r\n");
/*
Rolfs Ablaufchema in eine unendliche Schleife setzen.
*/
while (1)
{
/*
Rolf wartet erstmal ab.
*/
erwarten (1);
/*
Rolf startet Kollisionsfahrt.
*/
collision (10000);
/*
miau
*/
RWARD ();
Msleep (1000);
STOP ();
}
/*
Rolfs Durchdrehverhinderungsschleife
*/
while (1);
return 0;
}
/*----------------------------------------------------------------------------
Funktion erwarten()
Rolf wartet auf etwas
----------------------------------------------------------------------------*/
void erwarten (
unsigned int male)
{
unsigned int i;
for (i = 0; i <= male; i++)
{
Msleep (500);
StatusLED (GREEN);
Msleep (10);
BackLED (OFF, ON);
Msleep (500);
StatusLED (OFF);
Msleep (10);
BackLED (ON, OFF);
Msleep (500);
BackLED (OFF, ON);
Msleep (500);
BackLED (ON, OFF);
}
StatusLED (OFF);
BackLED (OFF, OFF); // Schalte alles ab
}
/*----------------------------------------------------------------------------
Funktion FWARD()
Rolf vorwaerts
----------------------------------------------------------------------------*/
void FWARD (
void)
{
FrontLED (ON); // Kuendige Anfahren an
Msleep (300);
FrontLED (OFF);
Msleep (150);
FrontLED (ON);
Msleep (300);
FrontLED (OFF);
MotorDir (FWD, FWD); // Beide Motoren vorwaerts
MotorSpeed (150, 150); // Los gehts
}
/*----------------------------------------------------------------------------
Funktion RWARD()
Rolf rueckwaerts
----------------------------------------------------------------------------*/
void RWARD (
void)
{
MotorDir (RWD, RWD); // Beide Motoren rueckwearts
MotorSpeed (120, 120); // Los gehts
}
/*----------------------------------------------------------------------------
Funktion RWDL()
Rolf rueckwaerts links
----------------------------------------------------------------------------*/
void RWDL (
void)
{
MotorDir (RWD, RWD); // Beide Motoren rueckwearts
MotorSpeed (120, 0); // Los gehts
}
/*----------------------------------------------------------------------------
Funktion RWDR()
Rolf rueckwaerts rechts
----------------------------------------------------------------------------*/
void RWDR (
void)
{
MotorDir (RWD, RWD); // Beide Motoren rueckwearts
MotorSpeed (0, 120); // Los gehts
}
/*----------------------------------------------------------------------------
Funktion STOP()
Rolf stoppen
----------------------------------------------------------------------------*/
void STOP (
void)
{
MotorSpeed (0, 0); // Feierabend
FrontLED (OFF); // Nix Licht
}
/*----------------------------------------------------------------------------
Funktion collision()
Rolf Kollisionsprogramm
----------------------------------------------------------------------------*/
void collision (
unsigned int lang)
{
unsigned long zeit = 0;
unsigned long startzeit = Gettime ();
unsigned char t1;
unsigned char t2;
while (zeit < (startzeit + lang)) // Fahre so lange wie zeit gegeben ist
{
t1 = PollSwitch ();
t2 = PollSwitch ();
/*
Nur dann die Tasten auswerten, wenn beide Abfragen identische Werte
geliefert haben. Sonst gehen wir von Schrottdaten aus.
*/
if (t1 == t2)
{
if (t1 == 0) // Keine Taste gedrueckt, vorwaerts
{
FWARD (); // Auf gehts (dauert 750 ms)
}
else
{
STOP (); // Stoppen
if (t1 & 0x07) // Linke tasten beruehrt
{
RWDL (); // LinksRueckwaerts ausweichen
SerPrint ("\r\n Hab links was beruehrt, weiche aus...\r\n");
}
if (t1 & 0x38) // Rechte tasten beruehrt
{
RWDR (); // RechtsRueckwearts ausweichen
SerPrint ("\r\n Hab rechts was beruehrt, weiche aus...\r\n");
}
Msleep (1000); // Eine Sekunde rueckwarts fahren
}
}
zeit = Gettime ();
SerPrint ("\r\nWiederhole Schleife fuer Collisionsfahrt\r\n"); // 44*5ms= 200 ms
PrintLong (zeit);
}
STOP ();
SerPrint ("\r\nVerlasse Collisionsschleife.\r\n");
}
Leider musst du nun RWD und FWD wieder tauschen. Oder besser löten.
Gruß Sternthaler
Lesezeichen