Forum: Mikrocontroller und Digitale Elektronik Turbo51 und CH55x


von Erni (pudding)


Angehängte Dateien:

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

von Harald K. (kirnbichler)


Lesenswert?

Unterscheidet sich der Turbo51-Download in irgendeiner Weise von dem auf 
dessen Homepage 
(https://turbo51.com/download-free-pascal-compiler-8051)?

von Erni (pudding)


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.

von Erni (pudding)


Lesenswert?


von Thomas Z. (usbman)


Angehängte Dateien:

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.

von Erni (pudding)


Lesenswert?

Ahh, super!
Spart viel Arbeit.
Danke!

von Erni (pudding)


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

von Thomas Z. (usbman)


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.

von Erni (pudding)


Angehängte Dateien:

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

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.