PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterdrücke falsch registriert



papa_moll
29.12.2006, 18:34
Und zum 2. mal heute....
ich habe folgendes Programm hier im Forum gefunden:


mein Problem ist, dass der Asuro immer die richtung wechselt als ob ein Taster gedrückt wird.
Habe meine Theorie überprüft und das obere Programm in der Asuro Anleitung von S. 61 draufgeflashed. Nach ca 10 sekunden stoppt er auch wenn keine WAnd oder ähnliches in der nähe ist. Er verhält sich wie gesagt als ob einer der Schalter gedrückt worden wäre....

#include "asuro.h"

int main(void)
{
int i;
int k=0;
i=0;
int l;
l=1;
Init();
while(1)
{
while(1)
{
if (PollSwitch()>1) i=1;
if(i==0)
{
MotorDir(FWD,FWD);
MotorSpeed(190,210);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(140,160);
Sleep(250);
k++;
}
if(k>500)
{
MotorSpeed(0,0);
break;
}
}
while(1)
{
if(l<300)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
l++;
Sleep(250);
}
else
{
MotorSpeed(0,0);
i=0;
k=0;
l=1;
break;
}
}
}

return 0;
}



Woran liegt das???

ASUROMIKE
29.12.2006, 19:13
Hi,

das war bei mir am Anfang auch so, wenn du die PollSwitch() function vorher ca 3x aufrufst geht es.

So sollte es gehen:



#include "asuro.h"

int main(void)
{
int i;
int k=0;
i=0;
int l;
l=1;
Init();
while(1)
{
while(1)
{ PollSwitch()
PollSwitch()
PollSwitch()
if (PollSwitch()>1) i=1;
if(i==0)
{
MotorDir(FWD,FWD);
MotorSpeed(190,210);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(140,160);
Sleep(250);
k++;
}
if(k>500)
{
MotorSpeed(0,0);
break;
}
}
while(1)
{
if(l<300)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
l++;
Sleep(250);
}
else
{
MotorSpeed(0,0);
i=0;
k=0;
l=1;
break;
}
}
}

return 0;
}

Gruß

papa_moll
29.12.2006, 20:26
Danke für die Antwort aber dass kann ja nicht sinn und zweck sein, wenn ich jetzt eine längere Strecke hätte würde ja wohl wieder dieser Fehler auftreten.... Da muss es doch eine andere Lösung geben...

ASUROMIKE
29.12.2006, 20:39
Ich nehme an dir geht es nur darum dass ASURO ein bischen durch die gegend fährt und hindernissen ausweicht, oder??

ich benutze dazu diesen code:


int main(void)
{
init()
unsigned char taste;
int z;
SerWrite("POLL\n\r",8);
while(1)
{
taste=PollSwitch();
taste=PollSwitch();
taste=PollSwitch();
taste=PollSwitch();
taste=PollSwitch();
taste=PollSwitch();
taste=PollSwitch();
if(taste>0)
{
StatusLED(RED);
if (taste<8)
{
MotorDir(RWD,RWD);
MotorSpeed(150,150);
for(z=0;z<50;z++) Sleep(236);
MotorSpeed(150,0);
for(z=0;z<100;z++) Sleep(236);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(150,150);
for(z=0;z<50;z++) Sleep(236);
MotorSpeed(0,150);
for(z=0;z<100;z++) Sleep(236);
}



}
else
{
StatusLED(YELLOW);
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(150,150); // Beide Motoren halbe Kraft voraus
for(z=0;z<200;z++) Sleep(236);
}
}

}



bei mir geht das sehr gut :D
Wie meinst du das mit "längere Strecke"??

der_andi
29.12.2006, 20:43
Liegt am Rauschen von diesen dämlichen A/D-Wandlern, gelegentlich wird einfach mal das erste Bit gesetzt obwohl nix ist, dann gibt Pollswitch aus das der erste Schalter gedrückt wurde.*

Beweis: K1 nicht abfragen, nur K2-K6, dann passiert das nicht mehr.

ASUROMIKE
29.12.2006, 20:45
@Der_andi:
bei mir geben alle den richrtigen wert , also gedrückt, nicht gedrückt zurück, wenn ich di pollswitch() mehrmal hintereinander aufrufe. Wenn ich sie nur einmal aufrufe kommt nur Müll.

der_andi
29.12.2006, 21:04
Widerstände haben Toleranzen, wenn man Pech hat, wie z.b. bei meinem Exemplar, dann reicht das grade so um am A/D-Wandler 2,44 mV anliegen zu haben, das entspricht 1/1024tel, und damit wird dann das erste Bit gesetzt.
Warum es öfters vorkommt das nach ein paar mal Abfragen die Werte stimmen ist mir ein Rätsel.


Das ist der Nachteil bei dieser Schaltung, man bringt zwar die 6 Schalter an nur einem Eingang unter, aber dafür ist der erste extrem empfindlich für allerlei Störungen.

ASUROMIKE
29.12.2006, 21:07
das ist das gleiche prob: https://www.roboternetz.de/phpBB2/viewtopic.php?t=25831

der_andi
29.12.2006, 21:20
Alles zwischen 1 und 20 Abfragen schon mal durchprobiert, die Fehler bei Pollswitch kommen nicht nachvollziehbar und einfach mal immer wieder zwischendrin.

Drum bastel ich grad meinen Asuro um, K1 und K6 werden paralell geschaltet mit K3 und K4, K1 kann man so ignorieren aber weiter verwenden, die inneren Schalter sind in meinen Augen eh sinnlos. Dann reichts auch wenn man Pollswitch einmal abfragt. (...und das erste Bit dabei ignoriert)

papa_moll
29.12.2006, 21:23
@ASUROMIKE
Dadurch verzögert sich bei mir alles nur sprich längere Strecke die er ohne probleme fährt.

papa_moll
29.12.2006, 22:03
ähm ganz blöde Frage muss ich um alle PollSwitch jetzt nacheinander abfragen ausser K1

EDH
29.12.2006, 23:28
??? die frage ist ein wenig unverständlich

meinst du das:
wie krieg ich aus dem return wert raus, welche taster gedrückt sind?
schau dazu in der anleitung nach

damaltor
30.12.2006, 01:46
der grund für diesen fehler ist der entstörkondensator, der parallel zu den tastern gelötet ist. (siehe anleitung->schaltplan). solange dieser geladen ist, sind die werte falsch.

nach 2-5 abfragen ist er meist entladen, und das problem tritt nicht mehr auf.

ich habe ihn irgendwann aus reiner genervtheit ausgelötet, seitdem stimmt jede abfrage 100%ig.

wie man aus dem wert, den pollswitch zurückgibt, herausfindet, welche taster gedrückt wind und welche nicht, das steht recht gut beschreiben in der anleitung. allerdings ist die anwendung nicht ganz leicht... such einfach mal im forum, das thema wurdo oft besprochen.

papa_moll
30.12.2006, 11:21
Nur mit mehr PollSwitch abfragen ist das problem leider nicht gelöst(ich habe inzwischen 10 abfragen eingebaut) kann ich c7 denn einfach so auslöten ohne etwas kaputt zu machen wenn er später läuft???

damaltor
30.12.2006, 11:47
wenn c7 der ist, der parallel zu den tastern liegt (hab grad keinen schaltplan da) dann ja. mein asuro läuft ohne einwandfrei. die teile sind so billig, dass sie teilweise selbst einen kurzschluss haben.

tip: kneif ihn einfach ab, auslöten ist riskant =) wenn du ihn dann irgendwann wiederhaben willst, dann lötest du ihn einfach an die drahtenden.

papa_moll
30.12.2006, 12:01
Danke für den Tipp jetzt funktioniert er einwandfrei.....

damaltor
30.12.2006, 13:55
wunderbar =) war bei mir auch so,

papa_moll
30.12.2006, 14:59
Ich glaube ich war ein bisschen zu voreilig....
Ich habeihn gerade so ca 10 min unbeaufsichtigt durch Zimmer fahren lassen nun gucke ich und er macht wieder die selben mätzchen wie vor dem ausbauen....
Ich habe immernoch die 10 PollSwitch abfragen aber keine Änderung.
Woran kann es sonst noch liegen irgendjemand eine Idee???
mein aktuelles Programm sieht also so aus:


#include "asuro.h"

int main(void)
{
int i;
int k=0;
i=0;
int l;
l=1;
Init();
while(1)
{
while(1)
{ PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
if (PollSwitch()>1) i=1;
if(i==0)
{
MotorDir(FWD,FWD);
MotorSpeed(190,210);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(140,160);
Sleep(250);
k++;
}
if(k>500)
{
MotorSpeed(0,0);
break;
}
}
while(1)
{
if(l<300)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
l++;
Sleep(250);
}
else
{
MotorSpeed(0,0);
i=0;
k=0;
l=1;
break;
}
}
}

return 0;
}

Asuro-n00b
30.12.2006, 15:00
Sauber Damaltor!
Den selben Fehler mit K1 hatte ich auch.
Ich hab immer den Fehler in meiner If-Abfrage und der Pollswitch-Funktion gesucht und bin da kein Stück weiter gekommen.
Nach Auslöten des C7 geht's. :)

Serious
30.12.2006, 16:19
Wozu ist C7 dann denn überhaupt noch da, wenn man ihn sowieso besser auslötet?

papa_moll
30.12.2006, 16:21
Im Schaltplan ist er "nur" mit der Masse und danach mir den Schaltern verbunden ich habe also keine besondere Funktion festgestellt....

damaltor
30.12.2006, 16:42
er ist eigentlich zum entstören, da die motoren große schwingungen an die masse leiten. dass der asuro immer noch gelegentliche mätzchen macht, ist dann darauf zurückzuführen. kann man nicht viel machen, dafür ist es eben ein roboter für unter 50 euro...

die beste möglichkeit ist eine unabhängige spannungsversorgung für prozessor und motoren. aber eben recht kompliziert auf dem kleinen board =)

der_andi
30.12.2006, 16:49
Hm, auch ne möglichkeit.
Ich würd aber eher drauf tippen das der Kondensator zum entprellen da ist, beim Abfragen der Tastenzustände sollte das wirklich egal sein...
Gute Lösung, gefällt mir.
Den Thread sollte man vorsorglich als wichtig markieren.

Asuro-n00b
30.12.2006, 18:23
Hi, ich habe auch den C7 entfernt und hatte auf den ersten Blick weniger Probleme, da der AD-Wandler jetzt nicht mehr von C7 gestört wurde. Ich bin auch zu dem Schluss gekommen, dass der Kondensator C7 mit seinen 4,7nF zum Entprellen da ist. Dem habe ich jetzt aber im Programm entgegen gewirkt in dem ich eine kurze Sleep-Funktion eingebaut habe.

#include "asuro.h"

int main(void)
{
int i;
Init();
while(1)
{
if (PollSwitch()>0) // wenn einer der Taster betätigt
{ // dann...
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(100,150); //rückwärts wenden(mit großem Wendekreis)
for(i=0;i<1500;i++) // 3s
{Sleep(144);}
}
else //ansonsten...
{
MotorDir(FWD,FWD);
MotorSpeed(120,120); //geradeaus fahren
StatusLED (GREEN);
}
for(i=0;i<10;i++) // 30ms warten, zum Entprellen, damit er nicht durcheinander kommt
Sleep(216);
}
return(0);
}

Jetzt habe ich aber durch das Entfernen des Kondensators ein neues Problem. Wenn der Asuro gewendet hat und dann wieder in den Vorwärtsmodus übergeht, schalten ja die Motoren von Rückwärtslauf auf Vorwärtslauf. Dabei entstehen bei meinem Asuro wahrscheinlich so hohe Spannungsschwankungen, dass der AD-Wandler(empfindlich wie er ist :-s ) wieder denkt, dass einer der Taster angesprungen ist.
Und er ab und zu mal nach dem einen Wendekreis nochmal einen Zweiten zieht.
Begründet hat das Damaltor ja eben schon:

er ist eigentlich zum entstören, da die motoren große schwingungen an die masse leiten

Ich versuche als nächstes mal einen Kondensator mit einer geringeren Kapazität, so vielleicht 1nF als C7 zu benutzen.
Dann entstört er die Motoren hoffentlich ausreichend und haut hoffentlich beim Entladen keine zu hohe Spannung raus, die der AD-Wandler wieder fehlinterpretiert.
Allerdings habe ich mir so einen Kondensator noch nicht besorgt.

Habt ihr vielleicht noch ne Idee, ob es mit dieser Motorstop funktion vielleicht gehen könnte. Da werden doch glaub ich die Spulen kurz geschlossen um zu bremsen. Vielleicht ist dadurch ja auch keine so hohe Spannungsschwankung beim Umschalten den Drehrichtung?!

damaltor
30.12.2006, 22:39
ddas wäre einen versuch wert. probier mal:

MotorSpeed(0,0);
MotorDir(Break,Break); //Das englische wort für bremse heisst zwar brake... aber egal =)
Sleep(216);
MotorDir(FWD,FWD);
MotorSpeed(xxx,xxx)

und schreib was passiert...

(*akkuladegerät sucht*)

Asuro-n00b
31.12.2006, 13:52
Moin moin,
Habe deinen Teil mal mit eingebaut und jetzt macht er genau das was er soll. Aber den Kondensator werde ich trotzdem wieder einbauen, wenn ich einen passenden gefunden habe. :)

#include "asuro.h"

int main(void)
{
int i;
Init();
while(1)
{
if (PollSwitch()>0) // wenn einer der Taster betätigt
{ // dann...
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(100,150); //rückwärts wenden(mit großem Wendekreis)
for(i=0;i<1500;i++) // 3s
{Sleep(144);}
}
else //ansonsten...
{
MotorSpeed(0,0);
MotorDir(BREAK,BREAK); //Das englische wort für bremse heisst zwar brake... aber egal =)
Sleep(216); //3ms
MotorDir(FWD,FWD);
MotorSpeed(120,120); //geradeaus fahren
StatusLED (GREEN);
}
for(i=0;i<10;i++) // 30ms warten, damit er nicht durcheinander kommt
Sleep(216);
}
return(0);
}


Finde das Forum echt gut hier, da kann man viel lernen. :)

papa_moll
31.12.2006, 14:06
Bei mir funktioniert das letzte Problem überhaupt nicht der Asuro fährt nur rückwärts im Kreis und nach ca 5 Runden fängt die Status-LED an gelb zu flackern was bedeutet das denn???

Asuro-n00b
31.12.2006, 14:22
gelb heißt ja grün und rot schnell im Wechsel.
Hab erst gedacht, dass er bei dir ständig zwischen if und else hin und her wechselt. Aber das kann ja nicht sein, da er sobald er rot leuchtet, dies ja genau 3 Sekunden machen würde.
-->
for(i=0;i<1500;i++) // 3s
{Sleep(144);}
Ich weiß nicht, vielleicht heißt das ja auch das die Batterie schwach ist oder so??? Meine waren noch nicht alle, zeigt Asuro das eigentlich an, wenn er nicht mehr genug Spannung bekommt?

papa_moll
31.12.2006, 14:33
Ich habe niegelnagelneue Batterien drin.
Bei mir machte er nichts besonderes ausser dass er nur noch seeeeeeeeeehr langsam fuhr obwohl fullspeed eingeschaltet war.

damaltor
31.12.2006, 15:11
das könnte verschiedene bedeutungen haben. vielleicht einen fehler im programmcode, gelb ist tatsächlich nur rot und grün. nochmal genau prüfen (kann mich nach neujahr mal ransetzen, hab aber jetzt keine zeit =)

oder: alte bzw billige batterien. darauf reagiert der asuro extrem alergisch. allerdings findet die überprüfung eigentlich nur im bootloader statt. halt mal den transceiver drüber: wenn der asuro VLVLVL sendet, dann sind die batterien leer (Voltage Low)

oder: Akkus und kein jumper gesetzt. Der Jumper MUSS bei akkus rein und MUSS bei batterien raus.

oder irgendwo ein kriechstrom, der den motoren den strom klaut. lötstellen checken =)

papa_moll
31.12.2006, 16:36
Der Jumper ist draussen aber an den Batterien kann es vll liegen es sind "nur" welche von so einer No-Name Firma gestern abend hatte kein Geschäft mehr auf um vernünftige Batterien/akkus zu holen.....

damaltor
01.01.2007, 05:19
ja allerdings. wenn du ein multimeter mit "batterietest" funktion hast, kannst du checken wieviel strom die batterie unter last abgibt (einfach die voltzahl messen wäre ohne last). die billig batterien fallen schon nach wenigen minuten unter 0,8V.

ich nutze akkus (jumper gesetzt) und bin ganz zufrieden.

ponzelar
01.01.2007, 10:53
Guten Morgen in die Runde und ein gutes Roboterjahr,
ich besitze (noch) keinen Roboter, konnte jedoch am Sylvesterabend das frustrierende Verhalten des Asuro von papa_moll beobachten. Er fährt im leichten Kreisbogen vorwärts, nach ca. 60 cm Weg im Bogen ca. 60 cm rückwärts und in stetiger Folge hin und her, wobei die Krümmung der Bögen wechselt. Lt. Programm sollte er geradeaus fahren.
1. Im Forum wird im Zusammenhang mit Geradeausfahrt überwiegend über die Ansteuerung der Motoren diskutiert. Vom Motor zum Rad ist ein weiter Weg mit vielfältigen Toleranzen und Fehlern. Wichtig ist aber doch das Weg/Zeit-Verhalten der Räder. Warum wird nicht das Weg/Zeit-Verhalten der Räder über das Encoder-Zahnrad geregelt. Man weiß, daß je Radumdrehung 40 hell/dunkel-Wechsel erfolgen und je hell/dunkel-Wechsel ein Weg von 3,025 mm zurückgelegt wird. Wenn nun der gewollte Weg, z.B. beim Haus des Nikolaus, über die erf. hell/dunkel-Wechsel über eine Schleife gesteuret werden, müßte das doch funktionieren und die Motoren könnten machen was sie wollen.
2. Die abrupten, gleichförmig getakteten Richtungswechsel lassen doch auf einen nicht zufälligen Fehler schließen. Mir fehlen jetzt die Voraussetzungen um diesen Fehler zu ergründen. Vielleicht ist einer der vielen Experten (Respekt) in der Lage hier eine Lösung zu finden.
Einige Anregungen in der Hoffnung, daß die Profis den Problemen auf die Spur kommen.
ponzelar

radbruch
01.01.2007, 11:12
Hallo


gelb heißt ja grün und rot schnell im Wechsel.Unsinn. Das ist eine tri-state-LED, sie hat also 3 Zustände(+OFF):


inline void StatusLED(unsigned char color)
{
if (color == OFF) {GREEN_LED_OFF; RED_LED_OFF;}
if (color == GREEN) {GREEN_LED_ON; RED_LED_OFF;}
if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
if (color == RED) {GREEN_LED_OFF; RED_LED_ON;}
}
Also ergibt ROT und GREEN zusammen YELLOW

Gruß

Radbruch

damaltor
01.01.2007, 15:33
Hallo


gelb heißt ja grün und rot schnell im Wechsel.Unsinn. Das ist eine tri-state-LED, sie hat also 3 Zustände(+OFF):


inline void StatusLED(unsigned char color)
{
if (color == OFF) {GREEN_LED_OFF; RED_LED_OFF;}
if (color == GREEN) {GREEN_LED_ON; RED_LED_OFF;}
if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
if (color == RED) {GREEN_LED_OFF; RED_LED_ON;}
}
Also ergibt ROT und GREEN zusammen YELLOW
Radbruch
Trotzdem kann rot und grün im schnelle wechsel gelb aussehen. so unsinnig ist das nicht, gerade wenn es um ein programm geht, welches die led nur rot ODER grün leuchten lassen sollte. an sich sind es nur zwei leds mit einem gemeinsamen pin und einem gemeinsamen gehäuse.



1. Im Forum wird im Zusammenhang mit Geradeausfahrt überwiegend über die Ansteuerung der Motoren diskutiert. Vom Motor zum Rad ist ein weiter Weg mit vielfältigen Toleranzen und Fehlern. Wichtig ist aber doch das Weg/Zeit-Verhalten der Räder. Warum wird nicht das Weg/Zeit-Verhalten der Räder über das Encoder-Zahnrad geregelt. Man weiß, daß je Radumdrehung 40 hell/dunkel-Wechsel erfolgen und je hell/dunkel-Wechsel ein Weg von 3,025 mm zurückgelegt wird. Wenn nun der gewollte Weg, z.B. beim Haus des Nikolaus, über die erf. hell/dunkel-Wechsel über eine Schleife gesteuret werden, müßte das doch funktionieren und die Motoren könnten machen was sie wollen.

du meinst eine möglichkeit, mithilfe der odometrie geradeaus zu fahren? ich glaube da gibt es tausende ansätze hier im forum, einige gehen, andere nicht, und einer ist sogar in der funktion "Go()" in die erweiterte lib gekommen...
und so einfach ist das alles leider nicht: die sensoren sind extrem ungenau, gelegentlich gehen ticks verloren oder durch störlich kommen welche hinzu. du kannst ja mit papa_moll mal das haus vom nikolaus probieren... oder fangt beim ersten wettbewerb an: der asuro soll zweimal ein rechteck abfahren, wobei die strecke IDENTISCH sein soll (also nicht zwei rechtecke, sondern 2x das GLEICHE). das ist schwer genug.
auch die tatsache, dass ein tick etwa 3 mm sind, ist nicht so einfach zu sagen: das kommt auf die aufgeklebte scheibe an (es gibt verscheidene mit verscheidenen felderzahlen), auf das spiel der motoren usw.

davon ganz abgesehen: wenn du mit der odometrie einfluss auf das weg-zeit-verhältnis (also auf gutdeutsch die geschwindigkeit) der zahnräder bzw der reifen einfluss nehmen willst, musst du zwangsläufig die motoren ansteuern... wie solltest du die räder sonst zum drehen bewegen?

Asuro-n00b
01.01.2007, 21:06
Bei mir funktioniert das letzte Problem überhaupt nicht der Asuro fährt nur rückwärts im Kreis und nach ca 5 Runden fängt die Status-LED an gelb zu flackern was bedeutet das denn???

Mir ist eben noch ein Einfall gekommen!
Wenn du statt mit der StatusLED die Richtung mit den BackLEDs anzeigst, weißt du, ob das gelbe Flackern der StatusLED von der IF-Abfrage herkam.
Bei mir leuchtet die StatusLED bei folgendem Programm während der gesamten Zeit grün:


#include "asuro.h"

int main(void)
{
int i;
Init();
while(1)
{
if (PollSwitch()>0) // wenn einer der Taster betätigt
{ // dann...
BackLED(OFF,ON);
MotorDir(RWD,RWD);
MotorSpeed(100,150); //rückwärts wenden(mit großem Wendekreis)
for(i=0;i<1500;i++) // 3s
{Sleep(144);}
}
else //ansonsten...
{
MotorSpeed(0,0);
MotorDir(BREAK,BREAK); //Das englische wort für bremse heisst zwar brake... aber egal =)
Sleep(216); //3ms
MotorDir(FWD,FWD);
MotorSpeed(120,120); //geradeaus fahren
BackLED(ON,OFF);
}
for(i=0;i<10;i++) // 30ms warten, damit er nicht durcheinander kommt
Sleep(216);
}
return(0);
}

damaltor
02.01.2007, 00:51
hmm... ist es nicht egal, ob nun "rot-grün-gelb" oder "links-rechts-beide" angezeigt wird?

die richtige batteriespannungsmessung geschieht nur im bootloader. aus irgend einem grund springt das programm in der abfrage, so dass die gelbe led (oder eben beide backleds) leuchtet/n.

morgen hab ich meinen asuro wieder, dann kann ich mal schaun was bei mir ist.

papa_moll
02.01.2007, 10:18
Habe mir gerade Akkus gekauft O:) jetzt müssen die nur wieder laden #-o .....
Melde mich dann ob es nun endlich klappt.

Asuro-n00b
02.01.2007, 11:19
hmm... ist es nicht egal, ob nun "rot-grün-gelb" oder "links-rechts-beide" angezeigt wird?

die richtige batteriespannungsmessung geschieht nur im bootloader. aus irgend einem grund springt das programm in der abfrage, so dass die gelbe led (oder eben beide backleds) leuchtet/n.

morgen hab ich meinen asuro wieder, dann kann ich mal schaun was bei mir ist.

Ich denke nicht, dass das egal ist, weil du ja gesehen hast, dass es eine Diskussion gab, ob die StatusLED wegen dem Programm oder wegen eines Fehlers wie z.B. in der Versorgungsspannung, gelb geleuchtet hat.

Wenn es nun wirklich an dem Programm liegen sollte (was ich mir wirklich nur schwer vorstellen kann, da ja noch die Sleepfunktion von 3 Sekunden drin ist, sobald die Lampe rot leuchtet),
dann findet man das doch heraus, wenn man es über die BackLEDs anzeigen lässt.
Dann müssten bei papa_moll die beiden BackLEDs gleichzeitig leuchten.

Bin gespannt, mit den neuen Akkus wird's bestimmt laufen. ;)

damaltor
02.01.2007, 13:13
naja die spann ungsmessung ist es mal mit sicherheit nicht, da das programm ja schon läuft wenn der fehler auftritt. die messung der spannung findet jedoch nur im bootloader, vor dem programmablauf statt.

Asuro-n00b
02.01.2007, 15:08
Ach ja stimmt, das hast du schonmal erwähnt.
Aber an der If-Abfrage kann es auch nicht liegen, weil wenn er wirklich immer innerhalb der Abfrage hin und her springt, dann würde es nicht so schnell sein, dass die StatusLED gelb wird.
Denn wenn die erste und einzige Bedingung erfüllt ist, leuchtet die LED für DREI SEKUNDEN rot. Und so lange die LED rot ist arbeitet der Prozessor auch nicht weiter, weil die Sleep-Funktion ja aktiv ist.

Mich wundert es aber auch, dass das Programm anläuft und dann mitten drin das Flackern der StatusLED eintritt ohne, dass sich einer der Motoren dreht. :-k

Gibt es eine Liste mit Fehlercodes vom Asuro, die er eventuell ausgibt?
In der Anleitung habe ich keine gefunden. Eventuell weist gelbes Leuchten der StatusLED ja auf einen Fehler hin.

damaltor
02.01.2007, 15:15
eigentlich gibt es keine fehlercodes vom asuro, er macht nur das was das programm ihm sagt. die fehlercode datei müsstest du schon selbst starten...

ich vermute, dass die batterien so schwach sind (oder so billig oder so leer) dass der prozessor einen BrownOutReset macht (dieser tritt dann uaf, wenn die batteriespannung DEUTLICH unter einen bestimmten wert kommt und der prozessor nicht mehr genug strom bekommt. kann passieren, wenn z.B. die motoren gestartet werden sollen, da diese ja recht viel strom brauchen).
nahc dem reset startet der prozessor neu (die spannung erholt sich, die motoren laufen ja nicht mehr) und startet den bootloader, der dann die (noch nicht ganz wieder auf vollem niveau liegende) batteriespannung misst und als zu niedrig befindet. also: blink,blink....

wäre mal interessant ob der asuro WÄHREND dem blinken über die infrarotschnittstelle VLVLVLVLVL ausgibt. dann wäre es mit sicherheit die spannungsmessung im bootloader.

papa_moll
02.01.2007, 15:45
Die Akkus dauern noch 45 min [-( ....
Der Asuro hielt einfach mitten im Zimmer an ohne einen zuvorherigen Tastendruck (was bei dem Asuro ja nichts zu bedeuten hat) und die StatusLED fing an gelb zu blinken.
Zu den Batterien, ich glaube die waren von dem Laden wo es AL(L)DI(e) guten Sachen gibt...
Für meinen alten MP3 Player und für Fernbedienungen reichten die immer allemal..... :-b

papa_moll
02.01.2007, 16:13
Ich habe gerade die vollen Akkus in den Asuro und wollte das Programm drauf flashen aber bei jeden mal compilieren erscheint folgender fehler:

C:\ASURO_src\FirstTry/test.c:4: undefined reference to `init'

Dies passiert sogar bei der neusten lib. ich nutze das ganz neue WinAVR vom 1.1.07

damaltor
02.01.2007, 17:57
in deinem programm muss

Init();

und nicht

init();

stehen. groß- und kleinschreibung ist wichtig!

papa_moll
02.01.2007, 21:32
Sorry hatte ich total übersehen.

Aber die große Ernüchterung folgt sogleich.....
Der Asuro reagiert immer noch falsch auf die Taster.
Ein Baufehler ist inzwischen ausgeschlossen da ich mehere "Experten" in Sachen löten und Elektrotechnik bereits gefragt (genervt) habe.
Alle fragwürdigen Lötstellen habe ich inzwichen nachgelötet auch wenn diese hinten an den Odometriesensoren waren.

Kann mir vll irgendwer ein Code schreiben indem alle TAster ausser der K1 abgefragt werden (Der Tipp wurde ganz zu Anfang gegeben).
Ich frage deshalb hier so peinlich da ich es nicht nachvollziehen kann (nach der Anleitung) wie man nur einzelne Taster abfragt.
Wenn mir keiner ein Code schreiben will kann ich ja verstehen aber kann mir denn wenigstens jemand eine Anleitung dafür geben wie ich den schreiben muss???? Ich bin ein ziemlicher Anfänger in Sachen C wie man an meinem kleigeschriebenen Init ja vll auch merken kann.


Danke für eure bisherige Hilfe und ich hoffe das ihr mir auch weiterhin helfen könnt.

damaltor
03.01.2007, 15:53
also:

pollswitch gibt einen wert zurück.dieser ist die summe aller gedrückten taster.
der erste taster ist 1
der 2. ist 2
der 3. ist 4
der 4. ist 8
der 5. ist 16
der 6. ist 32

wenn pollswitch also einen wert, sagen wir mal 43 zurückgibt, sind die taster 6,4,2 und 1 gedrückt. (32+8+2+1=43).

es gibt für jede zahl, die pollswitch zurückgibt nur eine mögliche tasterkombination!!

such im forum, es gibt massen von threads dazu.

tipp: wenn du nur abfragen willst ob ein taster gausser dem ersten gedrückt wurde, dann frag doch ab ob pollswitch()>1 ist. der erste taster hat den wert 1, und wird dadurch ignoriert. alle anderen taster haben höhere werte.

papa_moll
03.01.2007, 19:24
Aha verstehe leider hat genau das jemand in meinem Programm schon irgendwer vor mir getan....(wie gesagt ich habe es hier im Forum gefunden).
Damit ist auch meine letzte Idee gescheitert.
Ich werde versuchen ein Video zu machen und es hochzuladen damit ihr das Verhalten mal beurteilen könnt vll liegt ja etwas ganz anderes vor als das nachdem wir hier alle Momentan suchen.
Ich hoffe auf weitere Hilfe denn ich möchte gerne mein Weihnachtsgeschenk bald funktionierend wissen um dann eigene Programme zu schreiben.

damaltor
03.01.2007, 19:29
das problem ist eins der bekanntesten des asuros. du kannst mal versuchen den wert zu erhöhen:

PollSwitch()>1 //Der erste taster wird ignoriert
PollSwitch()>2 //Die ersten beiden Taster werden ignoriert
PollSwitch()>3 //die ersten beiden taster werden ignoriert, auch wenn sie gleichzeitig gedrückt wurden
PollSwitch()>4 //Dir ersten 3 Taster werden ignoriert...

und so weiter...

je höher der wert, desto mehr taster werden ignoriert, aber desto fehlerunabhängiger ist die abfrage.

Frutiger
03.01.2007, 19:49
mit diesem kleinen Programm hatte ich meine Schalter getestet:

#include "asuro.h"

int main(void)
{
int n;

Init();
Encoder_Init();
StatusLED(OFF);
SerWrite("\n\rSchalter Test\n\r",17);
while(1)
{
n=PollSwitch();
switch(n) // Ausgabe auf der Konsole
{
case 1 : SerWrite("\n\rK6\n\r",6); break;
case 2 : SerWrite("\n\rK5\n\r",6); break;
case 4 : SerWrite("\n\rK4\n\r",6); break;
case 8 : SerWrite("\n\rK3\n\r",6); break;
case 16 : SerWrite("\n\rK2\n\r",6); break;
case 31 : SerWrite("\n\rK1\n\r",6); break; // mein ASURO!!
}
while(n>10)
{
Msleep(500);
StatusLED(GREEN); // grüne Status LED für die Zehner
n-=10;
Msleep(500);
StatusLED(OFF);
}
while(n>0)
{
Msleep(500);
StatusLED(RED); // rote Status LED für die Einer
n-=1;
Msleep(500);
StatusLED(OFF);
}
}
return 0;
}

radbruch
03.01.2007, 19:59
Hallo,

ich vermute auch dass die Motoren die Tastenabfrage stören. Die mehrfache Abfrage oder die Verzögerungen mit Zählschleifen oder Sleep-Funktionen(der asuro kann dann nichts anderes machen!) sind Unsinn. Sinnvoll erscheint mir nur die mehrfache Abfrage der Schalter mit Zwischenspeichern der einzelnen Ergebnisse. Wenn dann mehrere Ergebnisse hintereinander oder z.B. 2 aus 3 (kann man steigern) gleich sind ist die betreffende Taste gedrückt.

Ich habe meinen asuro erst seit Weihnachten und bin noch bei den Basics, aber demnächst werde ich euch vermutlich mit meinen Codes überschwemmen *grins*

Gruß

mic

damaltor
04.01.2007, 15:47
es liegt weniger an den motoren, als an dem kondensator C7. solange dieser entladen ist kommt nur mist an. deshalb wird die mehrfache abfrage benutzt, um den kondensator zu entladen.