Forum: Mikrocontroller und Digitale Elektronik Application Note AVR309 ATMega8 USB (Erfahrungsaustausch)


von Frank Simon (Gast)


Lesenswert?

Hallo,
falls es weitere Leute hier gibt, die auf Basis von Igor Ceskos
USB-Implementation eigene Projekte entwickeln wollen: Hier gibt es
Gelegenheit zum Erfahrungsaustausch.
Ich fange mal an: (Vorschlag: Erfahrungen bitte laufend
durchnummerieren, wegen Bezugnahme)

1. Die beiden Keramikkondensatoren am Quarz sollten lieber doch nicht
eingespart werden (15pF). Der Quarz schwingt sonst nicht sicher.

2. Der Mega8 wird mit 3,5 Volt (bei mir: 3,3V) außerhalb der
Spezifikation betrieben. Das ist kein Problem, auch nicht beim ISP. Bei
mir tuts der serielle Programmer von Olimex in Zusammenarbeit mit der
neuesten Version von Ponyprog (2.06c Beta  Jul 27 2003), die Version
davor tats (unter Windows XP) nicht. Damit der Quarz immer sauber
läuft, hab ich sicherheitshalber die CKOPT-Fuse gesetzt (kostet etwas
mehr Energie, aber die haben wir ja)

3. Die beiliegende Software arbeitet klaglos. Ich verwende den Treiber
und die DLL unverändert. Zusätzlich zur Demo-Applikation verwende ich
zum Testen VBA-Makros, die dann direkt ins Excel-Blatt schreiben.
Folgendes z.B. zum Senden (also Downstream):
   Dim RS232Buffer(10000) As Byte
   Dim RS232BufferLength As Long
   ...
   RS232Bufferlength = 10000
   RS232BufferLength = DoRS232BufferSend(RS232Buffer(0), 0,
RS232BufferLength)
   ...
Entsprechendes zum Empfangen mit DoGetRS232Buffer(RS232Buffer(0), 0,
RS232BufferLength).

3. Downstream-Bandbreite: (PC->AVR) enttäuschende 8ms für jedes Byte,
macht ca. 125 Bytes pro Sekunde. Ich hab einiges rumgetrickst, da ist
wohl nicht mehr zu machen. Es wird immer nur ein einziges Byte
transportiert, auch wenn der Name der Routine anderes suggeriert. Es
gibt dieselben Zeiten, wenn die ...BufferSend...Routine jeweils
byteweise aufgerufen wird. Im Assemblertext sieht man auch, dass jedes
Byte nach Übernahme in den USART einzeln per USB quittiert wird. Ein
Fifo (wie in Upstream-Richtung) ist nicht vorhanden.

4. Upstream-Bandbreite: konnte ich noch nicht sehr genau messen, aber
mindestens 2kB pro Sekunde. Dann ist der uC aber schon nahe an seiner
Grenze (Bei mir leuchtet eine LED, solange die Int0-ISR bearbeitet
wird, die ist dann spürbar heller)

5. Abfragezyklus: Egal, wie oft die DLL angefragt wird: neue Daten
(Upstream) gibt es alle ca. 20ms.

6. Möglicherweise gibt es im Firmware-Fifo (Upstream) einen
Softwarefehler: manchmal mischen sich Nullen in den Datenstrom.
Passiert generell öfter, wenn wenig Daten fließen. Ich habe den
Verdacht, dass das beim Leerlaufen des Fifos passiert. Muss noch
genauer untersucht werden.

7. Mein Projekt: Das definitv billigste Selbstbau-Messinterface für
meine Schüler, kein Steckernetzteil mehr, Messen und Steuern über
Excel/VBA im Anfängerkurs "Rechnergestützte Physikalische
Messtechnik". Ist aber noch lange nicht fertig. RS232 brauche ich gar
nicht, hab ich in der Firmware umgeflanscht, so dass ich zum Messen
(Upstream) einen Bytestrom von den verschiedenen I/O-Einheiten
(speziell ADC und Timer1/Input Capture (für präz. Zeitmessungen))
bekomme. Der Timer1 läuft schon als 32-Bit Zeitstempel für die
Messungen. Die Schüler empfangen in einer Endlosschleife den Datenstrom
und fischen die entsprechenden Ereignisse heraus, um bestimmte
Messprobleme zu bearbeiten. (Die Schüler sollen also nicht den Mega8
programmieren, deshalb werde ich auch kein ISP vorsehen)

Das wars erstmal. Lasst mal was hören!
Mit freundlichem Gruß
Frank

von Olaf (Gast)


Lesenswert?

Mir leuchtet nicht so direkt ein wieso das billig sein soll wenn man
noch VBA und Excel kaufen muss. Ich hab das Teil unter Linux
angesprochen und da benoetigt es etwa eine DIN-A4 Seite C-Source und es
laeuft.
Allerdings ist die Uebertragungsrate wirklich nicht sehr hoch und der
Prozessor kann nicht mehr soviel nebenbei machen.

Deshalb habe ich jetzt einen USBN9604 am Mega8. Damit komme ich so auf
6-7kb/s und die Bandbreite wird dadurch begrenzt das der USB-Controller
ueber einen seriellen Datenbus angesprochen wird. Ausserdem habe ich
natuerlich jede Menge Rechenzeit im Mega8 uebrig um mit meinen Daten
auch noch was zu machen.

Olaf

von Björn (Gast)


Lesenswert?

Hallo Olaf,

könntest du den C-Source vielleicht mal posten? Würde mich echt
interessieren wie man das teil unter Linux ansprechen kann...

von Rufus T. Firefly (Gast)


Lesenswert?

VBA muss man nicht kaufen, das ist im Lieferumfang von Excel & Konsorten
enthalten.
Statt dessen lässt sich auch VBScript und OpenOffice verwenden - keins
der beiden muss gekauft werden.

von Hans (Gast)


Lesenswert?

warum zum teufel excel verwenden.. open office sollts doch auch tun..

sonnst wäre da noch visualisierung mit dem iis... ist für
nt4,98,95,2k,... doch kostenlos... und über asp kannst com-objeckte
ansprechen... wobei wir da schon bei vbs wären.. nur da sind
oberflächen nicht brauchbar einfach hinzutrixen...

und im vorletzten..also dezember war doch irgendwas mit software die
daten vergewaltwuzln kann... so matlab zeug nur billiger (kann das
nicht octave auch ???) das sollte auch mit com-objekten umgehn
können...etwas entwicklungsarbeit dann sollte aus der (wenn es sie
schon gibt) dll ein com-server werden... dann kannst eigentlich auch
von anderen rechnern auf das teil zugreifen dank DCOM ;)

btw.. ich bin noch immer verfechter der ethernet methode.... ip-stack
drauf... simpel interface auf irgend einem port auf machen... und dann
kommen die daten schön brav über tcp/ip in jedes OS rein...

ich werde mir aber mal das usb zeug anschaun... weil interessieren
würds mich schon... nur 125byte/sec das ist schon etwas mager....

obwohl wenn das senden vom avr schneller geht kann ich mir eigentlich
nur vorstellen das die dll langsam ist...

gibts dazu ein referenz-design und software für winavr???

ich muss heut eh noch in richtung stadt...dann nehm ich mir gleich das
zeug alles mitheim g

73 de oe6jwf / hans

von Olaf (Gast)


Lesenswert?

Ich fuerchte ich werde die naechsten zwei Tage sehr beschaeftigt sein,
aber wenn ich es nicht vergesse lege ich den Source am Wochenende auf
meine Homepage.

     http://www.ruhr.de/home/criseis/

Olaf

von Frank Simon (Gast)


Lesenswert?

Das Basic im OpenOffice ist halt etwas gewöhnungsbedürftig, aber das
liegt natürlich am Gewöhnungsbedürftigen und nicht am OO.
Bei mir liefen der Zugriff auf DLLs und auch COM-Objekte recht bald,
damit konnte ich schnell alles auf OO-Basic umstellen (allerdings unter
Windows).
Leider gilt wie überall auch in meiner Schule, dass MS-Office zwar
kostet, aber schon bezahlt ist. Ich kann also dort nicht umsatteln,
weil es nicht der Schulpolitik entspricht.
Übrigens: so guten und flotten Support wie im OO-Forum habe ich vorher
noch nie erlebt.

von Frank Simon (Gast)


Lesenswert?

an Hans:
es gibt wenige Argumente für USB außer dem Preis. Deshalb braucht eine
USB-Minimal-Lösung für 7 Euro nicht gegen Ethernet anzutreten. Das ist
eben eine andere Liga.
Für die Messwerte, die ein Mega8 pro Sekunde produzieren kann, reicht
die Upload-Bandbreite von 2kByte/s völlig aus.
Und mit dem eingebauten Timer kann man damit z.B. Zeiten auf die
Mikrosekunde genau messen. Das gibt es sonst nicht für das Geld.
mfg
Frank

von Frank Simon (Gast)


Lesenswert?

an Olaf:
Denkst Du bitte daran, die C-Source auf Deine Homepage zu legen (oder
hier zu posten)?  -Danke!  Noch was: hast Du die LibUSB verwendet?

An alle: Diesen unglaublichen Codeschnipsel fand ich in der AVR309 im
Sourcecode:

;------------------------------------------------------
;CheckCRCIn:
;    kiss  USBBUFPTRY
;    kiss  ByteCount
;    ldi  USBBUFPTRY,InputBuffercompare
;    rcall  CheckCRC
;    pope  ByteCount
;    pope  USBBUFPTRY
;    lip

Ihr habt doch bestimmt Ideen, wie man das übersetzen könnte...

von Olaf (Gast)


Lesenswert?

Ups...haette ich doch fast vergessen:

http://www.ruhr.de/home/criseis/usbtest.tgz

Das laeuft bei mir mit usblib-0.1.8. Erwartet keine Wunder, das ist ein
Quick+Dirty Hack um die Funktion zu testen.

Olaf

von Günther (Gast)


Lesenswert?

Ich möchte den Beitrag nicht kaputt machen, aber meine Frage scheint
hier am besten aufgeheben zu sein.

Ich habe das ganze mit einem AT90S2313-10PI nachgebaut und habe das
Problem, das Windows zwar ein USB:Gerät erkennt, angeblich auch ein
Treiber installiert (ohne das ich sagen muß welchen) dann aber schreibt
es funktioniet nicht richtig (das USB-Gerät).

Ich habe das HEX-File mit PonyProg2000 unter XP fehlerfrei gebrannt.
Der Quarz hat zwei 22pf Kondensatoren.

Kann mir da evtl jemand helfen? Spannungen sind ok. Ob der Quarz
schwingt kann ich ohne Oszi leider nicht messen.
Müssen irgendwelche Fusebits gesetzt werden? PonyProg2000 Hat mir nur
Lock1 und Lock2 aktiv angezeigt. CKOPT war schonmal garnicht mit in der
Liste.
Wenn ich die .INF für den Treiber installiere habe ich auch kein
Erfolg.

von Olaf (Gast)


Lesenswert?

Ganz egal welches Problem du hast, wenn Windoof bei dir einen Treiber
installieren will muss es schon ein USB Device gefunden haben und damit
das passiert muss da schon einiges an kommunikation zu deinem
Microcontroller gelaufen sein. Du kannst dir also sicher sein das der
Mega8 erstmal laeuft.

Olaf

von Frank Simon (Gast)


Lesenswert?

An Günther und Olaf:
Sobald der 1k5-Widerstand D- hochzieht, reagiert XP. Auch wenn gar
keine Kommunikation stattfindet, meldet er das Gerät mit "...aber
funktioniert nicht richtig".
Zu Deinem Problem: Ich kenne nur den großen Bruder des 2313, den 4433.
Dort müssen gar keine Fuses aktiviert werden. (CKOPT gibts nicht, weil
er die Stromsparfunktion eben nicht hat.) Wenn Ponyprog tadellos
arbeitet, mußt Du weiter nach nem Hardwarefehler suchen. Ich glaube,
dass noch keine Kommunikation statt gefunden hat.
mfg
Frank

von Thomas (Gast)


Lesenswert?

zu 3. Downstream-Bandbreite:
das Teil ist doch ein Hid Device oder ? dann geht bei LO Speed eben nur
eine Transaktion /8 ms wieviele Bytes hängt vom Hid Descriptor ab
(max 8). Das ist Teil der USB Spec, die man halt nicht umgehen kann.

Ich weis jetzt nicht was für eine Schule das ist und was das Lernziel
ist. Ich bin aber generell schon der Meinung das Schüler mehr davon
hätten, wenn du eine vernuftige HW einsetzen würdest (auch wenn es
etwas kostet). Steuerung in Exel halte ich schon für etwas unglücklich.


Ich habe zwar allen Respekt vor der Lösung von Igor vor allem wenn man
mal überlegt wie lange der programmiert hat um das zum laufen zu
bekommen.

Thomas

von hanes (Gast)


Lesenswert?

Für das sameln von erfahrungen ist das wiki denk ich eine bessere
Plattform

von marcel (Gast)


Lesenswert?

schaut euch mal die usb-specs www.usb.org an bei usb 1 kann alle 1 ms
ein frame gesendet werden für jeden daten-frame (mit 8 byte maximum
daten) sind zusätzlich 2 frames als quittung nötig. wenn nun nur ein
usb gerät am bus hängt, dann macht das theoretisch ca. 333 daten-frames
die sekunde mal 8 sind dass dann ca. 2.5kByte/s Daten-Rate.

und usb 2 ist mit einem avr in sw nicht zu machen.

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.