Sequencial Supermquina
(TEMPORIZAO SIMPLES)
Roteiro
Sequencial Supermquina
Materiais
Pinos do PIC
Fluxograma
Temporizao
Circuito no protoboard
Melhoramentos
Sugesto de Atividades
Sequencial
Um sequencial basicamente um conjunto de
leds que acedem e apagam em uma determinada
ordem provocando algum tipo de efeito visual.
O sequencial supermquina assim chamado
graas a srie Supermquina dos anos 80, onde
o carro do protagonista possua na sua parte
frontal um sequencial onde as luzes acendiam de
forma a provocar um efeito de vai-e-vem.
Materiais
Gravador
PIC 16F628A
8 Leds
8 Resistores de 1K
2 Suportes para Pilhas AA
4 Pilhas AA
Protoboard e Fios
Pinos do PIC
Fluxograma
INICIO
Apaga Led 2
Acende Led 3
Apaga Led 6
Acende Led 7
Apaga Led 4
Acende Led 3
Apaga Led 3
Acende Led 4
Apaga Led 7
Acende Led 6
Apaga Led 3
Acende Led 2
Apaga Led 4
Acende Led 5
Apaga Led 6
Acende Led 5
Apaga Led 2
Acende Led 1
Apaga Led 5
Acende Led 6
Apaga Led 5
Acende Led 4
Apaga Led 1
Configurao
Loop
Acende Led 0
Apaga Led 0
Acende Led 1
Apaga Led 1
Acende Led 2
Fazendo Sada com o PIC
O controlador PIC tem 2 Portas para Entrada e Sada
uma conhecida por Port A e a outra Port B. Usaremos
Port B neste exemplo.
O Port B do PIC tem o endereo 06H, e tem os seu
bits ligados ao pinos externos do PIC, de acordo
com a tabela a seguir:
BIT PORTB
Pino
0
10
11
12
13
Configurando as Sadas
As configuraes de E/S para cada Port so feitas usando os
registradores TRISA e TRISB onde TRISA configura o PortA e
TRISB o PortB, os endereos so 85H e 86H respectivamente.
Para configurar algum pino de Port B como sada devemos
desligar o bit correspondente em TRISB. Ou seja se queremos
que o pino 6 de PortB seja sada (output) configuramos o Bit 6
de TRISB como 0. Para configurar como entrada configuramos
o bit 6 como 1;
fcil lembrar desta regra 0 para 0utput e 1 para 1nput
Desta forma para configurar todos os pinos de port B como
sada devemos zerar todos os bits de TRISB;
Instrues BCF e BSF
As instrues BCF (Bit Clear File) e BSF (Bit
Set File) so usadas para desligar e ligar bits
especficos de um registrador.
Ex
BCF 06H,1 ; desliga o bit 1 de 6H
BSF 06H,1 ; Liga o bit 1 de 6H
A sintaxe destes comandos
BCF Registrador, Bit
BSF Registrador, Bit
Configurao
Depois veremos a
Razo destas instrues
Cdigo: Configurao
CONFIGURACAO
BSF 03H,5 ; Seleciona banco 1 (seta RP0)
CLRF 86H ; Reseta PortB (Todas os pinos como saida)
BCF 03H,5 ; Seleciona banco 0 (reseta RP0)
CLRF 06H ; Zera todos os pinos de PortB
Fluxograma
INICIO
Configurao
Loop
Apaga Led 2
Acende Led 3
Apaga Led 6
Acende Led 7
Apaga Led 4
Acende Led 3
Apaga Led 3
Acende Led 4
Apaga Led 7
Acende Led 6
Apaga Led 3
Acende Led 2
Apaga Led 4
Acende Led 5
Apaga Led 6
Acende Led 5
Apaga Led 2
Acende Led 1
Apaga Led 5
Acende Led 6
Apaga Led 5
Acende Led 4
Apaga Led 1
Acende Led 0
Apaga Led 0
Acende Led 1
Apaga Led 1
Acende Led 2
Fluxograma
INICIO
Configurao
Loop
BCF 86H,2
BSF 86H,3
BCF 86H,6
BSF 86H,7
BCF 86H,4
BSF 86H,3
BCF 86H,3
BSF 86H,4
BCF 86H,7
BSF 86H,6
BCF 86H,3
BSF 86H,2
BCF 86H,4
BSF 86H,5
BCF 86H,6
BSF 86H,5
BCF 86H,2
BSF 86H,1
BCF 86H,5
BCF 86H,6
BCF 86H,5
BSF 86H,4
BCF 86H,1
BSF 86H,0
BCF 86H,0
BSF 86H,1
BCF 86H,1
BSF 86H,2
Cdigo
Cdigo: ex1-0.asm
CONTINUAO...
BCF 06H,5 ; Desliga RB5
BSF 06H,6 ; Liga RB6 (bit 6 de PortB)
__CONFIG 0x3D18
ORG 0x00
CONFIGURACAO
BSF 03H,5 ; Seleciona banco 1 (seta RP0)
CLRF 86H ; Reseta PortB (Todas os pinos como saida)
BCF 03H,5 ; Seleciona banco 0 (reseta RP0)
CLRF 06H ; Zera todos os pinos de PortB
BCF 06H,6 ; Desliga RB6
BSF 06H,7 ; Liga RB7 (bit 7 de PortB)
BCF 06H,7 ; Desliga RB7
BSF 06H,6 ; Liga RB6 (bit 6 de PortB)
BCF 06H,6 ; Desliga RB6
BSF 06H,5 ; Liga RB5 (bit 5 de PortB)
LOOP
BSF 06H,0 ; Liga RB0 (bit 0 de PortB)
BCF 06H,5 ; Desliga RB5
BSF 06H,4 ; Liga RB4 (bit 4 de PortB)
BCF 06H,0 ; Desliga RB0
BSF 06H,1 ; Liga RB1 (bit 1 de PortB)
BCF 06H,4 ; Desliga RB4
BSF 06H,3 ; Liga RB3 (bit 3 de PortB)
BCF 06H,1 ; Desliga RB1
BSF 06H,2 ; Liga RB2 (bit 2 de PortB)
BCF 06H,3 ; Desliga RB3
BSF 06H,2 ; Liga RB2 (bit 2 de PortB)
BCF 06H,2 ; Desliga RB2
BSF 06H,3 ; Liga RB3 (bit 3 de PortB)
BCF 06H,2 ; Desliga RB2
BSF 06H,1 ; Liga RB1 (bit 1 de PortB)
BCF 06H,3 ; Desliga RB3
BSF 06H,4 ; Liga RB4 (bit 4 de PortB)
BCF 06H,4 ; Desliga RB4
BSF 06H,5 ; Liga RB5 (bit 5 de PortB)
BCF 06H,1 ; Desliga RB1
GOTO LOOP
END
Processo de Montagem
Cdigo
Cdigo
executvel: ex1-0.hex
executvel: ex1-0.hex
$ gpasm -p16f628a ex1-0.asm
ex1-0.asm
ex1-0.asm
Montagem
:020000040000FA
:020000040000FA
:100000008316860183128601861306140610861451
:100000008316860183128601861306140610861451
:100010008610061506118615861106160612861616
:100010008610061506118615861106160612861616
:0A002000861206170613861704283F
:0A002000861206170613861704283F
:02400E00183D5B
:02400E00183D5B
:00000001FF
:00000001FF
Simulao
$ gpsim ex1-0.cod
Escolha Realtime with GUI
(simulao em tempo real)
Inicie a simulao
Verifique a Breadboad
Observe que durante a simulao as sadas do controlador no esto alternando entre
acesso e apagado com esperado.
Simulao
Execute passo-a-passo
as instrues do programa
Pause a simulao
No passo-a-passo o comportamento o esperado. Qual ser o problema?
Resposta: Prximo slide.
Resposta: Temporizao
Temporizao
Entende-se por temporizao a capacidade de
programar um evento para acontecer aps a
passagem de um tempo especfico.
No PIC no existem instrues que permitam fazer
o controlador esperar um determinado intervalo de
tempo, desta forma responsabilidade do
programador prover esse tipo de funcionalidade.
Existem 2 formas de temporizao com o PIC, a
primeira e mais simples a queima de ciclos. A
segunda usar os timers internos do PIC para essa
finalidade. Aqui veremos apenas a primeira.
Temporizao
A palavra de configurao que estamos usando
aqui configura o oscilador interno do PIC que de
4Mhz.
O PIC executa instrues a da velocidade do
oscilador o que nos leva a uma taxa de 1 milho de
instrues por segundo, ou seja uma instruo
demora 1 microssegundo para ser executada.
Com base nisto se quisermos um tempo de espera
1s temos que fazer o PIC executar 1 milho de
instrues. Mas como fazer isso?
Temporizao
Para prover a temporizao usaremos loops
com a instruo: NOP (No OPeration) que
serve apenas para Queimar um ciclo
Observe o cdigo abaixo de loop infinito:
Agora o que preciso
fazer trabalhar esse
loop de forma que ele
execute
por
um
nmero determinado
de interaes.
Ex: 250 interaes
leva a uma espera de
1ms
Cdigo
LOOP
NOP
NOP
GOTO LOOP
Esse loop leva 4us por
interao, 1us para
cada NOP e 2us para
GOTO. Instrues de
salto costumam levar
2 ciclos quando saltam
Temporizao
Essas instrues inicializam
o endereo de memria com
o valor 250.
Cdigo
DL_1
Em termos da percepo
humana, 1ms muito
pouco. Para o olho humano
perceber,
com
certa
persistencia precisamos de
um intervalo de pelo menos
1/50s ou seja 20ms
MOVLW d'250'
MOVWF 20H
NOP
DECFSZ 20H,1
GOTO DL_1
DECFSZ
Essa Instruo decrementa o
contedo da posio 20h at
este chegar a zero. Quando
o valor armazenado em 20H
chegar a zero, a instruo
DECFSZ efetuar o salto da
prxima instruo (GOTO
DL_1) e sair do loop.
Resultado: 1ms de espera
(250x4us).
Temporizao
Cdigo
DELAY1MS
MOVLW d'250'
MOVWF 20H
DL_1
NOP
DECFSZ 20H,1
GOTO DL_1
RETURN
DELAY1MS
Esse conjunto de instrues
foi transformado em uma
FUNO. Isso permite que
em qualquer parte do cdigo
o programador execute esse
conjunto
de
instrues
apenas executando CALL
DELAY1MS.
Isso
tem
algumas
vantagens
a
principal delas no precisar
replicar esse cdigo em
todas as partes do programa
Cdigo
DL_2
DELAY
Esse lao executa 250 vezes, a
cada vez que executa chama a
funo DELAY1MS 4 vezes. Ou
seja uma espera aproximada de
1s. Convm transformar esse
cdigo em funo.
MOVLW d'250'
MOVWF 21H
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
DECFSZ 21H,1
GOTO DL_2
Fluxograma (com temporizao)
INICIO
BCF 86H,2
BSF 86H,3
Configurao
DELAY
Loop
BCF 86H,3
BSF 86H,4
DELAY
DELAY
BCF 86H,7
BSF 86H,0
DELAY
BCF 86H,0
BSF 86H,1
DELAY
BCF 86H,4
BSF 86H,5
DELAY
BCF 86H,5
BCF 86H,6
DELAY
DELAY
BCF 86H,1
BSF 86H,2
BCF 86H,6
BSF 86H,7
Fluxograma
INICIO
DELAY
DELAY
DELAY
Configurao
BCF 86H,2
BSF 86H,3
BCF 86H,6
BSF 86H,7
BCF 86H,4
BSF 86H,3
DELAY
DELAY
DELAY
BCF 86H,3
BSF 86H,4
BCF 86H,7
BSF 86H,6
BCF 86H,3
BSF 86H,2
DELAY
DELAY
DELAY
BCF 86H,4
BSF 86H,5
BCF 86H,6
BSF 86H,5
BCF 86H,2
BSF 86H,1
DELAY
DELAY
DELAY
BCF 86H,5
BCF 86H,6
BCF 86H,5
BSF 86H,4
BCF 86H,1
Loop
BSF 86H,0
DELAY
BCF 86H,0
BSF 86H,1
DELAY
BCF 86H,1
BSF 86H,2
DELAY
Cdigo com temporizao
Cdigo: ex1-1.asm
CONTINUAO...
CALL DELAY1S
BCF 06H,2 ; Desliga RB2
BSF 06H,3 ; Liga RB3 (bit 3 de PortB)
__CONFIG 0x3D18
ORG 0x00
CONFIGURACAO
BSF 03H,5 ; Seleciona banco 1 (seta RP0)
CLRF 86H ; Reseta PortB (Todas os pinos como saida)
BCF 03H,5 ; Seleciona banco 0 (reseta RP0)
CLRF 06H ; Zera todos os pinos de PortB
GOTO LOOP
DELAY1MS
MOVLW d'250'
MOVWF 20H
DL_1
NOP
DECFSZ 20H,1
GOTO DL_1
RETURN
CALL DELAY1S
BCF 06H,3 ; Desliga RB3
BSF 06H,4 ; Liga RB4 (bit 4 de PortB)
CALL DELAY1S
BCF 06H,4 ; Desliga RB4
BSF 06H,5 ; Liga RB5 (bit 5 de PortB)
CALL DELAY1S
BCF 06H,5 ; Desliga RB5
BSF 06H,6 ; Liga RB6 (bit 6 de PortB)
CALL DELAY1S
BCF 06H,6 ; Desliga RB6
BSF 06H,7 ; Liga RB7 (bit 7 de PortB)
CALL DELAY1S
BCF 06H,7 ; Desliga RB7
BSF 06H,6 ; Liga RB6 (bit 6 de PortB)
DELAY1S
MOVLW d'250'
MOVWF 21H
DL_2
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
DECFSZ 21H,1
GOTO DL_2
RETURN
CALL DELAY1S
BCF 06H,6 ; Desliga RB6
BSF 06H,5 ; Liga RB5 (bit 5 de PortB)
CALL DELAY1S
BCF 06H,5 ; Desliga RB5
BSF 06H,4 ; Liga RB4 (bit 4 de PortB)
CALL DELAY1S
BCF 06H,4 ; Desliga RB4
BSF 06H,3 ; Liga RB3 (bit 3 de PortB)
CALL DELAY1S
BCF 06H,3 ; Desliga RB3
BSF 06H,2 ; Liga RB2 (bit 2 de PortB)
LOOP
BSF 06H,0 ; Liga RB0 (bit 0 de PortB)
CALL DELAY1S
BCF 06H,2 ; Desliga RB2
BSF 06H,1 ; Liga RB1 (bit 1 de PortB)
CALL DELAY1S
BCF 06H,0 ; Desliga RB0
BSF 06H,1 ; Liga RB1 (bit 1 de PortB)
CALL DELAY1S
BCF 06H,1 ; Desliga RB1
BSF 06H,2 ; Liga RB2 (bit 2 de PortB)
CALL DELAY1S
BCF 06H,1 ; Desliga RB1
CALL DELAY1S
GOTO LOOP
END
Simulao
$ gpsim ex1-0.cod
Inicie a simulao
Verifique a Breadboad
Observe que o funcionamento agora est correto. Parabns voc conseguiu!
O Circuito
+
+
+
+
1K
1K
1K
1K
1K
1K
1K
1K
Melhoramentos deste cdigo
No programa optamos por ligar e desligar os
bits da porta individualmente atravs das
instrues BCF e BSF.
Podemos minimizar bastante o cdigo tratando
a porta como um byte completo, ao invs de
tratar cada bit. Existe duas instrues que
proporcionam o mesmo efeito do programa
anterior que basicamente o rotacionamento
do byte para direita ou esquerda, essas
instrues so RRF e RLF respectivamente.
INICIO
INICIO
Configuraes
Liga Led 0
Configuraes
BSF 05H,0
Rotaciona
Esquerda X2
DELAY
LOOPESQ
RLF 05,1
DELAY
Led 7
Est aceso?
DELAY
No
BTFSS 05,7
Sim
Sim
DELAY
DELAY
DELAY
Rotaciona
Direita /2
DELAY
Led 0
Est Acesso?
Sim
DELAY
No
LOOPDIR
RRL 05,1
DELAY
DELAY
No
BTFSS 05,0
Sim
No
DELAY
Cdigo com Temporizao
Melhorado
Cdigo: ex1-2.asm
__CONFIG 0x3D18
ORG 0x00
GOTO CONFIGURACAO
DELAY1MS
; Funcao de Espera 1ms
MOVLW d'250' ; $(20H) = 250
MOVWF 20H
;
DL_1
NOP
; Queima 1 Ciclo
DECFSZ 20H,1 ; Queima 1 Ciclo se <> 0
GOTO DL_1
; Queima 2 Ciclos
; Total 4 ciclos X 250 = 1000 ciclos gastos
; 1000 X 0,000001s = 0,001s = 1ms
RETURN
; Retorna
DELAY1S
; Funcao espera 1s
MOVLW d'50'
; $(21h) = 250
MOVWF 21H
;
DL_2
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
CALL DELAY1MS
DECFSZ 21H,1
GOTO DL_2
RETURN
; Retorna
CONFIGURACAO
BSF 03H,5 ; Seleciona banco 1 (seta RP0)
CLRF 86H ; Reseta PortB (Todas os pinos como saida)
BCF 03H,5 ; Seleciona banco 0 (reseta RP0)
CLRF 06H ; Zera todos os pinos de PortB
BSF 06H,0 ; Liga RB0 (bit 0 de PortB)
LOOPESQ
CALL DELAY1S
RLF 06H,1 ; Rotaciona para esquerda
BTFSS 06H,7 ; Sai do Loop se led 7 acesso
GOTO LOOPESQ
LOOPDIR
CALL DELAY1S
RRF 06H,1 ; Rotaciona para direita
BTFSS 06H,0 ; Sai do Loop se led 7 acesso
GOTO LOOPDIR
GOTO LOOPESQ
END
Simulao
$ gpsim ex1-0.cod
Inicie a simulao
Verifique a Breadboad
Observe que o funcionamento TAMBEM est correto. S que agora com muito menos
linhas de cdigo e consequentemente menos espao na memria do programa.
Sugesto de Atividades
1) diminua o tempo de forma a parecer mais
continuo o deslocamento do led acesso;
2)Altere o cdigo de forma que no ligamento do
circuito todos os leds pisquem 5 vezes como
forma de teste;
3) Altere o cdigo para que existam 2 leds
sempre acessos um se deslocando para direita
e outro para esquerda;
4) Altere o cdigo de forma que os dois leds
acessos voltem quando se encontrarem.