PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterauswertung



Ezalo
31.07.2010, 20:35
Guten Abend,

hab bis jetzt nichts dazu gefunden.

Ist es möglich jeden Taster einzeln auszuwerten, also jedem einzeln eine Funktion zuzuweisen?

z.B.:
K1 = StatusLed: rot
K2 = StatusLed: grün
K3 = StatusLed: gelb
K4 = StatusLed: Aus
K5 = BackLed: On/Off
K6 = BackLed: Off/On

MfG

Ezalo

Valen
31.07.2010, 21:51
Kannst du im Binaires Zahl-system rechnen? K1 bis K6 haben allen ihres eigene Wert der ein Machte von 2 ist. K6=1 (ganz rechts von hinten gesehen: 2 zum Macht 0), K5=2 (2 zum Macht 1), K4=4 (2 zum Macht 2), usw. bis K1=32. Also jede Wert der PollSwitch zurück liefert ist einer kombination von dieser Tastern, und auch einer Summe von ein oder mehr diesen Werten. Zbs, wir bekommen den Wert 22 von PollSwitch. Das ist 2+4+16, also sind das die taster K5,K4 und K2.



2 zum macht: 7 6 5 4 3 2 1 0
128 64 32 16 8 4 2 1
22 = (binair) 0 0 0 1 0 1 1 0


Das kann man auswerten in einem if-abfrage mit hilfe von bitweise-UND operatoren:

http://www.rn-wissen.de/index.php/C-Tutorial#Bit-Operatoren

Diese operatoren vergleichen die bits in 2 werten (ein variabele und einer bestimmte wert der ein oder mehrere bits anzeigt) und setzen das antwort an hand der logische funktion (UND, ODER, exclusief-ODER).


char Taster=PollSwitch();

If (Taster & 16) { /* Taster K2 ist geprellt! */ }

If (Taster & 0b00010001) {
/* bitweise UND mit einer Binaires zahl, 17, gemacht. */
/* oder Taster K2=16, oder Taster K6=1 geprellt! */
}

Ich hoffe du kannst hier mit weiter ausprobieren. Ich finde es schwer mich genau auszudrücken auf deutsch.

Ezalo
31.07.2010, 22:01
Joa, du meinst das jeder Taster einen Binären wert liefert, also: 2 hoch 0, 2 hoch 1 usw. wobei 2 hoch 0 = 1 ist, 2 hoch 1 = 2, 2 hoch 2 = 4. das hab ich soweit verstanden da ich das ja auch in der Ausbildung dran hatte ^^

Das heißt mit den binären Werten kann ich genau den Taster abfragen den ich haben will :D

Gleich mal probieren.

Danke erstmal

Edit: Das man da manchmal nicht selber drauf kommt ^^

Funktioniert prima.

Valen
31.07.2010, 22:08
Du kannst 6 mal fuhr einer bestimmte Taster testen und den bestimmte funktion anrufen oder code-block ausfuhren.

Valen
31.07.2010, 22:12
Einfach testen ob den Wert von PollSwitch gleich an 1,2,4,8,16 oder 32 ist geht auch. Aber das funktioniert nicht wan mehrere tasten gleichzeitig angeprellt sind. Dan muss man dieser bit-testen machen.

Valen
31.07.2010, 22:16
In dem datei Test.c von den SelbTest quell code steht wie das beim Selbtest gemacht wird:


/* ---------------------- */
/* ----- Switch Test ---- */
/* K1 -> Status LED Green */
/* K2 -> Status LED RED */
/* K3 -> Line LED */
/* K4 -> Break LED Left */
/* K5 -> Break LED Rigth */
/* K6 -> Motor Left */
/* ---------------------- */
void SwitchTest(void)
{
unsigned char sw,tmp;
MotorDir(FWD,BREAK);

sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
MotorSpeed(0,0);
tmp = 0;

if (sw & 0x01)
MotorSpeed(200,0);
if (sw & 0x02) {
BackLED(OFF,ON);
tmp = ON;
}
if (sw & 0x04)
BackLED(ON,tmp);
if (sw & 0x08)
FrontLED(ON);
if (sw & 0x10)
RED_LED_ON;
if (sw & 0x20)
GREEN_LED_ON;
}
/* END Switch Test ------------------------------ */

Ezalo
31.07.2010, 22:23
Habs jetzt so:



...
unsigned char sw1, sw2;
while(1){
sw1 = PollSwitch();
sw2 = PollSwitch();
if ((sw1 & 0b000001) || (sw2 & 0b000001)){
StatusLED(RED);
}
else if ((sw1 & 0b000010) || (sw2 & 0b000010)){
StatusLED(YELLOW);
}
else if ((sw1 & 0b000100) || (sw2 & 0b000100)){
StatusLED(GREEN);
}
else if ((sw1 & 0b001000) || (sw2 & 0b001000)){
StatusLED(OFF);
}
else if ((sw1 & 0b010000) || (sw2 & 0b010000)){
BackLED(ON,ON);
}
else if ((sw1 & 0b100000) || (sw2 & 0b100000)){
BackLED(OFF,OFF);
}
...

Allerdings gehts so nicht ^^

Drücke ich jetzt K2 gehen die BackLed's an und die StautsLed schaltet auf Rot. Die StatusLed lässt sich auch nicht mit K3 ausschalten und Die BackLed's gehen bei betätigen von K1 auch nicht aus.

Valen
31.07.2010, 22:38
Du liest die Tastern in dem falsche Richtung. K1 sitzt an die IR Sender/Empfänger Seite. Und ist die wert 32. Also stimmt dein Programm im Prinzip, leider sind die Funktion anrufen in dem falsche folge.

Ezalo
31.07.2010, 22:43
Ich weiß das meine Reihenfolge (Asuro von Batterie richtung taster sehende) von rechts nach links geht. Und K1, K2, K3 sind demzufolge links?

Dann versteh ich aber Trotzdem nicht wieso das beschriebene bei K1-K3 passiert obwohl das Programm etwas anderes sagt.

Ezalo
31.07.2010, 22:53
AHA...

ich dachte es wäre egal ob ich sie von K6 Richtung K1 auswerte oder von K1 Richtung K6 ^^ Aber scheint wohl nicht so.

Hab jetzt den Code auf K1 (links) nach K6 (rechts) umgeändert und nun funktioniert es wie es soll.

Danke

Edit: Wieso schalte ich mit antippen von K5 die BackLed's aus?

Edit2: Wenn ich die BackLed's mit K5 anschalte (wenn sie dnen anbleiben) kann ich mit K2 die StatusLed nicht mehr auf Gelb stellen, wieso das?

Valen
31.07.2010, 22:59
Laut dem Schaltplan ist K1 an R25 verbunden. Die sitzt auch Links gleich daneben.

Eine andere möglichkeit könnte sein das dein Asuro nicht ganz an dem PollSwitch Widerstand-Zahl-Formel halt. Das ist möglich durch die Ungenauigkeit de Widerstanden in dem Schaltung. Die erweiterte lib hat einer wert in den Formel der man anpassen kann. Wie man das heraus finden kann und anpassen kann in dem Originale PollSwitch weis ich nicht. Vielleicht ist dar schon uber geschrieben tief in das Forum.

radbruch
31.07.2010, 23:56
Hallo

Wenn die Zuordnung der Taster zu den jeweiligen Bits im Ergebniss von PollSwitch() nicht stimmt kann man das in der Datei asuro.c am Ende der Funktion PollSwitch() kalibrieren:

http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=419056#419056

Trotz richtig kalibrierten Tasten können die Werte noch schwanken, deshalb sollte man das Ergebniss von PollSwitch() überprüfen:


sw1=PollSwitch();
sw2=PollSwitch();

if(sw1==sw2)
{
if(sw1 & 1) {} // K6
if(sw1 & 2) {} // K5
...
if(sw1 & 32) {} // K1
}

So funktioniert es nicht:

sw1 = PollSwitch();
sw2 = PollSwitch();
if ((sw1 & 0b000001) || (sw2 & 0b000001)){
StatusLED(RED);
}

Weil es für eine rote Statusled ausreicht, wenn entweder in sw1 oder in sw2 Bit0 gesetzt ist. Das ist z.B. auch bei der Kombination sw1=0b111111 und sw2=0 der Fall. Korrekt wäre diese Formulierung:


sw1 = PollSwitch();
sw2 = PollSwitch();
if ((sw1 & 0b000001) && (sw2 & 0b000001)){
StatusLED(RED);
}


Gruß

mic

Ezalo
01.08.2010, 10:05
Habe jetzt die Taster kalibriert und bekomme dabei den Wert 63 angezeigt. In der myasuro.h stand 62L, habe es auf 63L geändert.

Mein jetziger Code:


unsigned char sw1, sw2;
while(1){
sw1 = PollSwitch();
sw2 = PollSwitch();
if(sw1==sw2){
if (sw1 & 0b100000){
StatusLED(RED);
}
else if (sw1 & 0b010000){
StatusLED(YELLOW);
}
else if (sw1 & 0b001100){
StatusLED(GREEN);
}
else if (sw1 & 0b000010){
BackLED(ON,ON);
}
else if (sw1 & 0b000001){
StatusLED(OFF);
BackLED(OFF,OFF);
}
}


Probleme:
K5 -> BackLed's an, StatusLed aus
BackLed's an -> K2 wird betätigt = StatusLed grün oder K1 wird betätigt = StatusLed gelb oder K5 wird betätigt = BackLed's gehen aus oder bleiben an

Hoffe mein Problem ist verständlich :)

-guenny-
20.09.2010, 20:19
In dem datei Test.c von den SelbTest quell code steht wie das beim Selbtest gemacht wird:


/* ---------------------- */
/* ----- Switch Test ---- */
/* K1 -> Status LED Green */
/* K2 -> Status LED RED */
/* K3 -> Line LED */
/* K4 -> Break LED Left */
/* K5 -> Break LED Rigth */
/* K6 -> Motor Left */
/* ---------------------- */
void SwitchTest(void)
{
unsigned char sw,tmp;
MotorDir(FWD,BREAK);

sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
MotorSpeed(0,0);
tmp = 0;

if (sw & 0x01)
MotorSpeed(200,0);
if (sw & 0x02) {
BackLED(OFF,ON);
tmp = ON;
}
if (sw & 0x04)
BackLED(ON,tmp);
if (sw & 0x08)
FrontLED(ON);
if (sw & 0x10)
RED_LED_ON;
if (sw & 0x20)
GREEN_LED_ON;
}
/* END Switch Test ------------------------------ */

Das geht bei mir nicht!
egal welchen Taster ich drück, nichts passiert.
und was sagt eigentlich die Init() Funktion?

Valen
20.09.2010, 22:15
In dem datei Test.c von den SelbTest quell code steht wie das beim Selbtest gemacht wird:


/* ---------------------- */
/* ----- Switch Test ---- */
/* K1 -> Status LED Green */
/* K2 -> Status LED RED */
/* K3 -> Line LED */
/* K4 -> Break LED Left */
/* K5 -> Break LED Rigth */
/* K6 -> Motor Left */
/* ---------------------- */
void SwitchTest(void)
{
unsigned char sw,tmp;
MotorDir(FWD,BREAK);

sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
MotorSpeed(0,0);
tmp = 0;

if (sw & 0x01)
MotorSpeed(200,0);
if (sw & 0x02) {
BackLED(OFF,ON);
tmp = ON;
}
if (sw & 0x04)
BackLED(ON,tmp);
if (sw & 0x08)
FrontLED(ON);
if (sw & 0x10)
RED_LED_ON;
if (sw & 0x20)
GREEN_LED_ON;
}
/* END Switch Test ------------------------------ */

Das geht bei mir nicht!
egal welchen Taster ich drück, nichts passiert.
und was sagt eigentlich die Init() Funktion?Funktioniert den Taster test von dem SelbTest nicht? Oder kannst du keine bit-test hin bekommen in dein Programm?

-guenny-
21.09.2010, 09:08
wie gesagt, wenn ich den selbst test ausführe, funktioniert alles super!
wenn ich jetzt aber nur den switch code übernehme, dann geht nichts.
genauso wie das beispiel programm aus dem manuel, das geht auch nicht.

Valen
21.09.2010, 11:23
Bitte las dein Programm sehen. Ohne kann man nichts sagen. In dem Anleitung gibt es kein komplett Programm das bestimmte Tastern auswertet.

-guenny-
21.09.2010, 12:37
void SwitchTest(void)
{
unsigned char sw,tmp;
MotorDir(FWD,BREAK);

sw = PollSwitch();
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
MotorSpeed(0,0);
tmp = 0;

if (sw & 0x01)
MotorSpeed(200,0);
if (sw & 0x02) {
BackLED(OFF,ON);
tmp = ON;
}
if (sw & 0x04)
BackLED(ON,tmp);
if (sw & 0x08)
FrontLED(ON);
if (sw & 0x10)
RED_LED_ON;
if (sw & 0x20)
GREEN_LED_ON;
}
/* END Switch Test ------------------------------ */

Das geht nicht!

und folgendes geht auch nicht.

int main(void)
{
Init(); //Welche Bedeutung?
unsigned char Taster;
Taster = PollSwitch();
if(Taster > 0 )
{
SerWrite("Hallo du da!",12);
}
while(1);
return 0;
}

Valen
21.09.2010, 12:58
Den SwitchTest Funktion allein kann nicht in ein Programm verwendet werden. Das muss irgendwie in den Hauptfunktion main (oder weitere Sub-funktionen) angerufen werden. Ich habe das nur damals in meiner Bericht geschrieben um den "sw & 0x_wert" anschaulich zu machen.

Den Init() Funktion initialisiert eine menge von Interne Registern der notwendig sind fur das korrektes funktionieren der IC1 (de Atmega8 chip). Es setzt den anfangs wert und Kommunikation-richtung und Anfangswert von verschiedene pins. Dazu setzt es auch den Timer einstellungen fur den Motor-kontrol und den serielle komunikation und analoge Messungeinrichtung (ADC). Die Funktion muss am Anfang angerufen werden sonnst werden die andere Asuro Funktionen nicht richtig funktionieren.

Dein Program geht schon, aber es tut es nur ein mal. Es macht den PollSwitch Messung nur einmal. Dan testet es mit den If abfrage ob einer Taster bemerkt is (und sendet über den IR stelle wenn das stimmt). Danach geht es in einer unendliche schleife mit while(1); Du bekommst aber keine Zeit einer der Taster ein zu drücken. Es geht zu schnell.

Den folgende code muss besser gehen:

int main(void)
{
Init();
unsigned char Taster;

While(1) { //wiederhol fur immer
Taster = PollSwitch();
if(Taster > 0 )
{
SerWrite("Hallo du da!",12);
} // Ende von if, irgend eine Taster geprellt.

} // Ende von while(1);

return 0;

} //Ende main

-guenny-
21.09.2010, 13:28
so hab das mal getestet... nichts geht!
der Kondensator läd sich zwar auf, aber es tut sich nichts!

Valen
21.09.2010, 13:36
Bist du sicher das eine neue Hex-datei erzeugt ist? Manchmal vergessen anfänger den Datei zu speichern. Auserdem ist noch etwas vergessen am obene ende das Program:


#include "asuro.h"

int main(void)
...

Das musste aber Kompilier-fehler oder Warnungen gegeben haben wen es nicht drin war.

-guenny-
21.09.2010, 13:43
jetzt hab ich des hinbekommen.
aber warum muss die Implementierung von Taster in die While-Schleife?
dann muss ich ja jedesmal neu implementieren!

Valen
21.09.2010, 13:53
Ich verstehe nicht was du mit "jedesmal neu implementieren" bedeutet.

http://de.wikipedia.org/wiki/Implementierung

Meinst du vielleicht "eindrücken" der Tastern? Jedenfalls, den messung dauert nur eine Fraktion von einer Sekunde. Nach dem Entscheidung ob etwas eingedrückt ist muss er es wieder abfragen. Dazu benötigt es eine neue Messung mit PollSwitch. Weil ein bisschen später kannst du den Taster wirklich eingedrückt haben. Dein Programm wartet nicht bis einer Taster eingedrückt is. Es fühlt immer ob es schon passiert ist. Das heißt Polling:

http://de.wikipedia.org/wiki/Polling_(Informatik)

Mit keiner Taster eingedrückt gibt PollSwitch die wert 0 zurück. Und dann geht es weiter innerhalb deine while schleife.

-guenny-
21.09.2010, 14:29
okay, nun folgendes Problem...

mein code...

if(taster == 32)
{
StatusLED(RED);
continue;
}

if(taster == 16)
{
StatusLED(RED);
continue;
}

if(taster == 8)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
continue;
}

if(taster == 4)
{
StatusLED(RED);
continue;
}

if(taster == 2)
{
StatusLED(RED);
continue;
}

if(taster == 1)
{
StatusLED(RED);
continue;
}


Warum läuft sofort der Motor?
Taste 1 und 2 lassen die LED jeweils rot leuchten, bei den anderen tastern 4-6 geht dann nichts mehr!

Valen
21.09.2010, 14:35
Gerade wo du den MotorBefehl gescrieben hat, steht nun ein Smiley. Bitte setzt dein code zwischen:

[code]deine code hier zwischen[ /code]
(nur den leerzeichen weglassen)

Valen
21.09.2010, 14:57
Wieso den Motoren gleich anfangen zu laufen verstehe ich auch nicht. Aber den Ursache könnte versteckt sein in den Code die du weggelassen hast.

Die Motoren generieren oft störungen zu dem analoge Messeinrichtung wan sie drehen. Dadurch macht Asuro oft eine falsche Konklusion uber die Tastern. Das passiert oftes mit den kleine Taster-werten, zbs. K6 und K5. Den einfachste Lösung ist 2 mal oder mehr Pollswitch auf zu rufen (weil die Störung meistens rausch ist, und nicht konstant) und den (beiden) werten zu speichern in einer variabele. Dan testen ob sie gleich an einander sein mit ein if-abfrage. Wenn das ist, hat es geklapt und geht er and die arbeit. Wenn es nicht gleich ist, muss er weiter gehen oder neu die Schleife durchgehen. Such mal in das Forum nach PollSwitch. Es gibt schon eine unzahlbare menge von Beispielen dafür.

-guenny-
21.09.2010, 15:42
Fettes Danke!!!
läuft alles super