PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Alter Motor-Controller mit PIC16F84



Der Eisvogel
22.09.2013, 22:35
Hallo,

ich habe hier einen alten Motor-Controller, vermutlich aus dem Jahr 2000, mit einem PIC16F84 vor mir liegen. Die Software auf dem Controller reagiert auf ein bestimmten Protokoll eines Two-Line-Bus-Systems. Ich kann ihn somit ansteuern. Da mehrere Motor-Controller an einem Bus hängen können reagieren sie alle auf unterschiedliche Adressen im Bus-System. Hier ein Auszug aus dem Schaltplan des Motor-Controllers:
26449

Wobei die linke Seite der Pins 1, 2, 4 und P an 5V hängen und die rechte Seite von 1, 2 und 4 an RA1, RA3 und RA2 angeschlossen sind. Der rechte Pin von P ist an MCLR des PIC angeschlossen. Wenn ich das richtig verstehe sollte man durch verbinden dieser Pins die Adresse auf die der Controller reagiert einstellen können. Auf bereits adressierten Controllern sind diese Pins aber nicht mit einer Lötbrücke oder ähnlichem verbunden. D. h., dass der Controller die Adresse irgendwie einlernen muss, während die entsprechenden Pins verbunden sind. Aber wie bringe ich den PIC dazu das zu tun? Durch Verbinden von MCLR mit 5V, also den zwei P-Pins, passiert leider nichts. Jetzt habe ich herausgefunden, dass PICs durch anlegen einer Programmierspannung von ca. 13V an MCLR in den Programmiermodus gehen. Ist es möglich, dass der PIC in diesem Modus das an RA1 bis RA3 anliegende Signal einliest und abspeichert? Oder funktioniert sowas komplett anders?

Ich freue mich auf eure Antworten.

MfG
Der Eisvogel

witkatz
23.09.2013, 11:45
Im Programmiermodus (13V an MCLR) wird der Speicher des PIC seriell über RB6/RB7 beschrieben. Das macht man normalerweise nicht händisch sondern mit einem Programmer, um eine neue "Firmware" in den PIC zu flashen. Das hat also mit deinem Adressieren über RA1 bis RA3 nichts zu tun. Das Adressieren über RA1 bis RA3 ist ein Teil der Anwendung, die auf dem PIC läuft.

Wenn die Adresse über RA1 bis RA3 nach einem MCLR - Reset eingelesen werden soll (und wahrscheinlich im EEPROM gespeichert), dann muss der MCLR ausgeführt werden -> MCLR kurz auf Masse ziehen.

Den Quellcode hast du wahrscheinlich auch nicht, oder? Sonst könnte man die Funktion reverse engineeren. Leider sieht man den Rest der Schaltung nicht, wie der MCLR verschaltet ist. Also mal spekulativ angenommen, dass der MCLR Pin des PIC über einen Widerstand auf Masse liegt, dann wird der Reset ausgeführt, wenn der Jumper gezogen wird. Also mein Vorschlag zum ausprobieren: Adresse jumpern, P-Jumper ziehen, P-Jumper stecken, ein paar Sekunden warten, Adressjumper entfernen und gut ist. Ist der P-Jumper gesetzt (und bleibt gesetzt!) und der MCLR Pin liegt auf 5V, dann sollte der PIC normal arbeiten.

Gruß
witkatz

Der Eisvogel
23.09.2013, 13:37
Hallo witkatz,

vielen Dank für deine Antwort. Ich hab das mal eben probiert, aber leider zeigt dieses Vorgehen keine Veränderung.

Hier mal der ganze Schaltplan, so wie er überliefert ist:
26452

Leider habe ich nur den Schaltplan, nicht aber den Source-Code. Der ist leider nicht mehr zu haben.

MfG
Der Eisvogel

witkatz
23.09.2013, 15:23
Der P-Jumper zieht wirklich nur den MCLR auf 5V, damit im laufenden Betrieb kein Reset möglich ist. Zum Programmieren mit einem Programmer muss der Jumper gezogen werden, ansonsten bleibt er drauf.
Über die Adress-Jumper an RA1 bis RA3 wird wohl die Adresse eingestellt. Wie kommst du darauf, dass der "Controller die Adresse irgendwie einlernen muss"? Mir fehlt in der Schaltung ein Auslöser für das Einlernen. Passiert das vielleicht automatisch durch Power-on-Reset? Also aus, Adresse jumpern, Ein/Aus, Adressjumper entfernen, einschalten und alles ist gut? Oder sind die Adressjumper invertiert, alle haben jetzt Adresse 7 und laufen gemeinsam im Testlauf? Oder kommt über den Bus ein Adressier-Befehl?
Ohne eine Funktionsbeschreibung ist das alles nur geraten...

Der Eisvogel
23.09.2013, 15:35
Hallo witkatz,

ich habe hier ein Set Motoren, die von 1 bis 6 bereits durchadressiert sind. Diese lassen sich durch Befehle im Bussystem ansprechen. Die Befehle von 0x00 bis 0x07 gelten für alle Motoren. Ab 0x08 stehen die letzten drei Bits für den zu addressierenden Motor. Da reagiert also nur noch jener, der mit der entsprechenden Adresse eingelernt wurde. Wenn ich den Befehl 0x52 (0b01010010) über das Bus-System schicken, dann dreht sich Motor zwei (0b010) nach links. Die anderen Motoren, die ich hier noch liegen habe befinden sich alle im Testlauf. Lege ich auf die Daten- oder Taktleitung ein Null-Signal, dann dreht der Motor sich entsprechende links oder rechts rum. D. h., die Motoren reagieren noch gar nicht auf das Bus-System. Bei den bereits adressierten Motoren sind die Jumper alle nicht gebrückt. Deswegen gehe ich davon aus, dass man es irgendwie einlernen muss, sonst würden sie ja nicht wissen auf welche Adresse sie reagieren müssen. Wenn ich die Jumper also setze und den Controller anschalte, passiert aber leider nichts.

Gibt es bei so einem PIC eventuell die Möglichkeit den Speicher wieder auszulesen um somit an den Source zu kommen?

MfG
Der Eisvogel

witkatz
23.09.2013, 20:12
Wenn ich die Jumper also setze und den Controller anschalte, passiert aber leider nichts.
Was passiert wenn du genau das tust, danach ausschaltest, Jumper ziehst und wieder einschaltest?
Meine Idee war, dass das Adressieren vielleicht nach dem Power-On-Reset automatisch geschieht.
Ich nehme an, dass die Befehlsliste keinen Adressier-Befehl enthält?

Ja, man kann versuchen den Programmspeicher mit einem Programmer auszulesen und zu disassemblieren, wenn Code Protection nicht aktiviert wurde.

Der Eisvogel
23.09.2013, 21:12
Hallo witkatz,

mein derzeitiges Vorgehen:

Plus und Minus des Motor-Controllers an GND hängen (zum vollständigen Entladen der Elektronik
Jumper setzen
Controller anschalten
Kurz warten
Controller ausschalten
Jumper ziehen
Controller einschalten


Wenn ich diese Schritte durchführe schaffe ich es, dass der Controller nicht mehr auf den Testlauf reagiert, aber auch auf keine anderen Befehle über den Bus. Es gibt ein paar Befehle, worauf er dann doch reagiert, aber da geht er dann wieder zurück in den Testlauf. Es scheint also so, als ob es doch einen Befehl geben muss, der dem Controller quasi bestätigt, dass er jetzt eine neue Adresse hat. Der Befehl scheint aber nicht gelistet zu sein. Also heißt es wohl ausprobieren. Oder hast du noch eine andere Idee?

PS: Was mir grad noch einfällt, dass dieses Prozedere nur jedes zweite Mal funktioniert.

MfG
Der Eisvogel

witkatz
24.09.2013, 09:20
Da ist noch der Endschalter, der vielleicht noch eine Rolle spielen könnte, sonst habe ich keine Idee mehr. Möglicherweise wurde die Adresse hart codiert?
Vielleicht hat jemand so was ähnliches schon mal realisiert und könnte einen Tipp geben, wie man am besten eine PIC Adressierung für Busbetrieb vornimmt. Ansonsten ist es wohl kein allgemeines PIC Thema mehr...

Peter(TOO)
24.09.2013, 10:58
Hallo,

Also allgemein üblich wäre, dass man die Jumper steckt und gut ist.

Der µP fragt die Pins dann bei jedem Reset ab und hat so seine Busadresse.

MfG Peter(TOO)

Der Eisvogel
24.09.2013, 19:46
Hallo,

also es scheint auch mit dem Endschalter zusammenzuhängen. Wenn ich mein Prozedere durchführe und dann den Endtaster einmal betätige, dann reagiert der Controller auf bestimmte Befehle. Aber sobald ein anderer Befehl kommt, ist er wieder im Testlauf, genauso wie nach dem Neustart. Aber die Befehle haben nichts mit den eigentlichen Befehlen der Befehlsliste zu tun. Da das Bus-System nicht ganz taktabhängig, sondern auch zeitabhängig ist, könnte es sein, dass das Quarz nicht mehr mit der ursprünglichen Frequenz schwingt? Wie kann ich das am besten nachmessen?

MfG
Der Eisvogel