Forum: Mikrocontroller und Digitale Elektronik LPC2148 und interruptgesteuerter USB-Betrieb


von G. B. (geri)


Lesenswert?

Hallo zusammen

Ich experimentiere gerade mit der USB-Schnittstelle des LPC2148. Gerne 
möchte ich die USB-Schnittstelle in einer Interrupt-Service-Routine 
laufen lassen.

Ich habe das Beispiel von Bertrik Sikken zum Laufen gebracht, allerdings 
muss hier in der Hauptschleife immer eine Routine aufgerufen werden. Das 
ist für meinen Fall nicht brauchbar.
Mich würde interessieren ob jemand von Euch auch schon an diesem Thema 
gearbeitet hat und falls ja, wie er es gelöst hat.  Verwendet man eine 
Timer-Routine o.ä. Irgendwie muss man es ja auch schaffen, dass sich der 
PC ja nicht mitten drin verabschiedet, wenn mal 1s nichts über die 
Schnittstelle gesendet wird

I arbeite übrigens mit einem gcc-Compiler und einem Olimex-Board, wie 
hier im shop zu haben:)

Beste Grüsse und vielen Dank für Eure Tipps

Geri

von Potter S. (potter68)


Lesenswert?

Hallo Gerhard,

diese Routine behandelt meist den "allgemeinen" USB Transfer. Das 
beginnt dann damit, dass die USB-Interrupt-Leitung gepollt wird (in der 
Hauptschleife), um zu sehen, was es Neues auf dem Bus gibt: welcher 
Interrupt ist aufgetreten? Welcher Endpoint ist gemeint? Setup-Packet 
angekommen? ... usw.

Du brauchst keinen Timer. Es sollte möglich sein, diese Routine (mit 
wenigen Anpassungen) vom Interrupt aus aufzurufen. Voraussetzung: man 
kennt sich in der USB-Spezifikation ein wenig aus. Es gibt ein Buch von 
J. Axelson, darin ist das Ganze recht gut erklärt.

Gruß Ralf

von G. B. (geri)


Lesenswert?

Hallo Ralf

Vielen Dank für Deine Hilfestellung! Das klingt mal schon sehr positiv! 
Ebenen, ich habe mir nur gedacht, dass MS-Windows o.ä. laufend eine 
Rückmeldung vom Client benötigt um festzustellen, dass noch ein Gerät 
angeschlossen ist. Schön wäre es eben, wenn der gesamte Datentransfer im 
Hintergrund ablaufen kann, ähnlich wie man es bei der RS232 machen kann.

Dein genannte Link zum Buch schaut vielversprechend aus, danke! Denke, 
diese Schnitttelle ist recht komplex. Werde meine Suche im Web noch ein 
wenig ausweiten. Es wundert mich eben, dass ich im Web dazu noch kein 
Beispiel gefunden habe. Hätte gedacht, dass dieses Problem viele 
betrifft. Vielleicht ist es aber nicht so ein grosses..:)

Beste Grüsse und nochmals vielen Dank für Deine Hinweise

Geri

von G. B. (geri)


Lesenswert?

Ach ja, kennt jemand zu diesem Thema vielleicht auch noch eine 
online-Literaturquelle?

Beste Grüsse

Geri

von Jankey (Gast)


Lesenswert?

is dein problem PC oder uC seitig?

lg

von G. B. (geri)


Lesenswert?

auf der Seite des Mikrocontrollers.

von Εrnst B. (ernst)


Lesenswert?

Der Grund warum das beim µC kaum jemand interrupt-gesteuert macht, ist 
einfach der, daß es wenig Sinn macht.

Bei einer reinen Software-Implementierung wie USBtiny &co braucht man 
die noch, sobald der µC aber Hardwareunterstützung für USB hat, ist es 
einfacher ohne.
Der ganze Datentransfer wird ja von der Hardware gemacht, die Software 
muss nur ab und an nachschauen, ob wieder ein komplettes Frame 
angekommen ist, das bearbeitet werden muss.
Ob du das jetzt früher oder später machst, ist egal.

Also besser im Hauptprogramm, wenn eh Zeit ist, und nicht in einer ISR, 
wo du dir nur einen unnötigen jitter auf evtl wirklich zeitkritische 
Interrupts holst.

von G. B. (geri)


Lesenswert?

Hallo Ernst

Vielen Dank für Dein Feedback. Du hast bestimmt recht. Ich verstehe 
deine Argumente. Dummerweise habe ich eine Echtzeitanwendung, bei der 
eine hoch priore Funktion die unter Umständen mehrere Sekunden läuft. 
Momentan funktioniert das Programm mit der Uart-Schnittstelle. Ueber 
Uart wird byte für byte eingelesen. Sobald ein neuer vollständiger 
Befehl da ist wird ein Flag gesetzt. Dieses Flag wird von der hoch 
prioren Funktion laufend gepollt. Ist das Flag gesetzt, dann wird das 
neue Kommando sofort ausgeführt. Das funktioniert sehr gut, nur eben 
nicht mit USB:) Das Polling einer Variable funktioniert dann halt recht 
schnell.

Deshalb die ISR oder gibt es hier Deiner Meinung nach vielleicht einen 
bessere Lösung?

Beste Grüsse

Geri

von Εrnst B. (ernst)


Lesenswert?

Hmm, mit der USB-Behandlung in der ISR sparst du dir dann aber auch 
nicht viel, oder?
Dann wird dein hochpriorisierter Task ständig von der USB-ISR 
unterbrochen, die dann relativ viel Zeit verbraucht.
Wenn das nix macht, als Quick&Dirty Methode das usb-pollen, wie oben 
schonmal geschrieben, einfach in einen Timer-Interrupt packen.

Ansonsten isses warscheinlich mehr zum umschreiben an deinem USB-Stack.

/Ernst

von G. B. (geri)


Lesenswert?

Hallo Ernst

Vielen Dank für Deine Rückmeldung.

Verstehe ich dich dann richtig?
1.) codiere eine Timer-ISR, welche z.B. alle 100ms aufgerufen wird und 
die USB-Verbindung zum PC am Leben erhält

2.) frage in der hochprioren Task ein Flag ab, welches angibt ob ein 
neues Frame vorhanden ist.

Gibt es zu Punkt bei USB auch so ein Flag etwa bereits schon?

Beste Grüsse

Geri

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Wie wärs mit usb-interrupt initialisieren und im interrupt die 
USBHwISR() aufrufen?!?

das funktioniert bei mir sehr gut...

von G. B. (geri)


Lesenswert?

Hallo Andreas

Das klingt sehr interessant.

Wenn ich Ralf und Ernst richtig verstanden habe, dann übernimmt 
USBHwISR() die Hintergrundaufgaben, die man ggf. auch zyklisch in einer 
Timer-Interruptroutine aufrufen könnte. Irgendwo müsste es für mich auch 
eine Flag geben, welches mir anzeigt ob neue Daten vorhanden sind.

Mich würde aber sehr interressieren, wie Deine Lösung aussieht. Kannst 
du mir hier bitte vielleicht weitere Hinweise geben wich ich das konkret 
lösen kann oder zumindest einen Link der mit die Sache klarer macht?

Vielen Dank nochmals und beste Grüsse

Geri

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Das verstehst du schon richtig, dass du den usb controller duch die 
USBHwISR() "pollst".

also initialisierst du nen usb-interrupt (siehe timer-interrupt-beispiel 
bei winarm) und packst in den handler die USBHwISR() und fertig.
wenn du dann noch flags für dateneingang brauchst schreibst du die 
_HandleBulkIn/_HandleBulkOut-funktionen rein...

von G. B. (geri)


Lesenswert?

Hallo Andreas

Vielen Dank für Deine Rückmeldung. Nun bin ich etwas durcheinander. Soll 
USBHwISR() nun in eimem TimerInterrupt oder durch einen "USB-Interrupt" 
- so wie du schreist - aufgerufen werden?:)

Ziat " ..also initialisierst du nen usb-interrupt (siehe 
timer-interrupt-beispiel bei winarm) und packst in den handler die 
USBHwISR() und fertig."

Punkt 2 habe ich gecheckt:)

Ach ja, mit welchen libraries kommunizierst du eigentlich PC-seitig?

Beste Grüsse

Geri

von Rupplyn (Gast)


Lesenswert?

nix timer-interrupt. kannst dir dazu nur das winarm-example zum 
erstellen eines interrupts (als allgemeines bsp) anschauen.

die USBHwISR() kommt dann in den usb-interrupt...

pc-seitig arbeite ich mit libusb...

von G. B. (geri)


Lesenswert?

Hallo Rupplyn

Vielen Dank, genau so habe ich es gestern Nacht auch noch gemacht. 
Funktioniert bis jetz einwandfrei. Werde diese Lösung dann allen zur 
Verfügung stellen.

Nun bin ich an libusb dran. Das UBS-Testprogramm erkennt mein 
LPC2148-USB-Programm. Ich arbeite aber mit Delphi. Hierzu habe ich eine 
Portierung von libusb im Internet gefunden. Hier komme ich leider nicht 
weiter. Irgendwie stürzt mein Programm gleich ganz am Anfang ab. 
Vielleicht ist es so, dass sich die zwei libusb-Versionen auf dem 
Rechner nicht vertragen...

Beste Grüsse und vielen Dank

Geri

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.