Baixe o app para aproveitar ainda mais
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
Compartilhar