PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit der PollSwitch-Funktion



smith
04.10.2006, 15:34
Hi,

ich kann die PollSwitch-Funktion aus irgendeinem Grund bei selbstgeschriebenen Programmen nicht nutzen. Egal wie ich das Programm schreibe, jedes mal liefert das Drücken eines Tasters keine Reaktion.
Beim Test funktionieren die Taster einwandfrei und auch das Demoprogramm mit der Tasterauswahl funktioniert ohne Probleme.

Als Beispiel habe ich mal einer der versuchten Programme hier gepostet, vielleicht erkennt ja jemand einen Fehler und kann mir helfen.


#include "asuro.h"
int main(void) {
unsigned char sw;
Init();
for (;;) {
sw = PollSwitch();
if (sw == 0x01) StatusLED(RED);
if (sw == 0x02) StatusLED(YELLOW);
if (sw == 0x04) BackLED(ON,OFF);
if (sw == 0x08) BackLED(OFF,ON);
if (sw == 0x10) FrontLED(ON);
if (sw == 0x20) BackLED(ON,ON);
}
}

MfG

backbone
04.10.2006, 15:41
Versuch mal statt dem == ein &

also nicht

if (sw == 0x01)

sondern

if (sw & 0x01)

MfG
backbone

_goto
04.10.2006, 15:45
Hat es einen besonderen grund warum du die Hexadezimale Schreibweise benutzt?

Schreib doch einfach:

sw = PollSwitch();
switch(sw) {
case 1: ....
case 2: ....
case 4: ....
case 8: ....
case 16: ....
case 32: ....
}


PS: Als Endlosschleife, sieht while(1){} schöner aus in C. :>

smith
04.10.2006, 16:00
Okay interessanterweise, zumindest für mich, macht es einen Unterschied hexadezimale Schreibweise zu benutzen oder nicht. Wenn ich die normalen Bitwerte eintrage funktioniert es auch, was mich irritiert, weil es anfangs damit nicht funktioniert hatte (war eigentlich mein erster versuch). Nun habe ich die Vermutung, dass beim Flashen etwas nicht funktioniert hatte und ich mir mit einem erneuten Versuch hätte viel Ärger ersparen können.
Mit dem '&' anstelle des '==' funktioniert das Programm ebenfalls. Nun bin ich noch nicht sehr bewandert in C Programmieren und der Operator '&' ist mir neu, daher hab ich direkt noch eine Frage, was bezweckt dieser Operator?
Auf jeden Fall danke, für die schnelle Hilfe.

backbone
04.10.2006, 16:11
Der & Operator ist für die Bitweise UND verknüpfung

& wird verwendet , wenn Du bspw. prüfen möchtest , ob ein bestimmtes Bit gesetzt ist.
Du willst zb. prüfen , ob das 3.Bit von x unabhängig von den anderen gesetzt ist : x & 4 (=00000100 in binär-schreibweise)
ergibt 4 ,wenn es gesetzt ist , sonst 0.

Also:
00000100 & 00000100 = 00000100 (Binär) = 4 (Dezimal)
01010000 & 00000100 = 00000000 (Binär) = 0 (Dezimal)

_goto
04.10.2006, 16:12
Komisch, bei mir funktioniert es auch mit dem Vergleichsoperator '=='. :|
'&' Ist ein Bitoperator und man kann damit kontrollieren ob bestimmte Bits gesetzt sind, oder eben nicht, es läuft also auf dem Binärsystem.
Weitere Infos:
8.5 Bit-Operatoren (http://www.pronix.de/pronix-676.html)

€: Ich glaub ich weiß einen Grund warum es bei dir nicht Funktioniert. Du Vergleichst unsigned char mit einem einfachem Zahlenwert. Kann sein das er es dann nach signed char umwandelt, und er somit eine andere Zahl erählt. Darf man fragen welchen Compiler du benutzt?

€²: Wirst du wohl aufhören immer kurz vor mir zu posten, backbone? [-(

smith
04.10.2006, 16:33
als compiler benutze ich die mitgelieferten programme.
Hatte als Variablentyp deswegen unsigned char genommen, weil dieser auch in den Demoprogrammen benutzt wird.
Wenn ich signed char benutze, funktioniert es nicht. Könnte man es sonst nicht auch mit int versuchen?

backbone
04.10.2006, 16:41
unsigned char hat den vorteil, dass es intern mit 8 Bit abgespeichert wird
int mit 2 oder 4 Byte = 16 Bit oder 32 Bit

@ _goto Sorry

_goto
04.10.2006, 16:42
Das du den Rückabewert in einer unsigned char Variable speicherst, ist schon richtig.
Jedoch wird sie im Vergleich wahrscheinlich in signed umgewandelt.
Versuch es mal auf folgende Arte:

if (sw == (unsigned char)0x01) StatusLED(RED);
/* ... */

smith
04.10.2006, 16:54
Mit dem if (sw == (unsigned char)0x01)... funktioniert es. Also stimmte die Vermutung von _goto.
Ist das Problem denn sonst noch bei niemanden so aufgetreten? Wundert mich ein wenig.

Nochmals danke an alle.

Asurotechnik
19.10.2006, 13:43
Ich hatte auch Probleme mit den Tastern.
Bei mir war aber das Problem, dass die bei mir in der Packung die Seitenverkehrten Kolliossions-Taster eingepackt hatten!

damaltor
11.11.2006, 23:09
hmmm... seitenverkehrt draufgelötet? =)

mach ma foto von!