eng-1450 microcontroladores e sistemas embarcadosabranco/eng1450/lab02/lab02.pdf · interrupções...
TRANSCRIPT
ENG-1450Microcontroladores e Sistemas Embarcados
– Lab02 – Apresentação Kit PicGenios
Interrupção e Timers
Atividades
1. Executar tarefas da aula anterior no kit
2. Exemplo1:
1.Acionar o LED por interrupção de botão
3. Exemplo2:
1.Acionar o LED por interrupção de temporizador
Kit PicGenios
● Ver manual PDF: manual_picgenios.pdf
Operação do Kit PicGenios
● Conectar cabo serial– Computador – conector db9 no painel traseiro
– Kit – conector db9 ao lado da “ventoinha”
● Fonte– Conector oposto ao conector serial.
● Programa para carga de código.– WinPic800
Conector Serial
Fonte alimentaçãoCabo serial
WinPic800
1⁰1⁰ 2⁰2⁰
Interrupções
Interrupção no Microcontrolador
● Mecanismo para interromper a execução do programa principal
● Desvia a execução para um endereço especial
● Retorna para a execução principal no local que tinha interrompido.
Execução da interrrupção
Execuçãoda rotinaprincipal
Execuçãoda rotina deinterrupção
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4
Interrupção
Execução da interrrupção no PIC
Execuçãoda rotinaprincipal
Execuçãoda rotina deinterrupção
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4
Interrupção (High/Low priority)
PIC:High → &000008h → Low → &000018h →
MikroC:void interrupt(void);void interrupt_low(void);
Ajuda do MikroC
Manual do PIC
Tem uma cópia no computador do laboratório e no computador no dia da prova.
Interrupções no PIC (pg 73)
● Externa– INT[0,1,2] (B0,B1,B2)
● Transição em um pino digital: (0 → 1) ou (1 → 0)
– RB (B4 .. B7)● Alguma mudança nos 4 pinos digitais
● Interna– Timer[0,1,2]
– Outros periféricos
● Parallel Slave Port Read/Write● A/D Converter● USART Receive● USART Transmit● Master Synchronous Serial Port● Data EEPROM/FLASH Write Operation● Bus Collision● Low Voltage Detect
Procedimento (pg 75)
● Configurar os registradores relacionados com as interrupções.– INTCON, INTCON2, INTCON3, etc..
– Bits: ● xxxIF – Interrupt Flag ● xxxIE - Interrupt Enable● xxxIP – Interrupt Priority● INTEDGEx – Interrupt Edge Select
● Implementar as funções– void interrupt(void);
– void interrupt_low(void); // se necessário
● A função de interrupção deverá verificar os bits de interrupção (xxxIF==1) para saber qual foi a origem da mesma.
● No final deverá limpar (zerar) o xxxIF.
INTCON Registers (pag.75)
PIR Registers (pag.78)
Exemplo: Chave/Int0/B0, Led/D0www.inf.puc-rio.br/~abranco/eng1450/Lab02/Int0.c
// High priority int.function
void interrupt(void){
if (INTCON.INT0IF == 1){
PORTD.RD0 = ~PORTD.RD0;
INTCON.INT0IF=0;
}
}
void main() {
// Global Interrupt Enable
INTCON.GIE = 1;
// Int0/PORTB0 interrupt config
TRISB.RB0 = 1; // digital input
INTCON.INT0IF = 0;
INTCON.INT0IE = 1;
INTCON2.INTEDG0 = 0; // falling edge (1->0)
// Int0 priority is always high
// LED config
TRISD.RD0 = 0; // digital output
PORTD.RD0 = 0; // LED Off
}
TemporizadoresTimers
Temporizadores no PIC
● Contador programável● Entrada de clock configurável● Pode gerar interrupção no overflow● Exemplo
– Clock = 1Mhz → 1µs– Contador de 16bits– Carregar contador com 55.535 (65.535 – 10000)
– Gera overflow com 10.000 pulsos => 10ms
0xFFFF
Contador/Temporizador
Prescaler Timer/Counter
Data Bus
Timer Overflowinterrupt
InputClock
1:2, 1:4, …, 1:256
Principais pontos de atenção
● Combinação do Prescale x Counter– Prescale pequeno
● Permite passos pequenos (maior resolução)● Limita o tempo máximo● Ex: 0,5µs * 65535 => 65,535ms
– Prescale grande● Possibilita maior tempo máximo● Passo grande (menor resolução)● Ex: 256µs * 65535 => 16,77696 seg
Tempos maiores???
● Combinação: 2 ou mais timers– Combinação variável (Flexível & Complicado)
● Prescale0 + Counter0 + Prescale1 + Counter1
– Relógio: Fixo + variável (Restrito & Fácil)● Fixo: Prescale0 + Counter0 => 1ms● Variável: Prescale1 + Counter1 => X * 1ms● Exemplo: www.inf.puc-rio.br/~abranco/eng1450/Lab02/Timer0_1.c
● Combinação: Timer + Software● Fixo: Prescale0 + Counter0 => 1ms● Contador por software
– Hora, min., seg., ms– Dia, mês, ano
Timers [0...3] no PIC18F(pags. 105, 109, 113, 115)
● Timer0 module: – 8-bit/16-bit timer/counter
– with 8-bit programmable prescaler
● Timer1 module: – 16-bit timer/counter
● Timer2 module: – 8-bit timer/counter
– with 8-bit period register (time-base for PWM)
● Timer3 module: – 16-bit timer/counter
Registradores: Timers 0 & 1
Registradores: Timers 2 & 3
Timer0 + Timer1Timer 0
Timer 1
PORTC.RC0
// Timer 1 ConfigurationT1CON.RD16 = 8; // Read/Write in two 8 bits operT1CON.T1OSCEN = 0; // Disable internal OscilatorT1CON.TMR1CS = 1; // External clock from RC0T1CON.T1SYNC = 1; // Do not synchronize ext clock
Ligação internano PIC.
PORTC.RC0 = ~PORTC.RC0; => Timer0/2
Exemplo: Timer + LEDwww.inf.puc-rio.br/~abranco/eng1450/Lab02/Timer0.c
● Calcular o valor do timer– Scale * (65535 – count) => ???
– Ex: (8MHz / 4 ) / 2 => 1us ... 1000x => 1ms
● Função de interrupção– Testar TMR0IF
– Redefinir TMR0H e TMR0L
– Limpar TMR0IF
● Main()– Configurar Timer0
– Configurar Interrupção do Timer0
– Iniciar o Timer0