• Nenhum resultado encontrado

elt024-11-InterrupcoesWatchdog

N/A
N/A
Protected

Academic year: 2021

Share "elt024-11-InterrupcoesWatchdog"

Copied!
27
0
0

Texto

(1)

Universidade Federal de Itajubá [email protected]

(2)

Reprodução de Sons e Timers

(3)

Timers

São circuitos eletrônicos que realizam a contagem do tempo, podendo ou não disparar eventos em determinados instantes.

(4)

Timers

ˆ Ao invez de contarmos a quantidade de ciclos que queremos esperar e utilizar um loop for vazio, podemos utilizar os timers ˆ Modo de operação

ˆ Inicializam-se as congurações necessárias

ˆ Prescaler

ˆ Fonte de clock

ˆ Quantidade de bits (Timer0 apenas)

ˆ Congura-se o timer com o valor desejado1

ˆ Dispara o hardware

(5)

6

7 void AguardaTimer(void){ 8 while(!BitTst(INTCON,2));

9 }

10

11 void ResetaTimer(unsigned int tempo){

12 unsigned ciclos = tempo * 2; //para 8MHz, 1 ms = 2 ciclos

13 ciclos = 65535 - ciclos; //overflow com 2^15-1 = 65535 (16 bits)

14 ciclos -= 14; //subtrai tempo de overhead(experimental) 15 TMR0H = (ciclos >> 8); //salva a parte alta

16 TMR0L = (ciclos & 0x00FF); //salva a parte baixa 17 BitClr(INTCON,2); //limpa a flag de overflow

(6)

Interrupções

(7)

ˆ Até agora, o uxo do programa é determinado apenas pelo programa principal

ˆ Problema

ˆ Alguns periféricos necessitam de um tempo para que possam executar suas tarefas

ˆ Este tempo era gasto fazendo nada - loop vazio - enquanto esperamos uma variável ou ag mudar de estado

(8)

Interrupção

ˆ Solução: Interrupção

ˆ Desenvolver um sistema que nos avise quando uma determinada tarefa acabou

ˆ Este sistema deve ser acionado automaticamente

ˆ O uxo do programa não deve ser alterado

ˆ O dispositivo/periférico em questão deve estar preparado para gerar uma interrupção

(9)

Programa

Principal InterrupçãoRotina de ProgramaPrincipal Latência da

Interrupção Acontece a

Interrupção da ISRInicio Continua o fluxodo programa

Tempo Latência da

Interrupção Fim da

(10)

Interrupção

ˆ Quando gerada uma interrupção o programa é paralizado e uma função de interrupção é executada

ˆ Conversor AD: quando o resultado da conversão estiver disponível para leitura.

ˆ Porta B: quando algum dos bits congurados como entrada altera seu valor.

(11)

Atenção

A função que irá tratar da interrupção não retorna nem recebe nenhum valor

(12)

Interrupção

1 //Usando compilador C18 da microchip 2 void NomeDaFuncao(void)

3 {

4 //código ...

5 }

6

7 //Indicar a posição no vetor de interrupções 8 #pragma code high_vector=0x08

9 void interrupt_at_high_vector(void)

10 {

11 _asm GOTO Interrupcao _endasm

12 }

13 #pragma code

(13)

1 void NomeDaFuncao(void) interrupt 1

2 {

3 //código ...

(14)

Interrupção

ˆ Existe uma correlação entre

ˆ o número que vem depois da expressão interrupt para o compilador SDCC

ˆ o número ao nal da expressão #pragma code high_vector para o C18

ˆ Estes números representam a posição para a qual o

microcontrolador vai quando acontece uma interrupção. Estas posições estão numa área conhecida como vetor de

(15)

ˆ 0x00(0)

ˆ 0x08(1)

ˆ 0x18(2)

ˆ Como muitos periféricos são mapeados na mesma interrupção, a função deve ser capaz de diferenciar entre as diversas fontes de requisição.

ˆ Uma maneira de se realizar esta vericação é através das ags de controle, ou seja, bits que indicam a situação de cada

(16)

Interrupção

1 void Interrupcao(void) interrupt 1 {

2 if (BitTst(PIR1,0)) { /*codigo*/ } //overflow do TIMER1

3 if (BitTst(PIR1,1)) { /*codigo*/ } //comparação do TIMER2 com PR2 4 if (BitTst(PIR1,2)) { /*codigo*/ } //comparação do CCP1

5 if (BitTst(PIR1,3)) { /*codigo*/ } //fim de operação na porta paralela 6 if (BitTst(PIR1,4)) { /*codigo*/ } //fim de transmissão da Serial 7 if (BitTst(PIR1,5)) { /*codigo*/ } //recepção da Serial

8 if (BitTst(PIR1,6)) { /*codigo*/ } //fim de conversão do AD

9 if (BitTst(PIR1,7)) { /*codigo*/ } //leitura/escrita da porta paralela 10 if (BitTst(PIR2,0)) { /*codigo*/ } //comparação do CCP2

11 if (BitTst(PIR1,1)) { /*codigo*/ } //overflow do TIMER3

12 if (BitTst(PIR1,2)) { /*codigo*/ } //condição de Tensão Alta/Baixa

13 if (BitTst(PIR1,3)) { /*codigo*/ } //detecção de colisão no barramento 14 if (BitTst(PIR1,4)) { /*codigo*/ } //fim escrita na memoria flash 15 if (BitTst(PIR1,5)) { /*codigo*/ } //interrupção da USB

16 if (BitTst(PIR1,6)) { /*codigo*/ } //mudança na entrada de comparação 17 if (BitTst(PIR1,7)) { /*codigo*/ } //falha no oscilador

(17)

6 ADvalor = ADRESH ; // lê o resultado 7 ADvalor <<= 8;

8 ADvalor += ADRESL;

9 BitClr(PIR1,6); //limpa a flag

10 }

11 if (BitTst(PIR1,5)) //Serial: recepção { 12 Serial = RCREG; //limpa sozinho quando lê

13 //BitClr(PIR1,5);

14 }

15 if (BitTst(INTCON,2)) //TIMER0: Overflow{ 16 ResetaTimer(50000);

(18)

Interrupção

1 BitClr(RCON,7); //desabilita IPEN (modo de compatibilidade) 2 BitSet(PIE1,6); // liga a interrupção para o AD

3 BitSet(PIE1,5); // liga a interrupção para a recepção na serial 4 BitSet(INTCON,5); // liga a interrupção para o timer 0

5 BitSet(INTCON,3); // liga a interrupção para a porta B

6 BitSet(INTCON,7); //habilita todas as interrupções globais 7 BitSet(INTCON,6); //habilita todas as interrupções de periféricos

(19)
(20)

Interrupção

ˆ Filme: O m do loop innito ˆ Estrelado por: Watchdog ˆ Do mesmo diretor de:

ˆ A volta dos que não morram

ˆ Poeira em alto mar

(21)

ˆ Situações incômodas num programa que está rodando

ˆ Loop innito

ˆ Dead lock

(22)

Watchdog

(23)
(24)

Watchdog

(25)

ˆ O watchdog visa aumentar a segurança do projeto. ˆ Funciona como um temporizador

ˆ Precisa ter seu contador constantemente reiniciado.

ˆ Caso não seja reiniciado no tempo exigido, o watchdog reinicia o microcontrolador

(26)

Interrupção

1 //code char at 0x300003 CONFIG2H = 0x00; // Watchdog controlado por software

2

3 #define CLRWTD() _asm CLRWDT _endasm 4

5 void main(void) interrupt 0

6 {

7 unsigned int i; 8 unsigned char temp; 9 TRISD=0x00;

10 PORTD=0x00;

11 BitSet(WDTCON,0); //liga o sistema de watchdog

12 for(;;)

13 {

14 PORTD++;

15 for(i = 0; i < 10000; i++)

(27)

Atenção

ˆ O #dene criado na primeira linha do programa anterior faz uso das diretivas _asm e _endasm

ˆ Estas diretivas indicam que o código a seguir não deve ser alterado pelo compilador

ˆ O comando CLRWDT indica que o micro deve resetar o watchdog

Referências

Documentos relacionados

Fica claro que o romance é cheio de significados objetivos e universais e que muitos fatores da vida de Gadda, como a família (começou a escrever este livro logo depois da morte

Os anos de 1995 a 2000 foram marcados pela grande popularidade do Movimento dos Trabalhadores Rurais sem Terra (MST) na área urbana e foram os mais representativos no país no que

Há somente um modo para se obter vitória sobre estes três tipos de morte (física, espiritual e eterna), a saber, morrendo para a sentença de condenação e maldição da

Também chegado a experimentações em diferentes tipos de registro sonoro, Arnaldo Antunes ressalta a diferença do que a tecnologia o permite gravar em pe- quenos estúdios, como a que

É o nome usado para descrever empresas que prestam serviços financeiros, tendo na tecnologia seu grande diferencial — muitas delas, inclusive, não têm agências para atender

y Se o Decisor for pelo menos moderadamente optimista então deverá optar pela produção das Lolas Tia. y Nos outros casos, o Decisor deverá optar pela produção de

thread corrente em estado de espera até que outra thread chame os métodos notify ou notifyAll liberando o

A implementação da pesquisa como prática de formação é difícil, mais pela concepção restrita dada à pesquisa pelas “comunidades científicas” do que pela