Buscar

elt024-12-InterrupcoesWatchdog

Prévia do material em texto

Interrupc¸a˜o e Watchdog
Prof.MSc.Rodrigo Maximiano Antunes de Almeida
Universidade Federal de Itajuba´
rodrigomax@unifei.edu.br
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 1 / 1
Reproduc¸a˜o de Sons e Timers
Revisa˜o
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 2 / 1
Timers
Timers
Sa˜o circuitos eletroˆnicos que realizam a contagem do tempo, podendo ou
na˜o disparar eventos em determinados instantes.
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 3 / 1
Timers
Ao inve´s de contarmos a quantidade de ciclos que queremos esperar e
utilizar um loop for vazio, podemos utilizar os timers
Modo de operac¸a˜o
Inicializam-se as configurac¸o˜es necessa´rias
Prescaler
Fonte de clock
Quantidade de bits (Timer0 apenas)
Configura-se o timer com o valor desejado1
Dispara o hardware
Aguarda overflow
Reinicia o timer
1O valor deve ser o complemento com base na quantidade de bits dispon´ıveis
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 4 / 1
Timer
1 #include "basico.h"
2 #include "timer.h"
3 char FimTimer ( v o i d ) {
4 r e t u r n BitTst ( INTCON , 2 ) ;
5 }
6 v o i d AguardaTimer ( v o i d ) {
7 w h i l e ( ! BitTst ( INTCON , 2 ) ) ;
8 }
9 v o i d ResetaTimer ( uns igned i n t tempo ) {
10 uns igned ciclos = tempo * 2 ; // para 8MHz, 1 ms = 2 c i c l o s
11 ciclos = 65535 − ciclos ; // o v e r f l o w com 2ˆ15−1 = 65535 ←↩
(16 b i t s )
12 ciclos −= 1 4 ; // s u b t r a i tempo de ←↩
o v e r h e a d ( e x p e r i m e n t a l )
13 TMR0H = ( ciclos >> 8) ; // s a l v a a p a r t e a l t a
14 TMR0L = ( ciclos & 0x00FF ) ; // s a l v a a p a r t e b a i x a
15 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g de o v e r f l o w
16 }
17 v o i d InicializaTimer ( v o i d ) {
18 T0CON = 0b00001000 ; // c o n f i g u r a t i m e r 0 sem p r e s c a l e r
19 BitSet ( T0CON , 7 ) ; // l i g a o t i m e r 0
20 }
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 5 / 1
Interrupc¸o˜es
Interrupc¸o˜es
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 6 / 1
Interrupc¸a˜o
Ate´ agora, o fluxo do programa e´ determinado apenas pelo programa
principal
Problema
Alguns perife´ricos necessitam de um tempo para que possam executar
suas tarefas
Este tempo era gasto fazendo nada - loop vazio - enquanto esperamos
uma varia´vel ou flag mudar de estado
Esta te´cnica utilizada ate´ agora e´ denominada pooling
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 7 / 1
Interrupc¸a˜o
Soluc¸a˜o: Interrupc¸a˜o
Desenvolver um sistema que nos avise quando uma determinada tarefa
acabou
Este sistema deve ser acionado automaticamente
O fluxo do programa na˜o deve ser alterado
O dispositivo/perife´rico em questa˜o deve estar preparado para gerar
uma interrupc¸a˜o
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 8 / 1
Interrupc¸a˜o
Programa
Principal
Rotina de
Interrupção
Programa
Principal
Latência da
Interrupção
Acontece a
Interrupção
Início 
da ISR
Continua o fluxo
do programa
TempoLatência da
Interrupção
Fim da 
ISR
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 9 / 1
Interrupc¸a˜o
Quando gerada uma interrupc¸a˜o o programa e´ paralisado e uma
func¸a˜o de interrupc¸a˜o e´ executada
Exemplos:
Conversor AD: quando o resultado da conversa˜o estiver dispon´ıvel para
leitura.
Porta B: quando algum dos bits configurados como entrada altera seu
valor.
Timer 0: quando acontece overflow em seu contador
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 10 / 1
Interrupc¸a˜o
Atenc¸a˜o
A func¸a˜o que ira´ tratar da interrupc¸a˜o na˜o retorna nem recebe nenhum
valor
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 11 / 1
Interrupc¸a˜o
1 // Usando c o m p i l a d o r C18
2
3 v o i d NomeDaFuncao ( v o i d )
4 {
5 // c o´ d i g o . . .
6 }
7 // I n d i c a r a p o s i c¸ a˜ o no v e t o r de i n t e r r u p c¸ o˜ e s
8 #pragma code high_vector=0x08
9 v o i d interrupt_at_high_vector ( v o i d )
10 {
11 _asm GOTO NomeDaFuncao _endasm
12 }
13 #pragma code
14 #pragma interrupt NomeDaFuncao
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 12 / 1
Interrupc¸a˜o
1 // Usando c o m p i l a d o r SDCC
2
3 v o i d NomeDaFuncao ( v o i d ) interrupt 1
4 {
5 // c o´ d i g o . . .
6 }
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 13 / 1
Interrupc¸a˜o
Existe uma correlac¸a˜o entre
o nu´mero que vem depois da expressa˜o interrupt para o compilador
SDCC
o nu´mero ao final da expressa˜o #pragma code high vector para o C18
Estes nu´meros representam a posic¸a˜o para a qual o microcontrolador
vai quando acontece uma interrupc¸a˜o. Estas posic¸o˜es esta˜o numa
a´rea conhecida como vetor de interrupc¸o˜es.
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 14 / 1
Interrupc¸a˜o
Para o microcontrolador PIC18f4550 este vetor possui treˆs posic¸o˜es
importantes:2
0x00 (0)
0x08 (1)
0x18 (2)
Como muitos perife´ricos sa˜o mapeados na mesma interrupc¸a˜o, a
func¸a˜o deve ser capaz de diferenciar entre as diversas fontes de
requisic¸a˜o.
Uma maneira de se realizar esta verificac¸a˜o e´ atrave´s das flags de
controle, ou seja, bits que indicam a situac¸a˜o de cada perife´rico.
2O compilador C18 usa a posic¸a˜o f´ısica e o SDCC o nu´mero entre pareˆnteses.
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 15 / 1
Interrupc¸a˜o
1 v o i d Interrupcao ( v o i d ) interrupt 1 {
2 i f ( BitTst ( PIR1 , 0 ) ) { /* c o d i g o */ } // o v e r f l o w do TIMER1
3 i f ( BitTst ( PIR1 , 1 ) ) { /* c o d i g o */ } // comparac¸ a˜o TIMER2 = PR2
4 i f ( BitTst ( PIR1 , 2 ) ) { /* c o d i g o */ } // comparac¸ a˜o do CCP1
5 i f ( BitTst ( PIR1 , 3 ) ) { /* c o d i g o */ } // f im e n v i o p o r t . p a r a l e l a
6 i f ( BitTst ( PIR1 , 4 ) ) { /* c o d i g o */ } // f im t r a n s m i s s a˜ o da S e r i a l
7 i f ( BitTst ( PIR1 , 5 ) ) { /* c o d i g o */ } // r e c e p c¸ a˜ o da S e r i a l
8 i f ( BitTst ( PIR1 , 6 ) ) { /* c o d i g o */ } // f im de c o n v e r s a˜ o do AD
9 i f ( BitTst ( PIR1 , 7 ) ) { /* c o d i g o */ } // l e i t u r a / e s c r i t a p a r a l e l a
10 i f ( BitTst ( PIR2 , 0 ) ) { /* c o d i g o */ } // comparac¸ a˜o do CCP2
11 i f ( BitTst ( PIR2 , 1 ) ) { /* c o d i g o */ } // o v e r f l o w do TIMER3
12 i f ( BitTst ( PIR2 , 2 ) ) { /* c o d i g o */ } // problema na t e n s a o (V)
13 i f ( BitTst ( PIR2 , 3 ) ) { /* c o d i g o */ } // c o l i s a˜ o no barramento
14 i f ( BitTst ( PIR2 , 4 ) ) { /* c o d i g o */ } // f im e s c r i t a na f l a s h
15 i f ( BitTst ( PIR2 , 5 ) ) { /* c o d i g o */ } // i n t e r r u p c¸ a˜ o da USB
16 i f ( BitTst ( PIR2 , 6 ) ) { /* c o d i g o */ } // mudanc¸a na comparac¸ a˜o
17 i f ( BitTst ( PIR2 , 7 ) ) { /* c o d i g o */ } // f a l h a no o s c i l a d o r
18 i f ( BitTst ( INTCON , 0 ) ) { /* c o d i g o */ } // mudanc¸a na PORTA B
19 i f ( BitTst ( INTCON , 1 ) ) { /* c o d i g o */ } // i n t e r r u p c¸ a˜ o e x t e r n a INT0
20 i f ( BitTst ( INTCON , 2 ) ) { /* c o d i g o */ } // o v e r f l o w no TIMER0
21 i f ( BitTst ( INTCON3 , 0 ) ) { /* c o d i g o */ } // i n t e r r u p c¸ a˜ o e x t e r n a INT1
22 i f ( BitTst ( INTCON3 , 1 ) ) { /* c o d i g o */ } // i n t e r r u p c¸ a˜ o e x t e r n a INT2
23 }
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 16 / 1
Interrupc¸a˜o
1 s t a t i c uns igned i n t ADvalor ;
2 s t a t i c uns igned char Serial ;
3 v o i d Interrupcao ( v o i d ) interrupt 1 {
4 char i , j ;
5 i f ( BitTst ( PIR1 , 6 ) ) { //AD : f im de c o n v e r s a˜ o
6 ADvalor = ADRESH ; // l eˆ o r e s u l t a d o
7 ADvalor <<= 8 ;
8 ADvalor += ADRESL ;
9 BitClr ( PIR1 , 6 ) ; // l i m p a a f l a g
10 }
11 i f ( BitTst( PIR1 , 5 ) ) { // S e r i a l : r e c e p c¸ a˜ o
12 Serial = RCREG ; // l i m p a s o z i n h o quando l eˆ
13 // B i t C l r ( PIR1 , 5 ) ;
14 }
15 i f ( BitTst ( INTCON , 2 ) ) { //TIMER0 : O v e r f l o w
16 ResetaTimer (50000) ;
17 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
18 }
19 i f ( BitTst ( INTCON , 0 ) ) { //PORTA B : mudou v a l o r
20 DebounceTeclas ( ) ;
21 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
22 }
23 }
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 17 / 1
Interrupc¸a˜o
1 BitClr ( RCON , 7 ) ; // d e s a b i l i t a IPEN ( modo de c o m p a t i b i l i d a d e )
2 BitSet ( PIE1 , 6 ) ; // l i g a a i n t e r r u p c¸ a˜ o para o AD
3 BitSet ( PIE1 , 5 ) ; // l i g a a i n t e r r u p c¸ a˜ o para a r e c e p c¸ a˜ o na s e r i a l
4 BitSet ( INTCON , 5 ) ; // l i g a a i n t e r r u p c¸ a˜ o para o t i m e r 0
5 BitSet ( INTCON , 3 ) ; // l i g a a i n t e r r u p c¸ a˜ o para a p o r t a B
6 BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s as i n t e r r u p c¸ o˜ e s g l o b a i s
7 BitSet ( INTCON , 6 ) ; // h a b i l i t a t o d a s as i n t e r r u p c¸ o˜ e s de p e r i f e´ r i c o s
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 18 / 1
Watchdog
Watchdog
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 19 / 1
Interrupc¸a˜o
Situac¸o˜es incoˆmodas/problema´ticas num programa que esta´ rodando
Loop infinito
Dead lock
Hack
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 20 / 1
Watchdog
Loop infinito
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 21 / 1
Watchdog
Dead lock
http://www.webkinesia.com/online/adv os/notes/deadlock.php
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 22 / 1
Watchdog
Hack
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 23 / 1
Interrupc¸a˜o
O watchdog visa aumentar a seguranc¸a do projeto.
Funciona como um temporizador
Precisa ter seu contador constantemente reiniciado.
Caso na˜o seja reiniciado no tempo exigido, o watchdog reinicia o
microcontrolador
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 24 / 1
Interrupc¸a˜o
1 // Watchdog c o n t r o l a d o por s o f t w a r e
2 code char at 0x300003 CONFIG2H = 0x00 ;
3
4
5 #define CLRWTD ( ) _asm CLRWDT _endasm
6
7 v o i d main ( v o i d )
8 {
9 uns igned i n t i ;
10 uns igned char temp ;
11 TRISD=0x00 ;
12 PORTD=0x00 ;
13 BitSet ( WDTCON , 0 ) ; // l i g a o s i s t e m a de watchdog
14 f o r ( ; ; )
15 {
16 PORTD++;
17 f o r ( i = 0 ; i < 10000 ; i++)
18 {
19 CLRWTD ( ) ;
20 }
21 }
22 }
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 25 / 1
Interrupc¸a˜o
Atenc¸a˜o
O #define criado na primeira linha do programa anterior faz uso das
diretivas asm e endasm
Estas diretivas indicam que o co´digo a seguir na˜o deve ser alterado
pelo compilador
O comando CLRWDT indica que o micro deve resetar o temporizador
do watchdog
ELT024 Interrupc¸a˜o e Watchdog rodrigomax@unifei.edu.br 26 / 1

Continue navegando