Você está na página 1de 45

CURSO DE MICROCONTROLADORES

EXERCCIOS PROFESSOR

Ricardo Pannain

Programas Exemplo
Programa 1:......................................................................................................................................................2
Diagrama Esquemtico:................................................................................................................................2
Codificao:..................................................................................................................................................2
Programa 2:......................................................................................................................................................4
Diagrama Esquemtico:................................................................................................................................4
Codificao:..................................................................................................................................................4
Programa 3:......................................................................................................................................................6
Diagrama Esquemtico:................................................................................................................................6
Codificao:..................................................................................................................................................6
Programa 4:......................................................................................................................................................8
Diagrama Esquemtico:................................................................................................................................8
Codificao:..................................................................................................................................................9
Programa 5:....................................................................................................................................................12
Diagrama Esquemtico:..............................................................................................................................12
Codificao:................................................................................................................................................12
Programa 6:....................................................................................................................................................15
Diagrama Esquemtico:..............................................................................................................................15
Codificao:................................................................................................................................................15
Programa 7:....................................................................................................................................................19
Diagrama Esquemtico:..............................................................................................................................19
Codificao:................................................................................................................................................19
Programa 8:....................................................................................................................................................23
Diagrama Esquemtico:..............................................................................................................................23
Codificao:................................................................................................................................................23
Programa 9:....................................................................................................................................................25
Diagrama Esquemtico:..............................................................................................................................25
Codificao:................................................................................................................................................25
Programa 10:..................................................................................................................................................28
Diagrama Esquemtico:..............................................................................................................................28
Codificao:................................................................................................................................................28
Programa 11:...................................................................................................................................................32
Diagrama Esquemtico:..............................................................................................................................32
Codificao:................................................................................................................................................32
Programa 12:..................................................................................................................................................38
Diagrama Esquemtico:..............................................................................................................................38
Codificao:................................................................................................................................................38

Ricardo Pannain

Programa 1:
Este programa faz com que um LED, ligado sada RB0, seja aceso, caso uma chave C,
ligada entrada RA2, esteja em 1. Caso contrrio, o diodo se apaga.

Diagrama Esquemtico:

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador.


Cada registrador possui um endereo, ento criamos aliases para facilitar a codificao.
Afinal de contas, mais fcil se referir ao registrador PORTB pelo seu nome, ao invs de
seu endereo na memria (0x06)
STATUS
PORTA
PORTB
RP0

Ricardo Pannain

EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0x00
GOTO Inicio
ORG 0x05
Incio do programa
Inicio:
BANCO1
CLRF

MOVWF
BANCO0
CLRF

; mudana para o banco de memria 1


PORTB
; limpando os bits de PORTB. Com isso, todos os
; pinos (RB0 a RB7) sero utilizados como sada
B'00000100' ; utilizando o registrador Work (W) para configurar a
; porta de entrada A. O terceiro bit, que corresponde
; ao pino RA2 est sendo configurado como entrada,
; e o restante dos pinos desta porta como sada
PORTA
; concluindo a configurao da porta A
; mudando para o banco de memria 0
PORTB
; limpando a porta B

BTFSS

PORTA, 2

GOTO
GOTO

Apagar
Acender

MOVLW

Loop:

Acender:
BSF
GOTO
Apagar:
BCF
GOTO
END

Ricardo Pannain

PORTB, 0
Loop
PORTB, 0
Loop

; verifica o estado da chave C (pino RA2). Se o valor


; for 1, a prxima linha pulada, ento o LED ir
; acender. Caso contrrio o LED ir apagar
; se RA2 = 0, apaga o LED
; se RA2 = 1, acende o LED
; seta o bit 0 (RB0) da porta B. Isto faz com que o
; LED se acenda. RB0 = 1
; volta para verificao da chave C
; limpa o bit 0 (RB0) da porta B. Isto faz com que o
; LED se apague. RB0 = 0
; volta para verificao da chave C
; fim do programa

Programa 2:
Este programa funciona como um segredo eletrnico. O microcontrolador espera uma
combinao de 5 chaves, ligadas na porta A (RA0 RA5), e, se esta combinao ocorrer,
todos os LEDs ligados porta B (RB0 RB7) se acendem. Caso contrario, eles
permanecem apagados. A combinacao deve ser 1-0-1-0-1.

Diagrama Esquemtico:
L1 L2 L3 L4 L5 L6 L7 L8

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador.


STATUS
PORTA
PORTB
RP0
Z

EQU
EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05
0x02

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5

Ricardo Pannain

Incio do programa
Inicio:
BANCO1
CLRF

PORTB

MOVLW

B'00011111'

MOVWF
BANCO0
CLRF

PORTA

MOVF

PORTA, W

PORTB

; mudana para o banco de memria 1


; limpando os bits de PORTB. Com isso, todos os
; pinos (RB0 a RB7) sero utilizados como sada
; utilizando o registrador Work (W) para configurar a
; porta de entrada A. Todos os pinos da porta (RA0
; RA4) esto sendo configurados como entrada
; concluindo a configurao da porta A
; mudando para o banco de memria 0
; limpando a porta B

Loop:

MOVWF

; fazendo uma cpia do status da porta A para o


; registrador Work (W)
B'00011111' ; AND lgico entre o registrador Work (W) e o valor
; 00011111, para que os 5 primeiros bits sejam
; mantidos e os outros 3 passem a ser 0. Isto
; necessrio para realizar a comparao abaixo
B'00010101' ; verificando a existncia da seqncia 1-0-1-0-1,
; atravs de um XOR.
STATUS, Z ; se a operao acima resultou em 0, ou seja se todos
; os bits de W estiverem em 0, significa que a
; sequncia 1-0-1-0-1 est presente. Ento, a prxima
; linha pulada
Loop
; se a sequncia no estiver presente, feita uma
; nova verificao
0xFF
; se a sequncia estiver presente, todos os bits da
; porta B so setados (valor 0xFF), fazendo com que
; os LEDs se acendam.
PORTB
; acendendo os LEDs

GOTO

Fim

ANDLW

XORLW
BTFSS

GOTO
MOVLW

Fim:

END

Ricardo Pannain

; loop infinito. Para comear o programa novamente,


; depois de uma sequncia correta, necessrio
; resetar o microcontrolador
; fim do programa

Programa 3:
Este programa utiliza um display de 7 segmentos, ligado porta B (RB0 RB7) para
mostrar o valor de uma chave C ligada entrada RA2 da porta A. Se a chave estiver
ligada, o display exibe o nmero 1. Caso contrrio, exibido o nmero 0.

Diagrama Esquemtico:

Gnd

PIC
RA0
RA1
RA2
RA3
RA4

abcdefg.

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador.


STATUS
PORTA
PORTB
RP0

EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)

Ricardo Pannain

ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
CLRF

MOVWF
BANCO0

; mudana para o banco de memria 1


; limpando os bits de PORTB. Com isso, todos os
; pinos (RB0 a RB7) sero utilizados como sada
B'00000100' ; utilizando o registrador Work (W) para configurar a
; porta de entrada A. O terceiro bit, que corresponde
; ao pino RA2 est sendo configurado como entrada,
; e o restante dos pinos desta porta como sada
PORTA
; concluindo a configurao da porta A
; mudando para o banco de memria 0

BTFSS

PORTA, 2

GOTO
GOTO

Zero
Um

MOVLW

B'00111111'

MOVWF
GOTO

PORTB
Loop

MOVLW

B'00000110'

MOVWF
GOTO

PORTB
Loop

MOVLW

PORTB

Loop:
; verifica o estado da chave C (pino RA2). Se o valor
; for 1, a prxima linha pulada, ento o display
; ir exibir o nmero 1. Caso contrrio o display ir
; exibir o nmero 0
; desvia para linha Zero se o valor de RA2 for 0
; desvia para linha Um se o valor de RA2 for 1

Zero:
; como o valor a ser exibido deve ser Zero, o cdigo
; binrio correspondente este valor no display
; colocado no registrador Work (W)
; exibindo o valor Zero no display fsico
; volta para verificao da chave C

Um:

END

Ricardo Pannain

; como o valor a ser exibido deve ser Um, o cdigo


; binrio correspondente este valor no display
; colocado no registrador Work (W)
; exibindo o valor Um no display fsico
; volta para verificao da chave C
; fim do programa

Programa 4:
Este programa faz com que o LED, ligado ao pino RB0 da porta B acenda e apague a
cada segundo. Como o ciclo de clock do microcontrolador muito pequeno, necessrio
introduzir delays para que as transies do LED possam ser visualizadas. Estes delays
funcionam da seguinte maneira: uma rotina, chamada Delay1S, que utiliza a subrotina
Del10, que gera delays de 10 ms a cada chamada. Dentro desta rotina existe uma
varivel auxiliar (TEMPO1), que comea com o valor 100 e vai sendo decrementada.
Cada vez que ela decrementada, a rotina Del10 chamada novamente. Ou seja, sero
100 chamadas rotina Del10, gerando um delay total de 1 segundo.

Diagrama Esquemtico:

L1

PIC
RA0
RA1
RA2
RA3
RA4

Ricardo Pannain

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador e


variveis auxiliares utilizadas no programa
STATUS
PORTA
PORTB
RP0
OPTION_REG
INTCON
TEMPO1

EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05
0x01
0x0B
0x0C

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
CLRF

PORTB

MOVLW

B'00000111'

MOVWF

OPTION_REG

Ricardo Pannain

; mudana para o banco de memria 1


; limpando os bits de PORTB. Com isso, todos
; os pinos (RB0 a RB7) sero utilizados como
; sada
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:256. Por
; exemplo, se tivermos um clock de 4Mhz,
; cada instruo executada em 1s. Com o
; prescaler de 1:256, o TMR0 incrementado
; a cada 256 ciclos, consequentemente ele ir
; estourar em, aproximadamente, 6,5ms.
; concluindo a configurao do registrador de
; operaes

10

BANCO0
CLRF

PORTB

BSF

PORTB, 0

CALL

Delay1S

BCF

PORTB, 0

CALL

Delay1S

GOTO

Loop

; mudando para o banco de memria 0


; limpando a porta B

Loop:

Delay1S
BANCO0
MOVLW

0x64

MOVWF

TEMPO1

CALL
RETURN

Del10

BCF

INTCON, 2

MOVLW

0xD8

MOVWF

OPTION_REG

; setando o pino RB0 da porta B. Isto faz com


; que o LED se acenda
; chamando a rotina que introduz um delay de
; 1 segundo no processamento, fazendo com
; que o LED fique aceso por 1 segundo
; limpando o pino RB0 da porta B. Isto faz com
; que o LED se apague
; novamente a rotina de delay chamada,
; para que o LED fique apagado por 1 segundo
; volta para o lao principal
; mudando para o banco de memria 0
; colocando o valor 64h (100 em decimal) no
; registrador Work (W)
; movendo o valor anterior para a varivel
; temporria TEMPO1, que ser utilizada na
; rotina Del10 (delay de 10ms)
; chamando a rotina Del10
; retornando

Del10

Del10_1
BTFSS

Ricardo Pannain

INTCON, 2

; setando o bit 2 do registrador de


; configurao de interrupes. Isto faz com
; que a interrupo de estouro de timer
; (registrador TMR0) seja habilitada
; colocando o valor D8h (11011000 em binrio)
; no registrador Work (W)
; movendo o valor anterior para o registrador
; de operaes. Isto faz com que os bits do
; registrador sejam configurados da seguinte
; maneira:
; - Pull-Ups Internos (/RBPU) => habilitados
; - Borda que ir gerar a interrupo externa
; no RB0 (INTEDG) => subida
; - Incremento de TMR0 (T0CS) => clock
; interno
; - Aplicao do prescaler (PSA) => WDT
; - Valor do prescaler: 1:1
; se o bit 2 do registrador de interrupes
; (T0IF) estiver setado, significa que ocorreu
; um estouro do TMR0. Ento, a varivel
; auxiliar TEMPO1 (que inicialmente tem o
; valor 100), decrementada. Quando esta
; varivel chegar a zero, ou seja, quando

11

GOTO
DECFSZ
GOTO
RETURN
END

Ricardo Pannain

Del10_1
TEMPO1, 1
Del10

; ocorrerem 100 vezes a chamada da rotina


; Del10 (delay de 10 ms), a rotina retorna, pois
; o delay j ter atingido 1 segundo. Caso
; contrrio, o programa fica em loop at
; ocorrer a interruo de estouro do TMR0
; volta para verificar se ocorreu interruo
; decrementa a varivel auxiliar TEMPO1
; delay de 10ms
; retornando
; fim do programa

12

Programa 5:
Este programa conta as transies (mudanas) de uma chave C, ligada ao pino RA0 da
porta A. A quantidade de transies mostrada por 8 LEDs ligados aos pinos da porta B,
em formato binrio

Diagrama Esquemtico:
L1 L2 L3 L4 L5 L6 L7 L8

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador e


variveis auxiliares utilizadas no programa
STATUS
PORTA
PORTB
RP0
OPTION_REG
INTCON
CONTADOR

EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05
0x01
0x0B
0x0D

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
Ricardo Pannain

13

GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
MOVLW

0x01

MOVWF
CLRF

PORTA
PORTB

MOVLW

B'00000111'

MOVWF

OPTION_REG

BANCO0
CLRF
CLRF

PORTB
CONTADOR

BTFSS

PORTA, 0

GOTO
CALL

Loop
Anti_Ruidos

BTFSC

PORTA, 0

GOTO
CALL

Loop2
Anti_Ruidos

; mudana para o banco de memria 1


; utilizando o registrador Work (W) para
; configurar a porta de entrada A. O primeiro
; bit, que corresponde ao pino RA0 est sendo
; configurado como entrada, e o restante dos
; pinos desta porta como sada
; concluindo a configurao da porta A
; limpando os bits de PORTB. Com isso, todos
; os pinos (RB0 a RB7) sero utilizados como
; sada
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:256
; concluindo a configurao do registrador de
; operaes
; mudando para o banco de memria 0
; limpando a porta B
; limpando a varivel auxiliar CONTADOR

Loop:
; testando o estado da chave C. Enquanto ela
; estiver desligada (valor 0), o programa fica
; em loop. Quando ela for ligada, introduzido
; um pequeno delay (rotina Anti_Rudos), para
; evitar interferncias entre o acionamento da
; chave C e o acendimento dos LEDs, e o
; programa passa a esperar que a chave C
; seja desligada
; espera at a chave C ser ligada
; quando a chave C for ligada, chama a rotina
; Anti_Rudos

Loop2:

Ricardo Pannain

; testando o estado da chave C. Enquanto ela


; estiver ligada (valor 1), o programa fica em
; loop. Quando ela for desligada, a rotina
; Anti_Rudos chamada, e o programa passa
; a exibir o valor do contador nos LEDs
; espera at a chave C ser desligada
; quando a chave C for desligada, chama a
; rotina Anti_Rudos

14

INCF

CONTADOR, F

MOVF

CONTADOR, W

MOVWF

PORTB

; neste ponto, uma transio ocorreu. Ento, a


; varivel auxiliar CONTADOR, que grava a
; quantidade de transies feitas na chave C,
; incrementada.
; o valor da varivel CONTADOR gravada no
; registrador Work (W)
; o valor de transies exibido nos LEDs

GOTO

Loop

; volta a esperar outra transio

INTCON, 2

; limpando o bit 2 do vetor de configurao de


; interrupes. Isto necessrio para que a
; rotina funcione corretamente, pois se este bit
; estiver em 1, o delay no ser aplicado
; movendo o valor B0h (10110000 em binrio)
; para o registrador Work (W)
; modificando as configuraes do registrador
; de operaes. As opes escolhidas so:
; - Pull-Ups Internos (/RBPU) => habilitados
; - Incremento de TMR0 (T0CS) => externo,
; pela mudana do pino RA4/T0CKI
; Borda do incremento => descida

Anti_Ruidos
BCF

MOVLW

0xB0

MOVWF

OPTION_REG

BTFSS

INTCON, 2

GOTO
RETURN

Del

Del:

END

Ricardo Pannain

; verificao da ocorrncia da interrupo de


; estouro de timer (TMR0)
; espera a ocorrncia da interrupo
; retornando
; fim do programa

15

Programa 6:
Este programa faz com que um speaker, ligado ao pino RB7 da porta B, d beeps
peridicos a cada segundo. Cada beep dura cerca de 0,5s. Como o ciclo de clock do
microcontrolador muito pequeno, necessrio introduzir delays para que os beeps do
speaker possam ser ouvidos claramente. Estes delays funcionam da seguinte maneira:
duas rotinas, uma chamada Delay1S (delay de 1 segundo) e outra, DelayMS (delay de 0,5
segundos), utilizam a subrotina Del10, que gera delays de 10 ms a cada chamada. Dentro
desta rotina existe uma varivel auxiliar (TEMPO1), que, para a rotina Delay1S, tem o
valor inicial 100 e, para a rotina DelayMS tem o valor inicial de 50. e que vai sendo
decrementada. Cada vez que ela decrementada, a rotina Del10 chamada novamente.

Diagrama Esquemtico:

PIC
RA0

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

RA1
RA2
RA3
RA4

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0

Ricardo Pannain

BCF STATUS, RP0

16

#DEFINE BANCO1

BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador e


variveis auxiliares utilizadas no programa
STATUS
PORTA
PORTB
RP0
OPTION_REG
INTCON
TEMPO1

EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05
0x01
0x0B
0x0C

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
MOVLW

B'01111111'

MOVWF
MOVLW

PORTB
B'00000111'

MOVWF

OPTION_REG

BANCO0
CLRF

PORTB

BSF

PORTB, 7

CALL

DelayMS

BCF

PORTB, 7

CALL

Delay1S

; mudana para o banco de memria 1


; utilizando o registrador Work (W) para
; configurar a porta B. Todos os pinos desta
; porta so configurados como entrada, exceto
; o pino RB7, que funcionar como sada
; concluindo a configurao da porta B
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:256.
; concluindo a configurao do registrador de
; operaes
; mudando para o banco de memria 0
; limpando a porta B

Loop:

Ricardo Pannain

; setando o pino RB0 da porta B. Isto faz com


; que o speaker comece a produzir um som
; chamando a rotina que introduz um delay de
; 0,5 segundos no processamento, fazendo
; com que o speaker fique ligado por cerca de
; 0,5 segundos
; limpando o pino RB0 da porta B. Isto faz com
; que o speaker pare de produzir o som
; chamando a rotina que introduz um delay de
; 1 segundo no processamento, fazendo com

17

GOTO
Delay1S
BANCO0
MOVLW

Loop

.100

MOVWF

TEMPO1

CALL
RETURN

Del10

DelayMS
BANCO0
MOVLW

.50

MOVWF

TEMPO1

CALL
RETURN

Del10

BCF

INTCON, 2

MOVLW

0xD8

MOVWF

OPTION_REG

; que o speaker fique desligado por cerca de


; 1 segundo
; volta para o lao principal
; mudando para o banco de memria 0
; colocando o valor 100 (em decimal) no
; registrador Work (W)
; movendo o valor anterior para a varivel
; temporria TEMPO1, que ser utilizada na
; rotina Del10 (delay de 10ms)
; chamando a rotina Del10
; retornando
; mudando para o banco de memria 0
; colocando o valor 50 (em decimal) no
; registrador Work (W)
; movendo o valor anterior para a varivel
; temporria TEMPO1, que ser utilizada na
; rotina Del10 (delay de 10ms)
; chamando a rotina Del10
; retornando

Del10

Del10_1
BTFSS

Ricardo Pannain

INTCON, 2

; setando o bit 2 do registrador de


; configurao de interrupes. Isto faz com
; que a interrupo de estouro de timer
; (registrador TMR0) seja habilitada
; colocando o valor D8h (11011000 em binrio)
; no registrador Work (W)
; movendo o valor anterior para o registrador
; de operaes. Isto faz com que os bits do
; registrador sejam configurados da seguinte
; maneira:
; - Pull-Ups Internos (/RBPU) => habilitados
; - Borda que ir gerar a interrupo externa
; no RB0 (INTEDG) => subida
; - Incremento de TMR0 (T0CS) => clock
; interno
; - Aplicao do prescaler (PSA) => WDT
; - Valor do prescaler: 1:1
; se o bit 2 do registrador de interrupes
; (T0IF) estiver setado, significa que ocorreu
; um estouro do TMR0. Ento, a varivel
; auxiliar TEMPO1 (que inicialmente tem o
; valor 100 ou 50), decrementada. Quando
; esta varivel chegar a zero, ou seja, quando
; ocorrerem 100 (ou 50) vezes a chamada da

18

GOTO
DECFSZ
GOTO
RETURN
END

Ricardo Pannain

Del10_1
TEMPO1, 1
Del10

; rotina Del10 (delay de 10 ms), a rotina


; retorna, pois o delay j ter atingido 1
; segundo (ou 0,5 segundos). Caso contrrio,
; o programa fica em loop at ocorrer a
; interruo de estouro do TMR0
; volta para verificar se ocorreu interruo
; decrementa a varivel auxiliar TEMPO1
; delay de 10ms
; retornando
; fim do programa;

19

Programa 7:
Este programa escreve dados na memria EEPROM do microcontrolador. A posio 0
desta memria ir armazenar o valor das chaves ligadas aos pinos RA0 RA4 da porta A
(em binrio). A verificao do valor armazenado na memria pode ser visualizado pelo
programa de gravao do PIC, j que esta memria no apagada at ser subscrita. A
gravao da memria EEPROM leva um certo tempo. Devemos esperar este tempo antes
de continuar a execuo do programa. Temos duas opes: ou esperamos que o bit WR
do registrador EECON1 seja limpado pelo hardware, indicando o fim da escrita, ou
introduzirmos um delay, que espera uma determinada quantidade de tempo antes de
continuar a execuo. Esta implementao utiliza um delay de, aproximadamente, 2,6
segundos, para a espera da gravao da memria EEPROM.

Diagrama Esquemtico:

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

Ricardo Pannain

BCF STATUS, RP0


BSF STATUS, RP0

20

Definies das constantes utilizadas para acessar os registradores do microcontrolador e


variveis auxiliares utilizadas no programa
STATUS
PORTA
PORTB
RP0
OPTION_REG
INTCON
EECON1
EECON2
EEDATA
EEADDR
TEMPO1
RP0B
EEIE
WREN
WR
RD

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x03
0x05
0x06
0x05
0x01
0x0B
0x88
0x89
0x08
0x09
0x0D
5
6
2
1
0

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
MOVLW

B'00011111'

MOVWF
MOVLW

PORTA
B'00000111'

MOVWF

OPTION_REG

BANCO0
CALL
CALL
GOTO

Dado
Write
Fim

; mudando para o banco de memria 1


; utilizando o registrador Work (W) para
; configurar a porta de entrada A. Todos os
; pinos da porta (RA0 RA4) esto sendo
; configurados como entrada
; concluindo a configurao da porta A
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:256.
; concluindo a configurao do registrador de
; operaes
; mudando para o banco de memria 0
; rotina que obtm o dado a ser escrito
; rotina que escreve o dado na EEPROM
; finaliza programa

Dado
BANCO0

Ricardo Pannain

; mudando para o banco de memria 0

21

MOVLW
MOVWF

B'00000000'
EEADDR

MOVF

PORTA, W

MOVWF

EEDATA

RETURN

; colocando o nmero 0 no registrador Work


; movendo o valor 0 para o registrador de
; endereos da EEPROM. Este corresponde
; ao endereo da memria EEPROM no qual o
; dado ser armazenado
; colocando o valor das chaves de entrada
; ligadas na porta A no registrador Work (W),
; que ser o valor em binrio armazenado no
; endereo 0 da EEPROM
; colocando o valor de W no registrador
; EEDATA, que serve para armazenar o dado
; que ser gravado na memria EEPROM
; retornando

Write
BANCO1
BSF

EECON1, WREN

MOVLW

0x55

MOVWF
MOVLW
MOVWF
BSF

EECON2
0xAA
EECON2
EECON1, WR

BANCO0
CALL
RETURN

Del10

BCF

INTCON, 2

MOVLW

0xD8

MOVWF

OPTION_REG

; mudando para o banco de memria 1


; setando o bit WREN do registrador de
; configuraes EECON1. Este bit habilita a
; escrita na memria, e utilizado como bit de
; segurana
; tambm utilizado por questes de proteo,
; evitando que a memria EEPROM seja
; subscrita acidentalmente, o registrador
; EECON2 deve, primeiramente, receber o
; valor 0x55, e, posteriormente, o valor 0xAA.
; Este procedimento obrigatrio em todos os
; processos de escrita na memria EEPROM

; setando o bit WR do registrador de


; configuraes EECON1. Quanto este bit
; setado, o ciclo de escrita iniciado. Quando
; terminada a escrita, o hardware,
; automaticamente, limpa este bit.
; mudando para o banco de memria 0
; espera a memria ser escrita
; retornando

Del10

Ricardo Pannain

; setando o bit 2 do registrador de


; configurao de interrupes. Isto faz com
; que a interrupo de estouro de timer
; (registrador TMR0) seja habilitada
; colocando o valor D8h (11011000 em binrio)
; no registrador Work (W)
; movendo o valor anterior para o registrador
; de operaes. Isto faz com que os bits do
; registrador sejam configurados da seguinte
; maneira:
; - Pull-Ups Internos (/RBPU) => habilitados

22

; - Borda que ir gerar a interrupo externa


; no RB0 (INTEDG) => subida
; - Incremento de TMR0 (T0CS) => clock
; interno
; - Aplicao do prescaler (PSA) => WDT
; - Valor do prescaler: 1:1
Del10_1
BTFSS

INTCON, 2

GOTO
DECFSZ
GOTO
RETURN

Del10_1
TEMPO1, 1
Del10

GOTO

Fim

; se o bit 2 do registrador de interrupes


; (T0IF) estiver setado, significa que ocorreu
; um estouro do TMR0. Ento, a varivel
; auxiliar TEMPO1 (que inicialmente tem o
; valor 0), decrementada. Como o valor
; inicial desta varivel 0, quando
; decrementada pela primeira vez, ela passa
a ; ter o valor 255. Quando esta varivel
chegar
; a zero, ou seja, quando ocorrerem 256 vezes
; a chamada da rotina Del10 (delay de 10 ms),
; a rotina retorna, pois o delay j ter
; terminado. Caso contrrio, o programa fica
; em loop at ocorrer a interruo de estouro
; do TMR0
; volta para verificar se ocorreu interruo
; decrementa a varivel auxiliar TEMPO1
; delay de 10ms
; retornando

Fim:

END

Ricardo Pannain

; loop infinito. Para comear o programa


; novamente, depois de uma escrita,
; necessrio resetar o microcontrolador
; fim do programa

23

Programa 8:
Este programa l os dados anteriormente gravados na memria EEPROM, na posio 0.
O valor lido representado, em binrio, atravs de LEDs ligados aos pinos da porta B.

Diagrama Esquemtico:

L1 L2 L3 L4 L5 L6 L7 L8

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das constantes utilizadas para acessar os registradores do microcontrolador e


variveis auxiliares utilizadas no programa
STATUS
PORTA

Ricardo Pannain

EQU
EQU

0x03
0x05

24

PORTB
RP0
OPTION_REG
INTCON

EQU
EQU
EQU
EQU

0x06
0x05
0x01
0x0B

EECON1
EEDATA
EEADDR

EQU
EQU
EQU

0x88
0x08
0x09

RD

EQU

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
CLRF

PORTB

BANCO0
CLRF

EEADDR

CALL
MOVF

Read
EEDATA, W

MOVWF

PORTB

GOTO

Fim

BANCO1
BSF

EECON1, RD

; mudando para o banco de memria 1


; limpando os bits de PORTB. Com isso, todos
; os pinos (RB0 a RB7) sero utilizados como
; sada
; mudando para o banco de memria 0
; limpando os bits do registrador de endereos
; EEADDR. Isso faz com que o endereo a ser
; lido seja o endereo 0
; chama a rotina de leitura da memria
; move os dados lidos da memria para o
; registrador Work (W)
; exibe o valor lido da memria, em binrio,
; nos LEDs ligados aos pinos da porta B
; finaliza o programa

Read

BANCO0
RETURN

Ricardo Pannain

; mudando para o banco de memria 1


; setando o bit RD do registrador de
; configuraes EECON1. Quanto este bit
; setado, o ciclo de leitura iniciado. Quando
; terminada a leitura, o hardware,
; automaticamente, limpa este bit. Como a
; leitura da memria muito rpida, ou seja, o
; dado lido quase imediatamente aps o bit
; de incio do ciclo de leitura ser setado, no
; necessrio introduzir delays para a leitura, ou
; esperar que o bit RD seja limpado pelo
; hardware
; mudando para o banco de memria 0
; retornando

25

Fim:
GOTO

Fim

; loop infinito. Para comear o programa


; novamente, depois de uma escrita,
; necessrio resetar o microcontrolador
; fim do programa

END

Programa 9:
Este programa similar ao programa 5, mas explora os recursos de WatchDog e modo
Sleep do microcontrolador. A partir deste programa, passaremos a utilizar o arquivo de
definies padro da Microchip para microcontroladores modelo 16F84, onde se encontra
as definies dos nomes e endereos de todos os SFRs (registradores especiais) e uma
srie de outras definies necessrias para a utilizao do microcontrolador 16F84. Como
curiosidade, voc pode consultar este arquivo para visualizar todos os nomes dos SFRs e
constantes que podem ser utilizadas na programao do 16F84.

Diagrama Esquemtico:
L1 L2 L3 L4 L5 L6 L7 L8

PIC
RA0
RA1
RA2
RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Incluso do arquivo de definies da Microchip para o modelo 16F84a
INCLUDE "P16F84A.INC"
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das variveis auxiliares utilizadas no programa

Ricardo Pannain

26

CONTADOR

EQU

0x0C

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
MOVLW

0x01

MOVWF
CLRF

PORTA
PORTB

MOVLW

B'00001111'

MOVWF

OPTION_REG

BANCO0
CLRF
CLRF

PORTB
CONTADOR

BTFSS

PORTA, 0

GOTO
SLEEP

Loop

; mudana para o banco de memria 1


; utilizando o registrador Work (W) para
; configurar a porta de entrada A. O primeiro
; bit, que corresponde ao pino RA0 est sendo
; configurado como entrada, e o restante dos
; pinos desta porta como sada
; concluindo a configurao da porta A
; limpando os bits de PORTB. Com isso, todos
; os pinos (RB0 a RB7) sero utilizados como
; sada
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:128, pois,
; como o quarto bit est setado, significa que o
; prescaler ser aplicado ao WDT (WatchDog)
; Como o prescaler est acertado para 1:128,
; o WDT ir demorar 18 * 128 = 2,3 segundos
; para estourar. Note que 256 incrementos do
; WDT correspondem a 18 ms
; concluindo a configurao do registrador de
; operaes
; mudando para o banco de memria 0
; limpando a porta B
; limpando a varivel auxiliar CONTADOR

Loop:

Ricardo Pannain

; testando o estado da chave C. Enquanto ela


; estiver desligada (valor 0), o programa fica
; em loop. Quando ela for ligada, introduzido
; um delay, atravs do WDT, para evitar
; interferncias entre o acionamento da chave
; C e o acendimento dos LEDs, e o programa
; passa a esperar que a chave C seja
; desligada
; espera at a chave C ser ligada
; espera o WDT estourar (cerca de 2,3
; segundos). Neste perodo de tempo, o

27

; oscilador desligado e o processamento


; paralisado
Loop2:
BTFSC

PORTA, 0

GOTO
SLEEP

Loop2

INCF

CONTADOR, F

MOVF

CONTADOR, W

MOVWF

PORTB

; testando o estado da chave C. Enquanto ela


; estiver ligada (valor 1), o programa fica em
; loop. Quando ela for desligada, o delay
; introduzido, e o programa passa a exibir o
; valor do contador nos LEDs
; espera at a chave C ser desligada
; espera o WDT estourar (cerca de 2,3
; segundos). Neste perodo de tempo, o
; oscilador desligado e o processamento
; paralisado
; neste ponto, uma transio ocorreu. Ento, a
; varivel auxiliar CONTADOR, que grava a
; quantidade de transies feitas na chave C,
; incrementada.
; o valor da varivel CONTADOR gravada no
; registrador Work (W)
; o valor de transies exibido nos LEDs

GOTO

Loop

; volta a esperar outra transio

END

Ricardo Pannain

; fim do programa

28

Programa 10:
Este programa simula os movimentos de um rob. Este rob imaginrio possui dois
dispositivos infravermelhos, que fazem com que ele siga uma trajetria desenhada no
cho, e dois motores, um para cada roda de trao. Quando os sensores detectam a
necessidade de acertar a rota, os motores devem ser manipulados a fim de realizar o
acerto. Por exemplo, se o rob estiver desviando a rota para a esquerda, o rob deve se
mover para a direita at que a rota seja acertada. Para isto, o motor da direita deve ser
revertido (rodar para trs), e o da esquerda deve continuar ligado (rodando para frente).
Quando a rota estiver certa, ambos os motores devem ser ligados para frente, para que o
rob continue andando em frente. Os movimentos possveis so para a esquerda
(reverter o motor da esquerda e manter o motor da direita a frente), para a direita (reverter
o motor da direita e manter o motor da esquerda a frente), para frente (manter os dois
motores a frente), e para trs (reverter os dois motores).
Os sensores sero simulados pelas chaves ligadas aos pinos RA0 e RA1 da porta. Vamos
convencionar que o valor 0 significa que o sensor no detectou desvio na trajetria, e o
valor 1 significa que o sensor detectou um desvio na trajetria. Os LEDs ligados aos pinos
RB0 e RB1 da porta B iro simular as sadas de controle dos dois motores de trao
(direito e esquerdo, respectivamente). Vamos convencionar que o valor 1 significa ligar os
motores frente, e 0 significa reverter os motores.

Diagrama Esquemtico:

L1 L2

PIC
RA0
RA1
RA2
RA3
RA4

Ricardo Pannain

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

29

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Incluso do arquivo de definies da Microchip para o modelo 16F84a
INCLUDE "P16F84A.INC"
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das variveis auxiliares utilizadas no programa


AUX

EQU

0x0C

Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor


de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Inicio:
BANCO1
MOVLW

B'00000011

MOVWF
CLRF

PORTA
PORTB

BANCO0

; mudando para o banco de memria 1


; utilizando o registrador Work (W) para
; configurar a porta de entrada A. O dois
; primeiros bits, que correspondem aos pinos
; RA0 e RA1 esto sendo configurados como
; entrada, e o restante dos pinos desta porta
; como sada
; concluindo a configurao da porta A
; limpando os bits de PORTB. Com isso, todos
; os pinos (RB0 a RB7) sero utilizados como
; sada
; mudando para o banco de memria 0

Loop:
MOVF

PORTA, W

ANDLW

B'00000011'

Ricardo Pannain

; movendo o status atual da porta A para o


; registrador Work (W)
; AND lgico entre o registrador Work (W) e o
; valor 00000011, para que os 2 primeiros
; bits sejam mantidos e os outros 6 passem a
; ser 0. Isto necessrio para realizar as
; comparaes
30

MOVWF

AUX

XORLW

B'00000000'

BTFSC

STATUS, Z

GOTO

Para_Frente

MOVF

AUX, W

XORLW

B'00000001'

BTFSC

STATUS, Z

GOTO

Direita

MOVF

AUX, W

XORLW

B'00000010'

BTFSC

STATUS, Z

GOTO

Esquerda

MOVF

AUX, W

XORLW

B'00000011'

BTFSC

STATUS, Z

GOTO

Para_Tras

; faz uma cpia do valor da varivel AUX no


; registrador Work (W) para comparao
; verifica se o rob saiu totalmente da trajetria
; (isto ocorre quando ambos os sensores
; passam a ter o valor 1)
; se a operao anterior resultou em zero,
; significa que a trajetria deve ser acertada,
; ou seja, o rob deve movimentar-se para trs
; at que retome a trajetria correta
; faz o rob movimentar-se para trs

GOTO

Loop

; volta para o loop principal

B'00000011'

; os dois motores sero ligados frente

Para_Frente:
MOVLW

Ricardo Pannain

; coloca o valor da operao anterior na


; varivel auxiliar AUX
; verifica se a trajetria est correta (valores
; dos sensores = 0. Se estiver correta, mantm
; o movimento frente
; verifica se a operao anterior resultou em
; zero. Se o bit Z do registrador STATUS
; estiver setado, significa que a operao
; resultou em zero. Isto significa que ambos os
; sensores esto com os valores 0, e a
; trajetria est correta. Se isto ocorrer, o rob
; mantm o movimento frente. Caso
; contrrio, a prxima linha pulada e outras
; verificaes sero feitas
; faz o rob movimentar-se para frente
; faz uma cpia do valor da varivel AUX no
; registrador Work (W) para comparao
; verifica se a trajetria desviou para a
; esquerda
; se a operao anterior resultou em zero,
; significa que a trajetria deve ser acertada,
; ou seja, o rob deve movimentar-se para a
; direita at que retome a trajetria correta
; faz o rob movimentar-se para a direita
; faz uma cpia do valor da varivel AUX no
; registrador Work (W) para comparao
; verifica se a trajetria desviou para a
; direita
; se a operao anterior resultou em zero,
; significa que a trajetria deve ser acertada,
; ou seja, o rob deve movimentar-se para a
; esquerda at que retome a trajetria correta
; faz o rob movimentar-se para a direita

31

MOVWF
GOTO

PORTB
Loop

Para_Tras:
MOVLW B'00000000'
MOVWF PORTB
GOTO Loop

; liga os motores
; volta para o loop principal
; os dois motores sero revertidos
; reverte os motores
; volta para o loop principal

Direita:
MOVLW

B'00000010'

MOVWF
GOTO

PORTB
Loop

Esquerda:
MOVLW
MOVWF
GOTO
END

Ricardo Pannain

B'00000001'
PORTB
Loop

; o motor esquerdo ser ser ligado frente e


; o direito, revertido
; aciona os motores
; volta para o loop principal
; o motor direito ser ser ligado frente e
; o esquerdo, revertido
; aciona os motores
; volta para o loop principal
; fim do programa

32

Programa 11:
Este programa servir para a gerao de nmeros aleatrios. Ir funcionar da seguinte
maneira:
- Devemos gerar nmeros aleatrios de 0 a 6
- Quando a chave C, ligada ao pino RA0 da porta A, estiver em "1", o display (ligado aos
pinos RB0 RB7 da porta B) ir mostrar, sequencialmente, nmeros de 0 a 6, em
intervalos de 0,05 segundos
- Ao passar a chave C para "0", o display mostrar, durante 3 segundos, o nmero
aleatrio obtido
- Passados os 3 segundos, o display se apaga e a sequencia se repete
O nmero representado nos 4 bits menos significativos do registrador Work (W)
transformado em um nmero equivalente no display de 7 segmentos, como se
estivssemos implementando um conversor. O cdigo referente ao nmero no display de
7 segmentos tambm retorna no registrador W.

Diagrama Esquemtico:

Gnd

PIC
RA0
RA1
RA2
RA3
RA4

Ricardo Pannain

abcdefg.

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

33

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Incluso do arquivo de definies da Microchip para o modelo 16F84a
INCLUDE "P16F84A.INC"
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das variveis auxiliares utilizadas no programa


CBLOCK 0x0C

; incio da rea de memria do usurio

NUMERO
DELAY_CONT
TEMPORAL
ENDC
Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor
de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Tabela
ADDWF

PCL, F

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

B'00111111'
B'00000110'
B'01011011'
B'01001111'
B'01100110'
B'01101101'
B'01111101'

Ricardo Pannain

; soma o valor do registrador W (que contm o


; nmero a ser convertido) com o valor do
; registrador PCL, para que o program counter
; seja desviado para o valor que corresponde
; ao nmero na tabela de converso. O
; nmero convertido retornado em W,
; atravs da chamada RETLW
; representao do nmero 0
; representao do nmero 1
; representao do nmero 2
; representao do nmero 3
; representao do nmero 4
; representao do nmero 5
; representao do nmero 6
34

Delay_20_ms:
BCF

MOVLW
MOVWF

INTCON, T0IF; setando o bit T0IF do registrador de


; configurao de interrupes. Isto faz com
; que a interrupo de estouro de timer
; (registrador TMR0) seja habilitada
0xB1
; colocando o valor B1h (177 em decimal) no
; registrador Work (W)
TMR0
; movendo o valor 177 para o TMR0. Como o
; prescaler foi setado para 1:256, o TMR0 ser
; incrementado a cada 256 ciclos. Com um
; clock de 4 Mhz, isto significa que ocorre um
; incremento a cada 256s. Como o TMR0
; comea em 177, aps 79 incrementos ele ir
; estourar. Para ocorrer 79 incrementos, vo
; ser necessrios 79 * 256 = 20224s, ou,
; aproximadamente, 20 ms, que o delay que
; desejamos

Delay_20_ms_1
CLRWDT
BTFSS

GOTO
RETURN

; limpa o registrador WDT para no ocorrer


; um reset
INTCON, T0IF; se o bit T0IF do registrador de interrupes
; estiver setado, significa que ocorreu um
; estouro do TMR0. Ou seja, o delay de 20 ms
; foi atingido, ento a rotina retorna. Enquanto
; no ocorrer a interrupo de estouro de
; timer, o programa fica em loop, aguardando
; que esta interrupo ocorra
Delay_20_ms_1
; espera interrupo de estouro de timer
; retornando

Delay_Var
BCF

MOVLW
MOVWF

Ricardo Pannain

INTCON, T0IF; setando o bit T0IF do registrador de


; configurao de interrupes. Isto faz com
; que a interrupo de estouro de timer
; (registrador TMR0) seja habilitada
0x3C
; colocando o valor 3Ch (60 em decimal) no
; registrador Work (W)
TMR0
; movendo o valor 60 para o TMR0. Como o
; prescaler foi setado para 1:256, o TMR0 ser
; incrementado a cada 256 ciclos. Com um
; clock de 4 Mhz, isto significa que ocorre um
; incremento a cada 256s. Como o TMR0
; comea em 60, aps 196 incrementos ele ir
; estourar. Para ocorrer 196 incrementos, vo
; ser necessrios 196 * 256 = 50176 s, ou,

35

; aproximadamente, 50 ms.
; limpa o registrador WDT para no ocorrer
; um reset

CLRWDT
Intervalo
CLRWDT
BTFSS

GOTO
DECFSZ
GOTO

RETURN

; limpa o registrador WDT para no ocorrer


; um reset
INTCON, T0IF; se o bit T0IF do registrador de interrupes
; estiver setado, significa que ocorreu um
; estouro do TMR0. Ou seja, o delay de 50 ms
; foi atingido, ento a varivel DELAY_CONT,
; que contm a quantidade de vezes que a
; rotina ir repetir (ou seja, um parmetro
; que corresponde ao tempo desejado de
; delay, levando em conta que cada iterao
; da rotina demora 50 ms), decrementada, e
; a rotina recomea. Quando a varivel
; DELAY_CONT chegar a zero, a rotina
; retorna, sendo que o tempo gasto nesta
; rotina corresponde ao delay desejado.
; Enquanto no ocorre uma interrupo de
; estouro de timer, a rotina permanece em loop
Intervalo
; espera interrupo de estouro de timer
DELAY_CONT, F
; decrementa a varivel DELAY_CONT
Delay_Var
; se DELAY_CONT no chegou a zero, volta a
; executar a rotina. Note que esta rotina
; contm traos de rotina recursiva. Ento por
; que, ao invs de chamar a rotina usando
; CALL usamos GOTO? A resposta simples,
; pois se executamos CALL, o endereo de
; retorno armazenado na pilha (stack). Como
; a pilha possui apenas 8 nveis, no seria
; possvel armazenar todos os endereos de
; retornos das vrias chamadas mesma
; rotina (por exemplo, se desejarmos um delay
; de 3 segundos, a rotina deve ser chamada
; 60 vezes). Isto acarretaria a perda dos
; endereos mais antigos da pilha, e o
; programa no funcionaria corretamente.
; Ento, utilizando GOTO, o programa
; somente desvia a execuo para a linha
; correspondente ao nome da rotina, no
; sendo necessrio armazenar o endereo de
; retorno.
; retornando

Inicio:
CLRF
BANCO1
CLRF

Ricardo Pannain

PORTB
TRISB

; limpando a porta B
; mudando para o banco de memria 1
; limpando os bits de TRISB. Com isso, todos

36

MOVLW

B'00011111'

MOVWF
MOVLW

TRISA
B'00000111'

MOVWF

OPTION_REG

BANCO0

; os pinos (RB0 a RB7) sero utilizados como


; sada
; utilizando o registrador Work (W) para
; configurar a porta de entrada A. Todos os
; pinos (RA0 RA4) sero utilizados como
; entrada.
; concluindo a configurao da porta A
; utilizando o registrador Work (W) para
; configurar o registrador de operao do
; microcontrolador. Os trs primeiros bits, que
; correspondem configurao do prescaler,
; esto sendo setados, o que significa que o
; prescaler assumir o valor de 1:256
; concluindo a configurao do registrador de
; operao
; mudando para o banco de memria 0

Loop:
CLRWDT

; limpa o registrador WDT para no ocorrer


; um reset
; testa o status da chave C. Se estiver
; ligada, espera at que ela seja desligada.
; espera a chave C ser desligada
; copia o valor corrente do timer (TMR0) para o
; registrador Work (W)
; move o valor de Work (W) para a varivel
; NUMERO

BTFSS

PORTA, 0

GOTO
MOVF

Loop
TMR0, W

MOVWF

NUMERO

MOVLW
SUBWF
MOVWF
SUBLW
BTFSS
GOTO
INCF

D'6'
NUMERO, W
NUMERO
D'5'
STATUS, C
Divide
NUMERO, F

; move o valor 6 para o registrador Work (W)


; subtrai o valor de W da varivel NUMERO
; atualiza a varivel NUMERO
; subtrai o valor 5 do registrador W
; testa a ocorrncia do carry (negativo)
; se no ocorreu carry, continua os clculos
; se ocorreu carry, incrementa NUMERO

MOVLW
MOVWF

D'6'
TEMPORAL

; move o valor 6 para o registrador Work (W)


; copia o contedo de W (valor 6) para a
; varivel TEMPORAL

Divide:

Dado:

RA0_1:
CLRWDT
BTFSS

PORTA, 0

GOTO

Saida

Ricardo Pannain

; limpa o registrador WDT para no ocorrer


; um reset
; testa o status da chave C. Se estiver
; ligada, vai exibindo os nmeros aleatrios no
; display, em intervalos de 0,05 segundos. Se
; estiver desligada, exibe no display o nmero
; aleatrio gerados, por 3 segundos.
; se a chave C estiver desligada, exibe o
; nmero aleatrio gerado no display

37

MOVF

TEMPORAL, W

CALL

Tabela

MOVWF
MOVLW
MOVWF

PORTB
D'1'
DELAY_CONT

CALL
DECFSZ
GOTO

Delay_Var
TEMPORAL, F
RA0_1

GOTO

Dado

CALL

Delay_20_ms

MOVF

NUMERO, W

CALL

Tabela

MOVWF
MOVLW
MOVWF

PORTB
D'60'
DELAY_CONT

CALL
CLRF
GOTO

Delay_Var
PORTB
Loop

; move o nmero aleatrio atual para o


; registrador Work (W)
; converte este nmero para o formato de 7
; segmentos
; exibe o nmero no display
; move o valor 1 para o registrador Work (W)
; seta o multiplicador da rotina Delay_Var para
; o valor 1. Ou seja, a rotina ir gerar um delay
; de 50 ms
; chama a rotina Delay_Var
; decrementa o valor do nmero aleatrio atual
; se TEMPORAL no chegou a zero, continua
; exibindo os nmeros aleatrios no display
; se TEMPORAL for zero, seu valor deve ser
; atualizado. No caso, no desvio para a linha
; Dado, ele voltar ao valor 6
; delay de 20 ms

Saida:

END

Ricardo Pannain

; move o numero aleatrio gerado, a ser


; exibido no display, para o registrador W
; converte este nmero para o formato de 7
; segmentos
; exibe o nmero no display
; move o valor 60 para o registrador Work (W)
; seta o multiplicador da rotina Delay_Var para
; o valor 60. Ou seja, a rotina ir gerar um
; delay de 60 * 50 = 3000 ms, ou seja, 3
; segundos
; chama a rotina Delay_Var
; apaga o contedo do display
; retorna para o loop principal
; fim do programa

38

Programa 12:
Este programa ir simular um contador de 2 dgitos (00 a 99). Para sua realizao, sero
utilizados dois displays de 7 segmentos, e dois conversores binrio-7segmentos, que
recebe um nmero binrio de 4 bits e transforma este nmero para a representao do
display.
Para exibir os nmeros nos displays, utilizaremos a porta B, sendo que os 4 bits menos
significativos representaro o nmero a ser exibido no primeiro display (unidade), e os 4
bits mais significativos representaro o nmero a ser exibido no segundo display
(dezena).
Este contador ter duas chaves e um boto (push buttom). A chave ligada entrada RA0
da porta A ir controlar o sentido da contagem (0 = Decrescente e 1 = Crescente). A chave
ligada entrada RA1 da porta A ir controlar a parada do contador (0 = Parar e 1 =
Contar). E, por ltimo, o boto ligado RA2 servir de reset, ou seja, quando
pressionado, ir zerar os displays e recomear a contagem.

Diagrama Esquemtico:

Ricardo Pannain

39

abcdefg.

abcdefg.

4543

D3
D2
D1
D0
LD
BI
PH

4543

D3
D2
D1
D0
LD
BI
PH

a
b
c
d
e
f
g

Gnd

a
b
c
d
e
f
g

Gnd

PIC
RA0
RA1
RA2

+V

RA3
RA4

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

Codificao:
Definio do tipo de dispositivo que ser utilizado. Corresponde ao tipo do
microcontrolador no qual iremos gravar o programa
LIST P=16F84
Incluso do arquivo de definies da Microchip para o modelo 16F84a
INCLUDE "P16F84A.INC"
Definio dos comandos de usurio para alterao das pginas de memria (bancos)
#DEFINE BANCO0
#DEFINE BANCO1

BCF STATUS, RP0


BSF STATUS, RP0

Definies das variveis auxiliares utilizadas no programa


CBLOCK 0x0C

; incio da rea de memria do usurio

CONTADOR_D1
CONTADOR_D2

Ricardo Pannain

40

CONTADOR_TMP
CONTADOR_DELAY
ENDC
Definies do endereo de incio de processamento, ou vetor de reset (0x00), e do vetor
de interrupes (0x05)
ORG 0
GOTO Inicio
ORG 5
Incio do programa:
Delay
MOVLW

.10

MOVWF

CONTADOR_DELAY

BCF

INTCON, T0IF

MOVLW

0x3C

MOVWF

TMR0

CLRWDT

; move o valor 10 para o registrador


; Work (W)
; move o contedo de W para a
; varivel CONTADOR_DELAY
; limpando o bit de identificao de
; ocorrncia da interrupo de estouro
; de timer (T0IF)
; colocando o valor 3Ch (60 em
; decimal) no registrador Work (W)
; movendo o valor 60 para o TMR0.
; Como o prescaler foi setado para
; 1:64, o TMR0 ser incrementado a
; cada 64 ciclos. Com um clock de
; 4 Mhz, isto significa que ocorre um
; incremento a cada 64s. Como o
; TMR0 comea em 60, aps 196
; incrementos ele ir estourar.
; Para ocorrer 196 incrementos, vo ser
; necessrios 196 * 64 = 12544 s, ou,
; aproximadamente, 12,5 ms.
; limpa o registrador WDT para no
; ocorrer um reset

Intervalo
CLRWDT
BTFSS

Ricardo Pannain

INTCON, T0IF

; limpa o registrador WDT para no


; ocorrer um reset
; se o bit T0IF do registrador de
; interrupes estiver setado, significa
; que ocorreu um estouro do TMR0. Ou
; seja, o delay de 12,5 ms foi atingido,
; ento a varivel
; CONTADOR_DELAY, que contm a
; quantidade de vezes que a rotina ir
; repetir (que, no caso do exemplo,
; de 10 vezes), decrementada, e a
; rotina recomea. Quando a varivel
41

GOTO

Intervalo

DECFSZ
GOTO

CONTADOR_DELAY, F
Delay_Var

Mostrar_Valor
MOVF

CONTADOR_D2, W

MOVWF

CONTADOR_TMP

SWAPF

CONTADOR_TMP, F

CLRW
IORWF

CONTADOR_D1, W

IORWF

CONTADOR_TMP, W

MOVWF
RETURN

PORTB

CLRF
BANCO1
CLRF

PORTB

MOVLW

B'00011111'

; CONTADOR_CONT chegar a zero, a


; rotina retorna, sendo que o tempo
; gasto nesta rotina corresponde ao
; delay desejado (no caso, 125 ms)
; Enquanto no ocorre uma interrupo
; de estouro de timer, a rotina
; permanece em loop
; espera interrupo de estouro de
; timer
; decrementa a varivel DELAY_CONT
; se DELAY_CONT no chegou a zero,
; volta a executar a rotina
; move o valor atual do display2 para o
; registrador Work (W)
; coloca este valor na varivel
; CONTADOR_TMP
; realiza um swap dos bits menos
; significativos com os bits mais
; significativos da varivel
; CONTADOR_TMP. Isto necessrio
; porque o nmero a ser exibido no
; display2 ser escrito nos 4 bits mais
; significativos da porta B, ento eles
; devem estar na posio adequada
; limpa o registrador Work (W)
; realiza um OR lgico entre o valor
; corrente do display1 e o contedo do
; registrador Work (W). Com isso, os
; 4 bits menos significativos de W iro
; conter o nmero a ser exibido no
; display1
; realiza um OR lgico entre o valor da
; varivel CONTADOR_TMP (que
; contm o swap dos bits do nmero
; contido na varivel CONTADOR_D2)
; e o contedo do registrador Work (W).
; Com isso, os 4 bits mais significativos
; de W iro conter o nmero a ser
; exibido no display2
; exibe os nmeros nos displays 1 e 2
; retornando

Inicio:

Ricardo Pannain

TRISB

; limpando a porta B
; mudando para o banco de memria 1
; limpando os bits de TRISB. Com isso,
; todos os pinos (RB0 a RB7) sero
; utilizados como sada
; utilizando o registrador Work (W) para
; configurar a porta de entrada A.

42

MOVWF
MOVLW

TRISA
B'0000011'

MOVWF

OPTION_REG

BANCO0
Resetar:
CLRF
CLRF
CLRF

CONTADOR_D1
CONTADOR_D2
CONTADOR_TMP

CALL

Mostrar_Valor

CALL
BTFSC

Delay
PORTA, 2

GOTO

Resetar

BTFSS

PORTA, 1

GOTO
BTFSS

Loop
PORTA, 0

GOTO

Decrescente

; Todos os pinos (RA0 RA4) sero


; utilizados como entrada.
; concluindo a configurao da porta A
; utilizando o registrador Work (W) para
; configurar o registrador de operao
; do microcontrolador. Os trs primeiros
; bits, que correspondem
; configurao do prescaler, esto
; sendo configurados de maneira a
; fazer o prescaler assumir o valor de
; 1:64
; concluindo a configurao do
; registrador de operao
; mudando para o banco de memria 0
; limpando o display1
; limpando o display2
; limpando a varivel
; CONTADOR_TMP
; exibindo o valor 00 nos displays

Loop:

Crescente:
INCF
MOVLW

CONTADOR_D1, F
.10

SUBWF

CONTADOR_D1, W

BTFSS

STATUS, Z

Ricardo Pannain

; delay de 0,25 segundos


; verificando se o boto de reset do
; cntador foi pressionado.
; se o boto estiver pressionado, reseta
; os displays
; verificando o status da chave de
; parada do contador. Se estiver
; desligada, o contador ir parar. Se
; estiver ligada, a contagem continua
; pra o contador
; verificando o sentido da contagem. Se
; a chave de sentido estiver ligada, a
; contagem crescente. Caso
; contrrio, a contagem decrescente
; contagem decrescente
; contagem crescente
; incrementa o valor atual do display1
; move o valor 10 para o registrador
; Work (W)
; subtrai o valor atual do display1 do
; valor de W (no caso, 10)
; verifica se a operao anterior
; resultou em zero. Caso sim, o
; display1 deve ser atualizado, voltando
; para o valor 0, e o display2 deve ser
; incrementado. Caso contrrio, a
; contagem continua normalmente

43

GOTO
CLRF
INCF
MOVLW

Desviar_C
CONTADOR_D1
CONTADOR_D2, F
.10

SUBWF

CONTADOR_D2, W

BTFSC

STATUS, Z

CLRF

CONTADOR_D2

Desviar_C:
CALL
GOTO
Decrescente:
DECF
MOVLW

Mostrar_Valor
Loop
CONTADOR_D1, F
0xFF

SUBWF
BTFSS

CONTADOR_D1, W
STATUS, Z

GOTO
MOVLW

Desviar_D
.9

MOVWF
DECF
MOVLW

CONTADOR_D1
CONTADOR_D2, F
0xFF

SUBWF
BTFSS

CONTADOR_D2, W
STATUS, Z

GOTO
MOVLW

Desviar_D
.9

MOVWF

CONTADOR_D2

Desviar_D:
CALL
GOTO

Ricardo Pannain

Mostrar_Valor
Loop

; continua a contagem
; o display1 volta para o valor 0
; o display2 incrementado
; move o valor 10 para o registrador
; Work (W)
; subtrai o valor atual do display2 do
; valor de W (no caso, 10)
; verifica se a operao anterior
; resultou em zero. Caso sim, o
; display2 tambm deve ser atualizado,
; voltando para o valor 0
; o display2 volta para o valor 0
; exibe o valor atual dos contadores de
; cada display
; volta para o loop principal
; decrementa o valor atual do display1
; move o valor 0xFF (255 em decimal)
; para o registrador Work (W)
; subtrai o valor atual do display1 de W
; verifica se a operao anterior
; resultou em zero. Caso sim, o
; display1 deve ser atualizado, voltando
; para o valor 9, e o display2 deve ser
; decrementado. Caso contrrio, a
; contagem continua normalmente
; continua a contagem
; move o valor 9 para o registrador
; Work (W)
; atualiza o contador do display1
; decrementa o display2
; move o valor 0xFF (255 em decimal)
; para o registrador Work (W)
; subtrai o valor atual do display2 de W
; verifica se a operao anterior
; resultou em zero. Caso sim, o
; display2 tambm deve ser atualizado,
; voltando para o valor 9
; continua a contagem
; move o valor 9 para o registrador
; Work (W)
; o display2 volta para o valor 9
; exibe o valor atual dos contadores de
; cada display
; volta para o loop principal

44

END

Ricardo Pannain

; fim do programa

45

Você também pode gostar