Forum: Mikrocontroller und Digitale Elektronik V-USB Portwahl für D- problematisch


von Gerrit V. (gerczek)


Lesenswert?

Hi,
ich habe mir ein Breakout-Board für meinen ATMega16PU erstellt. Um mit 
ihm per USB zu kommunizieren benutze ich den Software-Stack v-usb von 
obdev.net und eine angepasste HID-Schnittstelle von rayshobby.net.

Laut v-usb muss die D+ Leitung an INT0 (PD2) angeschlossen werden.
Die D- Leitung kann am PortD angeblich beliebig gewählt werden.

Zu Testzwecken auf dem Schaltbrett habe ich für D- PD3 (INT1) gewählt, 
was auch prima funktioniert hat. D.h. ich kann Daten auf meinem PC vom 
meinem Mikrocontroller empfangen als auch an ihn senden. Für mein 
Breakoutboard (geätzte Platine) habe ich ohne zu testen D- mit PD6 (ICP) 
verbunden. Ich weiß war nicht schlau und es funktioniert auch nicht. 
Mein Mikrocontroller wird von meinem PC noch nicht einmal erkannt.
Ich habe alle anderen Ports von PortD ebenfalls zu Testzwecken an D- 
angelegt. Meine Hostsoftware auf meinem PC erkennt zwar meinen 
Microcontroller dann, kann aber keine weiteren Daten vom Microcontroller 
erhalten. Wirklich funktionieren tut es also nur wenn D- an PD3 (INT1) 
anliegt.
Hat jemand eine Ahnung warum die Kommunikation mit den anderen Pins 
nicht funktioniert?

von L. P. (lpg)


Lesenswert?

Hast du die Firmware im uC ebenfalls auf den "neuen" Port umgebaut?
Einfach den Pin zu änder geht natürlich nicht. Evtl. braucht die FW den 
Interrupt auf der D- Leitung.

Lg.

von Gerrit V. (gerczek)


Lesenswert?

Ja klar, den D- Pin habe ich auch in der FW geändert.

von L. P. (lpg)


Lesenswert?

Und wie sieht das mit dem Interrupt aus?

Lg.

von Gerrit V. (gerczek)


Lesenswert?

Alle Pins funktionieren, wenn ich sie in der FW angebe und zustätzlich 
mit INT1 (PD3) verbinde. D.h. z.B D- liegt an PD6 und an PD3 an, wobei 
in der FW nur PD6 als D- Leitung angegeben wurde.

Ich werde mal bei der Firma nachfragen, die den Softwarestack 
geschrieben hat. Denn ich habe keine Ahnung woran es liegt. Habe 
geschaut, ob irgendwo in der FW PD3 oder INT1 vorkommt aber nichts 
gefunden.

von Tim  . (cpldcpu)


Lesenswert?

Wenn V-USB so konfiguriert ist, dass INT0 oder INT1 genutzt werden, muss 
D- an einen dieser Pins angeschlossen werden. Die neueren AVRs 
unterstützen allerdings einen Pin-Change interrupt an jedem Pin. Mit 
diesem ist es möglich alle Pins zu nutzen.

von 4toTakoe (Gast)


Lesenswert?

poste doch mal deinen Code, bevor du die Leute dort mit deinen 
"Problemen" belästigst.

von Gerrit V. (gerczek)


Lesenswert?

In der sogenannten usbconfig.h werden die Leitungen D+ und D- 
festgelegt.
1
#define USB_CFG_IOPORTNAME      D
2
/* This is the port where the USB bus is connected. When you configure it to
3
 * "B", the registers PORTB, PINB and DDRB will be used.
4
 */
5
#define USB_CFG_DMINUS_BIT      6
6
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
7
 * This may be any bit in the port.
8
 */
9
#define USB_CFG_DPLUS_BIT       2
10
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
11
 * This may be any bit in the port. Please note that D+ must also be connected
12
 * to interrupt pin INT0! [You can also use other interrupts, see section
13
 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
14
 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
15
 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
16
 * markers every millisecond.]
17
 */

Da USV_COUNT_SOF nicht aktiviert ist dürfte D- auch keinen Interupt 
gebrauchen.
1
#define USB_COUNT_SOF                   0
2
/* define this macro to 1 if you need the global variable "usbSofCount" which
3
 * counts SOF packets. This feature requires that the hardware interrupt is
4
 * connected to D- instead of D+.
5
 */

Ich überlege, ob es möglicherweise eine Hardware-Problem ist. Sprich die 
Spannung die an PD6 anliegt ist zu gering um von diesem detektiert zu 
werden. Bei PD3 es aber reicht.

von matrixstorm (Gast)


Lesenswert?

Gerrit V. schrieb:
> Da USV_COUNT_SOF nicht aktiviert ist dürfte D- auch keinen Interupt
> gebrauchen.

Eigentlich brauchst du den Interrupt trotzdem. Auf Interrupt zu 
verzichten ist komplizierter: 
http://forums.obdev.at/viewtopic.php?f=8&t=8738&sid=129a0c27435d4518266cc816b06fa103

MfG

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.