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