PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Tastern



roland001
17.09.2007, 14:46
Hallo!

Bin ein neuer Asurobastler.

Zusammenbau hat soweit funktioniert, asuro hat selbsttest bestanden.

jetzt habe ich ein erstes kleines Programm geschrieben, bei dem er nachdem der Taster mit Wert 2 aktiv geht umdrehen soll und dann wieder vorwärts vor sich hinfahren soll.

Problem: Der Asuor dreht teilweise schon ohne hindernis um.
Kann das an den von den anderen beschriebenen Problemen mit den Tastern liegen oder habe ich im Programm einen Fehlen?

Bitte um Kontrolle



#include "asuro.h"

void main()
{
int zaehler;

Init();
while(1)
{
if (PollSwitch() == 2)
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,200);

for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}
}
else
{
StatusLED (GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
}
}



Danke

Mfg
Roland

liggi
17.09.2007, 15:00
Also ich finde keinen Fehler. Ich hab nur einen Vorschlag, nämlich du solltest die Asuro Lib benutzen, dann könntetst du zum Beispiel die Sleep-Schleife durch Msleep.

mfg liggi

farratt
17.09.2007, 15:27
Ich denke auch, dass kein Hardware-Fehler vorliegt. Ruf die Funktion PollSwitch() einfach mehrmals auf.


#include "asuro.h"

void main()
{
int zaehler;

Init();
while(1)
{
if (PollSwitch() == 2)
{
if(PollSwitch()==2)
{
if(PollSwitch()==2)
{

StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,200);

for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}
}}}
else
{
StatusLED (GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
}
}

Durch das öftere Aufrufen wird der Kondi C7 entladen und liefert genauere Werte.

Gruß farratt

damaltor
17.09.2007, 16:37
den kondensator kann man auch entfernen, seitdem geht bei mir alles. aber such mal ein wenig nach tastern im forum, da gibt es sehr viele ansätze. für den anfang reicht es meist schon die funktion mehrfach aufzurufen.

einfacher, als alles zu verschachteln, geht folgendes:
a=PollSwitch();
b=PollSwitch();
c=PollSwitch();
if((a == b)&(b == c)){ ....

roland001
17.09.2007, 16:43
werde bei gelegenheit mal einen kleineren Ko verwenden und das tau kleiner machen

damaltor
17.09.2007, 17:23
öhm... was meinst du?

KayH
17.09.2007, 17:34
tau ist IMHO die Zeitkonstante/Halbwertszeit
in diesem speziellem Fall wohl die des Kondensators, also ein kleinerer Kondensator

damaltor
17.09.2007, 17:37
lol... ja ein kleinerer konsensator könnte wohl helfen. an dieses tau hab ich gar nicht gedacht =) ich habe ihn einfach nicht eingelötet, es geht perfekt.

roland001
17.09.2007, 18:19
tau ist die Zeitkonstante die sich aus RxC zusammensetzt.

Für mich stellt der Kondensator eine Buffer dar, falls sich etwas einkoppen sollte um den Eingang des IC´s zu schützen (eventuell EMV maßnahme???)

Aber Funktion hat dieser C wohl keine, da sich die Spannung die bei gedrücktem Taster sowieso aufgrund des Spannungsteilers zusammensetzt, außer dass bei loslassen des Tasters der Eingang nicht sofort auf "1" geht, oder hat da wer ne andere Idee??

roland001
17.09.2007, 18:19
*doppelpost*

15 zeichen

harry3
18.09.2007, 11:21
tau ist die Zeitkonstante die sich aus RxC zusammensetzt.

Für mich stellt der Kondensator eine Buffer dar, falls sich etwas einkoppen sollte um den Eingang des IC´s zu schützen (eventuell EMV maßnahme???)

Aber Funktion hat dieser C wohl keine, da sich die Spannung die bei gedrücktem Taster sowieso aufgrund des Spannungsteilers zusammensetzt, außer dass bei loslassen des Tasters der Eingang nicht sofort auf "1" geht, oder hat da wer ne andere Idee??

Vielleicht sollte der Kondensator das Schalterprellen dämpfen.

Anscheinend ist er aber zu groß gewählt.

Du kannst dir eine Ersatzfunktion basteln, welche dir die richtigen Werte liefert. Dann musst du in main nur noch diese eine Funktion aufrufen und fertig!


unsigned char fkt_taster(void)
{
unsigned char taster=0;

taster=PollSwitch();

if(taster==PollSwitch() && taster!=0)
return taster;
else
return 0;
}

damaltor
18.09.2007, 14:00
er scheint wirklich zu groß zu sein. experimente mit kleineren sind ganz gut verlaufen, trotzdem habe ich mich entscieden, den kondensator letztendlich doch zu entfernen bzw. beim zweiten asuro ganr nicht erst einzubauen. ergebnis: 99,9% richtige werte.

harry3
18.09.2007, 20:59
er scheint wirklich zu groß zu sein. experimente mit kleineren sind ganz gut verlaufen, trotzdem habe ich mich entscieden, den kondensator letztendlich doch zu entfernen bzw. beim zweiten asuro ganr nicht erst einzubauen. ergebnis: 99,9% richtige werte.

Aha, wäre natürlich gut wenn man das schon vor dem Einbauen wüsste :D

Aber solange man es mit ein paar einfachen Tricks im Programmcode richten kann ists eh nicht so schlimm.

damaltor
18.09.2007, 21:16
ja, das ist wahr... aber ansonsten schlage ich folgendes vor: ein bein des konsensators durchkneifen, und dann testen. wenns besser wird: weg das ding, wenn nicht: mit einem kleinen lötfleck wieder kontakt herstellen.

harry3
18.09.2007, 21:20
ja, das ist wahr... aber ansonsten schlage ich folgendes vor: ein bein des konsensators durchkneifen, und dann testen. wenns besser wird: weg das ding, wenn nicht: mit einem kleinen lötfleck wieder kontakt herstellen.

Stimmt so kann man das ganze recht elegant lösen.

Bei mir funktionierts aber mit den genannten Tricks eh ganz gut also werde ich den Kondensator "am Leben" lassen.

mic
30.09.2007, 22:48
Wer hat eine Idee für dieses Problem:
- Taster-Selbsttest verläuft ok
- Sobald ein Motor an ist, liefert PollSwitch() eine 1, bei starker Belastung der Motoren auch 2. Dabei ist unabhängig, ob der linke oder rechte Motor an ist, ob vor- oder rückwärts.

Verzeifelt schiebe ich das so langsam in Richtung Störeinstrahlung.
Auch kombinierte Pollabfragen bringen nichts. Entfernen von C7 hat soweit Besserung gebracht, dass vereinzelt eine 0 kommt.
Lötbrücke schliesse ich aus, da sonst Abhängigkeit von links/rechts oder FWD/RWD bestehen müsste?
Und um gleich der Frage vorzubeugen, die Enstörkond. sind an den Motoren vorhanden.

Wo könnte ich noch prüfen?

Sternthaler
01.10.2007, 01:41
Hallo mic,
die Funktion PollSwitch() enthält eine 'kleine' Rechnung á la:
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));

Hier ist der Wert 63.0 häufig der Übeltäter.
Über eine Änderung von diesem Wert kannst du die Genauigkeit der PollSwitch()-Funktion so anpassen, dass die Widerstandstoleranzen teilweise ausgeglichen werden können.
Entweder 'spielt' du mit diesem Wert ein bisschen rum, oder du probiert einmal über dies hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31073) den Wert vom Asuro selbst bestimmen zu lassen.
Im übrigen kannst du diese Rechnung wesentlich schneller mit folgendem ausführen lassen (ist aus der Asuro-Lib von hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26594)):
return ((10240000L / (long)i - 10000L) * 63 + 5000L) / 10000;

mic
01.10.2007, 11:39
Sternthaler, vielen Dank. Mit Korrekturwerten +- 1 hatte ich bereits schon rumgespielt. Nun nochmal Dein tolles Programm heruntergeladen, und da erhalte ich als Ergebnis 62. Ich denke das Prgm. wird mir noch sehr nützlich sein, wenn es in Richtung Odemetrie geht.

Habe nochmal mit 62.0 probiert, aber das Problem bleibt. Was ja auch zu erwarten ist, da nicht die Tastenerkennung das Problem ist, sondern die Erkennung im Zustand nicht gedrückter Tasten: Sobald einer der Motoren in Betrieb ist, bekomme ich Werte von 1-2. R24 und R23 liegen gut in den Werten.

damaltor
01.10.2007, 21:15
experimentiere weiter - die tastererkennung ist sehr genau (werte von 0-1023) und wird durch diese formel umgerechnet in die tasterwerte (1,2,4,8...). wenn du weiter mit desem wert experimentierst, wird der fehler irgendwann "weggerundet".

Sternthaler
02.10.2007, 10:53
Hallo zusammen,
ich hatte mir vor längerer Zeit mal (natürlich) ein EXCEL-Blatt zusammenbebastelt um mir die Auswirkungen des Umrechenfaktors vor Augen zu führen.
Das will ich euch hier auch mal zeigen.
Im Blatt "Tabelle2" sieht man an der Grafik (oben, ganz weit rechts) deutlich, dass der Umrechenwert eigendlich nur die 'hohen' Tasten verschiebt. Taste 1, 2 und 3 bleiben so ziemlich im gleichen Bereich um erkannt zu werden.
Weiter kann man sehen, das die 'hohen' Tasten auch die kritischeren Tasten sind, da die Erkennungsbreite (ADC-Wert-Spanne) hier immer schmaler wird. Aber das wissen wir ja alle schon aus Erfahrung.

Tja, nix Anhang. 2 Fehler bekommen ich gleich.
1.Datei zu groß.
2.Du hast deine maximale Upload Quota Grenze von 3 MB erreicht.
@damaltor HILFE

Aber es geht auch so:
EXCEL-Blatt bei Sternthaler (http://members.surfeu.de/sternthaler/ASURO/ADC-Tasten.xls)

mic
02.10.2007, 11:19
Vielen dank, das ist alles Klasse - aber ist es Kern meines Problems?

Nochmal: Ich bekomme Werte für K6 und K5, sobald einer der Motoren läuft. Die Tasten müssen dazu nicht betätigt werden.

Mit nicht eingeschalteten Motorn läuft die Tastenerkennung 100%, deshalb wird mir die Korrektur der Formel nicht wirklich weiterhelfen.

- Da kein Zusammenhang zwischen linker/rechter Motor oder Vor/Rückwärtsbetrieb auszumachen ist, schließe ich eine Lötbrücke als Ursache aus.

- Wenn ich den Mechanismus richtig kapiere, muss zur Tastenerkennung der Interrupt über PD3 ausgelöst werden. Das würde bedeuten irgendwas 'zupft' an meiner Leitung, obwohl keine Taste gedrückt wurde. Oder liege ich da falsch?

Sternthaler
03.10.2007, 02:53
@mic Ähhhm, bist du nun roland001?
Oder habt ihr beide das selbe Problem?

Und nein, die EXCEL-Datei ist tatsächlich nicht das Problem, sondern soll nur ein bisschen vom Innenleben im Asuro zeigen, um ein bisschen Verständnis zu bringen. Natürlich keine Hilfe für dieses Problem.

Und noch ein nein. Wenn es um das Programm von roland001 im ersten Beitrag geht, wird kein Interrupt benutzt. Die Funktion PollSwitch() holt sich die Tastenwerte einfach so über das Auslesen des ADC-Wertes der Taster-Messleitung PC4 (ADC-Kanal 4).

Nun aber mal ein ja. Im Interruptbetrieb der Tastenerkennung wird tatsächlich Leitung PD3 mit der Zweitfunktion als Interrupt1-Eingang benutzt. Dann aber ist doch schon wieder die Leitung an PC4 gefragt um aus der dort gemessenen Spannung die gedrückte(n) Taste(n) zu berechnen. Siehe EXCEL-Blatt ;-)

Weiti
30.10.2007, 22:22
sooo, ich habe natürlich das gleiche problem (habe ich eigentlich alle probleme?) ich habe erstmal eine lötbrücke gebastelt, um den Kondensator außer kraft zu setzen. harrys lösung hatte nämlich auch schon nicht geklappt!
leider besteht das problem immer noch. liegt es denn jetzt an der brücke, also muss ich ihn ganz entfernen?

damaltor
31.10.2007, 03:27
WAAAAHHH keine lötbrücke!!! das ist ein glatter kurzschluss!!!!!!!

erst schaltplan gucken, dann löten!

Weiti
31.10.2007, 09:21
ok, ok, lötbrücke entfernt kondensatorbeinchen durchgeknipst. es geht trotzdem nicht. kann die lötbrücke die taster beschädigt haben?

damaltor
31.10.2007, 13:05
hm. eigentlich ist das ein glatter kurzschluss. es könnte durchaus sein, dass etwas beschädigt wurde. funktionieren andere programme noch?

welche tasterwerte bekommst du denn? du kannst auch nochmal den selbsttest flashen, und sehen wie die taster reagieren.

Weiti
31.10.2007, 13:20
wenn ich folgendes starte, reagieren die taster:



while (PollSwitch()==0) {
BackLED(ON,ON);
}

while (PollSwitch()>0) {
BackLED(OFF,OFF);
}



der code hier hingegen läuft nicht:


while (PollSwitch()==0) {
MotorSpeed(120,120);
}
MotorSpeed(0,0);


jeweils in das gleiche main() gerüst eingebunden

edit: mit rückgabewerten habe ich mich nicht befasst, ich brauche nur o oder !0 alles andere ist egal.

Weiti
31.10.2007, 14:40
ichnnehm alles zurück! der erste code läuft auch nicht...

damaltor
31.10.2007, 16:55
ok. bitte nutze nocmal die suchfunktion. es gibt viele verschidene möglichkeiten, die taster auszutesten, probier mal das hier:


#include "asuro.h"

int main(void){
unsigned char taster, radix=10;
unsigned char wert[5];
Init();
while(1){
taster=PollSwitch();
itoa(taster,*wert,radix);
SerWrite(*wert,5);
SerWrite("\n\r",2);
}
return 0;
}

(ungetesteter code, eben mal zusammengetippt).

in hyperterminal müsste jetzt ein wert ausgegeben werden, und zwar folgendes:
kein taster gedrückt:0
taster 1: 1
taster 2: 2
taster 3: 4
taster 4: 8
taster 5: 16
taster 6: 32

wenn mehrere taster gedrückt wurden, dann jeweils deren summe.

ElTransistor
31.10.2007, 17:45
hi

ich hab auch ein problem mit den tastern..

da hab ich dieses beispielprogramm aus der asuro lib genommen, wo die kollisionsabfrage gemacht wird. es funzt ganz gut.

wenn ich aber den teil des programms in mein programm reinkopiere, reagiert er auf die taster der einen seite normal, aber wenn die taster der anderen seite betätigt werden, tut er so als würde kurz danach wieder die gegenüberliegende seite betätigt werden..also so:

rechts
rechts
rechts
links, rechts
rechts
links, rechts

etc..
wenn ich aber die schleife so ändere dass nur eine der beiden möglichkeiten geht, dann geht NUR noch rechts..obwohl bei links auch zuerst links gekommen is..

ich hab jetzt auch c7 ausgelötet, der einzige unterschied ist der dass nach 3-4 mal tastendrücken die taster bis zum reset nun überhaupt nicht mehr reagieren ](*,) ](*,)

*verzweifel*

damaltor
31.10.2007, 19:57
bitte poste deinen code...

ElTransistor
01.11.2007, 00:30
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)


#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.
}
}


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..


julian

A.Hoffmann
01.11.2007, 09:19
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

damaltor
02.11.2007, 01:16
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.

A.Hoffmann
02.11.2007, 06:31
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

damaltor
02.11.2007, 08:57
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 =)

Weiti
02.11.2007, 12:21
das programm zum tastertest hat folgendes ergeben:


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,


erst beim drücken vom zweiten taster von links gesehen hat das terminal aufgehört wilde zeichen zu empangen!

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.

damaltor
02.11.2007, 16:30
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?


#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;
}

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.

ElTransistor
02.11.2007, 18:09
@dalmator hast du meinen code angeschaut, oder hattest du garnicht mich gemeint mit "poste bitte deinen code"?

Sternthaler
02.11.2007, 19:27
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

damaltor
02.11.2007, 19:32
ja, genau das würde ich auch sagen. dazu sollte mein kleines programm da oben taugen. funktioniert es?

ElTransistor
02.11.2007, 19:52
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

Sternthaler
03.11.2007, 01:28
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

izaseba
03.11.2007, 01:47
Hallo


probier mal das hier. kann da mal einer drüber schauen bitte?


SerWrite(*wert,5);

sollte


SerWrite(wert,5);


heißen

Gruß Sebastian

Sternthaler
03.11.2007, 02:10
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:

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);
..
..
Wie ich schon vorgeschlagen hatte.
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:

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);
..
..

Jubel, es geht nun super.
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

Weiti
03.11.2007, 09:22
ich habe aus der aktuellen asuro lib das taster-test ptogramm laufen lassen:


#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);
}
}

dabei zeigte das hyperterminal folgende werte:

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]

izaseba
03.11.2007, 10:15
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 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10101&highlight=asuro+assembler) Thread, dort habe ich ein Programm vorgestellt, das die ADC Werte über UART ausgibt.

Gruß Sebastian

Weiti
03.11.2007, 10:52
ok, ausgaben in der selben reihenfolge der taster:


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

izaseba
03.11.2007, 10:54
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

izaseba
03.11.2007, 11:22
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

Weiti
03.11.2007, 13:54
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!

ElTransistor
03.11.2007, 15:20
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

damaltor
03.11.2007, 22:55
super, danke... funktioniert es jetzt? mein asuro ist grad ne baustelle, kanns leider nicht testen..

Sternthaler
04.11.2007, 13:58
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

Sternthaler
04.11.2007, 15:27
Upp's.
Mal alles in den richtigen Thread geschoben. (siehe Hinweis von Radbruch)

Peinlich :oops:

radbruch
04.11.2007, 15:40
Klasse, genau so hatte ich mir das vorgestellt. Allerdings war das doch ein anderer Thread, oder?

Probleme mit 22er-Lochscheiben (https://www.roboternetz.de/phpBB2/viewtopic.php?t=35109)

ElTransistor
05.11.2007, 18:31
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/

Sternthaler
05.11.2007, 19:48
@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 ! (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=273400#273400)
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