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