Buscar

AULA 04 DELAY E BLINK RENATA MERCANTE

Prévia do material em texto

DELAY COM 
PIC16F628A
CONFIGURAÇÕES: CLOCK, VARIÁVEIS E CÁLCULO
QUAL O OBJETIVO DE UM DELAY?
• Executar ações em intervalos de tempo definidos:
• CPU precisa se comunicar com dispositivos mais lentos
• Sensores, comunicação serial ...
• Há necessidade de fazer ações que humanos percebam
• Piscar leds, acionar motores, buzzer...
FORMAS DE FAZER UM DELAY
• Existem duas formas tradicionais de efetuar um delay:
• 1) DELAY POR QUANTIDADE DE INSTRUÇÕES
• Fazer a CPU executar uma quantidade definida de instruções simples.
• Forma mais comum e precisa de contagens. Essa forma será a primeira a ser estudada.
• 2) DELAY POR TIMER
• Sincronizar a CPU com um temporizador
• O PIC 16F628A possui 3 temporizadores para sincronizar ações.
DELAY POR QUANTIDADE DE INSTRUÇÕES
• Executar N vezes instruções em assembly cujo tempo de execução seja definido.
• Esse processo é conhecido em linguagem de programação como LOOP FINITO.
• Exemplo de loop finito:
LOOP
DECFSZ 0x20 → DECREMENT FILE (0x20) SKIP IF ZERO
GOTO LOOP → GOTO LOOP (PULA GOTO SE 0x20 FOR ZERO)
80 Espaços vazios: (32)10 a (111)10 = 0x20 a 0x6F
PROGRAMA COMPLETO DE DELAY
• No local onde se precisa esperar um tempo se escreve CALL DELAY, que 
direciona para o programa abaixo: 
DELAY
MOVLW 0xFF → MOVE FF (255) TO WORK
MOVWF 0x20 → MOVE WORK TO FILE 0x20
LOOP
DECFSZ 0x20 → DECREMENT FILE SKIP IF ZERO
GOTO LOOP → GOTO LOOP (PULA GOTO SE 0x20 FOR ZERO)
RETURN
PROGRAMA COMPLETO DE DELAY
• Executa FF vezes (255) o LOOP abaixo:
DELAY
MOVLW 0xFF → MOVE FF (255) TO WORK
MOVWF 0x20 → MOVE WORK TO FILE 0X20
LOOP
DECFSZ 0x20 → DECREMENT FILE SKIP IF ZERO
GOTO LOOP → GOTO LOOP (PULA GOTO SE 0x20 FOR ZERO)
RETURN
FF vezes (255)
PROGRAMA COMPLETO DE DELAY
• Cada instrução abaixo tem seu tempo definido pelo número de ciclos de 
instrução:
DELAY
MOVLW 0xFF → 1 ciclo de instrução (executado 1 vez)
MOVWF 0x20 → 1 ciclo de instrução (executado 1 vez)
LOOP
DECFSZ 0x20 → 1 ciclo de instrução (executado 255 vezes)
GOTO LOOP → 2 ciclos de instrução (executado 255 vezes)
RETURN → 2 ciclos de instrução (executado 1 vez)
CÁLCULO DO TEMPO DE DELAY
• As instruções DECFSZ e GOTO LOOP são executadas 255 vezes (o valor inicial 
de 0x20). Então o tempo de delay é basicamente o tempo nessas duas linhas.
DELAY
MOVLW 0xFF → 1 ciclo de instrução (x1)
MOVWF 0x20 → 1 ciclo de instrução (x1)
LOOP
DECFSZ 0x20 → 1 ciclo de instrução (x255)
GOTO LOOP → 2 ciclos de instrução (x255) (x65.000)
RETURN → 2 ciclos de instrução (x1)
CÁLCULO DO TEMPO DE DELAY COM UMA 
VARIÁVEL
• TDELAY ≅ 1·TCICLO·255 + 2·TCICLO·255 = 3·TCICLO·255
DELAY
MOVLW 0xFF → 1 ciclo de instrução (x1)
MOVWF 0x20 → 1 ciclo de instrução (x1)
LOOP
DECFSZ 0x20 → 1 ciclo de instrução (x255)
GOTO LOOP → 2 ciclos de instrução (x255) 3 T ciclo
RETURN → 2 ciclos de instrução (x1)
CÁLCULO DO TEMPO DE DELAY COM UMA 
VARIÁVEL
• Considerando que o valor de 0x20 pode ser ajustado: TDELAY ≅ 3·TCICLO·VAR1
DELAY
MOVLW VAR1 → 1 ciclo de instrução (x1)
MOVWF 0x20 → 1 ciclo de instrução (x1)
LOOP
DECFSZ 0x20 → 1 ciclo de instrução (x255)
GOTO LOOP → 2 ciclos de instrução (x255)
RETURN → 2 ciclos de instrução (x1)
CADA CICLO DEMORA 1µs (1 microssegundo = 0,000001 seg = 10^-6) EM 4 MHz
CÁLCULO DO TEMPO DE DELAY COM UMA 
VARIÁVEL
• EM 4MHz: TDELAY ≅ 3·µ·VAR1 (segundos)
DELAY
MOVLW VAR1 → 1 ciclo de instrução (x1)
MOVWF 0X20 → 1 ciclo de instrução (x1)
LOOP
DECFSZ 0x20 → 1 ciclo de instrução (x255)
GOTO LOOP → 2 ciclos de instrução (x255)
RETURN → 2 ciclos de instrução (x1)
CÁLCULO DO TEMPO DE DELAY COM UMA 
VARIÁVEL
• O valor máximo de tempo de delay que esse programa permite é:
• VAR1 tem valor máximo 255 (Arquitetura do PIC é de 8 bits → 0 a 255)
• TDELAY MÁXIMO ≅ 3·µ·255 ≅ 765 µs (em 4MHz) = 0,000765 < 0,05 seg (NÃO PISCA)
• Pode ser suficiente para reduzir a velocidade do PIC para comunicar com 
sensores, mas não o suficiente para piscar um LED (perceptível para humanos).
DELAY COM DUAS VARIÁVEIS
• Para piscar um LED precisamos de algo próximo a 1/20 segundos > 0,05 seg !!! 
• Neste caso são necessárias 2 variáveis de LOOP!
DELAY
MOVLW 0xFF Mover Literalmente para Work
MOVWF 0x20 → VAR2 Mover Work para File 
SET
MOVLW 0xFF 
MOVWF 0x21 → VAR1
LOOP
DECFSZ 0x21 Decremente File Skip (Pular) se Zero
GOTO LOOP Ir para 
DECFSZ 0x20 
GOTO SET 
RETURN Retornar 
FF vezes
FF vezes
DELAY COM DUAS VARIÁVEIS
• Cada vez que um loop externo é executado, todos os loops internos são executados:
• Serão executados VAR1 x VAR2 loops:
DELAY
MOVLW 0xFF 
MOVWF 0x20 → VAR2
SET
MOVLW 0xFF 
MOVWF 0x21 → VAR1
LOOP
DECFSZ 0x21 
GOTO LOOP 
DECFSZ 0x20 
GOTO SET 
RETURN
Loop 
Externo
Loop 
Interno
CÁLCULO DO TEMPO DE DELAY DUAS VARIÁVEIS
• Mais uma vez, o tempo de delay é aproximadamente o tempo gasto pelas duas instruções em 
amarelo (que são executadas mais vezes): TDELAY ≅ 3· µ ·VAR1 ·VAR2 (em 4MHz)
DELAY
MOVLW 0xFF 
MOVWF 0x20 → VAR2
SET
MOVLW 0xFF 
MOVWF 0x21 → VAR1
LOOP
DECFSZ 0x21 → 1 ciclo de instrução (repetido VAR1 x VAR2 vezes)
GOTO LOOP → 2 ciclos de instrução (repetido VAR1 x VAR2 vezes)
DECFSZ 0x20 
GOTO SET 
RETURN
CÁLCULO DO TEMPO DE DELAY DUAS VARIÁVEIS
• O valor máximo de tempo de delay que esse programa permite é:
• VAR1 e VAR2 tem valor máximo 255 (Arquitetura do PIC é de 8 bits → 0 a 255)
• TDELAY MÁXIMO ≅ 3·µ·255 ·255 ≅ 0,196 s (em 4MHz) = 0,2 seg
• Esse geralmente é um tempo suficiente para piscar ou acionar motores e 
dispositivos lentos (para humanos).
• E se for necessário um tempo menor?
• Ajustar o valor inicial VAR1 e VAR2
• E se for necessário um tempo maior?
• 3 variáveis
CÁLCULO DO TEMPO DE DELAY DUAS VARIÁVEIS
• E se for necessário um tempo menor que 0.196s (em 4MHz) ?
• Ajustar o valor inicial VAR1 e VAR2 (exemplos na tabela)
• Por exemplo, em 4MHz temos:
• TDELAY ≅ 3·µ·VAR1 ·VAR2
• VAR1 E VAR2 PODEM TER VALORES ENTRE 0 E 255
VAR1 VAR2 TDELAY (em 4MHz)
255 (0xFF) 255 (0xFF) 0.196s ~ 0,2 seg
255 (0xFF) 127 (0x7F) 0,097s ~ 0,1 seg
CÁLCULO DO TEMPO DE DELAY DUAS VARIÁVEIS:
(EXERCÍCIOS)
• TDELAY = 0.125segundos em 4MHz. Temos:
• TDELAY ≅ 3·µ·VAR1·VAR2 = 0,125 
• Chutando VAR2 = 255 temos: VAR1 = 0,125 / (3µ·255) ≅ 163,39
• Pode-se usar o valor VAR1=163 (o valor precisa ser inteiro em assembly)
• Como assembly usa HEXADECIMAL, 163 precisa ser convertido para 0xA3
• TDELAY = 0.05segundos em 4MHz. Temos:
• TDELAY ≅ 3·µ·VAR1·VAR2 = 0,05
• Chutando VAR2 = 255 temos: VAR1 = 0,05 / (3µ·255) ≅ 65,36
• Pode-se usar o valor VAR1=65 (o valor precisa ser inteiro em assembly)
• Como assembly usa HEXADECIMAL, 65 precisa ser convertido para 0x41
CÁLCULO DO TEMPO DE DELAY DUAS VARIÁVEIS:
(EXERCÍCIOS)
• Decimal para Hexadecimal
163 16
3 10 (0xA3)
65 16
1 4 (0x41)
DELAY COM TRÊS VARIÁVEIS!
DELAY
MOVLW 0xFF 
MOVWF 0x20 → VAR3
SET1
MOVLW 0xFF 
MOVWF 0x21 → VAR2
SET2
MOVLW 0xFF 
MOVWF 0x22 → VAR1
LOOP
DECFSZ 0x22 
GOTO LOOP 
DECFSZ 0x21 
GOTO SET2 
DECFSZ 0x20 
GOTO SET1
RETURN
FF vezes
FF vezes
FF vezes
CÁLCULO DO TEMPO DE DELAY TRÊS VARIÁVEIS
• O TEMPO DE DELAY ESTÁ CONCENTRADO NAS LINHAS EM AMARELO NOVAMENTE: 
• TDELAY ≅ 3·TCICLO·VAR1 · VAR2 · VAR3
DELAY
MOVLW 0xFF 
MOVWF 0x20 → VAR3
SET1
MOVLW 0xFF 
MOVWF 0x21 → VAR2
SET2
MOVLW 0xFF 
MOVWF 0x22 → VAR1
LOOP
DECFSZ 0x22 → EXECUTADO VAR1 x VAR2 x VAR3 VEZES
GOTO LOOP → EXECUTADO VAR1 x VAR2 x VAR3 VEZES
DECFSZ 0x21 
GOTOSET2 
DECFSZ 0x20 
GOTO SET1
RETURN
CÁLCULO DO TEMPO DE DELAY TRÊS VARIÁVEIS
• O valor máximo de tempo de delay que esse programa permite é:
• VAR1, VAR2 e VAR3 tem valor máximo 255
• TDELAY ≅ 3·µ·255 ·255 ·255 ≅ 49,74 s (em 4MHz)
• Esse geralmente é um tempo suficiente para qualquer acionamento.
• E se for necessário um tempo menor?
• Ajustar o valor inicial VAR1 e VAR2 e VAR3
• E se for necessário um tempo maior?
• 4 variáveis ou mais!
CÁLCULO DO TEMPO DE DELAY TRÊS VARIÁVEIS
• E se for necessário um tempo menor que 49,74s (em 4MHz) ?
• Ajustar o valor inicial VAR1, VAR2 e VAR3 (exemplos na tabela)
• VAR1, VAR2 E VAR3 PODEM TER VALORES ENTRE 0 E 255
VAR1 VAR2 VAR3 TDELAY (em 4MHz)
255 (0xFF) 255 (0xFF) 255 (0xFF) 49,74s
255 (0xFF) 255 (0xFF) 127 (0x7F) 24,87s
255 (0xFF) 255 (0xFF) 51 (0x33) 10s
255 (0xFF) 255 (0xFF) 5 (0x05) 1s
CÁLCULO DO TEMPO DE DELAY TRÊS VARIÁVEIS
DELAY
MOVLW 0xFF 
MOVWF 0x20 
SET1
MOVLW 0xFF 
MOVWF 0x21 
SET2
MOVLW 0x33 
MOVWF 0x22 
0x33 é 51 em decimal 
DELAY
MOVLW 0xFF 
MOVWF 0x20 
SET1
MOVLW 0xC8 
MOVWF 0x21 
SET2
MOVLW 0x41 
MOVWF 0x22
0xC8 é 200 em decimal
0x41 é 65 em decimal
DELAY
MOVLW 0xC8
MOVWF 0x20 
SET1
MOVLW 0xC8 
MOVWF 0x21 
SET2
MOVLW 0x53 
MOVWF 0x22 
0x53 é 83 em decimal
0xC8 é 200 em decimal 
• Três maneiras de achar 10 segundos com 4MHz
CÁLCULO DO TEMPO DE DELAY TRÊS VARIÁVEIS:
(EXERCÍCIOS)
• TDELAY = 10s em 4MHz. Temos:
• TDELAY ≅ 3·µ·VAR1·VAR2·VAR3 = 10
• Chutando VAR1=VAR2=255 temos: VAR3 = 10 / (3µ·255·255) ≅ 51,26
• Pode-se usar o valor VAR1=51 (o valor precisa ser inteiro em assembly)
• Como assembly usa HEXADECIMAL, 51 precisa ser convertido para 0x33
• TDELAY = 1s em 4MHz. Temos:
• TDELAY ≅ 3·µ·VAR1·VAR2·VAR3 = 1
• Chutando VAR1=VAR2=255 temos: VAR3 = 1 / (3µ·255·255) ≅ 5,126
• Pode-se usar o valor VAR1=5 (o valor precisa ser inteiro em assembly)
• Como assembly usa HEXADECIMAL, 5 precisa ser convertido para 0x05
TEMPO DE CICLO DE DELAY NAS DIFERENTES 
FREQUÊNCIAS
frequência DECFSZ GOTO Tempo
4 MHz 1µ 2 µ 3µ
8 MHz 0,5 µ 1 µ 1,5 µ
16 MHz 0,25 µ 0,5 µ 0,75 µ
32 MHz 0,125 µ 0,25 µ 0,375 µ
EXERCÍCIO
• Faça o programa em Assembly para que o PIC abaixo pisque no máximo tempo 
possível em 8MHz com 3 variáveis. Qual é o tempo?
TRISA = TRISB = 0
BSF STATUS, RP0 Bit Set File 1
MOVLW 0x00
MOVWF TRISA PROGRAMA ESQUELETO
MOVLW 0x00
MOVWF TRISB
BCF STATUS, RP0 Bit Clear File 0
INICIO
BSF PORTA, 2 acender 1
CALL DELAY
BCF PORTA, 2 apaguei 0 PROGRAMA PISCA
CALL DELAY “BLINK”
GOTO INICIO
DELAY
TESTAR DELAYS MÁXIMO
TDELAY MÁXIMO em 8MHz. Temos:
TDELAY MÁXIMO 1 VAR ≅ 1,5µ· 255 = 0,0004s NÃO PISCA
TDELAY MÁXIMO 2 VAR ≅ 1,5µ· 255· 255 = 0,098s PISCA
TDELAY MÁXIMO 3 VAR ≅ 1,5µ· 255· 255· 255 = 24,87s PISCA
DELAY MÁXIMO COM 3 VARIÁVEISDELAY
MOVLW 0xFF
MOVWF 0x20
VSET1
MOVLW 0xFF
MOVWF 0x21
VSET2
MOVLW 0xFF
MOVWF 0x22
LOOP
DECFSZ 0x22
GOTO LOOP
DECFSZ 0x21
GOTO VSET2
DECFSZ 0x20
GOTO VSET1
RETURN
END
BSF STATUS, RP0
MOVLW 0x00
MOVWF TRISA
MOVLW 0x00
MOVWF TRISB
BCF STATUS, RP0
INICIO
BSF PORTA, 2
CALL DELAY
BCF PORTA, 2
CALL DELAY
GOTO INICIO
DELAY
MOVLW 0xFF
MOVWF 0x20
VSET1
MOVLW 0xFF
MOVWF 0x21
VSET2
MOVLW 0xFF
MOVWF 0x22
LOOP
DECFSZ 0x22
GOTO LOOP
DECFSZ 0x21
GOTO VSET2
DECFSZ 0x20
GOTO VSET1
RETURN
END
TDELAY MÁXIMO 3 VAR ≅ 1,5µ· 255· 255· 255 = 24,87s 
RESPOSTA COMPLETA
BSF STATUS, RP0
MOVLW 0x00
MOVWF TRISA
MOVLW 0x00
MOVWF TRISB
BCF STATUS, RP0
INICIO
BSF PORTB, 3
BSF PORTB, 6
CALL DELAY
BCF PORTB, 3
BCF PORTB, 6 
CALL DELAY
GOTO INICIO
DELAY
Faça o programa em Assembly para que o PIC abaixo pisque os 
leds juntos L1 e L2 a cada 5 segundos em 8MHz. 
DELAY
MOVLW 0xFF
MOVWF 0x20
VSET1
MOVLW 0xFF
MOVWF 0x21
VSET2
MOVLW 0x33
MOVWF 0x22
LOOP
DECFSZ 0x22
GOTO LOOP
DECFSZ 0x21
GOTO VSET2
DECFSZ 0x20
GOTO VSET1
RETURN
END
TDELAY ≅ 1,5µ· 255· 255 = 0,098s Com 4MHz 0,2seg 
Com 8MHz 0,1seg 
0.098 VAR = 5 
VAR = 5/0.098
VAR = 51 (decimal)
51 16
3 3 (0x33)
Faça o programa em Assembly para que o PIC abaixo pisque os 
leds juntos L1 e L2 a cada 5 segundos em 8MHz. 
TDELAY ≅ 1,5µ· 255· 
255 · 51 = 5s 
BSF STATUS, RP0
MOVLW 0x00
MOVWF TRISA
MOVLW 0x00
MOVWF TRISB
BCF STATUS, RP0
INICIO
BSF PORTB, 3
BSF PORTB, 6
CALL DELAY
BCF PORTB, 3
BCF PORTB, 6 
CALL DELAY
GOTO INICIO
DELAY1
MOVLW 0xFF
MOVWF 0x20
Faça o programa em Assembly para que o PIC abaixo pisque os 
leds juntos L1 e L2 a cada 5 segundos em 8MHz. 
VSET1
MOVLW 0xFF
MOVWF 0x21
VSET2
MOVLW 0x33
MOVWF 0x22
LOOP
DECFSZ 0x22
GOTO LOOP
DECFSZ 0x21
GOTO VSET2
DECFSZ 0x20
GOTO VSET1
RETURN
END
TDELAY ≅ 1,5µ· 255· 255 · 51 = 5s 
RESPOSTA COMPLETA

Continue navegando