mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Self Powered USB mit Atmega32


Autor: Thomas Krieger (tkrieger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe zur Zeit vor mich ein wenig mit USB zu beschäftigen. Mein Ziel ist 
es ein Atmega32 so zu beschalten und zu programmieren, das Daten mit ca. 
1MBit/s mit dem PC ausgetauscht werden können.

Als Software soll dazu die AVR USB Implementierung von obdev.at genutzt 
werden:

http://www.obdev.at/products/avrusb/index.html

Bei obdev.at sind allerdings nur Beispielschaltungen zu Devices die 
ihren Strom aus dem USB Bus ziehen. Daher wollte ich fragen, ob ein 
Anschluss nach dem angehängten Plan Sinn macht. Ich selbst bin noch 
recht am Anfang was Elektronik angeht.

Die Frage ist kann ich V_bus so "in der Luft" stehen lassen?
Reicht es die GND Leitungen der externen Spannungsversorgung mit dem USB 
GND zu verbinden, das die D+ und D- Signale ordentlich übermittelt 
werden?

Für Hinweise wäre ich sehr Dankbar!

Gruß

Thomas

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner "zwingt" dich Strom aus dem USB Bus zu beziehen, nur GND sollte 
halt verbunden sein dann klappt das schon :)

Autor: Thomas Krieger (tkrieger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab mir nochmal das Metaboard in dem Projekt angeschaut und den 
Kondensator und den 1k5 Ohm Widerstand an die Vcc Leitung des Atmega 
gebunden.

Werd es jetzt mal zusammenlöten und einen Versuch starten. Vielen Dank!

Gruß

Thomas

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viel Glück! Berichte mal ob es geklappt hat!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du die Vcc/Gnd-Symbole auch an jedem Bauteil benutzt, welches 
an Vcc/gnd liegt, werden die Schaltpläne nicht ganz so wirr...

Autor: Christian F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Spannungsversorgung usw. muss erst beim Layout komplett verbunden 
werden :-P
Mit den VCC/GND-Symbolen werden imaginäre Leitungen gezogen und dein 
Schaltplan sieht um einiges übersichtlicher aus  :)

Autor: 3374 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit wenig Ahnung von USB, noch von Elektronik wuerde ich mir das nicht 
antun, dafuer alternativ fuer 4 Euro einen FT232 chip drauf tun.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder AT90USB. Der hat USB onboard.

Autor: Thomas Krieger (tkrieger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider kann ich die AT90USB nicht verwenden, da bereits ein Atmega32 in 
dem Projekt verwendet wird, wo die USB Schnittstelle eingepflegt werden 
soll.

Da schon einige IO-Pins belegt sind, kam mir die AVR USB Lösung am 
besten vor. Bisher habe ich einen Grundschaltung (siehe Anhang), jetzt 
erstmal als Bus Powered USB Device angelegt und die PowerSwitch Software 
aus:

http://www.obdev.at/products/avrusb/powerswitch.html

Aufgespielt und angepasst. Bisher bekomme ich ca. jeden 3. oder 4. 
Versuch einen Verbindung mit dem PC hin. Unter Linux zumindest, bei 
Windows Vista meldet er sich noch nicht. Unter Linux wird die 
entsprechende Device und Vendor ID bei lsusb angezeigt, allerdings mehr 
auch nicht.

Wollte zunächst mal einen 1MOhm Pull-Down Wiederstand an D+ anbringen, 
um falsche Interrupts zu vermeiden.

Werde dann nochmal berichten.

Gruß

Thomas

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der 1.5K Pull-Up zur Device-Speed-Erkennung muss nach 3.3V geschaltet 
werden, nicht an 5V.
So fliesst da zuviel Strom, das kann deine "wacklige" USB-Verbindung 
erklären.
Versuch da mal eher 2.2k, wenn du nur 5V zur Verfügung hast.

Autor: Thomas Krieger (tkrieger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal gerade umgelötet, und habe jetzt scheinbar noch häufiger ein 
Connect. Allerdings so ganz in Ordnung scheint es auch noch nicht zu 
sein, werde nochmal prüfen, ob es neben den 2k2 Widerstand noch andere 
Optimierungen gibt oder evtl. ein Software Problem.

Danke für den Tip!

Gruß

Thomas

Autor: Thomas Krieger (tkrieger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juhu, hab eine erste Kommunikation!

Hab mit dem PowerSwitch Projekt kurze Abfragen gesandt, die die 
usbFunctionSetup beantwortet hat ;)

Der Schaltplan ist noch der alte (s.o. ca. 2 Antworten). Denke der 
Schaltplan bräuchte noch kleine Änderungen, da eine Verbindung nur jedes 
2. oder 3. mal zustande kommt.

Die Firmware enthällt die folgende usbconfig.h
#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      3
#define USB_CFG_DPLUS_BIT       2
#define USB_CFG_CLOCK_KHZ       16000
#define USB_CFG_HAVE_INTRIN_ENDPOINT    0
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   0
#define USB_CFG_EP3_NUMBER              3
#define USB_CFG_IMPLEMENT_HALT          0
#define USB_CFG_INTR_POLL_INTERVAL      10
#define USB_CFG_IS_SELF_POWERED         0
#define USB_CFG_MAX_BUS_POWER           100
#define USB_CFG_IMPLEMENT_FN_WRITE      0
#define USB_CFG_IMPLEMENT_FN_READ       0
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   0
#define USB_CFG_HAVE_FLOWCONTROL        0
#define USB_CFG_LONG_TRANSFERS          0
#define USB_COUNT_SOF                   0
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH   0
#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xdc, 0x05
#define USB_CFG_DEVICE_VERSION  0x00, 0x01
#define USB_CFG_VENDOR_NAME     'o', 'b', 'd', 'e', 'v', '.', 'a', 't'
#define USB_CFG_VENDOR_NAME_LEN 8
#define USB_CFG_DEVICE_NAME     'U', 'S', 'B', '-', '2', '3', '2'

#define USB_CFG_DEVICE_NAME_LEN 7

#define USB_CFG_DEVICE_CLASS        0xff    /* set to 0 if deferred to #define USB_CFG_DEVICE_SUBCLASS     0
#define USB_CFG_INTERFACE_CLASS     0x02   /* define class here if not at device level */
#define USB_CFG_INTERFACE_SUBCLASS  2
#define USB_CFG_INTERFACE_PROTOCOL  1
#define USB_CFG_DESCR_PROPS_DEVICE                  0
#define USB_CFG_DESCR_PROPS_CONFIGURATION           0
#define USB_CFG_DESCR_PROPS_STRINGS                 0
#define USB_CFG_DESCR_PROPS_STRING_0                0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
#define USB_CFG_DESCR_PROPS_HID                     0
#define USB_CFG_DESCR_PROPS_HID_REPORT              0
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0

/* #define USB_INTR_CFG            MCUCR */
#define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) 
/* #define USB_INTR_CFG_CLR        0 */
#define USB_INTR_ENABLE         GIMSK
#define USB_INTR_ENABLE_BIT     INT0 
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */
#define USB_INTR_VECTOR         SIG_INTERRUPT0 

#endif /* __usbconfig_h_included__ */

Insbesonder die auskommentierung von den letzten Interrupt 
Einstellungen, hat die Kommunikation im letzten Schritt zum laufen 
gebracht.

Als main habe ich folgendes Konstrukt:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>

#include <util/delay.h>
#include <avr/pgmspace.h>   /* required by usbdrv.h */
#include "usbdrv.h"
#include "oddebug.h"        

usbMsgLen_t usbFunctionSetup(uchar data[8])
{
  usbRequest_t    *rq = (void *)data;
  static uchar    replyBuf[2];

    usbMsgPtr = replyBuf;
    if(rq->bRequest == 0){  /* ECHO */
        replyBuf[0] = rq->wValue.bytes[0];
        replyBuf[1] = rq->wValue.bytes[1];
        return 2;
    }
    if(rq->bRequest == 1){  /* GET_STATUS -> result = 2 bytes */
        replyBuf[0] = 0x00;
        replyBuf[1] = 0xFF;
        return 2;
    }
    if(rq->bRequest == 2 || rq->bRequest == 3){ /* SWITCH_ON or SWITCH_OFF, index = bit number */
    }

    return 0;   /* default for not implemented requests: return no data back to host */
}

int main(void) 
{
    uchar i;
  
    wdt_enable(WDTO_1S);
    
    // Reset USB API
    usbDeviceDisconnect();

  // Wait some ms        
    for (i=0;i<254;i++)
    {
  wdt_reset();
  _delay_ms(1);
    }
    
    // Re-init USB API
    usbDeviceConnect();
    
    // Init USB 
  usbInit();
  
  // Enable interrupts    
    sei();
    
    for(;;){     
        wdt_reset();
        usbPoll();
    }
}

Der Code ist ein bisschen zusammenkopiert aus dem AVR USB PowerSwitch 
Projekt. Daher nochmal ein herzliches Danke und hier der Hinweis auf die
Homepage:

http://www.obdev.at/products/avrusb/powerswitch.html

Die Abfragen an das Device wurden ebenfalls mit dem PowerSwitch 
commandline
Tool gesandt. Als erfolgreiche Kommunikation hat mir heute Nacht erstmal 
die Statusabfrage gelangt. Es wird immer 0x00 und 0xFF zurückgesandt, 
und
entsprechend werden die Zustände der (nicht vorhandenen) LED's 
angezeigt.

Ich hoffe es hilft vielleicht auch einigen anderen, auch wenn hier noch
ein bisschen Arbeit nötig ist.

- Verbindung funktionier nicht auf anhieb
- Vendor und Produktbeschreibung werden nicht übertragen

Unter Linux bisher nur getestet, werde mich Morgen mal an Windows dran 
wagen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.