• Lunes 18 de Noviembre de 2024, 11:44

Autor Tema:  Como Modifico El Timer??  (Leído 1235 veces)

Victorn

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Como Modifico El Timer??
« en: Martes 8 de Noviembre de 2005, 16:35 »
0
PonVector MACRO tipo,rutina
 CLI
  MOV AX,0
  MOV ES,AX
  MOV word ptr ES:[tipo * 4], OFFSET rutina
  MOV word ptr ES:[tipo * 4 + 2 ], SEG rutina
 STI
ENDM
;--------------------------


GuardaVector MACRO tipo,IPviejo,CSViejo

  MOV AX,DATA
  MOV DS,AX
  MOV AX,0
  MOV ES,AX
  MOV DI,tipo*4

  MOV AX,ES:[DI]
  MOV IPviejo,AX
  MOV AX,ES:[DI + 2]
  MOV CSViejo,AX
ENDM

;----------------------------------------------------------------------

RestauraVector MACRO tipo,IPViejo,CSViejo


CLI
  push ax
  push ds
  push es
  push di
  MOV AX,DATA
  MOV DS,AX
  MOV AX,0
  MOV ES,AX
  MOV DI,tipo*4

  MOV AX,IPViejo
  MOV ES:[DI] , AX
  MOV AX,CSVIEJO
  MOV ES:[DI+2], AX

  pop di
  pop es
  pop ds
  pop ax
STI
 outp(0x43,0x3c);
  outp(0x40,0)
  outp(0x40,0);


ENDM

;----------------------------------------------------------------------
DATA SEGMENT

  IP8Viejo dw ?
  CS8Viejo dw ?
  Fin      db 0
  cont     dw 24
  ContInt dw 18
  n        dw 0            
DATA ENDS

;----------------------------------------------------------------------

CODE SEGMENT
MIPROG PROC FAR
ASSUME CS:CODE, DS:DATA
CLI


        GuardaVector 8,IP8Viejo,CS8Viejo ; guardo vector del timer antiguo
        PonVector    8,timernuevo  ; pongo el vector dede mi nuevo timer


        MOV AX,DATA
        MOV DS,AX


STI
         MOV n,48
 


DENUEVO:
Espera:
         CMP n,"9"
         JE quit
         CMP Fin,1   ; ciclo de espera para contar las interrupciones
         JNZ Espera

         INC n
         
         push ax
         push dx
         mov ah,2;
         mov dx,n
         int 21h
         pop dx
         pop ax
         ;imprime n ; imprime el segundo en el que va                                   JE  hagocero ; si es = a 5 significa que debo empezar el ciclo


        MOV Fin,0  ; coloco en 0 la bandera que me indica que se realizaron
                   ; las 18 interrupciones

        MOV ContInt,18  ; coloco el contados de interrupciones en 18


       
        JMP DENUEVO  ; salto para empezar el ciclo nuevamente




quit:
        RestauraVector 8,IP8Viejo,CS8Viejo  ; restauro el vector del timer

        MOV AX,4c00H
        INT 21H         ;retorno al S.O.

;----------------------------------------------------------------------

timernuevo:

        PUSH AX
        PUSH DS

        MOV AX,DATA
        MOV DS,AX


        DEC ContInt ; decremento el contador de interrupciones para
                    ; contar un segundo (18 interrupciones)
        JNZ Salir
        MOV Fin,1   ; coloco la bandera FIN en 1 para avisar que se
                    ; cumplieron las 18 interrupciones


Salir:

        MOV AL,20H  ;comando fin de interrupcion
        OUT 20H,AL

        POP DS
        POP AX

IRET

;----------------------------------------------------------------------

MIPROG ENDP
CODE ENDS
END MIPROG


bueno este programa muestra una generacion de numeros del 1 al 9 en un cierto intervalo de tiempo, la pregunta es como lo modifico para que ande mas lento o mas rapido segun los requerimientos, como por ejemplo que genere esos numeros en centecimas de segundos, como lo hago?, ojala me puedan ayudar

como idea se me ocurrio hacer eso, guiandome por este codigo en C

void ISRS::SetTimerFrequency(float hz)
{
  float base=1193180.0;
  unsigned short word;

  base/=hz;
  byte=(unsigned short)base;

  outp(0x43,0x3c);
  outp(0x40, LOW_BYTE(word));
  outp(0x40,HIGH_BYTE(word));
}


pero no se como implementarlo!