Mi intensión: es a partir del temporizador de la cpu (temporizador 8254) controlar una interrupcion de 0,5 seg (solo puede hacerse as por exigencia del profesor)para que cada medio segundo se enciendan las luces siguiendo la tabla.
LA Forma: Modifico la tabla de interrupciones donde esta la interrupcion de reloj, y hago que apunte a mi rutina retardo, la cual me reduce en 1 el contador cada vez que entra(28 veces cada vez que se enciende una luz segun la rutina secuen1, de manera que 28 *18,9ms(interrupcion cpu)=509ms).
PROBLEMA: Nunca me entra en la rutina retardo
NOTA:FALTAN MUCHAS LINEAS DE CODIGO QUE NO VIENEN AL CASO, PERO EL ARCHIVO ESTA ADJUNTO
Mi programa es el siguiente:
Stkseg SEGMENT PARA STACK 'STACK'
DB 100h DUP (?)
Stkseg ENDS
Data SEGMENT WORD 'DATA'
tiempo DB 00h
intseg DW 00h
intoff DW 00h
Texto1 DB ' Prueba Finalizada'
DB '$'
Text2 DB 'Empieza la Prueba de Luces'
DB '$'
Text3 DB 13,'Prueba de Tecla producto. **Pulse cada tecla una sola vez**'
DB '$'
Tabla DB 5d
DB 11111111b
DB 11100111b
DB 11000011b
DB 10000001b
DB 00000000b
Tabla2 DB 2d
DB 00000101b
DB 00001010b
Data ENDS
Code SEGMENT WORD 'CODE'
ASSUME CS:Code,DSata
..
....
call noint ;Cancelamos posibles interrupciones mientras cambiamos la tabla de vectores
call vectorint ;Modifica el vector interrupcion
call siint ;habilita la interrupcion IRQ0 (que es nuestro timer)
corre:
mov al,tiempo
or al,al
jnz nosecuen ;Siel tiempo no se ha terminado hacemos tiempo hasta interrupcion
call secuen1 ;Llamamos a la secuencia de luces solo cuando tiempo de interrupcion terminado 0,5s
nosecuen:
call tecla ;veamos si hay tecla
jz corre ;si no hay tecla seguimos haciendo tiempo para interrupciones
call intcar ;Nos quedamos en espera de que se introduzca caracter TODO PARADO, HASTA INT
...
;******Secuencia de luces producto******
secuen1 proc
push ax
push ds
push bx
push dx
mov ax,data
mov ds,ax
mov bx,OFFSET tabla ;Primera DIRECCION de la tabla
mov dx,378h ;Nos situamos en la direccion de datos
add bx,cx
mov ax,[bx]
out dx,ax
inc cx
cmp cx,05h
jbe continua ;salta si son menores que 5
mov cx,0d ;si es mayor que 5 lo vuelve a poner a cero
continua:
mov tiempo,28d ;Restauramos el tiempo para interrupciones 18.2ms*28=0,5s
pop dx
pop bx
pop ds
pop ax
ret
secuen1 endp
;*********Retardo de perdida de tiempo poco mas de 0.5s*****
retardo proc far
push ax
push bx
push ds
mov ax,data ;
mov ds,ax ;Apuntamos a Data, para la variable tiempo
mov al,tiempo
cmp al,00h
jz final
dec al ;Decrementamos en 1 el tiempo
mov tiempo,al
final:
mov al,20h ;Fin de Interrrupcion
out 20h,al ;Direccion de pic maestro IR0
pop ds
pop bx
pop ax
IRET
retardo endp
;*********Procedimiento para nuestra interrupcion de reloj modificacion en la tabla******
vectorint proc
push ax
push dx
push ds
mov ah,35h ;Interrupcion del DOS
mov al,08h ;num de vector
int 21h
mov ax,es ;Guardamos el Manejador de puntero
mov intseg,ax
mov intoff,bx
;Vamos a cargar en su lugar la interrupcion que queremos
mov ax,seg retardo ;segmento del programa CS:IP (nuestro programa
mov ds,ax
lea dx,retardo; calcula el offset de retardo y lo mete en dx CS:[DX](retardo)
mov al,08h
mov ah,25h
int 21h ;Establece el puntero de interrupcion
pop ds
pop dx
pop ax
ret
LA Forma: Modifico la tabla de interrupciones donde esta la interrupcion de reloj, y hago que apunte a mi rutina retardo, la cual me reduce en 1 el contador cada vez que entra(28 veces cada vez que se enciende una luz segun la rutina secuen1, de manera que 28 *18,9ms(interrupcion cpu)=509ms).
PROBLEMA: Nunca me entra en la rutina retardo
NOTA:FALTAN MUCHAS LINEAS DE CODIGO QUE NO VIENEN AL CASO, PERO EL ARCHIVO ESTA ADJUNTO
Mi programa es el siguiente:
Stkseg SEGMENT PARA STACK 'STACK'
DB 100h DUP (?)
Stkseg ENDS
Data SEGMENT WORD 'DATA'
tiempo DB 00h
intseg DW 00h
intoff DW 00h
Texto1 DB ' Prueba Finalizada'
DB '$'
Text2 DB 'Empieza la Prueba de Luces'
DB '$'
Text3 DB 13,'Prueba de Tecla producto. **Pulse cada tecla una sola vez**'
DB '$'
Tabla DB 5d
DB 11111111b
DB 11100111b
DB 11000011b
DB 10000001b
DB 00000000b
Tabla2 DB 2d
DB 00000101b
DB 00001010b
Data ENDS
Code SEGMENT WORD 'CODE'
ASSUME CS:Code,DSata
..
....
call noint ;Cancelamos posibles interrupciones mientras cambiamos la tabla de vectores
call vectorint ;Modifica el vector interrupcion
call siint ;habilita la interrupcion IRQ0 (que es nuestro timer)
corre:
mov al,tiempo
or al,al
jnz nosecuen ;Siel tiempo no se ha terminado hacemos tiempo hasta interrupcion
call secuen1 ;Llamamos a la secuencia de luces solo cuando tiempo de interrupcion terminado 0,5s
nosecuen:
call tecla ;veamos si hay tecla
jz corre ;si no hay tecla seguimos haciendo tiempo para interrupciones
call intcar ;Nos quedamos en espera de que se introduzca caracter TODO PARADO, HASTA INT
...
;******Secuencia de luces producto******
secuen1 proc
push ax
push ds
push bx
push dx
mov ax,data
mov ds,ax
mov bx,OFFSET tabla ;Primera DIRECCION de la tabla
mov dx,378h ;Nos situamos en la direccion de datos
add bx,cx
mov ax,[bx]
out dx,ax
inc cx
cmp cx,05h
jbe continua ;salta si son menores que 5
mov cx,0d ;si es mayor que 5 lo vuelve a poner a cero
continua:
mov tiempo,28d ;Restauramos el tiempo para interrupciones 18.2ms*28=0,5s
pop dx
pop bx
pop ds
pop ax
ret
secuen1 endp
;*********Retardo de perdida de tiempo poco mas de 0.5s*****
retardo proc far
push ax
push bx
push ds
mov ax,data ;
mov ds,ax ;Apuntamos a Data, para la variable tiempo
mov al,tiempo
cmp al,00h
jz final
dec al ;Decrementamos en 1 el tiempo
mov tiempo,al
final:
mov al,20h ;Fin de Interrrupcion
out 20h,al ;Direccion de pic maestro IR0
pop ds
pop bx
pop ax
IRET
retardo endp
;*********Procedimiento para nuestra interrupcion de reloj modificacion en la tabla******
vectorint proc
push ax
push dx
push ds
mov ah,35h ;Interrupcion del DOS
mov al,08h ;num de vector
int 21h
mov ax,es ;Guardamos el Manejador de puntero
mov intseg,ax
mov intoff,bx
;Vamos a cargar en su lugar la interrupcion que queremos
mov ax,seg retardo ;segmento del programa CS:IP (nuestro programa
mov ds,ax
lea dx,retardo; calcula el offset de retardo y lo mete en dx CS:[DX](retardo)
mov al,08h
mov ah,25h
int 21h ;Establece el puntero de interrupcion
pop ds
pop dx
pop ax
ret