Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeit AVR->USB (AVR309)


von PatrickHH (Gast)


Lesenswert?

Hallo,

habe mal eine Frage zu der Geschwindigkeit des USB to UART protocol
converters von www.cesko.host.sk. Habe die Schaltung aus dem Dokument
"AppNote_USBtoRS232.doc" (mit AT90S2313 und Z-Dioden) aufgebaut.
Funktioniert soweit alles super. Ich habe dort ein Display angesteuert,
daß ich über ein VB-Programm ansteuer.

Jetzt zu meinem Problem:
Die Übertragung zu den Ports am AT90S2313 ist recht langsam. Ich kann
das Display (2x24) zwar ansteuern, aber es dauert mir zu lange, bis der
Text auf dem Display steht.

Habe mal 255 Bytes nacheinander an den Port geschickt und mal mit der
Stopuhr die Zeit genommen, wie lange die 255 Bytes brauchen (ich weiß,
daß das nicht gerade genau ist). Da kamen so ca. 2 Sekunden raus. Also
braucht ein Byte ca. 7,8 ms (Bitte berichtet mich, wenn ich da falsch
liege). Für eine Display-Ansteuerung ist das wirklich viel zu langsam.

Ist das richtig, daß das sooo langsam ist? Hat da jemand mal
Erfahrungen mit gemacht?
Kann man die Geschwindigkeit irgendwie noch erhöhen? Oder ist das schon
das Maximum?

Die Routine für das Display kann ich auch nicht mehr in die Firmware
einbauen, da kein Platz mehr für Quellcode vorhanden ist.


Gruß PatrickHH

von Frank Simon (Gast)


Lesenswert?

Hallo,
habe noch nichts nachgebaut (also auch keine Erfahrung) sondern bin im
Moment dabei, den Qelltext der Firmware zu analysieren. Denn mein
Problem ist das gleiche wie deins: die Rechenleistung des AVR wird im
Grunde komplett für das Timing des USB-Protokolls geschluckt. Igor
schreibt, dass er den 10MHz-Chip mit 12 MHz übertaktet und das Timing
demgemäß über die Periodendauer der Assemblerbefehle erzeugt. Meine
Idee ist, den Mega8 (max. 16 MHz) zu nehmen. Dabei muss das Timing
natürlich neu berechnet werden und mir ist noch nicht ganz klar,
wieviel Rechenleistung das bringt, denn der Mega8 muss beim Senden und
Empfangen die Zeit natürlich genauso vertrödeln wie der 2323.
Bin zum Zwischenergebnis gekommen, dass ich wohl erstmal die USB-Doku
lesen muss (uff, 650 Seiten, bin erst bei S.65 :o(
Je länger ich darüber nachdenke, desto klarer wird mir, dass es wohl
doch schlauer ist, einen USB-Chip zu benutzen, wenn man seinen
Controller noch anderweitig braucht... (Dazu gibt es hier schon die
verschiedensten Threads)
mfg
Frank Simon

von Dom (Gast)


Lesenswert?

Ich hatte ähnliche Timing-Probleme, allerdings mit einem USB-Controller
von Cypress mit der Firmware von AK-Modulbus (Ansteuerung über nen
Delphi Programm). Ich konnte sehen wir jeder einzelne Buchstabe auf dem
Display geschrieben wurde. Ich denke, um da akzeptable Ergebnisse zu
erzielen braucht man nen schnelleren USB-Controller. Auch der Mega8 mit
der FW von Cesko wird nicht schnell genug sein. Oder man müsste die so
umschreiben, das wirklich nur das nötigste gemacht wird. Sind da nicht
noch Routinen für nen IR-Empfänger drin? Vielleicht kann man die mal
rausnehmen.

Gruß, Dominik

von Marcus M. (Gast)


Lesenswert?

Hallo Dom,

ich kenne die Firmware des AK-Modulbus Portbausteins sehr gut - hab den
Linux Treiber dafür geschrieben - Fragen zu der Firmware werden ABER
NICHT BEANTWORTET!
Dein Timing-Problem muß irgendwo anders liegen. Ich kann abfrage und
setzraten von bis zu 2kHz mit dem Gerät erzielen.
Der 8051er in dem Chip hat NULL Overhead für den USB! Er betreibt den
USB-Controller wie externes Ram mit Interrupt. Ähnliches macht der
Tiny26 mit der USI Schnittstelle. So in etwa kann man sich das händlich
vorstellen.

Zu dem Timing - ich kenn die Firmware zwar nicht - aber läßt den Timer
doch die Zeit verbummeln und arbeitet im Mainpart mit flags.

Gruß

von Dom (Gast)


Lesenswert?

Hi Marcus,

ich habe mich schon mit dem Buchautor B. Kainka in Verbindung gesetzt
und ihm mein Problem geschildert. Er meinte dazu:

 "Das liegt daran, dass jeder einzelne Transfer vier USB-Rahmen mit
zusammen 4 ms braucht. Die einzige Chance wäre eine Entwicklung, bei
der mehr Intelligenz im USB-Controller abläuft. "

Ich habe keine Möglichkeit gefunden meinen Code zu optimieren, aber
vielleicht licht das auch einfach an meinem OS, dass es nicht schneller
geht ;-)

Hier mal der Delphi Code für's LCD im 4Bit-Modus:

procedure setport(b:byte);
  begin
    temp1:=b;
    lIn.bValue1 := b;
   if (DeviceHandle <> INVALID_HANDLE_VALUE) then begin
     bResult :=
DeviceIoControl(DeviceHandle,$08,@lIn,4,@lOut,8,nBytes,nil);
  end;

  end;


function swapx(byt:byte):byte;
  begin
  result:= (($0f and byt)shl 4) or (($f0 and byt) shr 4);
  end;

procedure lcd_enable;
  begin
  setport(temp1 or $20);
  setport(temp1 and $df);
  end;

procedure lcd_command(cmd:byte);
  begin
  setport($0f and swapx(cmd));
  lcd_enable;
  setport($0f and cmd);
  lcd_enable;
  end;

procedure lcd_data(data:byte);
  begin
  setport(($0f and swapx(data))or $10);
  lcd_enable;
  setport(($0f and data)or $10);
  lcd_enable;
  end;

procedure lcd_init;
  begin;
  setport($03);
  lcd_enable;
  lcd_enable;
  lcd_enable;
  setport($02);
  lcd_enable;
  lcd_command($28);
  lcd_command($0c);
  lcd_command($04);
  end;

procedure lcd_clear;
  begin
  lcd_command($01);
  end;

"Fragen zu der Firmware werden ABER NICHT BEANTWORTET!"
>>> Kann ich mich vorstellen, A-K-Modulbus lässt sich diese ja auch
recht gut bezahlen ;) 20€ für nen einzelnen Controller der ohne FW 5€
kostet halte ich für übertrieben. Gerade für Schüler / Studenten...

Gruß, Dominik

von Marcus M. (Gast)


Lesenswert?

Hallo Dominik,

auf den ersten Blick finde ich jetzt nichts falsches.

Das roblem mit dem USB-Rahmen stimmt, aber das wären dann immer noch
250Bytes/sec.
Somit wärst Du theoretisch in der Lage das Display in einer Sekunde
max. 3 mal zu beschreiben (80Char. Dis.).

Da kannst Du nicht mehr bei zuschauen!

Zur Firmware, ich hab mit dem Chip schon mal gebastelt und wer etwas
fix im µC Bereich ist, der weiß auch, wie man das Ding baut.

Ein Problem, was ich durchaus noch sehe, ist das dein Controller nicht
mitbekommt, das es sich bei dem Chip um ein lowspeed USB 1.1 Device
handelt. Ich kenne das von der Treiberprogrammierung, denn da passiert
dann folgendes:
Der Controller steuert den Chip mit 12Mbit an und der Controller selber
versteht natürlich nur Bahnhof. Trotz Fehlerrate > 98% kommt aber eine
Kommunikation zu stande. Dies ist natürlich weit unter dem, was möglich
ist.
Zudem haßt Du den 15kOhm Widerstand in die Datenleitung gelötet?
Gern gemachter Fehler, bei dem aus mir nicht erkenntlichen Gründen
einige Kontroller trotzdem die Geräte erkennen, ob wohl sie das NICHT
dürften. Die Dinger werden IMHO immer seltsamer ;-)

Gruß

von Dom (Gast)


Lesenswert?

Naja, ich konnt wirklich sehen wie jedes Zeichen einzeln hinzugefügt
wurde (ich schätze mal so 5 Zeichen pro sek.) und die Daten auf dem
Display waren alle korrekt.
Der Widerstand war 1,5kOhm. Das stimmt doch, oder?

Ich werd das demnächst noch mal auf meinem Board aufbauen, arbeite
momentan an anderen Projekten.

Gruß, Dominik

von Marcus M. (Gast)


Lesenswert?

Ups, sorry es waren 1,5k.

Gestern die vergessene 1 und heute das Komma => werd ne neue Tastatur
brauchen ;-)

von PatrickHH (Gast)


Lesenswert?

Hallo,

vielleicht liegt es an den 2,2k und 4,7k Widerständen, daß es bei mir
so langsam läuft. Werde mal die Schaltung ohne Z-Dioden und nur mit dem
1,5k Widerstand ausprobieren. Dann werde ich euch nochmal davon
berichten.

Gruß PatrickHH

von PatrickHH (Gast)


Lesenswert?

Die "einfache" Schaltung mit dem 1,5k Widerstand hat nichts gebracht.
Ist immer noch genauso langsam wie vorher. Versuche mal den Code soweit
wie möglich zu reduzieren, damit ich die LCD-Routine dort noch hinein
bekomme. Sonst muß ich halt nen größeren ATMEL nehmen oder nen 2.
Controller.

Gruß PatrickHH

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.