bitte poste deinen code...
Druckbare Version
bitte poste deinen code...
ich hab befürchtet dass jemand das sehen will 8-[
sieht leider ziemlich chaotisch aus, da ich ja nur am rumtesten bin..
is eigentlich nur ein "multitasking" system von sternthaler, kombiniert mit dem geradeausfahr algorithmus von waste. dazu soll er noch ne led blinken lassen und eben mit den tastern einem hindernis ausweichen, code wie gesagt abgeleitet von der asuro lib (kollisionstest)
das ist die version, in der er nur in eine seite fährt, in die andere seite dreht er sich einmal und dann sofort wieder zurück..Code:#include "asuro.h"
int main (void)
{
unsigned long v_time = 0;
unsigned long v_P1_lasttime = 0; // PROZESS: Tasten auswerten
#define d_P1_wartezeit 50; // Zeit in ms
unsigned long v_P2_lasttime = 0; // PROZESS: Status-LEDs blinken
#define d_P2_wartezeit 200;// Zeit in ms
unsigned char v_P2_LEDonoff = 0;
unsigned long v_P3_lasttime = 0; // PROZESS: Linien-Sensoren
#define d_P3_wartezeit 5; // Zeit in ms
unsigned long v_P4_lasttime = 0; // PROZESS: PID-REGLER
#define d_P4_wartezeit 400; // Zeit in ms
unsigned char flagl=FALSE, flagr=FALSE;
unsigned int data[2];
int wegl, wegr, diff;
int speed = 160;
int speedLeft = 160;
int speedRight = 160;
wegl=0; wegr=0;
MotorDir(FWD,FWD);
Init();
unsigned char t1;
unsigned char t2;
// Multitasking teil von Sternthaler
//
while (1)
{
/*----------------------------------------------------------------------
Zeitbasis fuer die Prozesse aktualisieren
*/
v_time = Gettime ();
/*----------------------------------------------------------------------
PROZESS: Tasten auswerten.
*/
if (v_time > v_P1_lasttime)
{
v_P1_lasttime = v_time + d_P1_wartezeit;
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
}
else if (t1 && t2 && t1 == t2)
{
MotorDir(BREAK,BREAK);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
Msleep(200);
//Hier fängt das problem an
//
//
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorDir(FWD,RWD);
MotorSpeed(150,150);
Msleep(550); //ca 90 Grad
MotorDir(FWD,FWD);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(550); //ca 90 Grad
MotorDir(FWD,FWD);
}
/* 1 Sekunde fahren */
}
}
/*----------------------------------------------------------------------
PROZESS: Status-LED blinken lassen
*/
if (v_time > v_P2_lasttime)
{
v_P2_lasttime = v_time + d_P2_wartezeit;
if (v_P2_LEDonoff)
StatusLED(YELLOW);
else
StatusLED(OFF);
v_P2_LEDonoff ^= 1;
}
/*----------------------------------------------------------------------
PROZESS: test
*/
if (v_time > v_P3_lasttime)
{
v_P3_lasttime = v_time + d_P3_wartezeit;
//leer
}
/*----------------------------------------------------------------------
PROZESS:
geradeausfahren von waste
*/
if (v_time > v_P4_lasttime)
{
OdometrieData(data);
if ((data[0] < 550) && (flagl == TRUE)) {flagl = FALSE; wegl++;}
if ((data[0] > 650) && (flagl == FALSE)) {flagl = TRUE; wegl++;}
if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; wegr++;}
if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; wegr++;}
diff=wegr-wegl;
if (diff>0) speedRight--; // fahre geradeaus
else if (diff<0) speedLeft--;
else {speedRight=speed; speedLeft=speed;}
if (speedRight<0) {speedRight=0;}
if (speedLeft<0) {speedLeft=0;}
MotorSpeed(speedLeft,speedRight);
}
/*----------------------------------------------------------------------
PERMANTER RECHENPROZESS
*/
// Volle Rechenleistung ist hier verfügbar, ohne sich um ein
// 'Timing' zu kümmern.
// Natürlich darf hier keine Endlosschleife sein.
}
}
julian
Hallo zusammen
Ein Kurzschluß sollte durch die Lötbrücke nicht entstanden sein, denn dazwischen liegt ja noch der Widerstand R23 von 1M.
Das Problem vom mic hatte ich auch schon einmal. Die Ursache war die Batterie.
Jedesmal wenn ein Motor lief spielte der ASURO verrückt.
Mit freundlichen Grüßen
A.Hoffmann
hm du hast recht, den 1M habe ich nicht bedacht, trotzdem: niemals kondensatoren kurzschliessen! wenn du einen anderen erwischt hättest, hättest du evtl nicht so viel glück...
sind deine batterien
-wirklich voll
-nicht alt
-und von einer vernünftigen marke?
billigbatterien halten oftmals die spannung nicht, diese bricht dann recht schnell zusammen. das kann schon ausreichen, um am adc eigenartige werte zu finden.
Hallo damaltor
Das Problem bei mir waren nicht nur die seltsamen ADC Werte.
Bei einem von mir geschriebenen Testsystem funktionierte die
IR Kommunikation nicht mehr richtig, Ohne eingeschaltete
Motoren war alles in Ordnung. Immer wenn ich einen Motor
eingeschaltet habe, brach die Verbindung vom ASURO zu dem
Steuerprogramm auf dem PC ab. Ohne Motoren funktionierte alles
wie gewohnt. Hat mich zwei Tage fehlersuche gekostet.
Seit dem benutzte ich nur noch Markenbatterien.
Mit freundlichen Grüßen
A.Hoffmann
ja genau, das ist das problem... die billigen batterien sind gut für fernbedienungen und uhren, aber für die motoren des asuro, die doch recht großzügig mit strom und spannung umgehen, leider nichts. die spannung fällt zusammen, sowie die motoren eingeschaltet wurden. den µC ist das egal, ein atmega8L braucht bloß 2,7V, aber alles andere wird dann schwierig =)
das programm zum tastertest hat folgendes ergeben:
erst beim drücken vom zweiten taster von links gesehen hat das terminal aufgehört wilde zeichen zu empangen!Code:n0
n-
n0
nC
nW
n
n-
n+
n8
nK
nd
n&
n,
n,
nE
nY
n]
nd
nZ
nR
nX
nS
nX
n[
nW
n]
n
n-g
n,+
n9,
nN6
neI
n*_
n)#
n3+
nE+
nV>
nnQ
n,h
n++
n8,
nK3
na:
n'B
n-G
n0
n@
nW
nh
n,
n-
n6
nI
nb
n$
n,
n,
n?
nS
nk
n,
n-
n3
nK
n]
n%
n)
n,
meine taster sind folglich nicht ganz ok.
die baterien sind "Top Craft - Ultra Alkaline" ich weiß nicht wie gut diese sind. vielleicht hat ja jemand von euch erfahrungen mit dieser Marke?
Andernfalls ist die Frage: sind kaltlötstellen, oder irgentein anderer pfusch daran schuld?
Achja: der c7 ist durchgeknipst.
Ich habe deinen dreifachpost (!) gelöscht bzw. editiert.
ich vermute eher einen fehler in meinem programm, da kam ja nur grütze an...
probier mal das hier. kann da mal einer drüber schauen bitte?
und sag was dann kommt, wenn du die taster drückst. benutz mal den code-button, dann wird alles schön zusammengeschoben. oder du schreibst einfach auf, was bei den verschiedenen tastern kommt.Code:#include "asuro.h"
int main(void){
unsigned char taster
int radix=10;
unsigned char wert[5];
Init();
while(1){
taster=PollSwitch();
itoa(taster,wert,radix);
SerWrite(*wert,5);
SerWrite("\n\r",2);
}
return 0;
}
@dalmator hast du meinen code angeschaut, oder hattest du garnicht mich gemeint mit "poste bitte deinen code"?
Hallo ElTransistor,
ich habe mir mal deinen geposteten Code angesehen.
Du hast dort ein
---> if (t1 & 0x07) /* Tasten links gedrückt? */
---> if (t1 & 0x38) /* Tasten rechts gedrückt? */
eingebaut.
Das Problem bei den Tasten ist, dass die Funktion PollSwitch(), bei einem nicht korrekt eingestelltem Wert für die Umrechnung des Tasten-ADC-Wert's in den zurückgegeben Tasten-Gedrückt-Wert, z.B. folgendes passieren kann:
Gedrückt wird: 100000
Berechnet wird: 011111
Nun kommt es auf die Reihenfolge in deinem Hauptprogramm an ob du zuerst 0x07 oder 0x38 prüfst.
Du prüfst ja erst 0x07, und somit könnte diese Seite 'bevorzugt' werden. (Oder andersherrum)
Du solltest auf alle Fälle mal den Wert von t1 an die Terminalemulation senden, wenn du in den beiden IF-Codestellen bist und prüfen, ob das auch wirklich der Wert ist den du an den Tastern gedrückt hast.
Gruß Sternthaler