Problemas con el Compilador Keil 5

Hola , echar un vistazo al pequeño programa escrito en ensamblador, la instrucción DJNZ , la incluyo para abrir el ciclo que se cierra con SJMP, alguien puede decirme porque se ejecuta solo un ciclo de ambos ? , gracias.
Mensaje automáticamente combinado:

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SI PULSAMOS P1.0 TENEMOS UNA ONDA CUADRADA
; CONTROLADA POR EL FLAG DE SU TMR DE <6 HZ A 26 kHz>
; LA RUTINA LIMPIA LA BANDERA TF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




ORG 00H
USING 00H


MOV IE,10001111B // IE (EA+TMR0+)
MOV 088H,01011111B // TCON - START/STOP TMRs
MOV 091H,11111000B // TCONB | PSC | PWM
MOV 089H,00001000B // TMOD | (13 bits)
MOV 08FH,00000000B // CLKREG | TPS / CDV

MOV 0BFH,#00000000B // P4M1
MOV 0BEH,#00000000B // P4M0
MOV 0C7H,#00000000B // P3M1
MOV 0C6H,#00000000B // P3M0
MOV 0C5H,#00000000B // P2M1
MOV 0C4H,#00000000B // P2M0
MOV 0C3H,#00000000B // P1M1
MOV 0C2H,#00000001B // P1M0


CUADRADA: SETB P1.6
ACALL TIEMPO
CLR P1.6
ACALL TIEMPO
PULSA: JB P1.0,PULSA // Captura pulsación
;SJMP CUADRADA
DJNZ 0FFH,CUADRADA


CUADRADA1: SETB P1.4
ACALL TIEMPO
CLR P1.4
ACALL TIEMPO
PULSA1: JB P1.0,PULSA1 // Captura pulsación
DJNZ 0FFH,CUADRADA1
;SJMP CUADRADA1

TIEMPO: MOV TL1,#000H
MOV TH1,TL1
SETB TR1
AQUI1: JNB TF1,AQUI1 // Rearma FLAG TMR_0
CLR TF1
CLR TR1
RET

END
 
Última edición:
Código:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
;      SI PULSAMOS P1.0 TENEMOS UNA ONDA CUADRADA
;         CONTROLADA POR EL FLAG DE SU TMR DE <6 HZ A 26 kHz>
;           LA RUTINA LIMPIA LA BANDERA TF1  
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     



                ORG        00H
                USING    00H


                MOV    IE,10001111B    // IE (EA+TMR0+)  
                MOV    088H,01011111B    // TCON - START/STOP TMRs
                MOV    091H,11111000B    // TCONB  | PSC    | PWM
                MOV    089H,00001000B    // TMOD | (13 bits)                
                MOV    08FH,00000000B    // CLKREG | TPS / CDV
     
                MOV    0BFH,#00000000B    // P4M1
                MOV    0BEH,#00000000B    // P4M0
                MOV    0C7H,#00000000B    // P3M1
                MOV    0C6H,#00000000B    // P3M0
                MOV    0C5H,#00000000B    // P2M1
                MOV    0C4H,#00000000B    // P2M0
                MOV    0C3H,#00000000B    // P1M1
                MOV    0C2H,#00000001B    // P1M0      


CUADRADA:        SETB    P1.6
                ACALL    TIEMPO
                CLR        P1.6
                ACALL    TIEMPO
PULSA:            JB        P1.0,PULSA    // Captura pulsación
                ;SJMP    CUADRADA
                DJNZ    0FFH,CUADRADA


CUADRADA1:        SETB    P1.4
                ACALL    TIEMPO
                CLR        P1.4
                ACALL    TIEMPO
PULSA1:            JB        P1.0,PULSA1    // Captura pulsación
                DJNZ    0FFH,CUADRADA1
                ;SJMP    CUADRADA1

TIEMPO:            MOV        TL1,#000H
                MOV        TH1,TL1
                SETB    TR1
AQUI1:            JNB        TF1,AQUI1    // Rearma FLAG TMR_0
                CLR        TF1
                CLR        TR1
                RET
     
                END

Tabula el mensaje que no se entiende un pepino ponlo entre "code" "/code"
Pon etiquetas y comentarios que no se entiende un pepino

No puedes hacer djnz 0FFh porque no sabes que contiene 0FFh, es un registro SFR de valor desconocido, como lo mimso no hay nada nunca baja de valor y se queda para siempre ahí, o pasa una sola vez o cualquier cosa.
Si quieres acceder a la RAM que hay debajo de los SFR lo has de hacer mediante el registro R0 o R1, ahora no me acuerdo de la sintaxis pero tendŕias que hacer
mov R0,#0ffh
mov A,@R0

Y ahora tendrías en A el contenido de la ram 0FFh

¿Tu derivado tiene 256bytes de ram interna? Los 8051 tienen 128, los 8052 tienen 256 bytes. Si es un derivado sencillo lo mismo tiene 128.

Hace 15 años que no programa un 8052, puede que me equivoque, pero creo que es así.

Código:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
;      Lo que me parece entender que pretendes
;    SI PULSAMOS P1.0 TENEMOS UNA ONDA CUADRADA
;         CONTROLADA POR EL FLAG DE SU TMR DE <6 HZ A 26 kHz>
;           LA RUTINA LIMPIA LA BANDERA TF1  
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
contador    db   15     ; Una posición arbitraria en la ram


                ORG        00H
                ljmp         reset        ; Salto al inicio
; Resto de vectores de interrupción; timers, puerto serie etc etc
                ljmp         xxxxx no  me acuerdo
                ljmp         yyyyyyy tampoco me acuerdo




                USING    00H

                org 32        ; No puedes pisar todos los vectores de reset etc

                MOV    IE,10001111B    // IE (EA+TMR0+)  
                MOV    088H,01011111B    // TCON - START/STOP TMRs
                MOV    091H,11111000B    // TCONB  | PSC    | PWM
                MOV    089H,00001000B    // TMOD | (13 bits)                
                MOV    08FH,00000000B    // CLKREG | TPS / CDV
     
                MOV    0BFH,#00000000B    // P4M1
                MOV    0BEH,#00000000B    // P4M0
                MOV    0C7H,#00000000B    // P3M1
                MOV    0C6H,#00000000B    // P3M0
                MOV    0C5H,#00000000B    // P2M1
                MOV    0C4H,#00000000B    // P2M0
                MOV    0C3H,#00000000B    // P1M1
                MOV    0C2H,#00000001B    // P1M0      


reset:

                mov       contador,#0FFh
CUADRADA:   

                SETB    P1.6
                ACALL    TIEMPO
                CLR        P1.6
                ACALL    TIEMPO
PULSA:    JB          P1.0,PULSA    // Captura pulsación
                ;SJMP    CUADRADA
                DJNZ    contador,CUADRADA


preCUADRADA1:       
               mov      contador,#0FFh
CUADRADA1:               SETB    P1.4
                ACALL    TIEMPO
                CLR        P1.4
                ACALL    TIEMPO
PULSA1:            JB        P1.0,PULSA1    // Captura pulsación
                DJNZ    contador,CUADRADA1
                ;SJMP    CUADRADA1

;   Aquí falta algo que cierre el "main" algo como:
                 ljmp reset

TIEMPO:            MOV        TL1,#000H
                MOV        TH1,TL1
                SETB    TR1
AQUI1:            JNB        TF1,AQUI1    // Rearma FLAG TMR_0
                CLR        TF1
                CLR        TR1
                RET
     
                END
 
Última edición:
Compre un paquete profesional PK51-T compilador Keil 5, la cuestión es que no para de dar problemas al compilar tanto en ensamblador como en C, todo son errores debido sobre todo a los archivos include, hablo con el soporte técnico y se hacen como que no va con ellos el problema, la cuestión es que compre el compilador que por cierto no tiene nada de barato y no compile un solo programa desde hace un mes y medio. a alguno de vosotros le ocurrió algo similar ?
 
Hola, normalmente cuándo ocurre eso, es porque el programa se instaló en otro lugar, que al que pide por defecto.
Por ejem. Instalarlo en una unidad que no sea en la unidad C.
Sí los #include son el problema, intenta compilar cargando el archivo denotando con comillas.
Por ejem. #include "archivo.h"
Por otro lado, analiza el tipo de error que arroja, son de gran ayuda!!!
Los compiladores de hoy en día no te dicen: " Se ha producido un error y ya!"
Al contrario, arrojan muchos factores posibles, a veces en códigos para arrimarte al problema.
 
Última edición:
Me alegro de haber usado SDCC gratis y con soporte esmerado.

Como te han dicho o es mala instalación o es que te faltan librerías por instalar.

De todos modos razón no les falta. Si tu programa busca archivos que no has instalado tú sabrás por qué los llamas. Eso o has copiado un código que no entiendes.

Como la descripción que das es muy vaga poco más te puedo decir. Si das más detalles seguramente algún forero encontrará el problema.
 
Atrás
Arriba