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

1

Estoy trabajando con un derivado de 80C51, el P89C668HFA . En este momento, estoy tratando de obtener una funcionalidad muy básica: solo quiero 1) deshabilitar el cambio de ALE y 2) hacer que los puertos de E / S se activen. 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 soy capaz de programar con éxito el dispositivo y verificar que el programa es correcto, creo que el dispositivo funciona correctamente, pero parece que el código no se está ejecutando correctamente (en todo caso).

Apreciaría cualquier comentario sobre el tema, los hilos que podría extraer, etc. Gracias.

    
pregunta TheNoonMoose

1 respuesta

2

Tal vez esté ejecutando un problema con el comportamiento de inicio de este chip.

En la hoja de datos en página 64 se ejecuta el Código de reinicio de encendido descrito Si no le hace nada al Byte de estado especial, el procesador iniciará (por defecto de fábrica) la ROM de inicio 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 está poniendo 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 el archivo Intel-Hex en página 67 :

  

Funciones de escritura misceláneas

     

: nnxxxx03ffssddcc

     

Donde:

     

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

     

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

     

03 = Escribir función

     

ff = código de subfunción

     

ss = código de selección

     

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

     

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

     

ff = 04

     

ss = no importa

     

Ejemplo :

     

: 020000030400F7 borrar el vector de arranque y el 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

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas