-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEpisode_14.html
377 lines (349 loc) · 14.6 KB
/
Episode_14.html
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
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<link rel="stylesheet" href="./style.css">
<script src="./functions.js"></script>
</head>
<body>
<div class="page" id="top">
<p class="title">
<span class="titlePrincipal">Episódio 14: Conhecendo a interrupção por estouro em Timer0 (registrador <span class="register">TMR0</span> de 8 bits) de 8 bits no PIC16F628A</span></p>
<p class="backPage"><a href="./Summary.html">Voltar ao índice</a></p>
<p class="backPage"><a href="./Episode_13.html">Voltar ao Episódio 13</a></p>
<p class="forwardPage"><a href="./Episode_15.html">Ir para Episódio 15</a></p>
<hr class="indice"/>
<p class="principal">Neste episodio veremos o uso do registrador <span class="register">TMR0</span> e da interrupção associada a ele no qual pode ser usado em rotinas de temporizadores (contadores de tempo) mais precisos quanto também contadores associado ao pino RA4/T0CKI.</p>
<p class="principal">O registrador <span class="register">TMR0</span> SEMPRE é incrementado e cabe ao desenvolvedor do software fazer a escolha por incremento por pulso externo dado no pino <span class="register">RA4</span>/<span class="register">T0CKI</span> ou por um incremento dado por ciclo de instrução.</p>
<p class="principal">O registrador <span class="register">TMR0</span> pode ser zerado (limpo - clear) usando a instrução <span class="instruction">CLRF</span> <span class="register">TMR0</span> como também pode ser atualizado para um valor pelas instruções:</p>
<table class="code">
<thead>
<tr>
<th>
<span class="codeTitle">Código 14.1 -</span> Incremento de transição de alto para baixo sobre o pino RA4/T0CKI</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<pre class="code">
<code>MOVLW 0xEA ; coloca o valor 0xEA (234 em decimal)</code>
<code> ; no registrador W</code>
<code></code>
<code>MOVWF TMR0 ; coloca o valor 0xEA (234 em decimal)</code>
<code> ; do registrador W no registrador TMR0</code>
</pre>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoCode">
<span>Fonte:</span> <span>Autor 2021</span>
</td>
</td>
</tfoot>
</table>
<p class="principal">A escolha para a definição de qual será a fonte de incremento é dada por:</p>
<ul class="list">
<li>
<b>externa no pino <span class="register">RA4</span>/<span class="register">T0CKI</span></b>
<br/><br/>
<table class="code">
<thead>
<tr>
<th>
<span class="codeTitle">Código 14.2 -</span> Incremento de transição de alto para baixo sobre o pino RA4/T0CKI</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<pre class="code">
<code>BSF OPTION_REG, T0CS ; incremento na transicao de alto para baixo</code>
<code> ; sobre o pino RA4/T0CKI</code>
<code>BSF OPTION_REG, T0SE</code>
</pre>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoCode">
<span>Fonte:</span> <span>Autor 2021</span>
</td>
</td>
</tfoot>
</table>
</li>
<li style="list-style:none;">
<br/><br/>ou<br/><br/></li>
<li>
<b>ciclo de instrução interna (CLKOUT)</b>
<br/><br/>
<table class="code">
<thead>
<tr>
<th>
<span class="codeTitle">Código 14.3 -</span> Incremento pelo uso do clock interno do microcontrolador</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<pre class="code">
<code>BCF OPTION_REG, T0CS</code>
</pre>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoCode">
<span>Fonte:</span> <span>Autor 2021</span>
</td>
</td>
</tfoot>
</table>
</li>
</ul>
<p class="principal">Há também uma configuração importante que é a razão (taxa) de incremento do registrador <span class="register">TMR0</span>.</p>
<p class="principal">O bit PSA do registrador OPTION_REG é o bit de atribuição do Prescaler (Pré escala) que pode ser atribuido ao TImer0 ou ao Watchdog Timer (que será visto no episodio 25).</p>
<p class="principal">Se o Prescaler não for atribuido ao Timer0, usando a instrução <span class="instruction">BSF</span> <span class="register">OPTION_REG</span><span class="register">, PSA</span>, o Prescaler será atribuido ao WDT (Watchdog Timer) e a taxa de incremento do registrador <span class="register">TMR0</span> será de 1:1 [contagem 0x00 até 0xFF(255)].</p>
<p class="principal">Se os Prescaler for atribuído ao Timer0 a relação de incremento do registrador <span class="register">TMR0</span> será baseada na Tabela 14.1.</p>
<table class="data">
<thead>
<tr>
<th>
<span class="dataTitle">Tabela 14.1 -</span> Relação de incremento
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<table class="dataValues">
<thead>
<tr>
<th><span class="register">PS2</span></th>
<th><span class="register">PS1</span></th>
<th><span class="register">PS0</span></th>
<th>TAXA <span class="register">TMR0</span></th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1:2</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1:4</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1:8</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1:16</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1:32</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1:64</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1:128</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1:256</span></p></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoData">
<span>Fonte:</span> <span>Próprio autor (2021)</span>
</td>
</td>
</tfoot>
</table>
<p class="principal">Assim, por exemplo, se PS<2:0> = 001 e T0CS = 1, a cada 4 pulsos no pino <span class="register">RA4</span>/<span class="register">T0CKI</span> há o incremento de 1 unidade no registrador <span class="register">TMR0</span>. Agora se <span class="register">PS<2:0></span> = 110 e <span class="register">T0CS</span> = 1, a cada 120 pulsos no pino <span class="register">RA4</span>/<span class="register">T0CKI</span> há o incremento de 1 unidade no registrador <span class="register">TMR0</span>, assim pode-se contar valor de 0 até 128*255 itens completos.</p>
<p class="principal">O acionamento da interrupção associado ao Timer0 se dá pelo estouro (passagem do valor de <span class="number">0xFF</span>,equivalente a 255, para o valor <span class="number">0x00</span>) do registrador <span class="register">TMR0</span> e a ativavação desta interrupção se dá pelos bits <span class="register">GIE</span> e <span class="register">T0IE</span> do registrador <span class="register">INTCON</span> conforme Figura 14.1.</p>
<table class="image">
<thead>
<tr>
<th>
<span class="figureTitle">Figura 14.1 -</span> Disposição dos pinos do teclado
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img src="figures/Interrupts_logic.png" style="width: 604.72px; height: 198.67px;" title="Interrupts logic" alt="Interrupts logic"/>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoFigura">
<span>Fonte:</span> <span class="citacao"><a href="Reference.html#microchip_2020b" target="_blank">MICROCHIP 2020 (b) pag. 109</a></span>
</td>
</td>
</tfoot>
</table>
<p class="principal">O bit/flag <span class="register">T0IF</span> do registrador <span class="register">INTCON</span> dá o estado da interrupção, onde se ao ler o estado do bit/flag <span class="register">T0IF</span> for igual a 1, houve um estouro do registrador <span class="register">TMR0</span>, caso <span class="register">T0IF</span> for igual a 0, não houve um estouro no registrador <span class="register">TMR0</span>.</p>
<p class="principal">Seja o circuito eletrônico da Figura 14.2 no qual tem a função de contagem de objetos/pessoas ao passar pelo sensor fotoeletronico.</p>
<table class="image">
<thead>
<tr>
<th>
<span class="figureTitle">Figura 14.2 -</span> COLOCAR AQUI O DESENHO DO CIRCUITO
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img src="" style="width: 604.72px; height: 198.67px;" title="COLOCAR AQUI O DESENHO DO CIRCUITO" alt="COLOCAR AQUI O DESENHO DO CIRCUITO"/>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoFigura">
<span>Fonte:</span> <span>Próprio autor (2021)</span>
</td>
</td>
</tfoot>
</table>
<p class="principal">Neste exemplo queremos contar a quantidade de 37 objetos/pessoas ao passar pelo sensor. Ao obter a quantidade desejada o led ligado ao pino <span class="register">RB3</span> deve ser ligado e reiniciado a contagem. O led permanecerá verde até termos o 1º objeto/pessoa passad(a) pelo sensor novamente.</p>
<table class="code">
<thead>
<tr>
<th>
<span class="codeTitle">Código 14.4 -</span> Implementação do exemplo de aplicação da int. de estouro do registrador <span class="instruction">TMR0</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<pre class="code">
<code> ; DESENVOLVIDO POR EVERTON P. CRUZ</code>
<code> ; COM O PROPOSITO DE USO BASE PARA OS EPISODIOS</code>
<code> ; DA SERIE CONHECENDO O MICROCONTROLADOR PIC16F628A</code>
<code> #INCLUDE <P16F628A.INC></code>
<code> LIST P=16F628A</code>
<code> __CONFIG _BODEN_ON & _MCLRE_ON & _LVP_OFF & _WDT_OFF & INTOSC & _CP_OFF & _PWRTE_ON</code>
<code> </code>
<code> ORG 0x00</code>
<code> GOTO SETUP</code>
<code></code>
<code> ORG 0x04</code>
<code> BTFSC INTCON, T0IF ; testa se interrupcao ocorreu por causa de Timer0</code>
<code> GOTO TRATAMENTO_TIMER0 ; se sim, salta p/ tratamento Timer0</code>
<code> GOTO SAI_INTERRUPCOES</code>
<code>TRATAMENTO_TIMER0:</code>
<code> BCF INTCON, T0IF ; desliga flag</code>
<code> MOVLW .219 ; 256 - 37 = 219</code>
<code> MOVWF TMR0 ; atualiza TMR0</code>
<code> BSF PORTB, RB3 ; liga led em RB3 - quantidade satisfeita</code>
<code> BCF PORTB, RB2 ; desliga led em RB2</code>
<code> CLRW ; limpa registrador W</code>
<code> GOTO SAI_INTERRUPCOES</code>
<code></code>
<code> ;...</code>
<code></code>
<code>SAI_INTERRUPCOES:</code>
<code> ; restaura valores de W e STATUS</code>
<code></code>
<code>SETUP:</code>
<code> BCF STATUS, RP1 ; episodio 3 - selecao de banco de memoria 1</code>
<code> BSF STATUS, RP0 ; episodio 3 - selecao de banco de memoria 1</code>
<code></code>
<code> BSF OPTION_REG, T0CS ; fonte de incremento externo no pino RA4/T0CKI</code>
<code> BCF OPTION_REG, T0SE ; incremento na transicao de nivel baixa </code>
<code> ; para alto no pino RA4/T0CKI</code>
<code></code>
<code> BSF OPTION_REG, PSA ; Prescaler nao atribuido ao Timer0,</code>
<code> ; entao a relacao eh 1:1</code>
<code></code>
<code> BSF PORTA, RA4 ; episodio 4 - RA4 eh um pino de entrada</code>
<code> BCF PORTB, RB2 ; episodio 4 - RB2 eh um pino de saida</code>
<code> BCF PORTB, RB3 ; episodio 4 - RB3 eh um pino de saida</code>
<code></code>
<code> BCF STATUS, RP0 ; selecao do banco de memoria 0</code>
<code></code>
<code> MOVLW .219 ; 256 - 37 = 219</code>
<code> MOVWF TMR0 ; atualiza o registrador TMR0</code>
<code></code>
<code> BSF PORTB, RB2 ; liga led de estado de não completo a contagem</code>
<code> BCF PORTB, RB3 ; desliga led de estado de completo a contagem</code>
<code></code>
<code> MOVLW 0x07 ; 0x07 = 0000.0111 (desliga modulo comparador)</code>
<code> MOVWF CMCON ; episodio 20 - desligando o modulo comparador</code>
<code></code>
<code> BSF INTCON, T0IE ; ativa a interrupcao do Timer0</code>
<code> BSF INTCON, GIE ; ativa a chave geral das interrupcoes</code>
<code></code>
<code> CLRW</code>
<code></code>
<code>MAIN:</code>
<code> XORWF TMR0, 0 ; se igual, z=1, senao z=0</code>
<code> BTFSC STATUS, Z</code>
<code> GOTO MAIN</code>
<code> BSF PORTB, RB2</code>
<code> BCF PORTB, RB3</code>
<code> GOTO MAIN</code>
<code></code>
<code> END</code>
</pre>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="citacaoCode">
<span>Fonte:</span> <span>Autor 2021</span>
</td>
</td>
</tfoot>
</table>
<p class="principal important"><span class="important">COMENTAR SOBRE USO DE TIMER0 SEM USO DA INTERRUPÇÃO</span></p>
<hr class="indice"/>
<p class="backPage"><a href="#top">Voltar ao topo da página</a></p>
<p class="backPage"><a href="./Episode_13.html">Voltar ao Episódio 13</a></p>
<p class="forwardPage"><a href="./Episode_15.html">Ir para Episódio 15</a></p>
<p class="backPage"><a href="./Summary.html">Voltar ao índice</a></p>
</div>
</body>
</html>