Programa de interrupciones de 8051

Tengo un sistema basado en un uC8051 con un cristal de cuarzo de 3,6864 MHz y 1kByte de memoria externa. el uc esta conectado via serie con otro dispositivo que le envia codigos ascii que debera clasificar en funcion del grupo al que pertenezca cada caracter. en elprograma principal tenmos definido un array de enteros con las direcciones de memoria externa donde queramos que nos guarde los datos recibidos en funcion delgrupo al que pertenezca. elprimer elemento del array indica la direccion a partir de la cual guardaremos los codigos recibidos que correspondan a numeros del 0 al 9, el segundo elemento del array señalara la direccion donde guardaremos lasletras mayusculas el tercero las minusculas y el cuarto elemento nos indicara donde guardar los restantes caracteres que no pertenezcan a ningunodelos 3 grupos anteriores. un ejemplo de este array podria ser: unsigned char clasificar[] = ox100, 0x300, 0x500, 0x800


me hace falta escribir elprogrma principal, funcion de configuracion de la UART y la rutina de atencion a la interrupcion de la UART. La re cepcion sera mediante paridad impara una velocidad de 2400bits/s

los numeros van de la posicion 0x30 a 0x39, las mayusculas van de 0x41 a 0x5A,minusculas van de 0x61 a 0x7A y el resto va desde la posocion 0x20 a 0x2F de 0x3A a 0x40, de 0x5B a 0x60y de 0x7b a 0x7f.
 
Última edición:
Hola foreros un saludo a todos, soy nuevo en este sitio y pues quiero aprender a programar lenguaje emsamblador, actualmente estudio 4to año de ingeniería en tele y debo entregar un proyecto el cual diseñé la interfaz en proteus y a su vez realice el código fuente pero no me trabaja como tiene que trabajar, es decir las funciones que debe hacer no las hace.

Adjunto el programa y quiero que me digan donde tengo el error pues no lo veo, si alguien me pudiera ayudar se lo agradecería.

El problema consiste en que debo diseñar un software (haciendo uso de las interrupciones externas del 8051) de un sistema digital que almacenes 30 muestras a partir de la dirección 50 h, las muestras son adquiridas de un conversor ADC0851, cada vez que se presione un tecla.
El sistema además cuenta con 2 lámparas de 7 segmentos de ánodo común en las que se debe mostrar el valor en hexadecimal, adquirido del conversor. Cuando el sistema se inicialice un LED debe estar apagado, el mismo solo de encenderá cuando se termine de almacenar la cantidad de muestra.


Las instrucciones las que realice en el código fuente de mi programa:

Código:
;DECLARAR EL VECTOR DE INTERRUPCIÓN
org          0h              ;INICIO DEL PROGRAMA
jmp inicio                   ;COMENZAR UN CICLO
org          03h             ; 
jmp interup  

org          100h
inicio:
mov          IE,#81h         ;INTERRUPCION ENABLE    BANDERAS DE INTERUPCION
mov          TCON,#01h       ; REGISTRO DE FUNCIONES ESPECIALES UBICADOS EN ZONA DE MEMORIA
mov          IP,#01h         ;DEFINICION DE PRIORIDAD
mov          DPTR,#lamp_7s  ;DECLARA PUNTERO EN LA LAMPARA

mov          R0,#50h        ; PONIENDO EN RO EL VALOR DE 50h INICIO
mov          R2,#0h         
mov          P0,#40h        ;DIRECCIONAR PUERTOS Y DIRECCIONES DE MEMORIA
mov          P2,#40h
setb         P2.7           ; PRENDE EL LED EN ESE PUERTO
clr          20h.0 
     
repit:
jnb          20h.0,$        
clr          20h.0
inc          R2
cjne         R2,#8,repit    

jmp final
interup:
call inicio_conversion   ;SECUENCIA DE INICIO DE CONVERSIÓN
jb          P3.3,$   
clr         P3.6         ;PONE A RS EN 0
nop



mov         A,P1         ;LEE EL ESTADO DE LOS INTERRUPTORES
mov @R0,A
inc         R0
mov         A,P1        
mov         B,#16
div AB
movc        A,@A+DPTR   ;TOMA EL CODIGO DESEADO DE LA LAMPARA
mov         P0,A        ;ENVIA EL CODIGO DE LAMPARA AL PUERTO 0
mov         A,B
movc        A,@A+DPTR  
mov         P2,A        ;ENVIA EL CODIGO DE LAMPARA AL PUERTO 2
setb        P2.7
setb        20h.0
reti

inicio_conversion:
clr         P3.5         ;PONE A RS EN 0
clr         P3.6         ;PONE A RS EN 0
nop
nop
setb        P3.6
setb        P3.5
nop
clr         P3.5          ;PONE A RS EN 0
clr         P3.7          ;PONE A RS EN 0
nop
nop
setb        P3.7
reti
lamp_7s: db 40h,79h,24h,30h,19h,12h,02h,78h,00h

final: 
mov         IE,#01h 
clr         P2.7          ;PONE A RS EN 0
jmp $                     ;PROCESO CICLICO

end
En espera de ayuda, Drakull.
Gracias de antemano.
 

Adjuntos

  • Sin título 2.jpg
    Sin título 2.jpg
    131.1 KB · Visitas: 11
Hola, "hace mucho rato que no programaba en la familia 8051, me hizo recordar viejos tiempos".
Por lo que veo hay problemas con la tabla que utilizas para mostrar los dígitos en los displays de 7 segmentos, por otro lado también el contador que verifica si se llegó a los 30 datos no está bien definido.
aquí una pequeña corrección a tu programa.
Código:
;DECLARAR EL VECTOR DE INTERRUPCIÓN
    org          00h              ;INICIO DEL PROGRAMA
    jmp inicio                   ;COMENZAR UN CICLO
    org          03h             ; 
    jmp interup  
    org          100h
inicio:
    mov          IE,#81h         ;INTERRUPCION ENABLE    BANDERAS DE INTERUPCION
    mov          TCON,#01h       ;REGISTRO DE FUNCIONES ESPECIALES UBICADOS EN ZONA DE MEMORIA
    mov          IP,#01h         ;DEFINICION DE PRIORIDAD
    mov          DPTR,#lamp_7s   ;DECLARA PUNTERO EN LA LAMPARA

    mov          R0,#50h         ; PONIENDO EN RO EL VALOR DE 50h INICIO
    mov          R2,#0h         
    mov          P0,#40h         ;DIRECCIONAR PUERTOS Y DIRECCIONES DE MEMORIA
    mov          P2,#40h
    setb         P2.7            ; PRENDE EL LED EN ESE PUERTO
    clr          20h.0      
repit:
    jnb          20h.0,$        
    clr          20h.0
    inc          R2
    cjne         R2,#30,repit    
final: 
    mov         IE,#01h 
    clr         P2.7          ;PONE A RS EN 0
    jmp $                     ;PROCESO CICLICO
;******************************************************************
;Rutinas de interrupcion
;******************************************************************
interup:
    call        inicio_conversion   ;SECUENCIA DE INICIO DE CONVERSIÓN
    jb          P3.3,$   
    clr         P3.6         ;PONE A RS EN 0
    nop
    mov         A,P1         ;LEE EL ESTADO DE LOS INTERRUPTORES
    mov         @R0,A
    inc         R0
    mov         A,P1        
    mov         B,#16
    div         AB
    movc        A,@A+DPTR   ;TOMA EL CODIGO DESEADO DE LA LAMPARA
    mov         P0,A        ;ENVIA EL CODIGO DE LAMPARA AL PUERTO 0
    mov         A,B
    movc        A,@A+DPTR  
    mov         P2,A        ;ENVIA EL CODIGO DE LAMPARA AL PUERTO 2
    setb        P2.7
    setb        20h.0
    reti
;*************************************************************
;Surbrrutinas
;*************************************************************
inicio_conversion:
    clr         P3.5         ;PONE A RS EN 0
    clr         P3.6         ;PONE A RS EN 0
    nop
    nop
    setb        P3.6
    setb        P3.5
    nop
    clr         P3.5          ;PONE A RS EN 0
    clr         P3.7          ;PONE A RS EN 0
    nop
    nop
    setb        P3.7
    reti
;************************************************************
lamp_7s: 
    db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h,088h,083h,0c6h,0a1h,086h,08eh
;************************************************************
    end
Dibujo.JPG
 
Atrás
Arriba