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...
:
Verschoben durch Admin
Sehr spannend, ich hatte ein IDS-52-Basic, Das ist richtig gut. Kennt Das noch jemand?
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
Hier noch ein kleines Programmbeispiel für ein Lauflicht auf allen 16 Ausgängen in MCS51 Basic:
1 | 5 REM Uhr einschalten |
2 | 10 CLOCK 1 |
3 | 20 FOR I = 0 TO 15 |
4 | 30 GOSUB 1000 |
5 | 40 REM Uhr zurücksetzen |
6 | 50 TIME = 0 |
7 | 55 REM 1/10 Sekunde Licht an |
8 | 60 IF TIME < 0.1 THEN GOTO 60 |
9 | 70 GOSUB 1050 |
10 | 80 NEXT I |
11 | 90 GOTO 20 |
12 | |
13 | 990 REM Einschalten des Ports I |
14 | 1000 P = 2 ** I |
15 | 1010 PORT = PORT .OR. P |
16 | 1020 PORTX = PORT |
17 | 1030 RETURN |
18 | 1040 REM Ausschalten des Ports I |
19 | 1050 P = 2 ** I |
20 | 1060 PORT = PORT .AND. (65535-P) |
21 | 1070 PORTX = PORT |
22 | 1080 RETURN |
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
:
Bearbeitet durch User
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? |
8 | .. |
9 | das ist hier ist aber auch auskommentiert: |
10 | ;***************************************************************************** |
11 | ;******* New baudrate detection ********************************************** |
12 | ;******* Wulf 3 alteration 1 ************************************************* |
13 | ; PS3 dragged the old baudrate detector in to save space |
14 | ; plus we know that we don't have any exotic MC here |
15 | BG1: |
16 | ; CLR A ;DO BAUD RATE |
17 | ; MOV R3,A |
18 | ; MOV R1,A |
19 | ; MOV R0,#4 |
20 | ;BG11: JB RXD,BG11 ;LOOP UNTIL A CHARACTER IS RECEIVED |
21 | ; ; |
22 | ;BG2: DJNZ R0,BG2 ;FOUR CLOCKS, IN LOOP |
23 | ; CALL DEC3211 ;NINE CLOCKS |
24 | ; MOV R0,#2 ;ONE CLOCK |
25 | ; JNB RXD,BG2 ;TWO CLOCKS, LOOP UNTIL DONE |
26 | ;BG4: JB RXD,BG4 ;WAIT FOR STOP CHARACTER TO END |
27 | ;BG5: JNB RXD,BG5 |
28 | |
29 | ... |
30 | ;BG10: cjne r1,#B9600,BG12 ;jump if wrong fast baud rate |
31 | ;BG11: orl PCON0,#080h ;setb smod for fast mode |
32 | ; sjmp BG13 |
33 | ; |
34 | ;BG12: cjne r1,#B4800,BG14 ;jump if wrong slow baudrate |
35 | ;BG13: setb BD ;enable baudrategenerator |
36 | ; sjmp BG15 |
37 | ... |
38 | oder kann ich hier z.B. fest 9600 Baud einstellen (MOV A,#96 ?): |
39 | SBAUD: CALL AXTAL ;PUT CRYSTAL ON THE STACK |
40 | CALL EXPRB ;PUT THE NUMBER AFTER BAUD ON STACK |
41 | MOV A,#12 |
42 | ACALL TWO_R2 ;TOS = 12 |
43 | ACALL AMUL ;TOS = 12*BAUD |
44 | ACALL ADIV ;TOS = XTAL/(12*BAUD) |
45 | ACALL IFIX |
46 | ACALL CBIAS |
47 | MOV DPTR,#SPV |
48 | ... |
Peter
:
Bearbeitet durch User
Peter S. schrieb: > Das 2te 32k SRam, ein GM76C88AL ist leider auch eingelötet Das ist kein 32k-SRAM, sondern nur ein 8k-SRAM. http://pdf1.alldatasheet.com/datasheet-pdf/view/108055/LG/GM76C88AL.html
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?
:
Bearbeitet durch User
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.
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.