Alarme Real time clock
Caros amigos pois bem aqui estou eu de novo, nesta vez estou dedicado a 100% ao meu trabalho de assembly pois para quem ja nao se lembra
trata-se de um Alarme. pois eu acabei de criar um codigo mas nao me esta a trabalhar como eu queria.
So uma pequena nota, o alarme tem de ficar num programa residente.
.386
cseg segment use16
main proc far
assume cs:cseg
mov dx,offset int4a
mov ax, seg int4a
mov ds,ax
mov ah,25h
mov al,4ah
int 21h ;coloca o endereço da rotina int4a no vector de interrupt 4AH
;/////////////////////////////////////////////////////////////////////////////////
;DEFENIR O FORMATO A TRABALHAR (BCD)
mov al,0bh
out 70H,al
in al,71h
and al,00000010B
out 71H,al
;PERGUNTAR A HORA DO ALARME
mov ah,1 ;Fica a espera que o utilizador prime numa tecla
int 21H
sub al,'0' ;Converte o codigo ASCII em binario
mov bl,al ;Coloca o valor de al no bl
shl bl,4 ;Converte o codigo binario para BCD
mov ah,1 ;Fica a espera que prime outra tecla
int 21H
sub al,'0'
add bl,al ; 12 d = 0001 0010 bcd
;Acrescentar a Hora ao Real Time Clock
mov al,05H
out 70H,al ;Coloquei a hora do formato BCD no
mov al,bl ; Real Time Clock corresondente as
out 71H,al ; horas do Alarme = 05H
;Perguntar os Minutos do Alarme
mov ah,1 ;Fica a espera que o utilizador prime numa tecla
int 21H
sub al,'0' ;Converte o codigo ASCII em binario
mov bl,al ;Coloca o valor de al no bl
shl bl,4 ;Converte o codigo binario para BCD
mov ah,1 ;Fica a espera que prime outra tecla
int 21H
sub al,'0'
add bl,al ; 12 d = 0001 0010 bcd
;Acrescentar os minutos ao Real Time Clock
mov al,03H
out 70H,al ;;Coloquei os minutos do formato BCD no
mov al,bl ;; Real Time Clock corresondente as
out 71H,al ;; horas do Alarme = 05H
;Defenir os Segundos do Alarme
mov bl,00000000b
;Neste ultimo caso, o codigo BCD de 0 e igual ao binario
;Acrescentar os segundos ao Real Time Clock
mov al,01H
out 70H,al ;;Coloquei os segundos do formato BCD no
mov al,bl ;; Real Time Clock corresondente as
out 71H,al ;; horas do Alarme = 01H
;Colocar o Bit 5 do Status B a 1
mov al,0bH
out 70H,al ;; Activamos o Interrupt do Alarme
in al,71H
add al,00100010B
out 71H,al
;IR ao Interrupt Mask Register e garantir k nao esta MASCARADO IRQ8 =A1H
in al,0a1h
and al,11111110B
out 0a1h,al
;/////////////////////////////////////////////////////////////////////////////////
mov dx,zseg
mov ax,es
sub dx,ax ;determina o numero de paragrafos para deixar em memoria
mov ah,31h
int 21h ;termina o programa deixando o residente em memoria
main endp
int4a proc far ; rotina de atendimento ao interrupt
push ax
push bx
push cx
push di
push es ;faz o push de todos os registos que utiliza
;////////////////////////////////////////////////////////////////////////////
;sinal sonoro
in al,61h
add al, 11111111b
out 61h,al
;/////////////////////////////////////////////////////////////////////////////
pop es
pop di
pop cx
pop bx
pop ax ; restaura todos os registos usados
iret ; termina a rotina de interrupt
int4a endp
cseg ends
zseg segment use16
zseg ends ; segmento para calcular o tamanho do programa
end
Ora bem, como o meu prof neste momento nao vai aparecer no instituto politecnico da guarda ate ao dia da entrega do trabalho, entao eu começei a tirar algumas duvidas pelo email. So que agora neste ultimo email que ele me mandou epa... fiquei mesmo as arranhas....
Por isso vou postar o email que enviei ao prof e a seguinte resposta dele.
----------------email ------------
Caro professor Luis Figueiredo
Tenho alguns problemas no programa Alarme utilizando o Real Time Clock. Eu
criei o programa mas gostava que o professor me desse uma ajuda uma vez que copilado nao existe erro mas quando chega a altura de chamar a mensagem de alarme ele nao executa. presumo que seja algum erro meu e por isso preciso que o professor dê uma revisao do programa e me diga o que estou a fazer mal e se estou a fazer mal, como he-de fazer para corrigir.
Junto envio um ficheiro chamado residente1.ASM e o metodo de implementaçao das horas e minutos no dos é a seguinte:
c:\hhmm
Fico atento a sua resposta.
Obrigado.
-------resposta ao email---------
1º Simplifique o código dos segundos
2º Reveja o código da activação do interrupt de alarme. Olha bem para a tabela e para as instruções que usa.
3º Na rotina de atendimento ao interrupt não invente. Não ponha nada que não saiba ou não entende o que faz. Faça primeiro o algoritmo e depois o código de acordo com esse algoritmo. :die:
4º Pode acontecer em alguns sistemas que após a activação do interrupt de alarme este volte a ser activado em cada segundo que passa até ao fim do primeiro minuto. Pode resolver este problema se na rotina de atendimento desactivar o interrupt de alarme (bit5 do status B a 0).
----------------------------------
Ok pessoal eu tenho de entregar este trabalho ate 3 feira e ainda nao esta a funcionar por isso peço a vossa ajuda para tentar resolver os problemas do meu codigo