Forum: Mikrocontroller und Digitale Elektronik 3 Tasten als HID am USB-Port für Windows-PC


von Stefan B. (adam6de)


Lesenswert?

Hallo an alle.

Ersmal ein großes Lob!
Super Forum hab ihr hier!

Ich lese auch schon einige Zeit bei euch mit, habe mich jetzt 
entschlossen mal aktiv tätig zu werden.

Zu meinem Vorhaben:
Ich möchte mit geringstem Kostenaufwand eine Minitastatur mit nur drei 
Tasten basteln. Die Tastatur soll über USB am PC betrieben werden 
(Windows/Linux).
Funktionen der Tasten sollen >>arrow_up<< >>arrow_down<< und >>enter<< 
sein.
Die Tastatur soll ohne zusätzlichem Treiber am PC funktionieren.

Meine Hardware:
Atmel Evaluations-Board V2.0.1 von Pollin
Atmel Addon-Board von Pollin
USB-JTAG Programmer
Atmega 16-16PU
Atmega 8-16PU

Meine Software:
AVR Studio

Ich habe auch schon ein paar gehversuche mit dem JTAG-Programmer und dem 
Atmega16 gesammelt.

Da ich mich aber etwas an dieses Projekt

http://www.obdev.at/products/vusb/hidkeys.html

von V-USB halten möchte, habe ich mir einen Atmega8 zugeleget und kann 
jetzt nicht mehr mit meinem JTAG-Programmer arbeiten.

Meine Probleme:
Wie bekomme ich das Programm von V-USB über ISP auf meinen Atmega8?
Was muß ich am Programm verändern damit ich die o.g. Tasten an 
bestimmten Pins habe?

Wenn sich jemand evtl. die Mühe macht und mir eine Schritt für Schritt 
Anleitung macht wäre super super super!!!

MFG
Stefan

von Frank K. (fchk)


Lesenswert?

Du könntest auch einen Mega 32U4 und den LUFA USB-Stack nehmen.

Der 32U4 hat einen richtigen, normgerechten Full-Speed USB-Port und JTAG 
eingebaut.

Zu LUFA guckst Du hier:
http://www.fourwalledcubicle.com/LUFA.php

fchk

von Lehrmann M. (ubimbo)


Lesenswert?

Google mal nach vusb

von Stefan B. (adam6de)


Lesenswert?

Danke für den Tipp!

Ich bin für jeden Vorschlag dankbar aber das ist nicht das Richtige für 
mich.
Der µC ist SMD und da ich kein SMD löten kann müsste ich mir ein 
fertiges Board kaufen und das ist in meinem Budget einfach nicht drin.
Selbst der Einzelpreis ist das Doppelte vom Atmega8.

Trozdem Danke!

Gruß
Stefan

von Stefan B. (adam6de)


Lesenswert?

@ ubimbo.

Hallo Michael.
Danke für den Tipp.
Wenn du mein #1 Post nochmal anschaust wirst du sehen das der Link auf 
die Seite von V-USB führt.
Ein bisschen hab ich schon recherchiert bevor ich hier Fragen stelle.

Trozdem Danke!

Gruß
Stefan

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

auch wenn ich gleich gesteinigt werde...
Für einfach USB bei µC mit DIP hast du mit AVR aufs falsche Pferd 
gesetzt.

Hast du die Möglichkeit leihweise an einen Programmer für PICs (z.B. 
PicKit3)zu kommen? (Alternativ halt Selbstkauf für ab 20Eur. mit 
Versand)
IDE und Compiler sind kostenlos zum Download.

Dann Pic 18F13K50 im 20Poligen DIP Gehäuse verwenden, kostet so 
1,50-2,00 Euro und ist fast überall zu bekommen. Das was du möchtest 
(3Tasten HID) gibt es bereits als Beispielapplikation direkt von 
Microchip zum Download, Standartbeschaltung dran und die 
Beispielapplikation übernehmen. Einzige Änderung die du machen musst ist 
die Kennung der Tasten im Programm anzupassen damit halt die Pfeiltasten 
übertragen werden...

Den ganzen USB Kram rein über Software im AVR ohne HardwareUSB 
nachzubilden habe ich aufgegeben, viel zu Fehleranfällig und unflexibel.
Die AVRs mit USB gibt es aber leider nicht in DIP, vond er schlechten 
Verfügbarkeit mal ganz abgesehen.

Falls du dir einen PIC Prommer leihen kannst dürfte der Einsatz eines 
PICs sowohl der günstigste -wie auch der schnellste Weg sein dein 
Projekt stabil zum laufen zu bekommen.

Gruß
Carsten

von Andreas S. (drohgebaerde)


Lesenswert?

Mit V-USB lassen sich einige schöne HID-Sachen machen. Dein Vorhaben 
lässt sich damit simpel umsetzen, auf andere Hardware umzusatteln halte 
ich in diesem Falle nicht für notwendig. Am einfachsten fährst du, indem 
du eines der Beispielprogramme (z.B. HID-Keys) entsprechend deinen 
Vorstellungen modifizierst. In puncto Stabilität habe ich mit V-USB noch 
keine Probleme gehabt. Meine Projektchen gehen zwar auch nicht über 
kleine Byteschickereien hinaus, aber hier ist ja nichts gefordert, was 
im mindesten darüber hinaus ginge.

EDIT:
Man bin ich ein Depp, ich hab' deinen Post abgeschrieben ;-P Deine Frage 
richtet sich ja sogar genau nach HID-Keys...
Du musst lediglich das keyReport anpassen, der Code dürfte da 
selbsterklärend sein...

von Stefan B. (adam6de)


Lesenswert?

Ich bin jetzt ein kleines Stückchen weiter gekommen.
Ich habe jetzt mit PonyProg2000 die schon vorhandene HEX Datei vom 
HID-Keys Projekt auf meinen Atmega8 bekommen.
Wenn ich das richtig verstanden habe müsste ich den Code für mein 
Vorhaben aber erst anpassen.
Richtig?

@drohgebaerde

So selbserklärend ist der Code für mich Anfänger leider noch nicht ganz, 
auch wenn des Ganze bestimmt gut dokumentiert ist.
Ich finde noch nicht mal den von dir angesprochenen keyReport.
Wo soll der sein?
Ich finde nur eine main.C und eine usbconfig.h im Hauptverzeichniss.
Sorry könntest du mir da evtl. weiterhelfen?


@dg3ycs
Danke für den Tipp!
Im Moment will ich erst mal sehen wie der Atmega läuft(wenn er mal 
läuft).
Falls ich mit dem Atmega8 überhaupt nichtweiterkomme werde ich deinen 
Rat in erwägung ziehen.

Gruß
Stefan

von Stefan B. (adam6de)


Lesenswert?

Brauch ich unbedingt ein 12Mhz Quarz oder oder geht das auch mit 
internen Oscillator bzw. 16Mhz Quarz ?(da schon vorhanden)

Gruß
Stefan

von Walter S. (avatar)


Lesenswert?

nimm einen Teensy, habe ich mir für 14,95 incl. USB-Stickgehäuse 
gekauft,
billiger (und vor allem einfacher) kriegst du das auch nicht hin,
Programmer brauchst du auch nicht, da ist ein USB Bootloader drin

von Guido Körber (Gast)


Lesenswert?

KeyWarrior24-8 wäre eine fertige Lösung in DIL24:
http://www.codemercs.com/index.php?id=38&L=0

von Chris R. (hownottobeseen)


Lesenswert?

Stefan Brütting schrieb:
> Brauch ich unbedingt ein 12Mhz Quarz oder oder geht das auch mit
> internen Oscillator bzw. 16Mhz Quarz ?(da schon vorhanden)

Es geht auch mit einem 16MHz-Quarz. Du musst nur daran denken, nicht nur 
F_CPU, sondern auch USB_CFG_CLOCK_KHZ zu ändern, falls diese nicht 
automatisch (F_CPU/1000) berechnet wird.

von Dings (Gast)


Lesenswert?

Man kann auch eine USB Tastertur schlachten und die controllerpolatine 
von der Tastenfolie abtrennen die passenden Tasten durchmessen mit dem 
Ohmmeter und die Drei Tasten dan richtig an die Controllerplatine 
anlöten.

Die controller sind Oft auch im Großem Gehäuse.

von Andreas S. (drohgebaerde)


Lesenswert?

@Walter
Klar geht's billiger. Mit einem Atmega8 und V-USB ;-)

Für dieses Projekt muss definitiv kein neuer Controller gekauft 
werden... Es hat's auch nicht so locker mit dem Geld, für Spielereien 
gleich irgendwas zu kaufen, alles andere lässt sich mit Probierdrang 
erklären. Zumal es hier, wie gesagt, tatsächlich nicht notwendig ist, 
was neues zu kaufen.

@Topic: In der main.c findest du:
1
// [...]
2
static const uchar  keyReport[NUM_KEYS + 1][2] PROGMEM = {
3
// [...]
 Den Tasten 1 - 17 (die "pin assignments" stehen weiter oben als 
Kommentar in der main.c) sind die Buchstaben A - Q ("keyboard usage 
values", ebenfalls weiter oben) zugeordnet. Im keyReport kannst du das 
entsprechend anpassen.
Um auf Taste 1 ein kleines z zu legen trägst du ein:
1
/*  1 */    {0, KEY_Z}
 entspricht
1
{0, 0x1d}
"0x1d" ist die spezifische usage ID für den Buchstaben z auf einem 
USB-Keyboard. Deine gewünschten Tasten musst du entsprechend mal in den 
USB HID Usage Tables nachgucken 
(http://www.usb.org/developers/devclass_docs/Hut1_12.pdf -> Kapitel 10) 
und eintragen.

von Stefan B. (adam6de)


Lesenswert?

@hownottobeseen
So ich habe nun den Code entsprechend abgeändert:
1
#define F_CPU   16000000L    /* evaluation board runs on 4MHz */
aber wo finde ich "USB_CFG_CLOCK_KHZ" ???
Ich habe mir die aktuellste Version von
http://www.obdev.at/products/vusb/hidkeys.html
heruntergeladen

@drohgebaerde
Danke für deine Hilfe.
Ich habe das Programm soweit geändert:
1
#define KEY_F12     69
2
#define KEY_DOWN    81
3
#define KEY_UP      82
4
#define KEY_ENTER   40
5
6
static const uchar  keyReport[NUM_KEYS + 1][2] PROGMEM = {
7
/* none */  {0, 0},                     /* no key pressed */
8
/*  1 */    {0, KEY_DOWN},
9
/*  2 */    {0, KEY_UP},
10
/*  3 */    {0, KEY_ENTER},
11
/*  4 */    {MOD_SHIFT_LEFT, KEY_D},
Ich hoffe dass ich damit auf
PB0 "Pfeil-runter"
PB1 "Pfeil-hoch"
PB2 "Enter"
gelegt habe.

Ist das so richtig?

von Sebastian (Gast)


Lesenswert?

Ich bin mir nicht so sicher, ob V-USB mit anderen Quarzen als 12 MHz 
funktioniert, denn die sehr zeitkritische USB-Empfangsroutine darin ist 
Assembler, und geht von einer bestimmten Befehlsausführungszeit aus. Die 
Takte sind genau abgezählt, zumindest früher gingen andere Quarze nicht. 
Vielleicht gibt es aber inzwischen eine neue Revision, möchte das nicht 
ausschließen.

von Stefan B. (adam6de)


Lesenswert?

Chris R. schrieb:
> Stefan Brütting schrieb:
>> Brauch ich unbedingt ein 12Mhz Quarz oder oder geht das auch mit
>> internen Oscillator bzw. 16Mhz Quarz ?(da schon vorhanden)
>
> Es geht auch mit einem 16MHz-Quarz. Du musst nur daran denken, nicht nur
> F_CPU, sondern auch USB_CFG_CLOCK_KHZ zu ändern, falls diese nicht
> automatisch (F_CPU/1000) berechnet wird.

Hast du es schon mal getestet mit einem 16Mhz Quarz?

von Stefan B. (adam6de)


Lesenswert?

Kann mir noch Jemand die Frage mit dem Quarz beantworten?

Bzw. Was muß ich hier verändern wenn ich einen 16Mhz Quarz habe?
1
//[...]
2
DDRD = 0x02;    /* 0000 0010 bin: remove USB reset condition */
3
    /* configure timer 0 for a rate of 12M/(1024 * 256) = 45.78 Hz (~22ms) */
4
    TCCR0 = 5;      /* timer 0 prescaler: 1024 */
5
//[...]

Danke und Gruß
Stefan

von Sam (Gast)


Lesenswert?

Hallo Stefan B.,

wenn Du Dir mal die Seiten von OBDEV anschaust, dann wirst Du viele 
Antworten auf Deine Fragen bekommen - alleine durch Lesen.

Gruß Sam

von Stefan B. (adam6de)


Lesenswert?

Hallo Sam
leider hab ichs nicht so mit Englisch.
Aber ich hab zumindest rausgefunden dass es auch mit 16Mhz Quarz 
funktionieren müsste.
Reicht es dann wenn ich F_CPU anpasse (???) oder muss ich wie von
Chris R. geschrieben:
>...Du musst nur daran denken, nicht nur
>F_CPU, sondern auch USB_CFG_CLOCK_KHZ zu ändern, falls diese nicht
>automatisch (F_CPU/1000)berechnet wird.
noch andere Sachen anpassen?

Ich finde aber nichts ausser F_CPU.

Gruß
Stefan

von Tom M. (tomm) Benutzerseite


Lesenswert?

> V-USB can currently handle clock rates of 12 MHz, 12.8 MHz, 15 MHz, 16 MHz, 16.5 
MHz, 18 MHz and 20 MHz.

Schau dazu mal in die usbdrv.h und die clock.h

von Stefan B. (adam6de)


Lesenswert?

Tom M. schrieb:
>> V-USB can currently handle clock rates of 12 MHz, 12.8 MHz, 15 MHz, 16MHz, 
>>16.5MHz, 18 MHz and 20 MHz.
>
> Schau dazu mal in die usbdrv.h und die clock.h

Die usbdrv.h sagt mir:
>The device MUST be clocked at 12 MHz
darauf folgere ich es geht nur mit 12Mhz obwohl auf der OBDEV was 
anderes steht.

Leider kann ich die clock.h bei mir nicht finden!?!?

von Stefan B. (adam6de)


Lesenswert?

Also ich hab es gerade mit dem 16Mhz Quarz getestet.
Voher natürlich F_CPU angepasst.
Schaltung wie bei V-USB beschrieben aufgebaut.
(unterschied ich hab 22pF anstatt 27pF beim Quarz weil auf meinem Board 
so vorhanden)

USB-Gerät wird erkannt und dann sagt er teiber nicht richtig 
installiert.
Gerätemanager sagt: Angehalten Gerät meldet Fehler.

Wenn ich meinen 12Mhz Quarz bekomme teste ich weiter.

Gruß
Stefan

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.