- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Schalter auswerten funktioniert nicht

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    Anzeige

    Powerstation Test
    Das sind Zahlen im Hexadezimalsystem. Nimm den Taschenrechner aus dem MS Windows Zubehör, stelle ihn auf wissenschaftliche Ansicht. Dann tippst Du in der Auswahl HEX die Zahl FF ein, stellst dann in der Auswahl auf Dez um und erhälst 255. 0xFE00 bedeutet 65024.

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

  2. #12
    dasisch
    Gast
    joa, das weiss ich, die braucht man ja auch für farbcodes. ich weiss nur nicht, was hinter diesen zahlen steckt. also was genau spreche ich jetzt mit 0xfe00 an - weisst du, was ich meine?

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Die Taster sind jeweils über einen Widerstand mit einem gemeinsamen Pin des ATMega verbunden. Jeder Tastendruck erzeugt eine andere Widerstandskombination und damit eine andere Spannung, die an dem Pin gemessen werden kann. Der Messwert wird dann noch so umgerechnet, dass jedem Bit im Ergebnis von PollSwitch() einem bestimmten Taster entspricht. Also mal vereinfacht gesagt. Verwirrend ist dann noch, das Bit0 für den Switch6 steht...
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo dasisch,
    das Problem, ist eigendlich nicht ein 0x??-Wert, sondern eher die Funktion beschleunigen(). Ich habe die mal kopiert und KOMMENTIERT:
    Code:
    void beschleunigen (int beschl, int geschwindigkeit)
    {
      int a=90;
      for (a=90;a<geschwindigkeit;++a)
      {
    2)    MotorDir(RWD,RWD);    <-- Jetzt geht es aber weiter ...
    3)   MotorSpeed(a,a);       <-- .. mit einer neuen Geschwindigkeit!!!
       BackLED (ON, ON);
    1)   beruehrstop();         <-- Taste gedrückt, dann MotorDir(BREAK,BREAK) <-- das geht.
       Msleep(beschl);            
      }
      BackLED (OFF, OFF);
    }
    Die Reihenfolge von beruehrstop() und Msleep() ist deshalb bei dir so wichtig, weill dann NACH dem wiedereinschalten der Motoren ja sehr schnell wieder abgeschaltet wird (durch weiterhin gedrückten Taster).
    Nun kommt das Msleep() mit einer im Verhältnis zur 'ein'-Zeit der Motoren sehr langen Zeit. Somit hast du den Strom nur ganz kurz an, und lange aus, also 'glaubst' du, dass die Motoren stehen.

    Es könnte so gehen, dass die Motoren komplett gestoppt werden:
    Code:
    void beschleunigen (int beschl, int geschwindigkeit)
    {
      int a=90;
      for (a=90;a<geschwindigkeit;++a)
      {
        MotorDir(RWD,RWD);
        MotorSpeed(a,a);
        BackLED (ON, ON);
        if (beruehrstop() == TRUE)   // dann muss halt was zurueckkommen.
           break;                    // beendet hier das for{}, nicht die Funktion!
        Msleep(beschl);            
      }
      BackLED (OFF, OFF);
    }
    Ich frage mich allerdings, ob in der Funktion beruehrstop() das break; bei
    if (sw & 0x04)
    MotorDir(BREAK,BREAK);
    break;
    gewollt ist??
    Es verhindert eigendlich nur, das die Taster auf 0x08, 0x10 und 0x20 abgefragt werden, da es a) immer aufgerufen wird, und b) die Funktion verläßt.

    Du solltest aber trotzdem überlegen, ob die Lösung von Asuro-n00b mit dem:
    if (PollSwitch()>0)
    MotorDir(BREAK,BREAK);
    nicht doch sinnvoll ist. Du umgehst damt tatsächlich (fast) alle Probleme die bei den Tastern bzw. der Auswertung vorhanden sind.

    Noch ein Wort zu dem 0xFE00 aus SelfTest()
    Die Werte sind so ziemlich willkürlich gewählt und werden nur benutzt um die einzelnen Test (LineTest() SwitchTest() OdometrieTest() ...) ein bischen in die Länge zu ziehen. Sonst hast du ja nichts davon, wenn die nur 0,03 ms laufen würden
    Lieber Asuro programieren als arbeiten gehen.

  5. #15
    dasisch
    Gast
    hi,

    erstmal: das break soll natürlich nicht da rein, das war versehentlich noch beim kopieren drin. macht ja auch keinen sinn, im gegenteil...

    ich habe das mit dem motor jetzt folgendermaßen gelöst:

    Code:
    void beschleunigen (int beschl, int geschwindigkeit)
    {
      int a=90;
      for (a=90;a<geschwindigkeit;++a)
      {
        MotorDir(RWD,RWD);
    	MotorSpeed(a,a);
    	BackLED (ON, ON);
    	if (beruehrstop()>0)
    	{
    	  drehen();
    	  break;
    	}
    	Msleep(beschl);				
      }
      BackLED (OFF, OFF);
    danach stoppt der motor auch wirklich und die funktion zum drehen wird aufgerufen. vielen dank aber nochmal fürs genaue drüberschauen!

    das mit den hexadezimalcodes hab ich jetzt glaube ich verstanden. es ist also so, dass damit eigentlich nur die Zahlen anders notiert werden, sodass man statt einer ganzen zahl dann beispielsweise 0xfe00 hat.

    zu dem pollswitch > 0. das funktioniert bei mir nicht so ganz, scheinbar weil der erste schalter, wie bereits beschrieben, irgendwelche aussetzer hat und scheinbar immer mal wieder ein signal sendet. es funktioniert nur, wenn ich die schalter wie im quelltext anspreche.

    So, jetzt erstmal ab in die schule -.-

    Gruß,
    Sven

  6. #16
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    Testweise kannst du auch PollSwitch()>3 machen. dann sind zwar 2 taster abgeschaltet, aber dafür weniger fehler.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von dasisch
    das mit den hexadezimalcodes hab ich jetzt glaube ich verstanden. es ist also so, dass damit eigentlich nur die Zahlen anders notiert werden, sodass man statt einer ganzen zahl dann beispielsweise 0xfe00 hat.

    So, jetzt erstmal ab in die schule -.-
    Schule? Mann, du schreibst strukturierten Code, da denkt man nicht an Schule.
    Deshalb hier vielleicht doch noch mal eine Übersicht für die 0x??-Dinger, da es auch noch Binärzahlen, Oktalzahlen und weitere 'Notierungen' gibt:
    Code:
    Dezimal[10]  Hexadezimal[16]  Oktal[8]     Dual[2]
           0               0          0           0
           1               1          1           1
           2               2          2          10
           3               3          3          11
           4               4          4         100
           5               5          5         101
           6               6          6         110
           7               7          7         111
           8               8         10        1000
           9               9         11        1001
          10               A         12        1010
          11               B         13        1011
          12               C         14        1100
          13               D         15        1101
          14               E         16        1110
          15               F         17        1111
          16              10         20       10000
          17              11         21       10001
    
    Wie man sehen kann, benötigst du für jedes System so viele verschiedene Zeichen (0,1,2,...,9,A,B,..) wie das System nun heisst. (Dezimal, Dual, Oktal, Hexadezimal [auch nur Hex genannt])
    Also 'zählst' du in der Einer-Stelle immer nur ein Zeichen weiter, bis du alle erlaubten Zeichen 'verbraucht' hast. Dann erhöhen wir nun die 'Zehner-Stelle', bzw. nehmen sie dazu und fangen wieder in der Einer-Stelle mit 0 an.
    Bei anderen System als Dezimal, ist die Zehner-Stelle aber z.B. beim Hexadezimal-System, nun eine 16-ner-Stelle.
    
    Im Dezimalsystem 'weisst' du seit der Grundschule, dass 572 eigendlich folgendes bedeutet:
    5 * 10^2   plus
    7 * 10^1   plus
    2 * 10^0
    
    Im Hex-System tauscht du nur die 10^  gegen 16^ aus und benutzt noch A bis F als 'Zahlen'.
    Beispiel: 0xFE00 bedeutet:
    F * 16^3   plus
    E * 16^2   plus
    0 * 16^1   plus
    0 * 16^0
    
    Dabei sind A=10, B=11, C=12, D=13, E=14 und F=15 einzusetzen.
    Und um dieses 'Durcheinander' auseinanderzuhalten wurde das 0x erfunden. Heisst einfach, dass z.B. 0x123 eben 291 in dezimaler Schreibweise sein soll.
    0b wird für Dualzahlen benutzt. (b wie binary)
    0o wird für Oktal benutzt. (Bin mir hier nicht ganz sicher)
    
    So, ich hoffe, dass ich noch eine Kerze zur Erleuchtung beitragen konnte.
    Lieber Asuro programieren als arbeiten gehen.

  8. #18
    dasisch
    Gast
    hi, vielen Dank für die genaue erklärung. jetzt hab ichs auch komplett verstanden

    Gruß,
    Sven

  9. #19
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    0o123 ist richtig, oktalzahlen haben ein kleines o.

    der compiler versteht allerdings nur dezimalzahlen und 0x-hex-zahlen
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #20
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    ich muss mich korrigieren:


    dezimalzahlen:

    1234567890

    binärzahlen:

    0b01010101

    hexadezimalzahlen:

    0x90ABCDEF

    oktalzahlen:

    012345670

    oktalzahlen werden nur dadurch ausgezeichnet dass sie eine null voranhaben, KEINEN buchstaben. allerdings weiss ich nicht, wie der gnu-compiler das handhabt, schliesslich will er ja auch keine binärzahlen kennen...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen