Baixe o app para aproveitar ainda mais
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
Compartilhar