Assembly Alarme em Real Time Clock

Thorax

Power Member
Boas pessoal. Depois de tantas dificuldades e de todas as ajudas de parte de algumas pessoas deste forum como por exemplo Sky Fox, Redalert, Swordfish e ao resto das pessoas que tentaram ajudar como poderam, entao aqui fica o Trabalho Final que irei apresentar amanha na aula de Arquitectura de computadores no IPG. :P

Esse trabalho final consiste fazer um ALARME utilizando o Real time clock e que fique residente em Memoria.
Uma pequena nota, Este programa utiliza a arquitectura 8086 e foi copilado com o TASM (para verificar erros) e seguido pelo LINK ( cria um executavel do programa).


ALgoritmos:

PROGRAMA PRINCIPAL

1. Definir o formato em que o Alarme vai trabalhar ( BCD )
2. Perguntar a Hora do Alarme
3. Ler a Hora do Alarme
4. Converter a Hora introduzida pelo utilizador para BCD
5. Acrescentar a Hora do Alarme ao Real Time Clock
6. Repetir os passos 2,3,4 e 5 novamente mas agora correspondentes aos minutos
7. Definir os segundos do Alarme
8. Garantir que o Interrupt MAsk Register não está mascarado
9. Tornar o programa Residente

ROTINA DO INTERRUPT
1. Definir 1 ponteiro de leitura
2. Definir 1 ponteiro de escrita
3. Ler o carácter do ponteiro de leitura
4. Comparar com “$”
5. Se não for igual
6. Escrever o carácter no ponteiro de escrita
7. Actualizar o ponteiro de escrita
8. actualizar o ponteiro de leitura
9. Voltar ao passo 3
10. Se for igual “$” então Terminar


Codigo FONTE

.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,11111011B
out 71H,al


Aqui neste passo, vou querer trabalhar com o formato BCD. Então para que isso aconteça, terei de colocar no Status B no bit 2 o valor de zero. Para isso utilizei o AND al, 11111011B porque:




;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,00000000

;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
mov 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


; Definir a Mensagem de Alerta
mesg db 'ALARME!! ALARME!! ALARME!! ALARME!!$'

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

;Activar o SOM BEEEEEEEPPPPPP
in al, 061H
and al,11111110b
out 061H,al

;Definir um ponteiro de leitura
mov ax,0B800H
mov es,ax
mov di,0
;Definir um ponteiro de escrita
mov ax,seg mesg
mov ds,ax
mov si,offset mesg
;Ler o character do ponteiro de leitura
Lb2: mov al,ds:[si]
;Comparar com ‘$’
Cmp al,’$’
;Se não for igual Escreve o carácter no ponteiro de escrita
JE Fim
mov es:[di],al
;Actualizar o ponteiro de escrita e de leitura
inc si
add di,2
jmp Lb2
; Se for igual ao dólar terminar
Fim: 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



;) Agora pessoal quem tiver uma certa cadeira que nao estao com paciencia para programar assembly, e se tiveres de Fazer um Alarme, entao jovem, encontras-te o forum certo. Esta tudo explicadinho. :P
Se tiverem alguma duvidas e so postar!!!!
Obrigado a Todos. :x2: :P
 
Última edição:
Boas.

Pá, isso parece estár porreiro, mas sinceramente não consigo meter aqui nenhum comentário util acerca da programação assembler (esses push e pop é muito baixo nível para mim). :wow:

A razão do meu post é apenas para saber se IPG = Inst. Politecnico da Guarda (É que eu andei por lá há uns anos, bons tempos) :D

Cumps.
 
Heyas all...

Acabei por me registar no fórum em vez de estar sempre a usar o nick do Swordfish...

Estive a compilar o código tb no TASM e deu-me erro...

**Error** sd.asm(113) Illegal indexing mode


Linha 113:
Código:
mov al,ds:[dx];Linha 113

Dá erro, porque não podes usar o registo DX como "indexador" tens 2 registos próprios para isso o SI e o DI...

Ou seja em vez de teres:

Código:
mov dx,offset mesg
;Ler o character do ponteiro de leitura
Lb2:	mov al,ds:[dx]

Pões:
Código:
mov di,offset mesg
;Ler o character do ponteiro de leitura
Lb2:	mov al,ds:[di]

Tou a estranhar é não te ter dado erros a compilar, é que aqui ele acusou logo problemas...

E btw aqui:
;Actualizar o ponteiro de escrita e de leitura
inc dx
add di,2
jump Lb2

Deve ser jmp Lb2 e não jump...

Outro erro que me dá ao linkar:
C:\>tlink /v sd.obj
Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
Fatal: No program entry point

Ele diz que não encontra o entry point do programa...ou seja quando ele começa...isto já não sei resolver...também tive este problema, mas foi por causa de ficheiros de include...

Agora outra coisa mas esta já é em relação à apresentação do trabalho...devias tentar organizar mais o código...para ficar mais "bonito" e mais fácil de ler...usar tab's para o código, e também usar funções para fazer várias coisas...deixo-te aqui um exemplo para tu veres...

Exemplo

Abre 1º o Main...e depois dá uma olhadela nos outros...

Se quiseres correr já aí tá o Main.exe...se quiseres compilar basta fazer:
tasm /zi main.asm
tlink /v main.obj

E se quiseres fazer debug:
td main.exe

Hasta all e espero ter ajudado [[]]

PS: Estava a ver que nunca mais dizias nada sobre o trabalho... :P E boa sorte para amanhã! Alguma coisa podes me contactar pelo MSN: [email protected]
 
Última edição:
Lancaster

ups ... sim tens razao..agora que vi isto e acabei por meter o codigo errado... lol.. mas prontos eu ja faço a rectificação disso para ja workar :x2:
Em Relaçao a apresentaçao do trabalho .. pois tens razao mas para mim e para a cadeira que esta em questao nao nos interessa muito isso percebes.Nos nao vamos avançar mais do que isso.
Outra coisa se quiseres os programas que utilizei para copilar isso eu posso te arranjar. ai posso te garantir que isso worka mesmo..
Atençao ao sinal sonoro porque ele nao vai parar de fazer barulho. Tentei utilizar um Delay para o som mas nao consegui!

-----------------------------------------------------------------------

JGAlmeida
Sim eu Estudo no Instituto Politecnico da Guarda. E podes crer que esses tempos ainda continuam a ser igual... :P


Programa ALarme ja Editado e corrigido.
 
Última edição:
Back
Topo