Es geht hier um Turbo51, einen Pascal-Compiler für 8051 und Derivate. Diejenigen, die gerade beim Wort Pascal einen Herzkasper bekommen haben, bitte nicht weiterlesen. Im Forum http://mcu.goodboard.ru/viewtopic.php?id=89&p=3 hatte ich einige Codeschnipsel zur Programmierung der CH55x-Mikrocontroller unter Turbo51 gefunden. Hier ein Beispiel (per Google-Translate übersetzt): >> Nun, es ist sofort einsatzbereit, wenn Strom angelegt wird, ohne dass mit einem Tamburin getanzt werden muss >> Hier ist ein einzeiliges „Programm“, das die LED sofort aufleuchten lässt. >> p3.2 := false; Ok, das war jetzt einfach... Aber es gibt auch umfangreichere Beispiele in diesem Thread. Leider war der dort angebene Link zum Download auf yadi.sk nicht mehr gültig, so dass ich den Autor vt angeschrieben habe. Dieser hat sehr schnell und freundlich geantwortet und mir die Quellcodes zur Verfügung gestellt. >> That's all that's left after the fun with turbo51 >> https://disk.yandex.ru/d/9H50FDqrSjfOUA >> A computer client for winusb device is here >> http://forum.easyelectronics.ru/viewtopic.php?p=685335#p685335 Auf mein Dankeschön hat er mitgeteilt >> I'm glad if someone is interested in this >> You can do whatever you want with this code as a giftware ) Falls hier auch ein Interesse besteht, hänge ich die beiden Dateien von vt hier an. Eine Windows-IDE für Turbo51 gibt es hier zum Download (komplettes Paket): Beschreibung: https://www.rathlev-home.de/mc/mctools.html MC-Tools-Installationspaket mit Turbo-51 und ASEM-51: https://www.rathlev-home.de/mc/software/mc-setup-5.9.03.exe oder mit optionaler Einbindung von SDCC: https://www.rathlev-home.de/mc/software/mc-setup-6.3.03.exe Gruß Erni
Unterscheidet sich der Turbo51-Download in irgendeiner Weise von dem auf dessen Homepage (https://turbo51.com/download-free-pascal-compiler-8051)?
Hallo Harald, nein, turbo51.com ist die originale Homepage. MC51 ist eine IDE, die Turbo51 beinhaltet und von Prof. Rathlev programmiert wurde. Dies ist natürlich als Windows-Anwendung eleganter als das ursprüngliche Programm von Igor Funa. Es gibt auch noch TurboStudio als Turbo51-IDE unter Windows.
Ich hab mir vor einiger Zeit mal die Mühe gemacht die Register Definitionen des CH552 in ein Pascal Unit zu packen. Der Plan war mal sowas wie usb-cdc in Pascal zu bauen. Leider sind die Compiler Optionen nicht besonders gut dokumentiert, vieles muss man ausprobieren. Trotzdem ist Turbo51 besser als alles was es kommerziell gibt und gab.
In dem Turbo51-Paket ist auch eine Unit für das USB-Interface. Ich habe den Controller mit dem libusb0-Treiber an den Bastel-PC (Windows XP und 7) gekoppelt und kann 64-Byte Pakete zu den Endpoints senden/empfangen. Die Programmierung war mit Delphi-7 bzw. Lazarus v2.12. Soweit alles gut, mehr wollte ich auch nicht. Dennoch habe ich jetzt eine Frage, auch wenn das Problem für mich nicht dramatisch ist. Der CH552 wird mit dem USB Device Tree Viewer als "USB Device" angezeigt. Es gibt allerdings Fehlermeldungen zu den Strings, zu denen im Device Descriptor die Indexe angegeben sind. Hier im Code sind für iManufacturer 0 {d.h., String existiert nicht), für iProduct 2 und für iSerialNumber 3 eingetragen (etwas unübersichtlich): (Alle Codeausschnitte aus der ganz oben angehängten Datei ch552-turbo51.zip -> usb.pas)
1 | |
2 | device : array [1..9] of word = ($112, $110, 0, $4000, vid, pid, rev, $200, $103); |
3 | $200 = $00 für iManufacturer, $02 für iProduct |
4 | $103 = $03 für iSerialNumber |
Diese Strings sind im Code allerdings korrekt (wie ich meine) vorhanden:
1 | lang : array [1..4] of byte = ( 4, 3, 9,4 ); |
2 | prod : array [1..12] of byte = ( 12, 3, 90,0, 97,0, 100,0, 105,0, 103,0 ); |
3 | serial : array [1..12] of byte = ( 12, 3, 49,0, 50,0, 51,0, 52,0, 53,0 ); |
Language ist 0409, Productstring ist "Zadig" (Unicode) und Serialstring ist "12345" (Unicode). USB Device Tree Viewer gibt Fehlermeldungen für iProduct und iSerialnumber. Diese Strings kann ich aber mit meinem PC-Programm über die libusb-Routinen auslesen, das klappt. Der zugehörige Code in der Turbo51 USB-Unit ist demnach auch korrekt (case-Abfrage im Quelltext)
1 | ... |
2 | {product} $302 : begin |
3 | move( prod, buf0, sizeof( prod ) ); |
4 | stage := data; |
5 | ... |
Frage: Warum zeigt der USB Device Tree Viewer "String descriptor not found"?
1 | ------------------ Device Descriptor ------------------ |
2 | bLength : 0x12 (18 bytes) |
3 | bDescriptorType : 0x01 (Device Descriptor) |
4 | bcdUSB : 0x110 (USB Version 1.10) |
5 | bDeviceClass : 0x00 (defined by the interface descriptors) |
6 | bDeviceSubClass : 0x00 |
7 | bDeviceProtocol : 0x00 |
8 | bMaxPacketSize0 : 0x40 (64 bytes) |
9 | idVendor : 0x6666 |
10 | idProduct : 0x5500 |
11 | bcdDevice : 0x123 |
12 | iManufacturer : 0x00 (No String Descriptor) |
13 | iProduct : 0x02 (String Descriptor 2) |
14 | *!*ERROR String descriptor 2 not found |
15 | iSerialNumber : 0x03 (String Descriptor 3) |
16 | *!*ERROR String descriptor 3 not found |
17 | bNumConfigurations : 0x01 |
USB ist für mich zu kompliziert, ich finde keine Erklärung. Vielleicht kann ein usbman mir weiterhelfen? :-) Gruß Erni
zeig doch mal den kompletten Output von USB TreeView für dein Device. UsbTreeview hat die Eigenschaft die Strings erst korrekt anzuzeigen wenn ein SetConfigure erfolgt ist. Das ist ein Bug da die Strings auch vorher schon gültig sind. Dein Device Descriptor ist zwar korrekt Class sollte aber auf 0xFF stehen. Deine Datastage wertet nicht wLength aus. Ein USB Device darf max. wLength Bytes senden ggv aufgeteilt in bMaxPacketSize0 Häppchen. Sind weniger Daten vohanden dann eben nur bLenth. Die procedure trans ist sehr (zu) stark verweinfacht. Strings werden bei usb1.1 mit wlength 0xFF abgefragt.
Hallo Thomas, vielen Dank für die Unterstützung! Ich habe die Ausgabe vom USB Device Tree Viewer hier angehängt. Für mich war es schön, einen kompakten USB-Code für den Controller zu haben, der so weit auch für meine Anwendung funktioniert. Deinen Hinweis, die Device Descriptor Class zu korrigieren, werde ich berücksichtigen. Die Überprüfung der max. Übertragungs-Bytes muß ich bei meiner Programmierung sicherstellen. Bisher habe ich immer nur 64-Byte Blöcke übertragen (bulk_read/bulk_write). Da ich zu doof bin ein CDC-Interface für den CH552 zu schreiben, lenke ich dort die Ein-/Ausgaben in ein Text-File (var usb:text;), welche in dem Endpoint-Buffer landen. So kann ich ganz normal mit readln(usb,string) oder readln(usb,real) bzw. writeln(usb,'zweiPi=',2*Pi) arbeiten. Auch auf der PC-Seite ist der Aufwand mit libusb0 sehr gering. Die Fehlermeldungen vom USB-D-T-V verschwinden ja, wenn ich die String-Indexe auf 0 setze, für eine Auswertung kann ich die Strings mit usb_get_string_simple über die libusb0 bekommen. Wenn diese Fehlermeldungen nur eine Eigenart des USB-Viewers sind, kann ich gut damit leben :-) TURBO51 ist eine schöne Spielerei und weckt Erinnerungen. Nochmals vielen Dank für die Hilfe! Gruß Erni
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.