- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Asuro PollSwitch() für Anfänger

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    E-Bike
    Hallo

    je nach Schalter, die verschieden viele Bits ausgeben
    Wenn die PollSwitch()-Funktion richtig kallibriert ist entspricht jeder Taster genau einem Bit im Wert, bzw. mehrere Taster gleichzeitig werden durch die entsprechenden Bits dargestellt. (Taster K6 ist dabei das Bit0)

    und bin auch dankbar, dass man so geduldig mir gegenüber ist.
    Immer gerne wenn ich merke, dass auch Eigeninitiative vorhanden ist. Weiterhin viel Spass mit deinem asuro.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    bewundernswert... wirklich. viele neue user fragen einfach irgendwas schreiben drei zeilen hin und kümmern sich nicht.
    du nutzt die suchfunktion, bemühst dch selbst, kennst die deutsche rechtschreibung und interpunktion und hast sogar den code-button schnell gefunden =)


    am ersten programm hat hauptäschlich eine while-schleife gefehlt, die das programm wiederholt... aber solche kleinigkeiten sind die, die sich am schwersten finden lassen
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2008
    Beiträge
    12

    neuer ASURO Freund braucht Hilfe!

    Hallo Leute,

    ich bin nun auch einer von vielen ASURO- Besitzern und wie viele andere auch dachte ich nicht das C/C++ für Anfänger solche Probleme macht.

    Zum Thema, ich hatte die gleiche Idee wie "Doubleyou" und möchte erst einmal die einzelen Sensoren genauer kennen lernen und verstehen.
    Mit Hilfe des Forum und der Anleitung bin ich bisher zu follgenden Ergebnis gekommen:
    Code:
    #include "asuro.h"
    
    unsigned char taste;
    
    int main(void)
    {
    
    Init();
    
    while(1){
    
    taste = PollSwitch();
    
    if ((taste>0) && (PollSwitch()>0) & 0x01) {StatusLED (GREEN);}
    else if ((taste>0) && (PollSwitch()>0) & 0x02) {StatusLED (RED);}
    else if ((taste>0) && (PollSwitch()>0) & 0x04) {FrontLED (ON);}
    else if ((taste>0) && (PollSwitch()>0) & 0x08) {BackLED (OFF,ON);}
    else if ((taste>0) && (PollSwitch()>0) & 0x16) {BackLED (ON,OFF);}
    else if ((taste>0) && (PollSwitch()>0) & 0x32) {BackLED (ON,ON);}
    else {StatusLED(OFF);BackLED(OFF,OFF);FrontLED(OFF);}
    		  }
    while(1);
    return 0;
    }
    Zur Erklärung:
    Als erstes habe ich mir eine Variable"taste" angelegt.
    Die Variable erhält innerhalb der Schleife den Wert des Pollswitch.
    Falls nun ein PollSwitch gedrückt wird und er den Byte 1 entspricht und dieses zusammen gleich der "taste" ist, dann soll die StatusLED grün leuchten.
    anderenfalls, falls nun ein Pollswitch gedrückt wird und er den Byte2 entspricht und dieser gleich der "taste" ist, dann soll die StatusLED rot leuchten.
    .
    .
    .
    wenn nichts gedrückt wird sollen alle LED´s aus sein.
    ---------------------------------------------------------------------------------
    Mein Problem ist nun, dass die grüne Status LED auf jeden Taster anspringt und nicht wie eigentlich gewollt nur an K6.
    Könnt ihr mir bitte zu einen Erfolgserlebniss verhelfen?


    EDIT//
    Hhmm, ist es richtig das meine Variable nie den Wert2,4,8,16,32 erhält und da das Problem liegt???
    EDIT2//
    Nein, das ist falsch, oder? Ich frage ja nur ab ob "taste" & "PollSwitch" größer 0 ist. Liegt der Fehler in der Byte abfrage?
    Gruß zoerby

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    hallo

    ich weiß zwar nicht ob es hilft, aber ich würde dein programm etwas anders schreiben:

    Code:
    #include "asuro.h"
    
    unsigned char taste;
     
    int main(void)
    {
    
    Init();
    
    while(1){
    
    do
    {
            taste = PollSwitch();
    }while( taste != PollSwitch() )   // somit braucht man später nicht immer kontrollieren
    
    switch(taste)                       // hier wird taste auf bestimmte werte geprüft
    {
         case 1:
                StatusLED (GREEN);
                break;
         case 2:
                StatusLED (RED);
                break;
         case 4:
                FrontLED (ON);
                break;
         case 8:
                BackLED (OFF,ON);
                break;
         case 16:
                BackLED (ON,OFF);
                break;
         case 32:
                BackLED (ON,ON);
                break;
         default:
                StatusLED(OFF);
                BackLED(OFF,OFF);
                FrontLED(OFF);
                break;
            }
    }
    while(1);
    return 0;
    }
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2008
    Beiträge
    12
    Ein kleiner Fehler war drin, sonst funktioniert es wunderbar. Genau so wie ich es wollte.

    Aber eigentlich würde ich gern mit meinem Programm weiter kommen wollen, sonst habe ich am Ende nichts verstanden.

    Gruß zoerby

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    mir ist gerade aufgefallen, dass bei deiner tasterabfrage ein kleiner (denk)fehler ist:

    du hast 0x16 geschrieben, wobei dies aber 10110 als binärzahl ergibt.
    richtiger wiese müsste es aber 10000, bzw. 16 als dezimalzahl sein

    0x zeigt dem compiler an, dass die darauffolgende zahl in hexadezimaler schreibweise vorliegt
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2008
    Beiträge
    12
    Eine Frage noch, du benutzt follgende Schleife.
    Code:
    do {taste = PollSwitch();}
    while( taste != PollSwitch() );
    Hier wird geprüft ob "taste"=="PollSwitch" ist, ist das nicht der Fall so wird die Schleife durchlaufen.

    Das bedeutet doch das eigentlich "taste"="PollSwitch" reichen müßte wenn ich diese Deklaration außerhalb der main()-Funktion setze, oder?

    Was meinst du mit "somit braucht man später nicht immer kontrollieren"?
    Nur um Code einzusparen?

    bei dem "switch",
    Code:
    switch(taste) {case 1:}
    kann ich dieses case (was immer es bedeutet) auch durch "int", "char"... ersetzen??

    Gruß zoerby

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2008
    Beiträge
    12
    d.H. ich muss dort Binäre Zahlen eintragen?

    Code:
    if ((taste>0) && (PollSwitch()>0) & 0x000001) {StatusLED (GREEN);}
    else if ((taste>0) && (PollSwitch()>0) & 0x000010) {StatusLED (RED);}
    else if ((taste>0) && (PollSwitch()>0) & 0x000100) {FrontLED (ON);}
    else if ((taste>0) && (PollSwitch()>0) & 0x001000) {BackLED (OFF,ON);}
    else if ((taste>0) && (PollSwitch()>0) & 0x010000) {BackLED (ON,OFF);}
    else if ((taste>0) && (PollSwitch()>0) & 0x100000) {BackLED (ON,ON);}
    else {StatusLED(OFF);BackLED(OFF,OFF);FrontLED(OFF);}
    hhmm leuchtet leider immer noch nur die grüne Status Leuchte (K1-K6).

    EDIT//:

    Ich habe es glaube ich. Mein Problem sind nur noch die Zahlen (0x01....).
    Es funktioniert bei 0x01, 0x02, 0x04, 0x08 bei 0x16 und 0X32 nicht.

    Kann mir jemand das erklären wie das mit den Zahlen da funktioniert?

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    diese schleife:

    1.
    Code:
    do {taste = PollSwitch();}
    while( taste != PollSwitch() );
    habe ich eingebaut, da PollSwitch() manchmal falsche werte liefert, jedoch nicht zwei mal hintereinander. wenn also der wert 2 mal gleich ist, kann man davon ausgehen, dass er richtig ist

    2.
    switch-case kann man verwenden, wenn man eine variable auf verschiedene werte überprüfen will (müsste eigentlich in der anleitung auch beschrieben sein, aber trotzdem eine kurze erklärung)

    der aufbau ist folgendermaßen:

    Code:
    switch( zu_prüfende_variable )
    {
          case wert_1:
                       //... befehle, die ausgeführt werden sollen, wenn zu_prüfende_variable == wert_1
                       break;        //um switch zu verlassen, wenn man es auslässt werden die nächsten befehle ebenfalls ausgeführt, auch wenn wert_1 != zu_prüfende_variable
          case wert_2:
                       //...
          ....
    
          default:
                       //...  befehle, für den fall, dass sonst nichts zu trifft, muss nicht unbedingt vorhanden sein
    }
    3.
    bei deiner abfrage:

    if ((taste>0) && (PollSwitch()>0) & 0x000001) {StatusLED (GREEN);}

    musst du wissen, dass sich der µC bei vergleichen (<,>,==,!=,...) immer nur das ergebnis, also TRUE und FALSE oder 1 und 0 merkt.

    schauen wir nun was da bei deiner abfrage heraus kommt wenn ein taster gedrückt werd:
    taste>0 ==> TRUE
    PollSwitch()>0 ==> TRUE

    (taste>0) && (PollSwitch()>0) entspricht also TRUE && TRUE ==> TRUE

    TRUE & 0x000001 ist das selbe wie 1 & 1 ==> 1, also TRUE

    das heißt, wenn du irgend einen taster drückst ist sofort das erste if() richtig. daher leuchtet die statusLED grün, und die ganzen else if werden übersprungen


    wenn du es also mit if und else schaffen möchtest, musst du am besten so abfragen:

    Code:
    if(taste == 1){ //....}
    else if(taste == 2){//....}
    ...

    PS: ich habe auch erst nach einiger zeit gemerkt, was eigentlich in deinen if vor sich geht
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    19.05.2008
    Beiträge
    12
    Wau Super! Vielen Dank für die Super Unterstützung!

    Ich bin durch follgende Maßnahme zu einen Teilerfolg gekommen:

    if ((taste>0) && (PollSwitch()>0) & 0x01) {StatusLED (GREEN);}

    "(tast>0)" "(PollSwitch()>0)"
    Das >0 ist ja eigentlich Schwachsinn wenn ich die "&&" durch "==" ersetze.
    Nun habe ich einfach die gedrückte Taste nochmals mit den ausgegebenen Wert (Byte) verglichen:
    ...&& taste == 0x01) {StatusLED (GREEN);}

    Das schaut dann so aus:
    Code:
    if (taste == PollSwitch() && taste == 0x01) {StatusLED (GREEN);}
    else if (taste == PollSwitch() && taste == 0x02) {StatusLED (RED);}
    else if (taste == PollSwitch() && taste == 0x04) {FrontLED (ON);}
    else if (taste == PollSwitch() && taste == 0x08) {BackLED (OFF,ON);}
    Bis hierhin funktioniert es nun einwandfrei.
    Die letzten beiden Taster funktionieren ab leider nicht.
    An den else if Anweisungen kann es also eigentlich nicht liegen, oder?
    Vielmehr dann doch eher an den Zahlen gewurchtel wo ich noch nicht durch sehe, oder?

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test