Durch einen Zufall ist bei mir ein Rudel SPS der Firma Kloeckner-Moeller
vom Typ PS3-DC aufgeschlagen.
http://www.klocknermoeller.com/automation/ps3-dc.htm
Da es dazu zwar noch einige Unterlagen gibt, aber keine Software, die
irgendwie brauchbar wäre oder sinnvoll zu benutzen, habe ich mal eine
aufgeschraubt und angefangen, durchzuklingeln. Die sogen. AWL
Programmiersprache ist eine einzige Katastrophe und völlig
undurchsichtig. Damit beschäftige ich mich nicht.
Der Aufbau besteht aus einem MC vom Typ 8052, 2 Portbausteinen 82C55,
einem 4-Kanal 12bit ADC UPD7002 und einem 1 Kanal DAC UPD7011.
Dazu kommt ein 8253 Timerbaustein und eine RTC vom Typ UPD4990C.
Ein 8k Static RAM (HN6264) sowie ein 28-poliger Leersockel mit JEDEC
Pinout halten die Anwenderprogramme. Kommuniziert wird über RS485 auf
DIN Buchsen(!).
Die PS3 SPS hat 16 Digital Eingänge und 16 Digitalausgänge auf
Anschlussklemmen, die Analogports (0-10V) laufen über eine 8 polige DIN
Buchse seitlich am Hutschienengehäuse. Alle Digitalports sind galvanisch
getrennt von der Versorgungsspannung (24V/180mA ohne Last).
Eingänge sind I.0 bis I.15, Ausgänge sind O...0 bis O...15.
Das Ziel ist es, 8052AH Basic mit Anpassungen an die Hardware in einen
AT89S52 zu programmieren. Dazu passe ich erstmal meinen alten Monitor
auf die Hardware an und schreibe mit ihm Unterroutinen für die Hardware
in der PS3.
Hier ein paar Erkenntnisse:
Adressmapping:
0000h-3FFFh = Leersockel JEDEC
4000h-7FFF = 8k SRAM batteriegepuffert
8000h-8FFFh = 82C55 Nummer 1 (Port A = I.0 - I.7, Port B = O...0 -
O...7)
9000h-9FFFh = 82C55 Nummer 2 (Port A = I.8 - I.15, Port B = O...8 -
O...15)
A000h-AFFFh = UPD7002 ADC
B000h-BFFFh = UPD7011 DAC
C000h-FFFFh = 8253 Timer/Counter
Der RAM ist /RD&/PSEN verANDet, so das Maschinencode im RAM ausgeführt
werden kann und der RAM mit MOVX beschrieben und gelesen werden kann.
Der MC ist maskenprogrammiert, aber gesockelt und kann leicht gewechselt
werden.
Fortsetzung folgt...
IDS Basic ist im Netz nicht mehr zu finden, aber es gibt ein paar Leute,
die das Intel 8052AH Basic aufpoliert und durchsichtig gemacht haben.
Suchbegriff ist z.B.:
'version_1p3_assembler.asm' - letzte Version des 'aufpolierten' 8052AH
Basic
Site mit einigem Krimskrams dazu:
http://www.nomad.ee/micros/
Für die Kloeckner Moeller SPS muss das ganze ein wenig geändert werden,
Vollduplex Kommunikation z.B. geht nicht, da wir es ja mit RS485 zu tun
haben.
Hier läuft aber der Monitor schon und es gibt Routinen, um die Ports der
PS3 zu setzen. Auch der AD Wandler wird bereits angesprochen.
Es fehlt eigentlich im Moment nur der DAC, denn das Intel Basic hat
schon eine Echtzeit Uhr drin, die bei der PS in Hardware ist, aber nicht
so einfach anzusprechen, da sie über eine der 82C55 und P1.0 läuft -
muss ich weiter dran spielen. Wozu man den 8253 Timer benutzen kann,
weiss ich auch noch nicht.
Mehr Hardware Info - Belegung des Port 1 des MC:
P1.0 - DataOut von UPD4990AC RTC
P1.1 - Power LED
P1.2 - Run LED
P1.3 - Kurzschluss Erkennung LED
P1.4 - Reset für die beiden 82C55
P1.5 - /Driver Enable für RS485 (RX/TX Umschaltung)
P1.6 - 2QA von 74393 Zähler
P1.7 - 2A zum 74393 Zähler
Port 3
P3.0/3.1 - UART RS485
P3.2 - /INT0 Vom Netzteil Kurzschlussdetektor
P3.3 - /INT1 von OUT2 des 8253 Timers
P3.4 - T0 ist frei
P3.5 - T1 von galv. isolierter RCA Buchse 'Counter'
P3.6/3.7 - WR/RD für Peripherie
Edit: Nanu, warum plötzlich in 'µC & Elektronik'? Falls es nicht
aufgefallen ist, ich stelle keine Fragen, sondern ein Projekt im
Wachstum vor. Das Verschieben hierhin ist also nicht sinnvoll, denn die
Überschrift in diesem Forum lautet:
> Für alle Fragen rund um Mikrocontroller und sonstige digitale Elektronik
Anbei nun ein wenig Hardware zum Kommunizieren mit der PS3 und der
Monitor in MCS51 Assembler.
Das o.a. Adapter basiert auf einem Standard UART Anschluss mit CMOS oder
TTL Pegeln, wie es z.b. aus einem FTDI USB-UART Chip herauskommt. RS485
ist normalerweise symmetrisch ausgelegt, das spare ich mir aber und lege
stattdessen Signal A auf halben CMOS Pegel. An Signal B liegen die UART
Signale, die Diode zieht das Signal bei aktivem Sender auf GND.
Das erkennt der Empfänger der PS3 ohne Probleme.
Ebenfalls angehängt ist der kleine Monitor, den man am besten mit z.B.
Mide-51 und dem ASEM - 51 von W.W. Heinz in einen AT89S52 o.ä. flasht.
Der originale MC ist auf der mittleren Platine und der einzige
gesockelte Chip bis auf den JEDEC Leersockel. Die Baudrate ist beim
Starten auf 1200 Baud eingestellt, kann aber mit dem B(aud) Befehl
geändert werden. Ein '?' auf der Kommandozeile zeigt eine Hilfe für den
Monitor an.
Dieser wurde um ein paar PS3 spezifische Kommandos erweitert. So zeigt
z.B. 'P0' den Zustand des Eingangs I.0 an und 'P0 1' setzt Ausgang Q...0
auf EIN.
'A0' zeigt den AD Wert an Kanal 0 an, W80 schreibt den DAC mit Wert 80H
= 128.
Alle Werte auf der Eingabezeile werden als Hex interpretiert. 'PF' zeigt
also Port I.15 an.
So, das MCS52 BASIC springt auch schon an. Nachdem ich den leeren JEDEC
Sockel mit einem 32kByte SRAM a là 62256 bestückt habe, zeigt mir BASIC
knapp 16000 freie Bytes an, was ganz schön viel ist. Leider wird durch
das dämliche Adressschema der PS3 (vier 16kByte Blöcke) nur die Hälfte
des RAMs genutzt - aber kost' ja so gut wie nix.
Anzupassen gilt es jetzt noch die Routinen für den batteriegepufferten
RAM und ein paar neue Befehle für die Ports, DAC und ADC.
Ja cool! Als ich die Hardwareaufzählung gelesen habe, habe ich sofort
gedacht, das passt! Ich weis noch... 8052AHB oder auch 8052+ Eprom mit
Basic drinne... dazu noch den Keil-Assembler... im Mix...
its a long time ago ;-
Weiterhin viel Spaß und Erfolg
Viele Grüße
Uwe
So, das Intel BASIC läuft gut und hat nun die meisten Anpassungen hinter
sich. Ich habe mich dazu entschlossen, die Statements für den Timer 2
durch neue zu ersetzen, da der Timer2 sowieso für die RS485 besetzt und
nicht verfügbar ist.
Neue Funktionen:
ADCCH -> setzt und liest den gewählten Analogkanal für den ADC
PORTX -> Setzt und liest die Digitalports der PS3
ADCDAC -> liest einen 12-bit Wert vom ADC oder schreibt den 8-bit DAC
Da die PS3 batteriegepufferten RAM hat, sind sämtliche EPROM/EEPROM
Routinen nun in Nullkommanichts fertig.
Z.B. mit 'PROG2' speichert man ein Programm aus dem RAM und richtet es
als Autostarter ein. Mehrere verschiedene Programme können gleichzeitg
im NVRAM gepuffert werden. Eine recht genaue Uhr ist im Intel BASIC auch
schon vorhanden, mit 5ms Auflösung.
Ich teste jetzt noch ein wenig mit anderen Exemplaren und poste dann den
Code.
Hier mal die erste Version des Intel BASIC mit Erweiterungen für die
PS3. Das ist ein langes Stück MCS-51 Assembler mit ausführlichen
Kommentaren für den interessierten Leser. Anbei auch das Hex zum
direkten Programmieren eines z.B. AT89S52. Der MC wird nahezu komplett
beschrieben, es sind noch 13 Bytes frei. Denk dran, in den leeren JEDEC
Sockel vor dem Einschalten einen 32kByte SRAM zu stecken, wie oben
erwähnt, sonst geht nichts.
Ich möchte die Mods auch bitten, den Thread wieder zurück in 'Projekte &
Code' zu verschieben, da er im MC Fragen Thread nichts verloren hat.
Ich hörte gestern auch noch von einem Lager mit reichlich PS4 SPSen von
Kloeckner Moeller, vllt. gehts also auf diesem Modell in einiger Zeit
weiter.
ALs Ergänzung sei angemerkt, das die AC Version (PS3-AC, rotes Label
statt blau) völlig ungeeignet zum Umbau ist.
Hier sitzt das Programm nicht im MC wie bei der PS3-DC, sondern in einem
EPROM, welches den JEDEC Sockel belegt, der MC ist fest auf /EA gelötet
(ja - eingelötet) und der Umbau auf Basic erfordert tiefe Eingriffe ins
Layout. Es muss der /EA Anschluss befreit werden und auch der JEDEC
Sockel führt kein /WE Signal. Vergiss es...
Habe heute auch meine PS3-DC aus der Bucht bekommen.
Freu :-;
Leider 8052 CPU fest eingelötet.. argh!!
D.h. auch bei DC muss kein Sockel für den 8052 vorhanden sein :-(
Das bedeutet:
Flachkabel ablöten
IC auslöten
Sockel einlöten
Dann 62256 32k SRam gesteckt (da war ein Sockel) und AT89S52 mit der Hex
zum Projekt geflasht.
Habe dann ersteinmal provosorisch ein USB-TTL Wandler angeschlossen
Wandler - Platine
GND - GND (Pin 20 am AT89S52)
+5V - +5V (Nahe Pin 40 am AT89S52)
Rx - Tx = Pin 11 am AT89S52
Tx - Rx = Pin 10 am AT89S52
War nicht sicher, ob der kleine Wandler mir seinen max. 400-500mA das
schafft.. aber ging.
Die Rx+Tx direkt am Pin werde dich wohl noch anders lösen.
Muss auch noch entscheiden, ob ich alles wieder in eine PS3-DC
zurückbaue oder es einfach so getrennt lassen. Die Ports (8255)
sollte ja am Flachbandkabel verbunden sein.
Werde wohl da ich RS485 dann nicht brauche auch auf 9600 Baud
gehen.
Peter
Bei dir sieht das blaue Label auf der Front noch richtig gut aus. Bei
meinen Exemplaren waren durch die auslaufenden Ladyzellen dadrunter die
Papierchen völlig vergammelt und man konnte nichts mehr lesen.
Peter S. schrieb:> Leider 8052 CPU fest eingelötet.. argh!!> D.h. auch bei DC muss kein Sockel für den 8052 vorhanden sein :-(
Zu dumm. So lob' ich mir die deutsche Industrie, fest verlötete, nicht
upgradebare Firmware drauf.
Peter S. schrieb:> Werde wohl da ich RS485 dann nicht brauche auch auf 9600 Baud> gehen.
Das kannst du auch mit der RS485, die Hardware müsste bis 56k eigentlich
alles mitmachen. Nur das mit den DIN Buchsen ist - eh,
gewöhnungsbedürftig.
Peter S. schrieb:> Muss auch noch entscheiden, ob ich alles wieder in eine PS3-DC> zurückbaue oder es einfach so getrennt lassen.
Der Zusammenbau ist auch ein Spass der besonderen Art. Selten ein
dämlicheres Patent gesehen, als diese Zwischenpappen und- bleche. Ist
recht fummelig. Allerdings sind sie lose noch viel unhandlicher - ich
hatte immer Angst, die komischen Flachbandkabel abzureissen.
Frage: Das 2te 32k SRam, ein GM76C88AL ist leider auch eingelötet :-(
Dorthin kann man Basic Programme sichern und wenn Stützbatterie dran
ist,
bleiben die Daten dort dann auch erhalten..? Korrekt?
Alternativ auslöten, sockeln und ein 28C256 EEprom einsetzen..?
---
1
Um wieder die autom. Baudratenerkennung zu aktivieren reicht es dazu
2
den Kommentar zu entfernen:
3
; PS3 do not tamper with the baud rate
4
; LCALL RCL
5
6
??
7
Oder wird Timer2 dazu benötigt und der ist anderweitig vergeben?
Peter S. schrieb:> das ist hier ist aber auch auskommentiert:
Du kannst gerne das alles wieder reinziehen, ist aber überflüssig, denn
da ist kein Dallas MC verbaubar. Ausserdem ist der Platz im Flash echt
knapp, wenn du weiterhin die SPS Ports ansprechen möchtest.
Der Timer 2 ist fest für die Baudrate vergeben und ausserdem aus Basic
nicht mehr ansprechbar, weil ich die entsprechenden Routinen
rausgeschmissen habe, um Platz für die Peripherie der PS3 zu schaffen.
Peter S. schrieb:> oder kann ich hier z.B. fest 9600 Baud einstellen (MOV A,#96 ?):
Probiers aus. Ich habe jetzt schon länger nicht mehr im Code rumgewühlt.
Der 8k RAM ist per Batterie gepuffert und hält mit den 2 Ladyzellen
Jahrzehnte. Es ist vermutlich sinnlos, da rumzulöten, um einen EEPROM
einzubauen. Die Batterien werden auch nur dann angenuckelt, wenn die SPS
stromlos ist.
Hier die orig. Basic 1.3.1 Version lauffähig auf PS3-DC.
Nur 16kb SRam+8kb batt. SRam (also Standardbausteine mit PS3
Adressbereiche)
und 9600 Baud mit Autoerkennung werden unterstützt.
Noch keine der speziellen PS3-DC Bausteine werden hier unterstützt!
Man muss auch nach dem Einschalten etwa 30s warten bevor sich Basic nach
drücken der Space Taste meldet..?
Kann sein, das das mit den nicht unterstützen Bausteinen
zusammenhängt..?
Das Grund das ich das mit dem orig. Basic probiert hatte war, das die
hier vorgestellte und angepasste Version nur mit 1200 Baud lief und auch
nur unidirektional (RS485). Noch schlimmer aber war, das es bei mir
extrem instabil 'lief'. Nach fast 5-10s spontane Resets..? Ich dachte
erst an Fehler durch das Auslöten der CPU.. das war/konnte es aber nicht
mehr sein.
Kann aber sein, weil ich keine I/O Ports/Hardware dran habe, das da auch
etwas über offene Ports zu solchen Effekten führt..?
Nun die erarbeiteten Routinen von Matthias können ggf. bei Bedarf auch
wieder in diese Version übernommen werden..
Mit dieser Version läuft die geschlachtete PS3 Platine nun seit 30min
stabil ohne Resets etc.
Peter
Peter S. schrieb:> Mit dieser Version läuft die geschlachtete PS3 Platine nun seit 30min> stabil ohne Resets etc.Peter S. schrieb:> Man muss auch nach dem Einschalten etwa 30s warten bevor sich Basic nach> drücken der Space Taste meldet..?
Nicht bei meiner Version.
Peter S. schrieb:> das die> hier vorgestellte und angepasste Version nur mit 1200 Baud lief und auch> nur unidirektional (RS485)
Da verwechselst du was. RS485 ist keineswegs unidirektional, sondern
lediglich halbduplex. Natürlich kann die PS3 auch z.B. PRINT Kommandos
an die RS485 senden.
Peter S. schrieb:> Noch schlimmer aber war, das es bei mir> extrem instabil 'lief'. Nach fast 5-10s spontane Resets..?
Hier nicht. Lief schon tagelang am Stück mit irgendwelchen BASIC
Programmen. Ich vermute (das hatte ich bei einer der Dinger) das da
ein,zwei der kleinen Tantalpillen explodiert sind und da irgendwas mit
der Hardware faul ist.
Hallo zusammen,
ich hatte vor längerem auch schon mit der Basic Version auf meiner PS3
gespielt aber nun ja... Das mag ja vor 30 Jahren noch ganz nett gewesen
sein aber heute bekomm ich das Grausen bei dem ollen Interpreter. Also
fix mal nen ATmega162 mit Bootloader bespielt und anstelle des AT89S52
in den Sockel gepackt. Reset Pin nach außen gebogen et voilà. Die PS3
lässt sich nun auch über den Bootloader bespielen. Eingänge, Ausgänge,
DA Wandler funktionieren wunderbar.
Was allerdings nicht funktionieren will ist der AD Wandler.
Zuerst lese ich das Control-/Statusregister: Busy = 1 (=not Busy) und
EOC = 0 (=conversion completed)
Starte dann die Wandlung durch schreiben von 0x8c ins Controlregister
(Abgeschaut im Basic wo der AD Wandler ja einwandfrei funktioniert)
Wenn ich jetzt das Statusregister wieder lese ist Busy = 0 (=Busy) und
EOC = 1 (=conversion not completed)
Soweit OK. Allerdings wird die Wandlung anscheinend nie abgeschlossen da
Busy auf 0 und EOC auf 1 bleibt.
Timing Probleme mit dem alten Teil? Habe schon die Taktfrequenz auf
unter 1MHz gesetzt,das Ergebnis bleibt aber gleich...
Jemand ne Idee woran das liegen könnte?
Thomas G. schrieb:> Das mag ja vor 30 Jahren noch ganz nett gewesen> sein aber heute bekomm ich das Grausen bei dem ollen Interpreter.
Wenn du bei dir auch gleich noch Gleitkomma mit drin hast - Respekt.
Ansonsten wäre mir das zu viel Arbeit und ich müsste ja dann in C
schreiben? Oder wie willst du den RAM nutzen? AVR ausm RAM laufen lassen
ist nicht trivial.
Aber der ADC funktioniert hier bestens. Wie gehst du denn mit /WR und
/RD um?
Mit dem ollen Interpreter meinte ich hauptsächlich Basic an sich.
Und ja, ich möchte die PS3 dann lieber in C programmieren eben weil auch
speziell dieses Basic mir nicht unbedingt liegt.
Im Grunde wollte ich probieren ob es mit dem AVR überhaupt funktioniert.
Für später hatte ich dann mal was in Richtung Modbus angedacht.
Den externen RAM nutze ich im Moment nicht, kann ihn aber ohne Probleme
ansprechen. Der AVR bringt ja auch erstmal sein eigenes mit.
/WR und /RD überlasse ich dem external memory interface. Habe auch schon
versucht die Adress- und Datenleitungen sowie /RD und /WR von Hand zu
Fuß im Schneckentempo anzusteuern, komme aber auch dabei zu gleichen
Ergebnis wie mit dem external memory interface.