- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Was ist da bitte schön Falsch ???????

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    30
    Beiträge
    70

    Re

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Danke johns für die tolle aussagekräftige erklärung
    Trotzdem hätte ich noch ein paar Fragen .

    Wenn mit PollSwitch nur tASTER K6 abgefragt wird müsste der Befehl

    unsigned char

    Ja dann auf irgendeine Weise alle taster abfragen



    Im handbuch steht :

    unsigned char taste;
    .
    .
    taste = PollSwitch();
    if (taste>0) {MotorSpeed(0,0);}
    Wieso schreiebn die da auf einmal taste (POLLswitch) >0 und nicht ==1

    Mfg FREDWEISE

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.08.2005
    Beiträge
    178
    leider war mein post doch nicht so aussagekräftig... ich versuche es noch einmal

    Pollswitch liefert eine variable vom typ unsigned char zurück.
    char bedeutet dass es sich um eine variable welche 256 verschiedene werte aufnehmen kann handelt (8 bit -> 2 hoch 8 möglichkeiten)
    unsigned bedeutet dass es sich um werte ohne vorzeichen handelt, also von 0 aufwärts.
    unsigned char hat also einen wertebereich von 0 bis 255.
    da PollSwitch ein unsigned char liefert und das ergebnis von PollSwitch im obigen code in einer variable gespeichert werden soll, benötigt man eine variable von diesem typ. eine solche deklariert man eben zb so:
    unsigned char t1;

    und PollSwitch fragt natürlich alle taster ab, das funktioniert so:
    da unsigned char eine 8bit variable ist geht diese (binärdarstellung) von
    00000000 bis 11111111
    wobei die wertigkeit der einzelnen stellen 2 hoch _wievielte_stelle_(von rechts_gezählt_bei_1_beginnend)_ beträgt.
    beispiel: 00010011 wäre in dezimal:
    2 hoch 5 plus 2 hoch 1 plus 2 hoch 0 =
    = 32 + 2 + 1 = 35

    bei PollSwitch wird jetzt den einzelnen stellen der binärrepresentation ein taster zugeordent. also im konkreten fall zb der stelle 1 der taster K6.
    das bedeutet dass wenn K6 gedrückt ist, die erste stelle (ganz rechts) eine 1 ist. falls nur K6 und kein anderer taster gedrückt ist, dann sieht der rückgabewert von Pollswitch binär so aus: 00000001 was dezimal einer 1 entspricht. wenn aber zusätzlich zu taster K6 ein weiterer taster gleichzeitig gedrückt ist, dann könnte das so aussehen: 00010001 was dezimal 33 ist.
    da sobald mindestens ein taster gefrückt is, im rückgabewert von PollSwitch auch für jeden taster an der zugehörigen stelle der binärdarstellung eine 1 ist, ist der rückgabewert dann immer grösser 0, und umgekehrt ist der rückgabewert genau dann 0, wenn kein einziger taster gedrückt ist (alle 8 bit des unsigned char wertes sind 0).
    daher kann man mittels vergleichsrelation (grösser; >) feststellen ob mindestens irgendein taster gedrückt ist!

    war das verständlich genug?

    lg
    "A robot with guns for arms shooting a plane made out of guns that fires guns" - Nelson Muntz

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    30
    Beiträge
    70

    RE

    Vielen Vielen Vielen Dank
    Das war sehr ausführlich

    Also müsste das Prog doch dann so aus sehen

    Code:
    #include "asuro.h"
    void Msleep(int dauer) 
    { 
       int z; 
       for(z=0;z<dauer;z++) Sleep(72); 
    } 
    int main(void) 
    { 
    unsigned char t1; 
    unsigned char t2; 
    unsigned char t3; 
    unsigned char t4; 
    unsigned char t5; 
    unsigned char t6; 
    
    Init (); 
    while(1) 
    { 
    
    if (PollSwitch()>0)
    { 
    StatusLED(RED);
    MotorSpeed(0,0);
    } 
    else 
    { 
    MotorDir(FWD,FWD); 
    MotorSpeed(200,200); 
    StatusLED(GREEN); 
    Msleep(350); 
    } 
    } 
    return 0;
    Und das funktioniert auch Danke Danke Danke

    MFG FredWeise

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Hi,
    unsigned char t1; ...... usw. musst du nur schreiben wenn du t1 usw. auch zuordnest. Z.B. t1 = Pollswitch();
    wenn du nur Pollswitch() verwendest musst du nichts deklarieren.

    Zu Pollswitch();:
    Alle Taster sind an einem ADC mit verschiedenen widerständen angeschlossen. Pollswitch liest diesen ADC aus. Je nach gedrücktem Taster bekommst du einen anderen Wert. Taster 1=1, Taster 2 = 2, Taster 3 = 4, Taster 4 = 8, Taster 5 = 16, Taster 6 = 32.
    Wenn du sagst if (Pollswitch() == 1) dann heist das, dass er nur etwas ausführt wenn Taster 1 gedrückt wurde, wenn ein anderer gedrückt wurde interessiert das den controller nicht, den diese liefern nicht 1, sondern was anderes.

    Zu deinem Code:
    Wenn du einen Taster drückst wird er stehen bleiben, aber nur wenn er gedrückt ist, sobald du ihn auslässt fährt er vorwärts. Das Msleep(350) brauchst du nicht.

    mfg

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    32
    Beiträge
    239
    hallo

    also es bringt nichts wenn du die variablen t1-t6 definierts (dh. speicherplatz zur verfügung stellst und nichts damit anfangst

    wenn du etwas in einer variable speichern willst musst du eine zuweisung machen zb. t1=PollSwitch();
    danach kannst du sie weiter verwenden und ihren wert abfragen if(t1>0), um zu überprüfen ob irgend ein taster gedrückt ist

    und noch eine kleinigkeit zur tasterabfrage: es muss nicht immer der 1. wert falsch sein, aber die wahrscheinlichkeit, dass 2mal hinter einander der selbe falsche wert kommt, wird häufing die doppelte abfrage verwendet. wenn man auf nummer sicher gehen will kann man auch noch öfter die ergebnisse vergleichen, aber das ist meistens nicht notwendig

    nun aber wieder zu deinem programm:
    hier mein vorschlag mit komentaren, wie ich es machen würde
    Code:
    #include "asuro.h"                  //include
    void Msleep(int dauer)             //funktion zum eingeben einer wartezeit in ms
    {
       int z;
       for(z=0;z<dauer;z++) Sleep(72);
    } 
    
    
    int main(void)
    {
        unsigned char t1;      //variablen zum abspeichern der tasterwerte
        unsigned char t2;
    
        Init ();                    //initialisierung
        while(1)                  //endlosschleife
        {
            t1=PollSwitch();   //tasterwerte in die variablen speichern
            t2=PollSwitch();
            if (t1==t2 && t1==0)   //erst prüfen, ob beide werte gleich sind, dann ob KEIN taster drückt ist
            {                                          //falls kein taster gedrückt ist: vorwährts fahren
                MotorDir(FWD,FWD);
                MotorSpeed(200,200);
                StatusLED(GREEN);
                Msleep(350);                    //350ms bis zur nächsten auswertung warten (könnte auch weg gelassen werden)
            }
            else if(t1==t2 && t1!=0)       //wenn beide taster den geichen wert haben und ein taster gedrückt ist
            {                                        //stehen bleiben
                StatusLED(RED);
                MotorSpeed(0,0);
            }
            else                           //wenn nichts zutrifft, dh. t1 und t2 nicht den selben wert haben
            {}                             //soll nichts gemacht werden, so dass er sofort wieder zur tasterabfrage kommt
                
        }
        return 0;
    }
    so müsste es eigentlich funktionieren, ich habe es aber nicht getestet

    ich hoffe es ist jetzt alles klar mit den variablen und der tasterabfrage
    mfg hai1991

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

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    30
    Beiträge
    70
    Ja ich habe alles verstanden Danke

    MFG FredWeise

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    14.02.2009
    Beiträge
    6
    ich kenn mich damit nich so gut aus weil ich zwölf bin aberversuchs ma damit
    Code:
    #include "asuro.h" 
    
    void Msleep(int dauer) 
    { 
       int z; 
       for(z=0;z<dauer;z++) Sleep(72); 
    } 
      
    int main(void) 
    { 
       Init(); 
          
        
       while(1){ 
       if (PollSwitch()==1){ 
             StatusLED(RED); 
             MotorSpeed(4,0); 
           Msleep(350); 
           
           } 
       else{ 
             MotorDir(FWD,FWD); 
            MotorSpeed(200,200); 
            StatusLED(GREEN);} 
            
           } 
       return 0; 
    }

  8. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Wo hast du das denn geklaut?

    if (PollSwitch()==1){

    Nur wenn K6 gedrückt?

    MotorSpeed(4,0);

    Erfahrungswerte? Welche MotorDir() wollen wir denn hier?

    Diesen Beitrag hättest du dir sparen können. Auch Zwölfjährige sollten vor dem Posten denken!
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    24.04.2008
    Beiträge
    10
    Sei bite nicht so streng zu uns loops^^^, aller anfang ist schwer!!!!


    MgG
    bin 13

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress