Warum schalten meine 80C51-Pins nicht um?

Ich arbeite mit einem 80C51-Derivat, dem P89C668HFA . Im Moment versuche ich, einige sehr grundlegende Funktionen daraus zu machen - ich möchte nur 1) das ALE-Umschalten deaktivieren und 2) die E / A-Ports zum Umschalten bringen. Ich habe ein wenig Code geschrieben, um dies zu erreichen:

    MOV 08EH,#003H ; set lowest bit of AUXR low to disable ALE toggling
START:
    MOV 080H,#000H ; Port 0
    MOV 090H,#000H ; Port 1
    MOV 0A0H,#000H ; Port 2 
    MOV 0B0H,#000H ; Port 3
    MOV 080H,#0FFH
    MOV 090H,#0FFH
    MOV 0A0H,#0FFH
    MOV 0B0H,#0FFH  
    SJMP START
END

Die Ausgabe meines Assemblers stimmt mit der handgefertigten Binärdatei überein, mit der ich begonnen habe. Wenn ich das Gerät aus dem Reset nehme, schaltet der ALE-Pin immer noch um, aber nicht PSEN#, und die I/O-Port-Pins sind alle hoch. Angesichts dieser Informationen und der Tatsache, dass ich das Gerät erfolgreich programmieren und überprüfen kann, ob das Programm korrekt ist, glaube ich, dass das Gerät ordnungsgemäß funktioniert, aber es scheint, dass der Code nicht richtig ausgeführt wird (wenn überhaupt).

Ich würde mich über Gedanken zum Thema, Threads, auf die ich zurückgreifen könnte, usw. freuen. Danke.

Wird der Programmzähler beim Start der Steuerung korrekt initialisiert? Wenn dies nicht der Fall ist, wird Ihr Programm nicht ausgeführt, da es sich irgendwo im Mikrocontroller-Nirwana befindet.
Soweit ich weiß, arbeite ich mit einem vollständig gelöschten Gerät, aber ich werde versuchen, das herauszufinden.
Erstens setzt MOV 08EH,#003H das niedrigste Bit nicht auf Low, die 2 niedrigsten Bits sind wieder High. Zweitens, sind Sie sicher, dass Sie die Richtung der Port-Pins nicht vorher als Ausgang festlegen müssen?
AUXR ist beim Zurücksetzen #002H. Wenn ich also das zweite Bit in Ruhe lassen und das erste Bit hoch setzen möchte, muss ich es auf #003H setzen. Es gibt keine Portrichtungsregister für dieses Gerät - der 8051 hat einige ziemlich verrückte I/O-Ports.
Auf modernen Architekturen (Cortex-M, MSP430) wird der Programmzähler und Stapelzähler während des Power-On-Resets initialisiert, indem die ersten beiden Wörter aus dem Flash gelesen werden, und dann folgt die Interrupt-Vektortabelle. Wenn Sie Ihren Assembler einfach dort ablegen würden, würde er nicht das ausführen, was Sie erwarten, sondern zu der Adresse springen, die die Assemblierung darstellt. Ich bin mir nicht sicher, wie dies im 8051 gehandhabt wird.

Antworten (1)

Möglicherweise haben Sie ein Problem mit dem Startverhalten dieses Chips.

Im Datenblatt auf Seite 64 ist die Power-On Reset Code Execution beschrieben. Wenn Sie nichts mit dem speziellen Statusbyte tun, startet der Prozessor (standardmäßig) das interne Boot-ROM und nicht die von Ihnen programmierte Anwendung.

Es wird empfohlen, das Statusbyte auf 0x00 zu programmieren, damit die Codeausführung bei Adresse 0x0000 beginnt. Hier wird Ihr Programm wahrscheinlich ohne besondere Behandlung abgelegt.

Auf Seite 67 finden Sie einen Abschnitt zum Löschen und Programmieren des Statusbytes über einen Datensatz im Intel-Hex-File :

Verschiedene Schreibfunktionen

:nnxxxx03ffssddcc

Wo:

nn = Anzahl der Bytes (hex) im Datensatz

xxxx = Pflichtfeld, aber Wert ist „egal“

03 = Schreibfunktion

ff = Unterfunktionscode

ss = Auswahlcode

dd = Dateneingabe (nach Bedarf)

cc = Prüfsumme Unterfunktionscode = 04 (Boot-Vektor und Statusbyte löschen)

ff = 04

ss = egal

Beispiel:

:020000030400F7 Bootvektor und Statusbyte löschen

Subfunction Code = 06 (Program Status Byte oder Boot Vector)

ff = 06

ss = 00 Programmstatusbyte

01 Programm-Boot-Vektor

Beispiel:

:030000030601FCF7-Programmstartvektor mit 0FCH

Ich glaube, Sie sind hier an etwas dran, aber ich weiß im Moment nicht genau, wie ich es überprüfen soll ... mein Programmierer ist ein kommerzieller Programmierer, der viele Komponenten unterstützt, und ich kann damit nur die 64 KB des Programmspeichers programmieren , nicht das Boot-ROM.
@TheNoonMoose Sie können das Boot-ROM nicht schreiben, es ist immer da, aber das Statusbyte muss programmiert werden - wenn dieser Chip vom Programmierer unterstützt wird, gibt es vielleicht eine spezielle Option dafür.
Wenn das Statusbyte nur eine normale Position in den 64 KB des Flash ist, kann ich es programmieren, aber wenn es irgendwo ein spezielles Byte ist, dann kann ich das wahrscheinlich nicht mit diesem Programmierer. Es ist eine Art Mist.
@TheNoonMoose Ich habe nichts über die Position des Bytes gefunden, aber ich denke, es ist nicht im normalen Programmier-Flash. Welchen Programmierer verwendest du? Vielleicht ist ja was brauchbares zu finden.
Würde der Boot-Vektor unabhängig davon gelten, ob wir von einer internen oder externen Quelle ausführen? Wenn ich das Gerät in den externen Zugriffsmodus versetze, sind die Adresspins bei der ersten fallenden Flanke von ALE und PSEN# alle Null und inkrementieren, wie ich es erwarten würde
Der Programmierer, den ich verwende, ist ein Xeltek SuperPro 6000E.
Hmm nach meinem Verständnis, wenn Sie den EA-Pin erzwingen, damit er externen Speicher verwendet, wird das Boot-ROM nicht mehr ausgeführt. Haben Sie das Gerätekonfigurationswort mit Xeltek SuperPro überprüft? Vielleicht ist dort das Statusbyte versteckt.
Nun, ich habe gerade etwas Neues über den Xeltek gelernt. Ich kann jetzt das Statusbyte und den Boot-Vektor setzen, also melde ich mich mit weiteren Informationen zurück.
Ich habe die Status- und Boot-Vektoren auf Null programmiert und mindestens einer der Ports schaltet um und ALE nicht, also habe ich diese Antwort akzeptiert.