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.
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
Arsenal
Der Mittagselch
CasaMich
Der Mittagselch
Arsenal