1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Assembly Alarme em Real Time Clock

Discussão em 'Programação' iniciada por Thorax, 7 de Julho de 2004. (Respostas: 3; Visualizações: 3430)

  1. Thorax

    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: 8 de Julho de 2004
  2. JGAlmeida

    JGAlmeida Folding Colaborator

    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.
     
  3. Lancaster

    Lancaster To fold or to FOLD?

    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...


    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:
    Deve ser jmp Lb2 e não jump...

    Outro erro que me dá ao linkar:
    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: 7 de Julho de 2004
  4. Thorax

    Thorax Power Member

    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: 8 de Julho de 2004

Partilhar esta Página