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.
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:
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"?
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