8051 - Después de la llamada de la API a 0xFFF0, el indicador de instrucción no regresa a mi programa

1

Con el microprocesador ATmEL 89C51RC2, cuando preparo los registros y el ACC para la llamada de la API y llamo

CALL 0xFFF0

las instrucciones debajo de la llamada nunca se ejecutan. El proceso nunca regresa de 0xFFF0. ¿Hay algún error común que los principiantes puedan hacer, que cause esto? ¿Qué es importante tener en cuenta para que la instrucción API se ejecute correctamente?

Mi código:

FLASH_ADR equ 01000h        ; adress in FLASH to write to
PGM_MTP equ 0FFF0h          ; adress of API subprogram
PulseRRef set 4230;
MOV R0, #11
MOV R1,#02h
MOV A, #low(PulseRRef)

MOV DPTR,#FLASH_ADR

LCALL PGM_MTP

JZ END_S

MOV DPTR,#TEXTES     ; writes message to the terminal
CALL SEND

END_S:

MOV DPTR,#TEXTME    ; writes different message to the terminal
CALL SEND

RET
    
pregunta user50222

2 respuestas

1

Tenía mis propios controladores para interrupciones (serie). Creo que esto podría causar el problema. Cuando deshabilito el permiso de interrupción global (EA) antes de llamar a PGM_MTP y lo permito después de la llamada, el indicador de instrucción regresa a mi programa.

Entonces el programa debería verse como:

MOV R0, #11             ;crystal frequency
MOV R1,#02h
MOV A, byteToWrite

MOV DPTR,#FLASH_ADR

CLR EA
ORL AUXR1,#20h          ;set BOOTEN

CALL PGM_MTP

ANL AUXR1,#0DFh         ;clear BOOTEN
SETB EA

JZ END_S

MOV DPTR,#FAILED     ; writes warning message to the terminal
CALL SEND

END_S:

RET
    
respondido por el user50222
1

La función IAP PGM_MTP está en la ROM del cargador de arranque. En el funcionamiento normal, la ROM de inicio está deshabilitada, por lo que al intentar llamar a las funciones fallará. Para habilitar la ROM de inicio, debe configurar ENBOOT (bit 5) en el registro AUXR1 (0A2h). Después de realizar la llamada IAP, debe borrar ENBOOT para volver a desactivar la ROM.

El código podría verse así: -

AUXR1  equ   0A2h

 ORL   AUXR1,#20h       
 LCALL PGM_MTP            
 ANL   AUXR1,#NOT 20h  
    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas