ja, genau das würde ich auch sagen. dazu sollte mein kleines programm da oben taugen. funktioniert es?
Druckbare Version
ja, genau das würde ich auch sagen. dazu sollte mein kleines programm da oben taugen. funktioniert es?
hi
ich hab jetz das 2. programm von dalmator laufen lassen (da fehlt noch ein ; im code hinter "taster")
das hyperterminal spuckt aber nur symbole(herzchen usw) aus, wenn ich irgendwelche taster drücke kommen dann ganz unterschiedliche sachen, aber nix womit ich was anfangen könnte!
@sternthaler ich habe diesen code 1 zu 1 aus dem kollisionstest kopiert, und da funzt es ja! kann es irgendwie mit der "umgebung" also dem rahmen deines multitaskingcodes zu tun haben? sonst kann ich mir nämlich nicht erklären wieso die methode sonst funzt und hier einen (bei mir) reproduzierbaren fehler verursacht.
julian
Hallo ElTransistor,
Kleines Problem ist im 'Prozess' 4 (geradeausfahren von waste). Dort fehlt das Setzen der neuen Zeit mit:
"v_P4_lasttime = v_time + d_P4_wartezeit;"
Das allerdings sollte nicht zu deinem Problem führen, da du ja die Ausweichfahrt komplett im 'Prozess' 1 (Tasten auswerten) abhandelst.
Ich werde dein Programm mal bei mir übersetzen und dann berichten.
Gruß Sternthaler
Hallo
Zitat:
probier mal das hier. kann da mal einer drüber schauen bitte?
sollteCode:SerWrite(*wert,5);
heißenCode:SerWrite(wert,5);
Gruß Sebastian
Guten Morgen izaseba.
Wenigstens einer der mal aufpasst.
Dafür habe ich die Lösung von ElTransistor's Problem.
Es ist tatsächlich so wie ich schon vermutet hatte, dass der Taster 6 (von vorne gesehen rechts) wie immer spinnt.
Obwohl ich den Umrechenwert bei mir sehr gut justiert habe, kommt bei Taster 6 eben nicht 32 raus sondern nur 31.
Und dann ist es so wie ich schon oben geschrieben hatte.
Was habe ich gemacht:
Wie ich schon vorgeschlagen hatte.Code:if (t1 & 0x07) /* Tasten links gedrückt? */
{
SerWrite("\n\rL ", 4);
PrintInt(t1);
MotorDir(FWD,RWD);
..
..
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
SerWrite("\n\rR ", 4);
PrintInt(t1);
MotorDir(RWD,FWD);
..
..
Bei mir kommt dann:
L 1
L 2
L 4
R 8
R 16
L 31
R 31
Wobei das letzte "R 31" natürlich dann aus dem "if (t1 & 0x38) /* Tasten rechts gedrückt? */" kommt.
Lösung:
Jubel, es geht nun super.Code:if (t1 & 0x07) /* Tasten links gedrückt? */
{
t1 = 0;
MotorDir(FWD,RWD);
..
..
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
t1 = 0; // Das ist hier natürlich Ueberfluessig. Aber wer weiß schon,
// welche Taste als naechstes abgefragt werden soll.
MotorDir(RWD,FWD);
..
..
Warum der Code aus dem Beispiel funktioniert ist mir nicht klar. Ich vermute, dass der Regler mit seinem ständigen 'gefummel' an der Geschwindigkeitsvorgabe einfach zu viele Störungen in die Tastenmessung bringt.
So long
Gruß Sternthaler
ich habe aus der aktuellen asuro lib das taster-test ptogramm laufen lassen:
dabei zeigte das hyperterminal folgende werte:Code:#include <stdlib.h>
#include "asuro.h"
int main(void)
{
uint8_t t1, t2;
unsigned char text[16];
Init();
SerPrint("\r\nTastsensor Test\r\n");
while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 && t2 && t1 == t2) /* irgendeine Taste gedrueckt */
{
itoa(t1, text, 10); /* Tastenwert senden */
SerPrint(text);
SerPrint("\r\n"); /* Zeilenvorschub */
}
Msleep(500);
}
}
taste(von rechts nach links) - ausgabe des hyperterminals
1 - 1
2 - 2
3 - 4
4 - 8
5 - 196
6 - 31
alle tasten musten mehrmals gedrückt werden bevor sie überhaupt etwas ausgeben.
sind die werte so richtig? die 196 wirkt etwas fehl am platz.[/list]
die 196 ist in der Tat ziemlich Falsch.
Du kannst Dir auch direkt die ADC Werte auf der Konsole ausgeben lassen,
da kann man sehen, wie stabil die Messungen denn überhaut sind,
schau mal in diesem Thread, dort habe ich ein Programm vorgestellt, das die ADC Werte über UART ausgibt.
Gruß Sebastian
ok, ausgaben in der selben reihenfolge der taster:
Code:1010
1010
1010
1010
1010
1010
1010
1010
1010
994
994
994
994
994
994
994
994
964
964
964
964
964
964
964
912
912
912
912
912
912
912
912
912
0
0
0
0
0
0
0
676
676
676
676
676
676
676
1023
Ich habe da eine Idee, dafür müßte ich aber wissen, ob der M8 auf dem Asuro den EEPROM Inhalt nach dem erneutem Flashen behält, also ob EEPROM Save Fuse aktiv ist, hat da jemand erfahrungen, wie es so ist ?
Wenn der EEPROM erhalten bleibt könnte man ja ein kleines Programm schreiben, wo der User dazu aufgefordert wird jede Taste sag ich mal 5 Mal zu drücken, davon einen Mittelwert bilden und den errechneten Wert im EEPROM ablegen.
Die Pollswitch Funktion müßte nur noch etwas abgeändert werden, damit sie die Werte auf dem EEPROM bezieht und mit dem ist Wert vergeicht, was haltet Ihr davon ?
Gruß Sebastian
Hallo Weiti,
Das sieht ja schonmal gut aus, die Werte sehen ja schön stabil aus,
nur die 0 mitten drin ist nicht gut, ist das die Taste, die 196 ausgibt ?
ich vermute da einen kurzschluß gegen Masse ADC Wert von 0 bedeutet ja auch 0V
Seh Dir mal die Platine Genau an.
Gruß Sebastian
ahhh, due wiederstände r32 und r26 waren verbogen und haben sich berührt! ich habe sie wieder auseinander gebogen und alles geht!
vielen dank für die hilfe!
hi!
@sternthaler erstmal danke dass du dich um mein problem gekümmert hast!
aber hab ich das richtig verstanden, dass du als lösung nur in jeder if-schleife als erstes einfach t1 = 0 setzt? weil wenn ich das mache, "tut" er nur so, als gäbe es nur links. wenn ich die rechten taster drücke geht er trotzdem so als würde ich den linken drücken..bei dir funktioniert es aber normal?
julian
super, danke... funktioniert es jetzt? mein asuro ist grad ne baustelle, kanns leider nicht testen..
Hallo ElTransistor,
ja, die 0 wird natürtürlich die Information der gegrückten Taster löschen.
Da ich aber schon weiter oben aufgeführt hatte, dass das Drücken vom Taster 6 den beliebten Fehler liefert, NICHT eine saubere 32 also 100000, sondern manchmal auch nur ein 31 als 011111 zu bringen, habe ich mir bei deiner Anwendung gedacht es so zu lösen.
011--- bringt dann das Drehen in eine Richtung.
---111 wird dann gelöscht und somit wird nicht mehr in die andere Richtung gedreht.
Und so wie izaseba es vorschlägt, dass die ADC-Werte 'irgendwie' im EEPROM gespeichert werden, und durch eine angepasste PollSwitch()-Funktion benutzt werden, ist auch ein Lösungsversuch.
Allerdings bezweifel ich, dass es dann tatsächlich immer funktionieren wird, da ja auch dann noch die leidigen Störungen im laufenden Betrieb nicht berücksichtigt werden können. (Motor an/aus; LED's an/aus; Baterie schlapp; usw....) Sorry izaseba. Aber probieren geht über studieren. Hol deinen Asuro aus dem Koma und ran an den Feind.
Gruß Sternthaler
Upp's.
Mal alles in den richtigen Thread geschoben. (siehe Hinweis von Radbruch)
Peinlich :oops:
Klasse, genau so hatte ich mir das vorgestellt. Allerdings war das doch ein anderer Thread, oder?
Probleme mit 22er-Lochscheiben
hmm, wer hätte gedacht dass ein simpler schalter so kompliziert sein kann..
ich muss zugeben dass ich von dem ganzen noch überhaupt keine ahnung habe, den code hab ich ja auch nur zusammenkopiert..weiter geht mein verständnis leider noch nicht. wie man jetz irgendwelche ADC werte irgendwo speichert davon versteh ich überhaupt nix :(
vielleicht gibts ja ne einfachere hardware-lösung. ein schalter links, ein schalter rechts, fertig \:D/
@ElTransistor
Ja, das wäre eine nette Lösung. Leider, oder gar nicht mal so schlecht zum üben, ist aber die Lösung im Asuro etwas komplizierter.
Wenn du das Buch zum Asuro hast (Band I), solltest du dich da mal in Ruhe durch die Tastur-Lösung lesen. Sie ist sehr gut geschrieben und bringt bestimmt das Verständnis dazu.
Sonst schau mal hier nach: Wichtig- ASURO und Abitur !
Hier solltest du eventuell mal komplett von vorne anfangen, wenn dich einige Grundlagen interessieren.
Sonst mach vor allem die Code-Blöcke auf, die ich geschrieben hatte, da dort die Erklärungen drin stecken.
Viel Erfolg und Spaß weiterhin mit dem Asuro
Gruß Sternthaler