summaryrefslogtreecommitdiff
path: root/teste.asm
blob: ee39a853289b3b06f0fddde3fa94615debea988b (plain)
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