/
ex5.asm
328 lines (278 loc) · 12.3 KB
/
ex5.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* TIMER DE SEGUNDOS - EX5 *
;* DESBRAVANDO O PIC *
;* DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA *
;* VERSÃO: 1.0 DATA: 30/10/01 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRIÇÃO DO ARQUIVO *
;*-----------------------------------------------------------------*
;* TIMER DECRESCENTE EM SEGUNDOS. O VALOR INICIAL É DETERMINADO *
;* PELA CONSTANTE V_INICIO E PODE ESTAR ENTRE 1 E 9 SEGUNDOS. *
;* O BOTÃO 1 DISPARA O TIMER, MOSTRANDO O TEMPO RESTANTE NO *
;* DISPLAY. O BOTÃO 2 PARALIZA O TIMER. O LED É UTILIZADO PARA *
;* INDICAR O ESTADO ATUAL DO TIMER: ACESO=RODANDO E APAGADO=PARADO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES
;ESTAS VARIÁVEIS NEM SERÃO UTI-
;LIZADAS
TEMPO ;ARMAZENA O VALOR DO TEMPO
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
TEMP1 ;REGISTRADORES AUXILIARES
TEMP2
FILTRO1 ;FILTROS DOS BOTÕES
FILTRO2
ENDC ;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
#DEFINE F_FIM FLAGS,0 ;FLAG DE FIM DE TEMPO
#DEFINE ST_BT1 FLAGS,1 ;STATUS DO BOTÃO 1
#DEFINE ST_BT2 FLAGS,2 ;STATUS DO BOTÃO 2
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
V_INICIO EQU .15 ;VALOR INICIAL DO TIMER (1 A 15 SEG.)
T_FILTRO EQU .255 ;VALOR DO FILTRO DOS BOTÕES
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO
#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE LED PORTA,3 ;LED
;0 -> DESLIGADO
;1 -> LIGADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VETOR DE RESET *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; UTILIZAREMOS SOMENTE A INTERRUÇÃO DE TMR0, MAS EFETUAREMOS O TESTE
; PARA TERMOS CERTEZA DE QUE NENHUM PROBLEMA ACONTECEU. É NECESSÁRIO
; SALVAR E RECUPERAR OS VALOR DE W E STATUS.
ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP
BTFSS INTCON,T0IF ;É INTERRUPÇÃO DE TMR0?
GOTO SAI_INT ;NÃO, SAI SE AÇÃO
;SIM
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* TRATAMENTO DA INTERRUPÇÃO DE TMR0 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ CONTAR O TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARI-
; ÁVEL "TEMPO" SERÁ DECREMENTADA.
; 1 SEGUNDO = 64us (PRESCALER) X 125 (TMR0) X 125 (TEMP1)
BCF INTCON,T0IF ;LIMPA FLAG DA INT.
MOVLW .256-.125
MOVWF TMR0 ;REINICIA TMR0
DECFSZ TEMP1,F ;DECREMENTA CONTADOR AUXILIAR. ACABOU?
GOTO SAI_INT ;NÃO, SAI SEM AÇÃO
;SIM
MOVLW .125
MOVWF TEMP1 ;REINICIALIZA TEMPO AUXILIAR
BTFSC F_FIM ;JÁ CHEGOU AO FIM?
GOTO SAI_INT ;SIM, ENTÃO NÃO DECREMENTA O TEMPO
;NÃO
DECFSZ TEMPO,F ;DECREMENTA TEMPO. ACABOU?
GOTO SAI_INT ;NÃO, SAI DA INTERRUÇãO
;SIM
BSF F_FIM ;MARCA FIM DO TEMPO
GOTO SAI_INT ;SAI DA INTERRUPÇÃO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPÇÃO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.
; a
; **********
; * *
; f * * b
; * g *
; **********
; * *
; e * * c
; * d *
; ********** *.
CONVERTE
MOVF TEMPO,W ;COLOCA CONTADOR EM W
ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR
;CONSIDERAR SOMENTE ATÉ 15
ADDWF PCL,F
; B'EDC.BAFG' ; POSIÇÃO CORRETA DOS SEGUIMENTOS
RETLW B'11101110' ; 00 - RETORNA SÍMBOLO CORRETO 0
RETLW B'00101000' ; 01 - RETORNA SÍMBOLO CORRETO 1
RETLW B'11001101' ; 02 - RETORNA SÍMBOLO CORRETO 2
RETLW B'01101101' ; 03 - RETORNA SÍMBOLO CORRETO 3
RETLW B'00101011' ; 04 - RETORNA SÍMBOLO CORRETO 4
RETLW B'01100111' ; 05 - RETORNA SÍMBOLO CORRETO 5
RETLW B'11100111' ; 06 - RETORNA SÍMBOLO CORRETO 6
RETLW B'00101100' ; 07 - RETORNA SÍMBOLO CORRETO 7
RETLW B'11101111' ; 08 - RETORNA SÍMBOLO CORRETO 8
RETLW B'01101111' ; 09 - RETORNA SÍMBOLO CORRETO 9
RETLW B'10101111' ; 10 - RETORNA SÍMBOLO CORRETO A
RETLW B'11100011' ; 11 - RETORNA SÍMBOLO CORRETO b
RETLW B'11000110' ; 12 - RETORNA SÍMBOLO CORRETO C
RETLW B'11101001' ; 13 - RETORNA SÍMBOLO CORRETO d
RETLW B'11000111' ; 14 - RETORNA SÍMBOLO CORRETO E
RETLW B'10000111' ; 15 - RETORNA SÍMBOLO CORRETO F
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE ATUALIZAÇÃO DO DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA CONVERTE O VALOR DE TEMPO ATRAVÉS DA ROTINA CONVERTE
; E ATUALIZA O PORTB PARA ACENDER O DISPLAY CORRETAMENTE
ATUALIZA
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO
;DISPLAY
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
;NO DISPLAY
RETURN ;NÃO, RETORNA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE DESLIGAR O TIMER *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA EXECUTA AS AÇÕES NECESSÁRIAS PARA DESLIGAR O TIMER
DESL_TIMER
BCF INTCON,GIE ;DESLIGA CHAVE GERAL DE INT.
BCF LED ;APAGA O LED
RETURN ;RETORNA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE LIGAR O TIMER *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA EXECUTA AS AÇÕES NECESSÁRIAS PARA LIGAR O TIMER
LIGA_TIMER
BTFSC INTCON,GIE ;TIMER JÁ ESTA LIGADO?
RETURN ;SIM, RETORNA DIRETO
;NÃO
BCF INTCON,T0IF ;LIMPA FLAG DE INT. DE TMR0
MOVLW .256-.125
MOVWF TMR0 ;INICIA TMR0 CORRETAMENTE
MOVLW .125
MOVWF TEMP1 ;INICIA TEMP1 CORRETAMENTE
BSF INTCON,GIE ;LIGA CHAVE GERAL DE INTERRUPÇÕES
BSF LED ;ACENDE O LED
RETURN ;RETORNA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR ANALÓGICO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000101'
MOVWF OPTION_REG ;PRESCALER 1:64 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00100000'
MOVWF INTCON ;HABILITADA SOMENTE A INTERRUPÇÃO TMR0
;CHAVE GERAL DAS INTERRUÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS
MOVLW V_INICIO
MOVWF TEMPO ;INICIA TEMPO = V_INICIO
CALL ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
BTFSC F_FIM ;CHEGOU AO FIM?
CALL DESL_TIMER ;SIM, ENTÃO DESLIGA O TIMER
;NÃO
CALL ATUALIZA ;ATUALIZA O DISPLAY
MOVLW T_FILTRO
MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO
MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO
CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO ACAO_BT1 ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2
BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO
CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO ACAO_BT2 ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING
BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO
GOTO MAIN ;RETORNA AO LOOPING
ACAO_BT1 ;AÇÃO PARA O BOTÃO 1
BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
CALL LIGA_TIMER ;LIGA O TIMER
GOTO MAIN
ACAO_BT2 ;AÇÃO PARA O BOTÃO 2
BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
CALL DESL_TIMER ;DESLIGA O TIMER
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END ;OBRIGATÓRIO