¿Por qué no se alternan mis pines 80C51?

Estoy trabajando con un derivado 80C51, el P89C668HFA . Por el momento, estoy tratando de obtener algunas funciones muy básicas: solo quiero 1) deshabilitar la alternancia de ALE y 2) hacer que los puertos de E/S cambien. Escribí un poco de código para lograr esto:

    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

La salida de mi ensamblador coincide con el binario hecho a mano con el que comencé. Cuando saco el dispositivo del reinicio, el pin ALE sigue alternando, pero no PSEN #, y los pines del puerto de E/S están todos altos. Dada esa información, y el hecho de que puedo programar correctamente el dispositivo y verificar que el programa es correcto, creo que el dispositivo funciona correctamente, pero parece que el código no se ejecuta correctamente (si es que lo hace).

Agradecería cualquier idea sobre el tema, los hilos que podría extraer, etc. Gracias.

¿Se inicializó correctamente el contador de programa durante el inicio del controlador? Si no es así, su programa no se ejecutará porque está en algún lugar del nirvana del microcontrolador.
Estoy trabajando con un dispositivo completamente borrado, que yo sepa, pero intentaré resolver esto.
En primer lugar, MOV 08EH,#003H no establece el bit más bajo en un valor bajo, los 2 bits más bajos son altos. En segundo lugar, ¿está seguro de que no tiene que configurar la dirección de los pines del puerto como salida antes?
AUXR es # 002H en el reinicio, por lo que si quiero dejar el segundo bit solo y configurar el primer bit alto, necesito configurarlo en # 003H. No hay registros de dirección de puerto para este dispositivo; el 8051 tiene algunos puertos de E/S bastante extraños.
En arquitecturas modernas (Cortex-M, MSP430), el contador de programa y el contador de pila se inicializan durante el reinicio de encendido al leer las dos primeras palabras del flash y luego sigue la tabla de vectores de interrupción. Si simplemente pusiera su ensamblador allí, no ejecutaría lo que espera, sino que saltaría a la dirección que representa el ensamblado. Sin embargo, no estoy seguro de cómo se maneja esto en el 8051.

Respuestas (1)

Tal vez tenga un problema con el comportamiento de inicio de este chip.

En la hoja de datos de la página 64 se describe la ejecución del código de restablecimiento de encendido. Si no hace nada con el byte de estado especial, el procesador iniciará (por defecto de fábrica) la ROM de arranque interna y no la aplicación que ha programado.

Se sugiere programar el byte de estado a 0x00, para que la ejecución del código comience en la dirección 0x0000. Aquí es donde probablemente se coloque su programa sin ningún tratamiento especial.

Hay una sección sobre cómo borrar y programar el byte de estado a través de un registro en Intel-Hex-File en la página 67 :

Varias funciones de escritura

:nnxxxx03ffssddcc

Dónde:

nn = número de bytes (hex) en el registro

xxxx = campo obligatorio, pero el valor es "no me importa"

03 = función de escritura

ff = código de subfunción

ss = código de selección

dd = entrada de datos (según sea necesario)

cc = código de subfunción de suma de comprobación = 04 (Borrar vector de arranque y byte de estado)

ff = 04

ss = no me importa

Ejemplo:

:020000030400F7 borrar vector de arranque y byte de estado

Código de subfunción = 06 (byte de estado del programa o vector de arranque)

ff = 06

ss = 00 byte de estado del programa

01 vector de arranque del programa

Ejemplo:

:030000030601FCF7 vector de arranque del programa con 0FCH

Creo que estás en algo aquí, pero no sé exactamente cómo verificarlo en este momento... mi programador es un programador comercial que admite muchos componentes, y solo puedo programar los 64K de memoria de programa con él. , no la ROM de arranque.
@TheNoonMoose No puede escribir la ROM de arranque, siempre está ahí, pero el byte de estado debe programarse; si el programador admite este chip, tal vez haya una opción especial para hacerlo.
Si el byte de estado es solo una ubicación normal en los 64 K de flash, puedo programarlo, pero si es un byte especial en alguna parte, entonces probablemente no pueda con este programador. Es una especie de pedazo de mierda.
@TheNoonMoose No he encontrado nada sobre la ubicación del byte, pero supongo que no está en el flash de programación normal. ¿Qué programador estás usando? Tal vez haya algo útil que encontrar.
¿Se aplicaría el vector de arranque independientemente de si estamos ejecutando desde una fuente interna o externa? Si pongo el dispositivo en modo de acceso externo, los pines de dirección son todos cero en el primer flanco descendente de ALE y PSEN#, y aumentan de la manera que esperaría
El programador que estoy usando es un Xeltek SuperPro 6000E.
Hmm, según tengo entendido, si fuerza el pin EA para que use memoria externa, la ROM de arranque ya no se ejecutará. ¿Ha comprobado la Palabra de configuración del dispositivo con el Xeltek SuperPro? Tal vez el byte de estado esté oculto allí.
Bueno, acabo de aprender algo nuevo sobre el Xeltek. Ahora puedo configurar el byte de estado y el vector de arranque, así que volveré con más información.
Programé los vectores de estado y arranque a cero y al menos uno de los puertos está alternando y ALE no, así que acepté esta respuesta.