CH1 CH0 0 0 X 0 1 Le Sensor 1 1 0 Le Sensor 2 1 1 Desabilitado

Propaganda
CH1
0
0
1
1
CH0
0
1
0
1
X
Le Sensor 1
Le Sensor 2
Desabilitado
Analise do problema:
-
Se for precionado CH0, sera chamada a INT 0 (0003H) e nesta ocorrerá a leitura do sensor 1
(P20) e gravar está leitura numa dada posição da Memo interna;
Se for precionado CH0, sera chamada a INT 1 (0013H) e nesta ocorrerá a leitura do sensor 2
(P21) e gravar está leitura numa dada posição da Memo interna;
Se nenhuma chave for precionada nada ocorre;
Quanto ao fato de precionarmos as duas chaves ao mesmo tempo (quase impossível) e
mantermos a interrupção desabilitada precisa-se criar um intertravamento.
Programa:
ORG 00H
SJMP INICIO
INICIO:
LOOP:
ORG 0003 H
MOV C, P3.3
MOV R1,# D0H
MOV A,@R1
CJNE A, #80H, LOOP
MOV C, P2.0
MOV A,@R1
MOV @R0, A
RETI
; endereço INT0
; Move para carry o valor da porta P3.3 (INT 1)
; Move para R1 o valor D0H (endereço que contem o valor da carry)
; Move para ACC o valor do endereço indicado por R1(D0H)
;4
; Move para carry o valor do Sensor 1(P2.0)
; Move para ACC o valor do endereço indicado por R1(D0H)
; Move o valor do ACC para o ENDEREÇO (@) indicado pelo registrador R0.
ORG 0013 H
MOV C, P2.1
MOV R1,# D0H
MOV A,@R1
MOV R1, # C8H
MOV @R1, A
RETI
; endereço INT1
; Move para carry o valor do Sensor 2(P2.1)
; Move para R1 o valor D0H (endereço que contem o valor da carry)
; Move para ACC o valor do endereço indicado por R1(D0H)
; Move para Registrador R0 o valor C8H(200D)
; Move o valor do ACC para o ENDEREÇO (@) indicado pelo registrador R1(C8H).
MOV R0, # 64H
MOV R1, # C8H
MOV IE, # 85H
MOV IP,# 01H
MOV TCON,# 0FH
MOV P0,# 0FFH
SJMP LOOP
END
; Move para Registrador R0 o valor 64H(100D) 1
; Move para Registrador R0 o valor C8H(200D) 2
; Habilita interrupções externas INT0 e INT1 ( 1 0 0 0 0 1 0 1)3
;Dando prioridade a INT 0 (se acionarmos ambas Int., INT 0 é que será atendida)
;Indica interrupção por flanco (↓) em INT0 e INT1 (0 0 0 0 1 1 1 1)
;rotina para por o programa em loop (aguardando interrupção)
1 - (SERÁ usado para indicar a posição da Memo interna em que sera gravada a leitura do sensor 1)
2 - (SERÁ usado para indicar a posição da Memo interna em que sera gravada a leitura do sensor 2)
3 – Pela tabela passada pelo professor IE ficaria 80H, só que está errada!!! , pois para habilitar a interrução externa
usa-se “1” e não “0” como se encontra.
4 - Compara o valor do ACC com 80H, se for diferente desvia para LOOP, ou seja, se o valor lido em p3.3 (INT1) for
“0” (ch1 precionada) ele desvia para LOOP sem realizar a leitura de quaisqer dos sensores. (este comando tem o
objetivo de não permitir que eu leia qualquer sensor , se ambos forem precionados)
A)
CAUSAR UMA INTERRUPÇAO PARA TIMER 0 A CADA 50ms QUE POR SUA VEZ CAUSARÁ UMA
INTERRUPÇAO EM INT0.
ORG 00H
SJMP INICIO
ORG 0003H
SETB P0.0 ;endereço da INT0 (quando ocorre a interrupção no pino INT0, a qual é feita qnd P0.0 vai a “0”
CLR TR0
;limpa TR0 para resetar a contagem do timer0
RETI
; retorna a rotina onde ocorreu a interrupção pelo timer
ORG 000BH ;endereço do Timer0 (para onde a rotina é desviada após a contagem de 50ms)
CLR P0.0
; limpa a porta P0.0 criando uma interrupção em INT0
RETI
INICIO:
MOV IE, #83H
; habilita interrupção do INT0 e Timer 0 (1 0 0 0 0 0 1 1)
MOV IP,#02H
;da prioridade de interrupção para timer 0 (0 0 0 0 0 0 1 0)
MOV TMOD,#01H ;habilita Timer 0 (0 0 0 0 0 0 0 1) 1
MOV TCON,#13H
; Indica interrupção por flanco (↓) em INT0 (0 0 0 1 0 1 1 1) 1
MOV TH0,#HIGH(65535-50000)
MOV TL0,#LOW(65535-50000)
SETB TR0
; inicia a contagem
VOLTA 1: MOV P2,#00H
; rotina qualquer afim de aguardar o estouro da contagem.
SJMP VOLTA 1
END
1 - GATE.x  Quando GATE.x = 1 e TRx = 1, o temporizador irá operar somente enquanto o pino INTx = 1
(controle por circuito). Quando GATE.x = 0, o temporizador irá operar somente quando TRx = 1 (controle por
software).
Obs.: TRx é um bit de TCON (palavra de controle do Contador/Temporizador), portanto se gate.x=0 TRx em TCON
deverá ser posto em “1”.
B)
ENTRAR COM UM CLOCK EXTERNO EM T1 E SAIR COM UMA FREQUENCIA DE 100 HZ EM P0.1
O periodo de saída em p0.0 é 10ms, para gerar esse periodo precisamos manter 5ms da saida em nível 1 e 5ms
da saída em nível 0, assim carga:
V1:
ORG 00H
CLR P0.0
; limpa a saída P0.0
MOV TMOD, # 50H ; habilita timer 1 como contador (ou seja, trabalha com clock externo)(01010000)
MOV IE,#00H
;garante que nenhuma interrupçao seje atendida
MOV TH1,#HIGH(65535-500)
MOV TL1,#LOW(65535-500)
SETB TR1
; inicia a contagem
JNB TF0, $
; mantém preso até termino da contagem
CLR TR1
;limpa TR1 afim de preparar para proxima contagem
CLR TF1
;limpa TF1 afim de preparar para proxima contagem
CPL P0.0
;complementa a saída P0.0 (inverte o ultimo estado da saída)
SJMP V1
; pula para endereço V1
END
Download