- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 13

Thema: Ausuro Tasterproblem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Wenn man unvorsichtig die Formeln verändert, kann dies zu Überläufen und damit zu komischen Berechnungsergebnissen führen. Probier Mal folgende Formel:
    Code:
    return ((uint8_t) ((1024UL * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
    wobei SWITCH_FACTOR wieder die Zahl um die 63 ist. Du wirst vermutlich eher größere Werte brauchen, probier Mal 63..67 oder so aus, die Formel verkraftet das ohne Überläufe.
    Wenn du am Ende doch auf einen SWITCH_FACTOR von 63 oder weniger kommst, reicht dir auch eine leicht modifizierte Form, die weniger Rechenintensiv ist, weil sie mit einem uint16 statt uint32 arbeitet (man beachte die 1024U statt 1024UL):
    Code:
    return ((uint8_t) ((1024U * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
    Zusammengefasst und mit etwas Präprozessor-Magie musst du dir darum noch nicht Mal Gedanken machen:
    Code:
    #if SWITCH_FACTOR * 1024 + 512 > UINT16_MAX
        return ((uint8_t) ((1024UL * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
    #else
        return ((uint8_t) ((1024U * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
    #endif
    (Alles aus der Tiny ASURO Library)

    mfG
    Markus

    PS: Was bei mir "value" ist, ist bei dir "i"

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2010
    Beiträge
    6
    Danke für die schnelle Antwort!

    Hat leider noch nicht zum gewünschten Ergebnis geführt.
    Code:
    unsigned char t1, t2;
    while(1){
            t1 = PollSwitch();
            t2 = PollSwitch();
            if(t1 == t2){              /* irgendeine Taste gedrueckt */            
                PrintInt(t1);     /* Tastenwert senden */
                SerWrite("\r\n", 2); /* Zeilenvorschub */
                mSleep(500);         /* halbe Sekunde warten */
                }
            }
    Das ist die Funktion mit der ich die Taster teste. Den neuen return Wert habe ich wie folgt eingesetzt:
    Code:
    return ((uint8_t) ((1024UL * 63 + i / 2) / i)) - (uint8_t) 63;
    Den Wert von 63 habe ich dann verändert. Für alles <=63 sieht die Ausgabe so aus:
    Code:
    Tastsensor Test
    190\0x9f\0x01 || 190\0x9f\0x01 || ...
    Wo jetzt ein "||" steht geht es eigentlich im 0.5s Takt ohne Freizeichen/Zeilenumbruch weiter. Ich hab keine Ahnung woran das liegen könnte.
    Sobald ich einen Taster betätige hört die Ausgabe via IR sofort auf, lasse ich ihn los geht es wieder mit 190\0x9f\0x01 weiter.
    Wenn ich Werte einsetze die größer sind als 63 wird außer "Tastsensor Test" garnichts mehr ausgegeben.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Mich irritiert am meisten, dass die Zeichenkette mit dem Zeilenumbruch nicht korrekt ausgegeben wird. Da sind noch ganz andere Dinge kaputt bei dir, evtl. die Initialisierung? Der Code ist auch nicht vollständig, sonst könnte ich ihn Mal bei mir laufen lassen (mein ASURO steht schon lange einsam im Schrank ...)
    Zur Fehlersuche bei der Tasterauswertung solltest du dir Mal die Rohdaten vom ADC und das Berechnungsergebnis der Formel ausgeben lassen, möglichst kontinuierlich, das 500ms-Raster ist da schon kein schlechter Ansatz.

    Ich hänge Mal noch eine Testanwendung von mir an, die sollte alle 500ms die einzelnen Tasterzustände in Binärschreibweise (also 0b00100000) ausgeben. Verwendet wird dabei meine Formel mit dem Wert 63.

    mfG
    Markus

    EDIT: Siehe Anhang zwei Posts weiter, da sind alle Werte zwischen 60 und 70 abgedeckt.
    Geändert von markusj (14.12.2011 um 12:15 Uhr) Grund: Anhang zwei Posts weiter
    Tiny ASURO Library: Thread und sf.net Seite

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2010
    Beiträge
    6
    So, ich hab es jetzt mal ausprobiert: die Ergebnisse stimmen mit meinen ersten Ergebnissen überein. Alle ausgabewerte sind um eins zu klein.
    0: 0b00000000
    1: 0b00011111
    2: 0b00001111
    3: 0b00000111
    4: 0b00000011
    5: 0b00000001
    6: 0b00000000

    Auch so lässt sich also nicht unterscheiden ob der 6. oder kein Taster gedrückt ist.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Wenn ich mir die Formel ansehe, ist das Ergebnis zu klein, nach der Formel (1024 * x + i / 2) / i würde das Ergebnis größer mit größerem x. Eigentlich sollte 64 oder 65 bei dir funktionieren. Ich hänge dir Mal in einem Archiv das Programm für x zwischen 60 und 70 an (hoffentlich habe ich mich bei der Nummerierung nicht vertan ...), alternativ kannst du das Kalibrierungs-Tool, das irgendwo im asurowiki bzw. hier im Forum herumgeistert, ausprobieren.

    mfG
    Markus
    Angehängte Dateien Angehängte Dateien
    Tiny ASURO Library: Thread und sf.net Seite

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2010
    Beiträge
    6
    Das sind jetzt meine Bitmuster:

    Code:
          70        69        68        67        66
    k0    000000    000000    000000    000000    000000
    k1    100010    100010    100001    100001    100000
    k2    010001    010001    010000    010000    010000
    k3    001000    001000    001000    000111    000111
    k4    000100    000100    000011    000011    000011
    k5    000001    000001    000001    000001    000001
    k6    000000    000000    000000    000000    000000
    
          65        64    
    k0    000000    000000
    k1    100000    011111
    k2    010000    001111
    k3    000111    000111
    k4    000011    000011
    k5    000001    000001
    k6    000000    000000
    Unter 64 wird alles nur noch kleiner.... nur über den Wert lässt sich das Problem also anscheinend nicht lösen...

    Ich hab das Problem jetzt übergangsweise gelößt, ist aber alles andere als ne schöne Lösung. Zumindest kann ich jetzt erstmal an anderen Stellen weiterarbeiten.
    Code:
    int val = (unsigned char)i;
      
      if(254<=val && val<=255)        {return 0;}
      
      if(173<=val && val<=175)        {return 32;}    //K1
      if(57<=val && val<=59)        {return 16;}    //K2
      if(152<=val && val<=154)        {return 8;}        //K3
      if(205<=val && val<=207)        {return 4;}        //K4
      if(236<=val && val<=238)        {return 2;}        //K5
      if(251<=val && val<=253)        {return 1;}        //K6

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Hast du evtl. einen Fehler beim Aufbauen gemacht? Ich denke da vertauschten Widerstände. Dass vom letzten Taster nie etwas zu sehen ist, kann so eigentlich nicht sein. Wenn da untereinander etwas vertauscht wäre, könnte das evtl. auch eine Ursache für die Abweichungen bei den anderen sein, wenn der Vergleichswiderstand betroffen ist.

    mfG
    Markus

    Edit: Deine Übergangslösung scheitert, wenn mehr als ein Taster gedrückt wird.
    Tiny ASURO Library: Thread und sf.net Seite

Ähnliche Themen

  1. Tasterproblem!
    Von maxfrie im Forum Asuro
    Antworten: 7
    Letzter Beitrag: 03.04.2010, 13:29
  2. Ausuro sucht solange bis er den Durchgang findet...
    Von Thund3r im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 10.01.2009, 13:08
  3. Tasterproblem
    Von gandalfsz im Forum Asuro
    Antworten: 14
    Letzter Beitrag: 11.04.2007, 19:27
  4. Neu in der Roboterwelt---> Ausuro
    Von A.v. Taube im Forum Asuro
    Antworten: 7
    Letzter Beitrag: 03.07.2006, 19:13

Berechtigungen

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

Labornetzteil AliExpress