Forum: Mikrocontroller und Digitale Elektronik AVR + V-USB als HID-Device mit Drehimpulsgebern


von ElGreco (Gast)


Lesenswert?

Hi,
Habe einen ATMega32(@12MHz) mit V-USB als HID-Gerät (Joystick) laufen. 
Bei der Verwendung von den Drehimpulsgebern habe ich jedoch noch 
Probleme.
Sie funktionieren einwandfrei wenn ich sie als Analogachsen definiere, 
die einen 8bit-Wert senden. Ich möchte es jetzt allerdings so haben, 
dass links- und rechtslauf jeweils als Button-Signal gemeldet wird. Das 
Problem dabei ist, dass der Zustand des gedrückten Buttons so kurz ist, 
dass es vom PC nicht erfasst wird.
Das ganze basiert auf dem Code vom RedKontroll-Projekt.

Hier der entscheidende Code:
1
encTemp= encoderIn(PINB&0b11111111, lastPINB, 0, 1);
2
    if(encTemp==1) 
3
    {
4
      //enc0--;
5
      but1=0b00000001;
6
      changed= 2;
7
      lastPINB= PINB&0b11111111;
8
    } 
9
    else if(encTemp==2) 
10
    { 
11
      //enc0++;
12
      but1=0b00000010;
13
      changed= 2;
14
      lastPINB= PINB&0b11111111;
15
    }  
16
    else
17
    {
18
      but1 = 0;
19
    }

but1 enthält die entsprechenden Buttons, entsprechend der 
links/rechts-Rotation wird entweder Button 0 oder 1 gesetzt bzw bei 
keiner Rotation alle auf 0. Die Theorie sollte passen, aber selbst mit 
Vergrößerung des Abfrageintervalls habe ich keine Änderung im Verhalten. 
Hat jemand eine Idee was ich machen könnte?
Grüße, ElGreco

von Stefan P. (Gast)


Lesenswert?

Hi,

du könntest das Rücksetzen des "Taste gedrückt" Status durch die 
USB-Funktion, nach Übermittlung an den PC, machen lassen. Dann darf die 
Enc Funktion bei einem "Taste nicht gedrückt" Status natürlich auch 
keine 0 mehr setzen, sonder einfach gar nix tun.

Gruß
Stefan

von Guido Körber (Gast)


Lesenswert?

Um solche virtuellen Tastendrücke sicher zu übertragen muss man darauf 
achten, dass der Report mit der gesetzten Taste definitiv raus geht und 
danach noch einen mit nicht gesetzter Taste schicken.

von ElGreco (Gast)


Lesenswert?

danke für Antworten, erst auf 0 setzen wenn der Report sicher gesendet 
ist hat mir weitergeholfen.

Ich versuche nun einen weiteren Drehimpulsgeber als Analogachse mit 
erweitertem Bereich auszugeben, d.h. anstelle von 8bit (was bisher 
einwandfrei funktioniert), möchste ich Werte von 0-359 übertragen, wofür 
ich 9bit benötige.
Allerdings hat das bisher noch nicht so ganz geklappt. Die 
Windows-Joystick-Kalibrierung zeigt nachwievor nie was höheres als 255 
an (der Wert springt aber merkwürdig herum). Ich vermute das Problem am 
USB Device Descriptor.
REPORT_SIZE ist 9, LOGICAL_MINIMUM 0 und LOGICAL_MAXIMUM 359. Sind diese 
Daten vielleicht nicht ausreichend?
Danke im Vorraus, lg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.