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
|
processor PIC16F873A
#include <p16f873a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CP_OFF & _CPD_OFF
cblock 0x20 ;definir variaveis
tempbyte1
tempbyte2
;; tempbyteX vai no timer para contar
byte1t1
byte2t1
;; byteXt1: 2 bytes para armazernar o tempo 1
byte1t2
byte2t2
;; byteXt2: 2 bytes para armazenar o tempo 2
flag ;; para saber se o timer deve adicionar ou esperar 256 ciclos
contador ;; para ajudar a contar os ciclos do timer
endc
org 0x0
errorlevel -302 ;desabilitar mensagens de avisos na compilacao
goto INICIO
;;;;;;;;INICIO DO TIMER;;;;;;;;;;;;;;;;
org 0x004
;;toif = 0;;;;;;;;;;;;;;;
movlw b'10100000'
banksel INTCON
movwf INTCON
;;TMR0 = 255;;;;;;;;;;;;;;;;;;;;;;
movlw d'253'
movwf TMR0 ; nao precisar selecionar o banco, pois INTCON esta no mesmo banco de TMR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
btfss flag, 0 ;; se o primeiro bit da flag for 0, entao adicionar
goto ADICIONAR_1 ;; sim -> adicionar 1
decf contador, 1; decrementar 1 no contador
goto PULO
ADICIONAR_1: ;;ADICIONAR 1 NO tempbyteX
incfsz tempbyte1, 1
goto PULO
incf tempbyte2, 1
goto PULO
;;;;;;;;;
PULO:
retfie
INICIO:
; RB2 -> echo
; RB1 -> trigger
banksel TRISB
movlw b'00000100' ; rb22= input(recebe) / rb1 = output(manda)
movwf TRISB
;; echo e trigger arrumados
;;setar timer
;;;;option_reg
movlw b'00000010' ; prescaler = 8
banksel OPTION_REG
movwf OPTION_REG
;;;;intcon
movlw b'00000000' ; rotinas de interrupcoes estao desativadas por enquanto
banksel INTCON ; e todas as rotinas de interrupcao estao desativadas
movwf INTCON
;;;;TMR0
;movlw d'253' ; para o timer ficar 25us
movlw d'253'
banksel TMR0 ; Nint = 500000
movwf TMR0
;; resetar tempbyteX
movlw d'0'
movwf tempbyte1
movwf tempbyte2
movlw d'0' ;; colocar 0 no flag
movwf flag
;;ATIVAR O TRIGGER;;;
banksel PORTB
bsf PORTB, RB1 ; ligou o trigger
nop
nop
banksel PORTB
bsf PORTB, RB3 ; ativar um led
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ;; 15 us
bcf PORTB, RB1 ;; desliga o trigger
;;ATIVAR O TIMER;;
movlw b'10100000'
movwf INTCON ;nao precisa selecionar intcon esta no banco do portb ;;;;;;;;;;;;;;;;;;;;; !!!!!!! PQ TA DEMORANDO PARA O TIMER COMECAR
;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESPERA_RETORNO1:
banksel PORTB
btfss PORTB, RB2 ; VERIFICAR SE echo esta em 1
goto ESPERA_RETORNO1 ; nao
;;perguntar do timer que esta muito rapido e portanto nao sai dele
;;perguntar do pq o rb2 esta em 1 quando comeca -> testar isso com um led
;;DESATIVA O TIMER;;
movlw b'00000000'
banksel INTCON
movwf INTCON
; banksel PORTB
; bcf PORTB, RB3 ; desativar o led
;;;;SALVAR O VALOR;;;;
movf tempbyte1, W
movwf byte1t1
movf tempbyte2, W
movwf byte2t1
;;ATIVAR UM TIMER POR 400 CICLOS;;;;
;;para dar 10 ms;;;;;;;;;;;;;;;;;;;;
movlw b'10100000' ;; ativar o timer
banksel INTCON
movwf INTCON
movlw d'255' ;; colocar 1 no flag
movwf flag
movwf contador ; contador = 255;
ESPERA_255:
btfss STATUS, Z ; ver se contador - 1 = 0
goto ESPERA_255 ; se nao for
movlw d'145' ; 255+145 = 400
movwf contador; contador = 145
bcf STATUS, Z ; garantir que Z = 0 antes de entrar
ESPERA_145:
btfss STATUS, Z ; ver se contador - 1 = 0
goto ESPERA_145 ; se nao for
;;;termino 10 ms
;;desativar o timer
movlw b'00000000'
movwf INTCON
;;TERMINO DA ESPERA
;goto $ ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!VERIFICAR AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DEPOIS TESTAR O RESTO
;;;ATIVAR A SEGUNDA VEZ O SENSOR;;;;;;
movlw d'0' ;; colocar 0 no flag
movwf flag
movwf tempbyte1 ;;resetar o tempbyteX
movwf tempbyte2
;;ATIVAR O TRIGGER;;;
banksel PORTB
bsf PORTB, RB1 ; ligou o trigger
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ;; 15 us
bcf PORTB, RB1 ;; desliga o trigger
;;ATIVAR O TIMER;;
movlw b'10100000'
movwf INTCON ;nao precisa selecionar intcon esta no banco do portb ;;;;;;;;;;;;;;;;;;;;; !!!!!!! PQ TA DEMORANDO PARA O TIMER COMECAR
ESPERA_RETORNO2:
banksel PORTB
btfss PORTB, RB2 ; VERIFICAR SE echo esta em 1
goto ESPERA_RETORNO2 ; nao
;;DESATIVA O TIMER;;
movlw b'00000000'
banksel INTCON
movwf INTCON
;;;;SALVAR O VALOR;;;;
movf tempbyte1, W
movwf byte1t2
movf tempbyte2, W
movwf byte2t2
banksel PORTB
bcf PORTB, RB3 ; desativar o led
goto $
end
|