Turbo51 und CH55x

Gast #7552341
Lesenswert?

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

Angehängte Dateien:
Gast #7552392
Lesenswert?

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.

#7552844
Lesenswert?

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.

Angehängte Dateien:
Gast #7571736
Lesenswert?

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

#7571835
Lesenswert?

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.

Gast #7571887
Lesenswert?

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

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren