Interrupções e timers Guilherme Luiz Moritz 1 1 DAELT - Universidade Tecnológica Federal do Paraná 4 de dezembro de 2013
Objetivos Compreender o funcionamento de um display de sete segmentos Compreender o sistema de interrupções do PIC Compreender a arquitetura de Timers do PIC
Display de Sete Segmentos Figura : Display de 7 segmentos (cátodo comum)
Multiplexação de displays de 7 segmentos
74HC4511
Introdução Vivemos num mundo controlado pelo tempo Muitas das ações que um microcontrolador toma devem ser regradas pelo tempo O sistema de timers e interrupções provê maneiras do microcontrolador responder em tempo aos estímulos do sistema
Interrupções Interrupções
Conceito de interrupção Uma interrupção de um processador funciona de maneira análoga a uma interrupção do mundo real Num processador, ela é atendida de maneira urgente. É importante salvar o contexto antes de atender a interrupção
O que gera uma interrupção no PIC? Escrita na EEPROM Comparador UART RX e TX Timer 1 (Capture e Match e Overflow) Timer 2 (Match) Interrupções externas (GPIO) Outros chips possuem outras fontes
Como configurar uma interrupção no PIC INTCON -> Liga ou desliga as diferentes interrupções (mascara) PIE1 -> Peripheral enable IRQs Habilite a geração de interrupção do periférico!
Como configurar uma interrupção no PIC Figura : Sistemas de interrupção do PIC
O que acontece quando o PIC detecta uma interrupção? Completa a instrução corrente Salva o Program Counter Limpa o GIE Executa o código na posição correspondente a interrupção (0x0004) No fim o programa usa uma instrução especial que restaura o Program counter, continuando daonde o programa parou
O que acontece quando o PIC detecta uma interrupção? Figura : Ilustração de interrupção do PIC
Salvamento de contexto O estado dos registradores do PIC devem ser salvos para execução da interrupção O MicroC faz este trabalho Se for usar assembly, deve ser feito no código
Regiões Críticas Regiões onde o processador não pode parar para realizar outra tarefa Mascaramento de interrupções
Como fazer no MicroC? void interrupt() { counter++; TMR0 = 96; INTCON = 0x20; }
Como fazer no MicroC? void interrupt() { if (INTCON.TMR0IF){ counter++; TMR0 = 96; INTCON.TMR0IF = 0; } else if (INTCON.RBIF){ counter++; TMR0 = 96; INTCON.RBIF = 0; } }
Contadores Contadores
O que é um contador? Figura : Contador digital
Usos do contador Contar tempo [com o auxílio do módulo de capture/compare/pwm (será estudado na aula sobre PWM)] Contar eventos
Timer1 do PIC Figura : Timer 1 do PIC16f628A Olhar datasheet!
Timer 1 - Passo a passo O Prescaler sempre está ativo: Deve se configurar sua taxa (T1CKPS1 e T1CKPS0) no T1CON Selecione o modo: TMR1CS (0: externo, 1: interno) Ative T1OSCEN: O oscilador começa a contar e o valor de TMR1H e TMR1L são incremendados a cada ciclo de clock Quando a contagem estoura, a flag TMR1IF é setada (e gera uma interrupção caso a mesma esteja configurada)
Outros Timers Timer 0 - WatchDog timer Timer 2 - Base de tempo para o PWM e o CCP
Timer 0 do PIC Olhar datasheet! Figura : Timer 0 do PIC16f628A
Contando tempo com o Timer 0 Tempo de estouro (8bits) = ciclo de máquina * prescaler * (256 - TMR0) Ciclo de máquina = 1 Fosc/4 Prescaler: PS< 2 : 0 > Valor de contagem é carregado em TMR0 Como fica para o estouro de 16 bits?
Timer 0 - Passo a passo Selecione o modo do timer no OPTIONREG (T0CS: 0 = timer e 1 = counter) Caso se desejar utilizar o prescaler, o mesmo deve ser habilitado com o bit PSA do OPTIONREG. O valor do prescaler é configurado em PS2-PS0 Se a interrupção for utilizada, GIE e T0IE devem ser configurados no INTCON Para contar tempo Escreva o valor de TMR0 (condição inicial) Lendo-se TMR0 tem se o número de ciclos passados (o que pode ser convertido em tempo) A flag de interrupção TMR0IF do INTCON é setada toda vez que TMR0 estoura. Para contar pulsos A polaridade dos pulsos em RA4 deve ser selecionada pelo TOSE do option reg O número de pulsos é contado em TMR0, as interrupções funcionam normalmente