Baixe o app para aproveitar ainda mais
Prévia do material em texto
Timers Timers • Os microcontroladores de família PIC18 apresentam 4 timers internos, sendo 3 de 16 bits e 1 de 8 bits. Introdução • Um timer é utilizado para contar tempos ou contar pulsos externos, dependendo do timer utilizado. Desta forma, um timer pode funcionar como contador ou temporizador. • Quando o timer funciona em modo contador, ele funciona em modo assíncrono e, quando está configurado como temporizador, funciona no modo síncrono, pois em tempos exatos ele estabelecerá um evento. Introdução • Internamente, o PIC18F452 possui 4 timers denominados Timer0, Timer1, Timer2 e Timer3. • Os timers 0, 1 e 3 são de 16 bits, enquanto o timer2 é de 8 bits. • Um timer de 16 bits consegue contar até 65536, pois 216 é igual a este valor. • O de 8 bits conta até 256, pois 28 é igual a 256. • O timer0 pode funcionar nos modos de 8 bits ou 16 bits. Timer0 • O timer0 é um contador ou timer de 8 ou 16 bits. Ele é incrementado de acordo com o ciclo de máquina do microcontrolador ou pode contar pulsos externos através do pino T0CKI (RA4). • O timer0 é composto de 1 registrador de controle, chamado T0CON, e dois de contagem, sendo um chamado de TMR0L e o outro de TMR0H. O registrador TMR0L armazena a parte baixa da contagem, enquanto o TMR0H a parte alta. Os bits que compõem o registrador de controle do timer0 são: Outras Opções do TIMER:Outras Opções do TIMER:Outras Opções do TIMER:Outras Opções do TIMER: • O TIMER pode ser configurado para fazer a contagem NÃO pelo ciclo de processador interno, mas por uma fonte externa de clock (bit de subida e descida), a ser ligado em um pino especifico da PIC. Esta maneira de funcionamento pode ser utilizada em um contador de peças por exemplo, ou qualquer outro circuito que gere um clock digital externo. • O que difere o TIMER0 dos demais Timers (TIMER1, 2) são detalhes complementares, tais como, forma de contagem, numero de bits, geração de interrupções, tipo de incrementarão. Sendo que o TIMER0 seria o mais simples. • Por exemplo o TIMER1 em geral possui 2 bits de contagem, elevando o nível de precisão da mesma. Enquanto o Timer0 vai até 256 (2 elevado a 8), o Timer1 conta ate 2 elevado a 16. PrescalerPrescalerPrescalerPrescaler:::: • A função de prescaler pode ser ligada, desligada, e configurada para o TIMER0, sendo que ela nada mais é que um divisor, que dividirá um ciclo do processador por um valor fixo, que pode ser 1,2,4,8,16,32,64,128 ou 512). • Sendo assim, por exemplo, se o Prescaler for configurado para 4, ao invés do TIMER0 incrementar 1 a cada ciclo de máquina, ele irá incrementar 1 a cada 4 ciclos de máquina. • Com isso podemos aumentar o tempo de estouro, aumentar a contagem é bastante útil devido ao baixo valor de tempo que um ciclo de processador tem. (mais abaixo exemplos do calculo). Lógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagem sendo: sendo: sendo: sendo: XTAL de 20 XTAL de 20 XTAL de 20 XTAL de 20 MegahertzMegahertzMegahertzMegahertz • Ciclo basico do processador t = 1/(frequência do XTAL /4) = 1 / (20.000.000/4) = 0,0000002 ou 0,2 µ s. Obs: O ciclo interno do processador corresponde ao valor da frequencia do XTAL dividido por 4. • Tempo de estouro sem prescaler T = t * 256 = 51,2 µ s. • Tempo de estouro com prescaler de 4 (por exemplo) T4 = t * 256 * 4 = 204,8 µ s. O prescaler multiplica o ciclo interno por um valor fixo, aumentando o tempo de contagem para cada ciclo. Exemplo • Dado um microcontrolador com XTAL= 4MHz. Sendo a rotina delay de 200μs. Calcule o tempo do ciclo do processador e o tempo de ciclo de máquina. �����(�) = 1 �� � 4 = 1 1. 10� = 1μ� T = � ∗ 200μ� = 200μ� Tempo de estouro com prescaler: T4 = t * 200 * 4 = 800 µ s 1) Faça um programa onde haja uma rotina delay de 200μs utilizando o timer0. O ciclo de máquina deverá ser de 1 μs. Com um led em RB0. ;timerEx1.asm #INClUDE <P18F452.INC>; __CONFIG _CONFIG1H, _HS_OSC_1H ; __CONFIG _CONFIG2H, _WDT_OFF_2H __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ; __CONFIG _CONFIG4L, _LVP_OFF_4L #DEFINE LED1 PORTB,0; ORG 0X00 MOVLW B'00000111'; MOVWF ADCON1; MOVLW b'00000000'; MOVWF TRISB; MOVLW B'11001000'; timer0 ->ON modo->8bits prescaler->off MOVWF T0CON; LOOP BSF LED1 ; BCF INTCON, T0IF ;apaga o flag de interrupção do timer 0 CALL DELAY_200US ; CLRF LED1 ; BCF INTCON, T0IF ; CALL DELAY_200US; GOTO LOOP DELAY_200US MOVLW (.256-.200); carrega valor max contagem e o ;valor que se espera contar MOVWF TMR0L; DELAY_200U_A BTFSS INTCON, TMR0IF ; timer0 estourou? GOTO DELAY_200U_A ; não fica em loop RETURN ; END; 2) Faça um programa onde haja uma rotina delay de 400μs utilizando o timer0. O ciclo de máquina deverá ser de 1 μs. Com um led em RB0. ;timerEx2.asm #INClUDE <P18F452.INC>; __CONFIG _CONFIG1H, _HS_OSC_1H ; __CONFIG _CONFIG2H, _WDT_OFF_2H ; __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ; __CONFIG _CONFIG4L, _LVP_OFF_4L ; #DEFINE LED1 PORTB,0 ; ORG 0X00 MOVLW B'00000111‘ ; MOVWF ADCON1 ; MOVLW b'00000000'; MOVWF TRISB ; MOVLW B'11000000'; timer0 ->ON modo->8bits prescaler->1:2 MOVWF T0CON ; LOOP BSF LED1 ; BCF INTCON, T0IF ;apaga o flag de interrupção do timer 0 CALL DELAY_400US ; CLRF LED1 ; BCF INTCON, T0IF ; CALL DELAY_400US ; GOTO LOOP ; DELAY_400US MOVLW (.256-.200) ; MOVWF TMR0L ; DELAY_400U_A BTFSS INTCON, TMR0IF ; timer0 estourou? GOTO DELAY_400U_A ; não fica em loop RETURN ; END; 3) Faça um programa onde haja uma rotina delay de 1000μs utilizando o timer0. O ciclo de máquina deverá ser de 1 μs. Porém utilize o modo de 16bits do timer0. Com um led em RB0. LOOP BSF LED1 ; BCF INTCON, T0IF ; CALL DELAY_US ; CLRF LED1 ; BCF INTCON, T0IF ; CALL DELAY_US; GOTO LOOP DELAY_US MOVLW HIGH(.65536-.1000); MOVWF TMR0H; MOVLW LOW(.65536-.1000); MOVWF TMR0L; DELAY_A BTFSS INTCON, TMR0IF ; timer0 estourou? GOTO DELAY_A ; não fica em loop RETURN ; END; ;timerEx3.asm #INClUDE <P18F452.INC>; __CONFIG _CONFIG1H, _HS_OSC_1H ; __CONFIG _CONFIG2H, _WDT_OFF_2H ; __CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ; __CONFIG _CONFIG4L, _LVP_OFF_4L #DEFINE LED1 PORTB,0; ORG 0X00 MOVLW B'00000111'; MOVWF ADCON1; MOVLW b'00000000'; MOVWF TRISB; MOVLW B'10001000'; timer0 ->ON modo->16bits prescaler->1:1 MOVWF T0CON; Semáforo – entrega dia 01 junho • Dispondo de 5 leds ( 2 vermelhos, 2 verdes e 1 amarelo ), implementar dois semáforos, um para automóveis e outro para pedestres, ligados respectivamente em RB1, RB2, RB3 e RB4,RB5. • Desenvolvimento de um programa em assembly para controlar semáforos, de acordo com a tabela estados, que efeue a contagem de tempo na transição dos estados, com auxílio do timer 0. Automóvel Pedestre Tempo vermelho amarelo verde vermelho verde 4s ON ON 1s ON ON 1s ON ON 0,5s ON INTERMITENTE 0,5s ON ON 0,5s Descrição do estado dos leds
Compartilhar