Professor Sérgio Minas Melconian.
MICROCONTROLADOR PIC16F877A
FUNDAMENTOS E PROGRAMAÇÃO BÁSICA
1
Professor Sérgio Minas Melconian.
Introdução PIC – PROGRAMMABLE INTERRUPT CONTROLLER (CONTROLADOR DE INTERRUPÇÃO PROGRAMÁVEL) é um componente eletrônico programável produzido pela Microchip Technology Inc, utilizado no controle de processos e atividades lógicas. Os microcontroladores são compostos de uma única pastilha de silício encapsulada, popularmente chamada de CI (Circuito Integrado) e todos os elementos necessários para o controle das atividades estão internamente ligados a pastilha de silício. Aliás, essa é a característica principal que diferencia os microcontroladores dos microprocessadores. O PIC16F877A está enquadrado na família 8 bits de microcontroladores Microchip, possui via de programação com 14 bits e um conjunto de 35 instruções.
2
Professor Sérgio Minas Melconian.
Introdução PIC – PROGRAMMABLE INTERRUPT CONTROLLER (CONTROLADOR DE INTERRUPÇÃO PROGRAMÁVEL) é um componente eletrônico programável produzido pela Microchip Technology Inc, utilizado no controle de processos e atividades lógicas. Os microcontroladores são compostos de uma única pastilha de silício encapsulada, popularmente chamada de CI (Circuito Integrado) e todos os elementos necessários para o controle das atividades estão internamente ligados a pastilha de silício. Aliás, essa é a característica principal que diferencia os microcontroladores dos microprocessadores. O PIC16F877A está enquadrado na família 8 bits de microcontroladores Microchip, possui via de programação com 14 bits e um conjunto de 35 instruções.
2
Professor Sérgio Minas Melconian.
Arquiteturas dos Microcontroladores Os microcontroladores apresentam uma estrutura interna de máquina na qual irá determinar a maneira como os dados e o programa serão processados. As arquiteturas mais utilizadas para sistemas computacionais digitais são:
Arquitetura Von Neumann: A Unidade Central de Processamento (CPU) está conectada a memória de dados e programa por um único barramento ( bus) de 8 bits. Arquitetura Harvard: A Unidade Central de Processamento (CPU) está conectada a memória de dados e memória de programa por barramento ( bus) distintos. Sendo o barramento de dados composto por 8 bits e o barramento de programa formado por 14 bits (caso da família 16F).
Arquitetura Arquitetura Harvard x Von Neumann Os microcontroladores PIC utilizam como estrutura interna de máquina a arquitetura Harvard, a qual possibilita uma velocidade de processamento mais rápida, pois em quanto uma instrução está sendo executada, outra já está sendo buscada na memória. Além do mais, o fato do barramento de instruções ser maior do que 8 bits, o OPCODE (referência à instrução que um determinado processador possui para conseguir realizar determinadas tarefas) inclui o dado e o local onde ele vai operar, o que indica que apenas uma posição de memória será utilizada por instrução, levando a uma economia de memória de programa.
Filosofias RISC E CISC O fato do PIC trabalhar com a arquitetura Harvard, possibilita utilizar uma tecnologia chamada RISC ( Reduced Instruction Set Computer) – Computador com Set de Instruções Reduzido. Ou seja, pode-se trabalhar com uma lista de códigos de instruções de programação de cerca de 35 instruções (esse número varia um pouco de modelo para modelo). Já se fossemos utilizar a tecnologia CISC ( Complex Instruction Set Computer) – Computador com Set de Instruções Complexo, seriam necessários se conhecer cerca de 100 instruções de programação. Tornando o aprendizado mais árduo, porém algumas funções na tecnologia CISC se tornam mais fáceis, pois já existem, logo para o programador que utiliza o set reduzido, há uma maior cobrança das suas habilidade.
3
Professor Sérgio Minas Melconian.
O PIC16F877A •
Microcontrolador de 40 pinos;
•
Memória de programa 14 bits com 8k words, capacidade de escrita e leitura pelo próprio código interno;
•
Arquitetura Harvard e tecnologia RISC com 35 instruções;
•
33 portas configuráveis como entrada e saída;
•
15 interrupções disponíveis;
•
Memória de programação E 2PROM FLASH permite a gravação do programa diversas vezes por meio de pulsos elétricos no mesmo CI, não é necessário apagá-lo por meio de luz ultravioleta;
•
Memória E2PROM (não-volátil) interna com 256 Bytes;
•
Memória RAM com 368 Bytes;
•
3 TIMERs (dois de 8 bits e um de 16 bits);
•
Comunicação serial padrão RS232: SPI, I 2C e USART;
•
Conversores A/D 10 bits (8x) e Comparadores analógicos (2x);
•
Dois módulos CCP: Capture, Compare e PWM;
•
Programação in-circuit (alta e baixa tensão);
•
Power-on Reset (POR) interno – Ao ligar o microcontrolador, ele garante funcionamento correto do PIC;
•
Brown-out Reset (BOR) interno – Ele “Reseta” o PIC sempre que a tensão de alimentação for menor que
4V;
4
Professor Sérgio Minas Melconian.
Pinagem – Encapsulamento PDIP - 40 Pinos
5
Professor Sérgio Minas Melconian.
Nomenclatura dos pinos Nome do Pino
Nº
Tipo
Descrição
13 14 1
Caracte rística I O I/P
OSC1 / CLKIN OSC2 / CLKOUT MCLR / VPP
ST/CMOS4
VSS VDD RA0 / AN0 RA1 / AN1 RA2 / AN2 / VREF- / CVREF RA3 / AN3 / VREF+
12/31 11/32 2 3 4
P P I/O I/O I/O
TTL TTL TTL
5
I/O
TTL
RA4 / T0CKI / C1OUT
6
I/O
ST
RA5 / SS / AN4 / C2OUT
7
I/O
TTL
RB0 / INT RB1 RB2 RB3 / PGM RB4 RB5 RB6 / PGC
33 34 35 36 37 38 39
I/O I/O I/O I/O I/O I/O I/O
TTL/ST1 TTL TTL TTL TTL TTL TTL/ST2
RB7 / PGD
40
I/O
TTL/ST2
ENTRADA PARA OSCILADORES EXTERNOS. SAÍDA P/ CRISTAL. MASTER CLEAR (RESET) EXTERNO. SÓ FUNCIONA COM O PINO EM NÍVEL LÓGICO “1”. ENTRADA PARA TENSÃO DE PROGRAMAÇÃO EM 13V. GND (TERRA). ALIMENTAÇÃO POSITIVA. I/O DIGITAL OU ANALÓGICO. I/O DIGITAL OU ANALÓGICO. I/O DIGITAL OU ANALÓGICO OU TENSÃO NEGATIVA DE REFERÊNCIA ANALÓGICA. I/O DIGITAL OU ANALÓGICO OU TENSÃO POSITIVA DE REFERÊNCIA ANALÓGICA. I/O DIGITAL (OPEN DRAYN , NÃO CONSEGUE GERAR NÍVEL LÓGICO ALTO) OU ENTRADA EXTERNA DO CONTADOR TMR0 OU SAÍDA DO COMPARADOR 1. I/O DIGITAL OU ENTRADA ANALÓGICA OU HABILITAÇÃO EXTERNA PARA COMUNICAÇÃO SPI OU SAÍDA DO COMPARADOR 2. I/O DIGITAL COM INTERRUPÇÃO EXTERNA. I/O DIGITAL. I/O DIGITAL. I/O DIGITAL OU ENTRADA PARA PROGRAMAÇÃO EM 5V. I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO. I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO. I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO OU CLOCK DA PROGRAMAÇÃO SERIAL OU PINO DE IN-CIRCUIT DEBUGGER. I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO OU DATA DA PROGRAMAÇÃO SERIAL OU PINO DE IN-CIRCUIT
ST
DEBUGGER
RC0 / T1OSO / T1CKI
15
I/O
ST
RC1 / T1OSI / CCP2
16
I/O
ST
RC2 / CCP1
17
I/O
ST
RC3 / SCK / SCL
18
I/O
ST
RC4 / SDI / SDA
23
I/O
ST
RC5 / SDO RC6 / TX / CK
24 25
I/O I/O
ST ST
RC7 / RX / DT
26
I/O
ST
RD0 / PSP0 RD1 / PSP1 RD2 / PSP2 RD3 / PSP3
19 20 21 22
I/O I/O I/O I/O
TTL/ST3 TTL/ST3 TTL/ST3 TTL/ST3
I/O DIGITAL OU SAÍDA DO OSCILADOR EXTERNO PARA TMR1 OU ENTRADA DE INCREMENTO PARA TMR1. I/O DIGITAL OU ENTRADA DO OSCILADOR EXTERNO PARA TMR1 OU ENTRADA DO CAPTURE2 OU SAÍDAS PARA COMPARE2/PWM2. I/O DIGITAL OU ENTRADA DO CAPTURE1 OU SAÍDAS PARA COMPARE1/PWM1. I/O DIGITAL OU ENTRADA/SAÍDA DE CLOCK PARA COMUNICAÇÃO SERIAL SPI / I2C. I/O DIGITAL OU ENTRADA DE DADOS PARA SPI OU VIA DE DADOS (I/O) PARA I2C. I/O DIGITAL OU SAÍDA DE DADOS PARA SPI. I/O DIGITAL OU TX (TRANSMISSÃO) PARA COMUNICAÇÃO USART ASSÍNCRONA OU CLOCK PARA COMUNICAÇÃO SÍNCRONA. I/O DIGITAL OU RX (RECEPÇÃO) PARA COMUNICAÇÃO USART ASSÍNCRONA OU DATA PARA COMUNICAÇÃO SÍNCRONA. I/O DIGITAL OU DADO 0 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 1 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 2 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 3 (COMUNICAÇÃO PARALELA).
6
Professor Sérgio Minas Melconian. RD4 / PSP4 RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 RE0 / RD / AN5
27 28 29 30 8
I/O I/O I/O I/O I/O
TTL/ST3 TTL/ST3 TTL/ST3 TTL/ST3 TTL/ST3
RE1 / WR / AN6
9
I/O
TTL/ST3
RE2 / CS / AN7
10
I/O
TTL/ST3
I/O DIGITAL OU DADO 4 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 5 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 6 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU DADO 7 (COMUNICAÇÃO PARALELA). I/O DIGITAL OU CONTROLE DE LEITURA DA PORTA PARALELA OU ENTRADA ANALÓGICA. I/O DIGITAL OU CONTROLE DE ESCRITA DA PORTA PARALELA OU ENTRADA ANALÓGICA. I/O DIGITAL OU CONTROLE DE ESCRITA DA PORTA PARALELA OU ENTRADA ANALÓGICA.
Legenda: I => Input (Entrada); O => Output (Saída); I/O => Input/Output (Entrada ou Saída); P => Power (Alimentação); => Não utilizado; TTL => Pino tipo TTL; ST => Pino tipo Schmitt Trigger;
Notas: 1
Entrada tipo ST, quando configurado como interrupção externa. Entrada tipo ST, durante o modo do programação serial. 3 Entrada tipo ST, quando configurado como I/O de uso geral e TTL quando usado em modo de porta paralela. 4 Entrada tipo ST, quando em modo RC e CMOS no geral. 2
Observação quanto TTL e Schmitt Trigger (ST) As portas do PIC podem ser do tipo TTL ou ST, isso é um dado muito importante no momento de se utilizá-las, pois há interferência direta nos níveis de tensão (0 ou 1) interpretados pelo microcontrolador.
(1), (2) Região incerta, mantém nível anterior (0 ou 1).
7
Professor Sérgio Minas Melconian.
Estrutura Interna do PIC16F877A O diagrama de blocos (original Microchip) indicado a baixo mostra as diversas partes que compõem o microcontrolador.
8
Professor Sérgio Minas Melconian.
Ciclo de Máquina Todo microcontrolador possui um sinal de clock para poder trabalhar. No caso dos microcontroladores PIC o sinal de clock é internamente dividido por 4. Assim sendo se utilizarmos um oscilador externo que gere um clock de 4MHz, tem-se um clock interno de 1MHz e um ciclo de máquina de 1 µs. CKint = CKext / 4 TCM = 1 / Ckint
onde: CKint = Clock interno; CKext = Clock externo; onde: CM = Tempo de Ciclo de Máquina;
De maneira simplificada pode-se utilizar como cálculo de ciclo de máquina a seguinte equação: TCM = 4 / Freq. Osc.
onde: TCM = Tempo de Ciclo de Máquina; Freq. Osc. = Freqüência do Oscilador;
Observação: No caso do microcontrolador PIC16F877A, a Microchip garante perfeito funcionamento do ciclo de máquina com um oscilador de até 20MHz. Ao observar as equações anteriores é possível perceber que os TCM estão relacionados a uma constante de valor 4, mas qual o motivo desse número? Fácil o entendimento. Para executar uma única instrução pelo processador, algumas operações são realizadas. O fato do processamento não ser paralelo, exige operações de processamentos executados em sub-ciclos de máquina, originados pela divisão do clock externo. Estes sub-ciclos são conhecidos por Q1, Q2, Q3 e Q4. O program counter (contador de programa) é incrementado no instante Q1 automaticamente. Dentro dos quatro tempos (Q1 a Q4), a instrução carregada para ULA é executada, sendo trocadas informações com a memória de dados e o registrador W (Work) sempre que necessário. Por fim, no instante Q4, a próxima instrução é buscada da memória de programa e colocada na ULA. Esse processo é conhecido como PIPELINE, ele permite que todas as instruções sejam executadas em um ciclo de máquina. Observação: As exceções são os jumps (saltos) realizados no program counter , como chamadas de rotinas e retornos que gastam 2 ciclos de máquina.
Exemplo PIPELINE Vamos imaginar uma lavanderia, na qual possui quatro atividades a serem realizadas. Seqüência de trabalho: • • • •
Colocar a roupa na máquina de lavar; Depois de lavada colocar na secadora; Depois de seca passar o ferro; Por fim guardá-la no armário.
9
Professor Sérgio Minas Melconian. Ciclo sem PIPELINE
Ciclo com PIPELINE
Supondo que cada etapa gaste 30 minutos para ser realizada, utilizando o ciclo sem PIPELINE, um cesto de roupas levará 2h para ficar pronto. Já utilizando o ciclo com PIPELINE, o mesmo cesto ficará pronto em apenas 30 minutos. Ao final de duas horas teremos lavado 4 cestos de roupas.
10
Professor Sérgio Minas Melconian. Seqüência no PIC
Memórias Memória de Programa: É a memória onde ficará armazenada as instruções do programa no qual fará o controle das atividades. No caso do PIC16F877A esta é uma memória do tipo FLASH de 8192 palavras (8K) e 14 bits.
11
Professor Sérgio Minas Melconian. Demais características da memória de programa Vetor de Reset: É a posição 0x0000h de endereço da memória de programa, é para onde o programa vai quando é reiniciado (reset). Vetor de interrupção: É a posição 0x0004h de endereço da memória de programa, é a posição de memória para onde serão desviados todos os processamentos de interrupção. Este PIC possui 15 tipos de interrupções diferentes. Pilha (STACK): É uma região, fisicamente separada da memória de programa, onde serão guardados os endereços de retorno quando utilizados desvios para chamada de rotinas. Quando o programa é desviado por meio do comando CALL, o endereço seguinte ao ponto que estava sendo executado é guardado na pilha, ao fim da rotina, o programa retorna ao ponto que estava. O PIC16F877A possui uma pilha com 8 níveis, possibilitando guardar até 8 endereços de retorno (8 desvios consecutivos). Caso o programador tente ocupar mais de 8 níveis da pilha, a informação mais antiga será perdida. A pilha desse PIC armazena endereços de 13bits, sendo suficiente para gerenciar 8k de memória de programa. Memória de Dados: A memória de dados é volátil do tipo RAM (Random Access Memory). Serve para guardar as variáveis e os registradores utilizados pelo programa. Ela armazena dados de 8 bits e está dividida em dois grupos: Registradores Especiais e Registradores de uso geral.
12
Professor Sérgio Minas Melconian. Demais características da memória de dados Registradores Especiais: Região da memória de dados onde se encontram todos os registradores especiais e que são utilizados pelo PIC para a execução do programa e processamento da ULA. Registradores de uso geral: Região da memória de dados onde é possível armazenar até 368 Bytes de variáveis definidas pelo programador, para serem escritas ou lidas pelo programa. Observação: A memória de dados está divida em 4 bancos de memória (Banco 0, Banco 1, Banco 2 e Banco 3), isso ocorre devido a existência de apenas 7 bits para endereçamento de todos os registradores, com isso só se pode gerenciar 128 endereços diferentes. Por isso que o fabricante dividiu a memória em quatro grupos de 128 Bytes cada. Acesso aos bancos de memória Para acessar os bancos de memória é preciso gerenciar os registradores STATUS
. BANCO RP1 RP0 0 0 0 1 0 1 2 1 0 3 1 1
Observação: Sempre que o PIC for ligado, o Banco 0 será o primeiro a ser selecionado.
Interrupções As interrupções são ferramentas que possibilitam a execução de determinadas situações no momento em que elas ocorrem. Normalmente elas são geradas devido ações externas. O PIC 16F877A é composto por 15 interrupções diferentes, as quais sempre serão desviadas para o vetor de interrupção (0004h) da memória de programa.
13
Professor Sérgio Minas Melconian. As 15 interrupções que compõem o PIC 16F877A são: • • • • • • • • • • • • • •
Interrupção de Timer 0; Interrupção Externa; Interrupção por mudança de Estado; Interrupção da Porta Paralela (PSP); Interrupção dos Conversores A/D; Interrupção de Recepção da USART; Interrupção de Transmissão da USART; Interrupção da Comunicação Serial (SPI e I 2C); Interrupção do CCP1 (Capture/Compare/PWM); Interrupção do Timer 1; Interrupção de Timer 2; Interrupção de fim de escrita na E 2PROM/FLASH; Interrupção de Colisão de Dados (BUS Collision); Interrupção dos Comparadores;
Características Elétricas Temperatura de Trabalho Temperatura de Armazenamento Tensão de Trabalho Tensão Máxima no Pino V DD (em relação a Vss) Tensão Máxima no MCRL (em relação a Vss) Tensão Máxima no Pino RA4 (em relação a Vss) Tensão Máxima nos Demais Pinos (em relação a Vss) Dissipação Máxima de Energia Corrente Máxima de Saída no Pino Vss Corrente Máxima de Entrada no Pino V DD Corrente Máxima de Saída de um Pino (em V DD) Corrente Máxima de Entrada de um Pino (em Vss) Corrente Máxima de Entrada do PORTA, PORTB e PORTE Corrente Máxima de Saída do PORTA, PORTB e PORTE Corrente Máxima de Entrada do PORTC e PORTD Corrente Máxima de Saída do PORTC e PORTD
-55ºC até +125ºC -65ºC até +150ºC 4V a 5,5V -0,3V a 7,5V 0 a 14V 0 a 8,5V -0,3V a (V DD + 0,3V) 1W 300mA 250mA 25mA 25mA 200mA 200mA 200mA 200mA
14
Professor Sérgio Minas Melconian.
Set de Instruções O Set de instruções é dividido em quatro grupos, os quais compõem um conjunto com 35 instruções: •
Operações com registradores;
•
Operações com literais;
•
Operações com bits;
•
Controles;
Operações com Registradores Instrução Argumentos
Descrição
ADDWF
f,d
Soma W e f guardando o resultado em d.
ANDWF
f,d
Lógica "E" entre W e f, guarda o resultado em d.
CLRF
f
COMF
f,d
Calcula o complemento de f guardando o resultado em d
DECF
f,d
Decrementa f, guardando o resultado em d.
Limpa f.
Decrementa f, guardando o resultado em d e pula a próxima linha DECFSZ
f,d
se o resultado for zero.
INCF
f,d
Incrementa f, guardando o resultado em d. Incrementa f, guardando o resultado em d e pula a próxima linha se
INCFSZ
f,d
o resultado for zero.
IORWF
f,d
Lógica "ou" entre W e f, guardando o resultado em d.
MOVF
f,d
Move f para d (copia f em d).
MOVWF
f
RLF
f,d
Rotaciona f um bit para esquerda.
RRF
f,d
Rotaciona f um bit para direita.
SUBWF
f,d
Subtrai W de f (f - W) guardando o resultado em d.
Move W para f (copia W em f).
Executa uma inversão entre as partes alta e baixa de f, guardando SWAPF
f,d
em d.
XORWF
f,d
Lógica "ou exclusivo" entre k e W guardando o resultado em d.
15
Professor Sérgio Minas Melconian. Operações com Literais Instrução Argumentos
Descrição
ADDLW
K
Soma k com W, guardando o resultado em W.
ANDLW
K
Lógica "E" entre k e W, guardando o resultado em W.
IORLW
K
Lógica "OU" entre k e W, guardando o resultado em W.
MOVLW
K
Move k para W.
SUBLW
K
Subtrai W de k (k - W), guardando o resultado em W.
XORLW
K
Lógica "OU EXCLUSIVO” entre k e W, guardando o resultado em W.
Operações com bit Instrução Argumentos
Descrição
BCF
f,b
Impõe 0(zero) ao bit do registrador f.
BSF
f,b
Impõe 1 (um) ao bit do registrador f.
BTFSC
f,b
Testa o bit b do registrador f e pula a próxima linha se for 0 (zero).
BTFSS
f,b
Testa o bit b do registrador f e pula a próxima linha se for 1 (um).
Controles Instrução Argumentos
Descrição
CLRW
-
Limpa w.
NOP
-
Gasta um ciclo de máquina sem fazer nada.
CALL
R
Executa a rotina R.
CLRWDT
-
Limpa o registrador WDT para não acontecer reset.
GOTO
R
Desvia para o ponto R mudando o PC.
RETFIE
-
Retorna de uma interrupção.
RETLW
K
Retorna de uma rotina com k em W.
RETURN
-
Retorna de uma rotina sem afetar W.
SLEEP
Coloca o PIC em modo sleep (dormindo) para economia de energia.
16
Professor Sérgio Minas Melconian.
Fluxogramas Os fluxogramas são ferramentas que ajudam o programador a estruturar de maneira gráfica uma seqüência lógica de atividades que posteriormente serão executadas por um determinado programa. Elementos utilizados na construção dos fluxogramas:
Inicio ou Término – Símbolo utilizado para representar inicio ou término de programa; Processo – Símbolo utilizado para descrever uma determinada tarefa;
Dados – Símbolo utilizado para descrição de entrada de dados;
Tomada de decisão – Símbolo utilizado para testes condicionais. E tomada de decisão pode seguir um fluxo verdadeiro ou falso. Exemplo: Serão somados dois números inteiros A+B, se o resultado for par guarda em P, já se o resultado for impar guarda em I e finaliza o programa. Inicio Pega número A.
Pega número B. Soma A+B Não
Guarda A+B em I
A+B é Par?
Sim
Guarda A+B em P
FIM
17
Professor Sérgio Minas Melconian.
Primeiro Exemplo – Botão e LED Será dado inicio a programação dos microcontroladores PIC com um programa tradicional e simples de se entender.
Funcionamento: Ao apertar um botão, um LED se manterá ligado até o botão ser solto. Fluxograma
INICIO CONFIGURAÇÕES INICIAIS 1 ACENDE O LED
SIM
BOTÃO PRESSIONADO?
NÃO
APAGA O LED
1
O Programa ;************************************************************************************* ;* PROGRAMA LIGA LED POR MEIO DE UM BOTÃO * ;************************************************************************************* ;***************************CONFIGURAÇÃO PARA GRAVAÇÃO************************* #INCLUDE
;MODELO DO MICROCONTROLADOR UTILIZADO.
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ; CP - CODE PROTECTION (HABILITA OU DESABILITA LEITURA DA MEMÓRIA DE PROGRAMA). ; DEBUG - DEPURADOR DA PLACA ICD 2 (HABILITA OU DESABILITA DEPURADOR DA PLACA ICD 2). ; PWRTE - POWER UP TIMER (HABILITA OU DESABILITA TEMPORIZADOR QUE AGUARDA 72 ms PARA ;ESTABILIZAR O PIC). ; WDT - WATCHDOG TIMER ("CÃO DE GUARDA" TEMPORIZADOR QUE RESETA O PIC QUANDO SISTEMA ;TRAVADO). ; BOREN - BROWN OUT DETECT (SE A ALIMENTAÇÃO VDD FOR MENOR QUE 4V DURANTE 100 MICRO-SEG. ;O PIC RESETA). ; LVP - LOW VOLTAGE PROGRAM (SISTEMA DE PROGRAMAÇÃO EM BAIXA TENSÃO). ; XT - OSCILADOR DO TIPO CRISTAL.
18
Professor Sérgio Minas Melconian. ;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM************************ #DEFINE BANK0 #DEFINE BANK1
BCF BSF
STATUS, RP0 STATUS, RP0
;SETA BANK 0 DE MEMÓRIA. ;SETA BANK 1 DE MEMÓRIA.
;O PIC 16F877A POSSUI QUATRO BANCOS DE MEMÓRIAS PARA OS REGISTRADORES ESPECIAIS (SFR). POR ;ISSO, QUANDO QUEREMOS ACESSAR ALGUM REGISTRADOR SFR, DEVEMOS PRIMEIRO INFORMAR AO ;SISTEMA QUAL BANK QUEREMOS TRABALHAR. ;PARA ISSO DEVEMOS ALTERAR OS BITS RP0 E RP1 NO REGISTRADOR STATUS. ;TABELA: ; BANCO RP1 RP0 ; 0 0 0 ; 1 0 1 ; 2 1 0 ; 3 1 1 ;OBS: SEMPRE QUE O PIC INICIA, RP1 E RP0 SÃO INICIADOS COM ZERO.LOGO O BANK 0 É SEMPRE O ;PRIMEIRO SELECIONADO. ;***************************************VARIÁVEIS************************************* CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI ;ESCOLHIDO, POIS ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. ENDC
;FIM DO BLOCO DE MEMÓRIA.
;*****************************************FLAGS*************************************** ; SINALIZA QUEM GEROU A INTERRUPÇÃO. "NÃO SERÁ UTILIZADO NESTE PROGRAMA". ;***************************************CONSTANTES************************************ ; FILTRO PARA EVITAR RUIDOS DOS BOTÕES. "NÃO SERÁ UTILIZADO NESTE PROGRAMA". ;****************************************ENTRADAS************************************* #DEFINE BOTAO_0 PORTB,0
;BOTÃO QUE LIGA O SISTEMA - (PINO 33 - RB0)
;*****************************************SAÍDAS************************************** #DEFINE LED_1 PORTB,1
;LED 1 - (PINO 34 - RB1) ;0 -> APAGADO ;1 -> ACESO
;*************************************VETOR DE RESET********************************** ORG 0X0000 GOTO INICIO
;ENDEREÇO DO VETOR DE RESET ;PULA PARA O INICIO
;***********************************INICIO DA INTERRUPÇÃO***************************** ORG 0X0004 RETFIE
;ENDEREÇO DO VETOR DE INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO
19
Professor Sérgio Minas Melconian. ;*************************************INICIO DO PROGRAMA****************************** INICIO CLRF PORTB
;LIMPA PORTB
BANK1
;TRABALHAR COM BANK1
MOVLW B'00000001' MOVWF TRISB ;ENTRADA, 0 -> SAÍDA).
;DEFINE RB0 COMO ENTRADA E DEMAIS PORTS B COMO SAÍDA (1 ->
BANK0
;TRABALHAR COM BANK0
;*************************************ROTINA PRINCIPAL******************************** MAIN BTFSC BOTAO_0 GOTO BOTAO_LIBERADO GOTO BOTAO_PRESSIONADO
;O BOTÃO_0 ESTÁ PRESSIONADO? ;VAI PARA BOTÃO_LIBERADO. ;VAI PARA BOTÃO_PRESSIONADO.
BOTAO_LIBERADO BCF LED_1 GOTO MAIN
;APAGA LED_1 ;RETORNA AO LOOP PRINCIPAL (MAIN)
BOTAO_PRESSIONADO BSF LED_1 GOTO MAIN
;ACENDE LED_1 ;RETORNA AO LOOP PRINCIPAL (MAIN)
;**************************************FIM DO PROGRAMA******************************** END ;FIM DO PROGRAMA (OBRIGATÓRIO)
Exercícios Propostos Utilizando como parâmetro o primeiro exemplo, faça as seguintes alterações: A) Inverta a lógica do LED, ao pressionar o botão o LED apagará e ao liberá-lo o LED acenderá. B) Ao apertar o botão faça dois LEDs acenderem. C) Utilize dois botões e quatro LEDs. Quando um botão for pressionado dois LEDs acesos se apagarão, já o outro botão ao ser pressionado acenderá dois LEDs que estavam apagados.
20
Professor Sérgio Minas Melconian.
Segundo Exemplo – Contador de Tempo (DELAY) Neste segundo exemplo será estudada uma rotina para contar tempo.
Funcionamento: Ao apertar um botão, um LED se manterá ligado por 1s e desligará logo em seguida. Fluxograma
INICIO CONFIGURAÇÕES INICIAIS 1 SIM
BOTÃO
NÃO
PRESSIONADO?
APAGA O LED
1
ACENDE O LED
CONTADOR DE TEMPO = 0s?
NÃO
DECREMENTA CONTADOR DE TEMPO.
SIM APAGA O LED
1
21
Professor Sérgio Minas Melconian. O Programa ;**************************************************************************************************** ;* PROGRAMA CONTADOR DE TEMPO (DELAY) * ;**************************************************************************************************** ;******************************** ARQUIVOS DE DEFINIÇÃO DO PIC ********************************** #INCLUDE ;MODELO DO MICROCONTROLADOR UTILIZADO - PIC 16F877A __CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;******************************** PAGINAÇÃO DE MEMÓRIA DO PIC ********************************** #DEFINE BANK0 BCF STATUS,RP0 #DEFINE BANK1 BSF STATUS,RP0
;HABILITA BANCO 0 DE MEMÓRIA ;HABILITA BANCO 1 DE MAMÓRIA
;********************************** DEFINIÇÃO DAS VÁRIAVEIS ************************************** CBLOCK 0X70
;INICIO DA MEMÓRIA DE ÚSUARIO
TEMPO1 TEMPO2 TEMPO3
;CONTADOR DE TEMPO1 (VALOR 250) ;CONTADOR DE TEMPO2 (VALOR 250) ;CONTADOR DE TEMPO3 (VALOR 4)
ENDC
;FIM DO BLOCO DE MEMÓRIA
;**************************************** ENTRADAS ************************************************ #DEFINE BOTAO_0
PORTB,0
;BOTÃO QUE LIGA O SISTEMA - (PINO 33 - RB0)
;***************************************** SAÍDAS *************************************************** #DEFINE
LED_1
PORTB,1
;PORTA DO LED1 (PINO 34 - RB1) ;0 -> APAGADO ;1 -> ACESO
;************************************* VETOR DE RESET ********************************************* ORG 0X0000 GOTO INICIO
;ENDEREÇO INICIAL PARA PROCESSAMENTO ;VAI PARA INICIO DO PROGRAMA
;********************************* INICIO DA INTERRUPÇÃO ***************************************** ORG 0X0004 RETFIE
;ENDEREÇO INICIAL DA INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO
;********************************** INICIO DO PROGRAMA ******************************************* INICIO CLRF PORTB
;LIMPA TODO PORTB
22
Professor Sérgio Minas Melconian. BANK1
;HABILITA BANCO 1 DE MEMÓRIA DO PIC
MOVLW B'00000001' MOVWF TRISB ;CONFIGURA PORTB,0 COMO ENTRADA E DEMAIS PINOS COMO SAÍDA. BANK0
;RETORNA PARA O BANCO 0 DE MEMÓRIA DO PIC
;*********************************** ROTINA PRINCIPAL ********************************************** MAIN BTFSC BOTAO_0 GOTO BOTAO_LIBERADO GOTO BOTAO_PRESSIONADO
;O BOTÃO_0 ESTÁ PRESSIONADO? ;VAI PARA BOTÃO_LIBERADO. ;VAI PARA BOTÃO_PRESSIONADO.
BOTAO_LIBERADO BCF LED_1 ;APAGA LED_1 GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) BOTAO_PRESSIONADO BSF LED_1 ;ACENDE LED_1 CALL DELAY ;CHAMA ROTINA DE DELAY BCF LED_1 ;DESLIGA LED_1 GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) ;*********************************** ROTINA DE DELAY ********************************************* DELAY
;ROTINA DE DELAY
MOVLW .4 MOVWF TEMPO3 ;TEMPORIZA 1s DL3 MOVLW .250 MOVWF TEMPO2 ;TEMPORIZA 1/4s = 0.25s DL2 MOVLW .250 MOVWF TEMPO1 ;TEMPORIZA 1ms DL1 NOP ;GASTA UM CICLO DE MÁQUINA. DECFSZ TEMPO1 ;DECREMENTA TEMPO1 GOTO DL1 DECFSZ TEMPO2 ;DECREMENTA TEMPO2 GOTO DL2 DECFSZ TEMPO3 ;DECREMENTA TEMPO3 GOTO DL3
23
Professor Sérgio Minas Melconian. RETURN
;RETORNA DA ROTINA DE DELAY
;*********************************** FIM DO PROGRAMA ********************************************* END
;FIM DO PROGRAMA
Exercícios Propostos Utilizando como parâmetro o segundo exemplo, faça as seguintes alterações: A) Ao apertar um botão, um LED ficará ligado por 5s e desligado logo em seguida. B) Ao apertar um botão, ligue o LED_1, após 2s ligue o LED_2 e os desligue após 2s. C) Ao ligar o microcontrolador, o LED_1 deve se manter aceso constantemente, passados 4s o LED_2 deverá piscar 5 vezes com um DELAY de 1s apagado e 3s ligado.
24
Professor Sérgio Minas Melconian.
Terceiro Exemplo – Gerando Som (BUZZER) Neste terceiro exemplo será estudada uma rotina para se gerar som com um cristal piezelétrico (Buzzer).
Funcionamento: Para um buzzer soar, é necessário alimentá-lo com uma fonte de sinal. Neste caso, o PIC ira gerar ondas quadradas com freqüência tal para o funcionamento do mesmo. Fluxograma
INICIO CONFIGURAÇÕES INICIAIS
GERAR ONDA QUADRADA COM FREQUÊNCIA f.
O Programa ;**************************************************************************************************** ;* PROGRAMA BUZZER * ;**************************************************************************************************** ;********************************* ARQUIVOS DE DEFINIÇÃO DO PIC ********************************** #INCLUDE ;MODELO DO MICROCONTROLADOR UTILIZADO - PIC 16F877A __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;********************************* PAGINAÇÃO DE MEMÓRIA DO PIC ********************************** #DEFINE BANK0 BCF STATUS,RP0 #DEFINE BANK1 BSF STATUS,RP0
;HABILITA BANCO 0 DE MEMÓRIA ;HABILITA BANCO 1 DE MAMÓRIA
;*********************************** DEFINIÇÃO DAS VÁRIAVEIS ************************************* CBLOCK 0X70 ;INICIO DA MEMÓRIA DE ÚSUARIO TEMPO1
;VARIAVEL TEMPO1
25
Professor Sérgio Minas Melconian. ENDC ;FIM DO BLOCO DE MEMÓRIA ;******************************************* SAÍDAS ************************************************ #DEFINE BUZZER PORTA,5
;PORTA DO BUZZER
;************************************** VETOR DE RESET ******************************************** ORG 0X0000 GOTO INICIO
;ENDEREÇO INICIAL PARA PROCESSAMENTO ;VAI PARA INICIO DO PROGRAMA
;*********************************** INICIO DA INTERRUPÇÃO **************************************** ORG 0X0004 RETFIE
;ENDEREÇO INICIAL DA INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO
;********************************** INICIO DO PROGRAMA ******************************************* INICIO CLRF PORTA
;LIMPA TODO PORTA
BANK1
;HABILITA BANCO 1 DE MEMÓRIA DO PIC
MOVLW B'00000000' MOVWF TRISA ;CONFIGURA TODO PORTA COMO SAÍDA. BANK0
;RETORNA PARA O BANCO 0 DE MEMÓRIA DO PIC
;************************************ ROTINA PRINCIPAL ******************************************** MAIN
;INICIO DA ROTINA PRINCIPAL
BSF BUZZER ;SETA O PORTA,5 (BUZZER) CALL DELAY_MS ;CHAMA ROTINA DE DELAY BCF BUZZER ;LIMPA O PORTA,5 (BUZZER) CALL DELAY_MS ;CHAMA ROTINA DE DELAY GOTO MAIN ;VAI PARA O INICIO DA ROTINA PRINCIPAL ;**************************************ROTINA DE DELAY******************************** DELAY_MS
;ROTINA DE DELAY
MOVLW .50 ;MOVER O NUMERO 50 EM DECIMAL PARA W (VALOR MAXIMO = 256) MOVWF TEMPO1 ;MOVER O NUMERO 50 PARA TEMPO1 NOP
;PERDE UM CICLO DE MÁQUINA (SÓ PARA GANHAR TEMPO)
DECFSZ TEMPO1,F ;DECREMENTA TEMPO1 E GUARDA O RESULTADO EM F, E PULA A PROXIMA LINHA SE RESULTADO FOR ZERO (FIM DO TEMPO1?)
26
Professor Sérgio Minas Melconian. GOTO $-2 RETURN
;NÃO, VOLTA DUAS INSTRUÇÕES ;SIM, PASSOU TEMPO ;RETORNA DA ROTINA DE DELAY
;************************************* FIM DO PROGRAMA ******************************************* END
;FIM DO PROGRAMA
Exercícios Propostos Utilizando como parâmetro o terceiro exemplo, faça as seguintes alterações: A) Altere as freqüências geradas, deixando o som mais grave. B) Faça o buzzer soar de maneira que fique bipando com delay de 2s. C) Insira 3 botões, cada um ao ser pressionado ira gerar uma freqüência diferente. (o som só será escutado em quanto o botão estiver pressionado).
27
Professor Sérgio Minas Melconian.
Quarto Exemplo – Rotação de Bit Neste quarto exemplo será estudada uma rotina para rotação de bit.
Funcionamento: Um bit ficará rotacionando para esquerda. LED L0 L0 L1 L1 L2 L2 L3 L3
ESTADO LIGA DESLIGA LIGA DESLIGA LIGA DESLIGA LIGA DESLIGA
Fluxograma
INICIO CONFIGURAÇÕES INICIAIS
LIMPA REGISTRADOR STATUS,C
ROTACIONAR O BIT
(3X)
LIMPA LED (PORTB)
28
Professor Sérgio Minas Melconian. O Programa ;********************************************************************************************* ;* PROGRAMA ROTAÇÃO DE BIT COM RLF * ;********************************************************************************************* ;******************************CONFIGURAÇÃO PARA GRAVAÇÃO***************************** #INCLUDE
;MODELO DO MICROCONTROLADOR UTILIZADO.
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM************************ #DEFINE BANK0 #DEFINE BANK1
BCF STATUS, RP0 BSF STATUS, RP0
;SETA BANK 0 DE MEMÓRIA. ;SETA BANK 1 DE MEMÓRIA.
;***************************************VARIÁVEIS************************************* CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI ESCOLHIDO, POIS ;ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. TEMPO1 TEMPO2 TEMPO3
;CONTADOR PARA DELAY 1ms ;CONTADOR PARA DELAY 1/4s = 0,25s ;CONTADOR PARA DELAY 1s
ENDC
;FIM DO BLOCO DE MEMÓRIA.
;*****************************************SAÍDAS************************************** #DEFINE LED PORTB
;DEFINE PORTB COMO LED. ;0 -> APAGADO ;1 -> ACESO
;*************************************VETOR DE RESET********************************** ORG 0X0000 GOTO INICIO
;ENDEREÇO DO VETOR DE RESET ;PULA PARA O INICIO
;***********************************INICIO DA INTERRUPÇÃO***************************** ORG 0X0004 RETFIE
;ENDEREÇO DO VETOR DE INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO
;*************************************INICIO DO PROGRAMA****************************** INICIO CLRF PORTB
;LIMPA PORTB
BANK1
;TRABALHAR COM BANK1
29
Professor Sérgio Minas Melconian. MOVLW B'00000000' MOVWF TRISB ;DEFINE PORTS B COMO SAÍDA (1 -> ENTRADA, 0 -> SAÍDA). BANK0
;TRABALHAR COM BANK0.
;*************************************ROTINA PRINCIPAL******************************** MAIN BCF STATUS,C ;LIMPA CARRY (REGISTRADOR RELACIONADO AS OPERAÇÕES MATEMÁTICAS) MOVLW B'00000001' ;MOVER VALOR 1 EM BINÁRIO PARA W (VALOR MENOS SIGNIFICATIVO) MOVWF LED ;MOVER VALOR DE W (W=1)PARA LED (PORTB) CALL DELAY_1S ;CHAMA ROTINA DE DELAY RLF LED CALL DELAY_1S
;ROTACIONA BIT DO LED PARA ESQUERDA ;CHAMA ROTINA DE DELAY
RLF LED CALL DELAY_1S
;ROTACIONA BIT DO LED PARA ESQUERDA ;CHAMA ROTINA DE DELAY
RLF LED CALL DELAY_1S
;ROTACIONA BIT DO LED PARA ESQUERDA ;CHAMA ROTINA DE DELAY
CLRF LED GOTO MAIN
;LIMPA LED ;RETORNA PARA MAIN
;**************************************ROTINA DE DELAY******************************** DELAY_1S
;ROTINA DE DELAY
MOVLW .4 MOVWF TEMPO3 ;TEMPORIZA 1s DL3 MOVLW .250 MOVWF TEMPO2 ;TEMPORIZA 1/4s = 0.25s DL2 MOVLW .250 MOVWF TEMPO1 ;TEMPORIZA 1ms DL1 NOP ;GASTA UM CICLO DE MÁQUINA. DECFSZ TEMPO1 ;DECREMENTA TEMPO1 GOTO DL1 DECFSZ TEMPO2 ;DECREMENTA TEMPO2 GOTO DL2
30
Professor Sérgio Minas Melconian. DECFSZ TEMPO3 ;DECREMENTA TEMPO3 GOTO DL3 RETURN
;RETORNA DA ROTINA DE DELAY
;**************************************FIM DO PROGRAMA******************************** END
;FIM DO PROGRAMA (OBRIGATÓRIO)
Exercícios Propostos Utilizando como parâmetro o quarto exemplo, faça as seguintes alterações: A) Inverta o sentido de rotação do bit para a direita. B) Ao invés de rotacionar apenas o bit como no exemplo, rotacione o bit, mantendo o anterior ligado.
LED L0 L1 L2 L3 L0 L1 L2 L3
ESTADO LIGA LIGA LIGA LIGA DESLIGA DESLIGA DESLIGA DESLIGA
C) Mantenha a seqüência pedida no item B (iniciar ligada) e insira um botão que ao ser pressionado, irá manter todos os LEDs ligados por 5s, em seguida a seqüência do item B voltará a rotacionar.
31
Professor Sérgio Minas Melconian.
Quinto Exemplo – Display 7 segmentos (Catodo Comum) Neste quinto exemplo será estudada uma rotina para aplicação do display de 7 segmentos catodo comum..
Funcionamento: Um botão ira incrementar um contador que vai de 0 à 15 e outro botão ira decrementar o mesmo. Fluxograma
32
Professor Sérgio Minas Melconian. O Programa ;************************************************************************************* ;* PROGRAMA CONTADOR - DISPLAY 7 SEGMENTOS E CONTADOR * ;************************************************************************************* ;******************************CONFIGURAÇÃO PARA GRAVAÇÃO********************** #INCLUDE
;MODELO DO MICROCONTROLADOR UTILIZADO.
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM***************** #DEFINE BANK0 BCF STATUS, RP0 #DEFINE BANK1 BSF STATUS, RP0
;SETA BANK 0 DE MEMÓRIA. ;SETA BANK 1 DE MEMÓRIA.
;***************************************VARIÁVEIS************************************ CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI ESCOLHIDO, POIS ;ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. CONTADOR FLAGS FILTRO1 FILTRO2
;ARMAZENA O VALOR DA CONTAGEM ;ARMAZENA OS FLAGS DE CONTROLE ;FILTRAGEM PARA O BOTÃO 1 ;FILTRAGEM PARA O BOTÃO 2
ENDC
;FIM DO BLOCO DE MEMÓRIA.
;*****************************************FLAGS*************************************** ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA. #DEFINE ST_BT0 FLAGS,0 #DEFINE ST_BT1 FLAGS,1
;STATUS DO BOTÃO 0 ;STATUS DO BOTÃO 1
;***************************************CONSTANTES************************************ ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .0 MAX EQU .15 T_FILTRO EQU .255
;VALOR MÍNIMO PARA O CONTADOR ;VALOR MÁXIMO PARA O CONTADOR ;FILTRO PARA BOTÃO
;****************************************ENTRADAS************************************* #DEFINE BOTAO_0 PORTB,0 #DEFINE BOTAO_1 PORTB,1
;PORTA DO BOTÃO - (PINO 35 - RB2) ;PORTA DO BOTÃO - (PINO 34 - RB1)
;*****************************************SAÍDAS************************************** ;NÃO SERÁ UTILIZADO NESTE PROGRAMA.
33
Professor Sérgio Minas Melconian. ;*************************************VETOR DE RESET********************************** ORG 0X0000 GOTO INICIO
;ENDEREÇO DO VETOR DE RESET ;PULA PARA O INICIO
;***********************************INICIO DA INTERRUPÇÃO***************************** ORG 0X0004 RETFIE
;ENDEREÇO DO VETOR DE INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO
;********************ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY 7 SEGMENTOS*************** ; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER ; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ ; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTD. ; a ; ********** ; * * ; f * *b ; * g * ; ********** ; * * ; e* *c ; * d * ; ********** *. CONVERTE MOVF CONTADOR,W ANDLW B'00001111' ADDWF PCL,F ;
;COLOCA CONTADOR EM W ;MASCARA VALOR DE CONTADOR ;CONSIDERAR SOMENTE ATÉ 15 ;SOMA DESLOCAMENTO AO PROGRAM COUTER, GERANDO UMATABELA"CASE"
B'PGFEDCBA' ; POSIÇÃO CORRETA DOS SEGUIMENTOS RETLW B'00111111' ; 00 - RETORNA SÍMBOLO CORRETO 0 RETLW B'00000110' ; 01 - RETORNA SÍMBOLO CORRETO 1 RETLW B'01011011' ; 02 - RETORNA SÍMBOLO CORRETO 2 RETLW B'01001111' ; 03 - RETORNA SÍMBOLO CORRETO 3 RETLW B'01100110' ; 04 - RETORNA SÍMBOLO CORRETO 4 RETLW B'01101101' ; 05 - RETORNA SÍMBOLO CORRETO 5 RETLW B'01111101' ; 06 - RETORNA SÍMBOLO CORRETO 6 RETLW B'00000111' ; 07 - RETORNA SÍMBOLO CORRETO 7 RETLW B'01111111' ; 08 - RETORNA SÍMBOLO CORRETO 8 RETLW B'01101111' ; 09 - RETORNA SÍMBOLO CORRETO 9 RETLW B'01110111' ; 10 - RETORNA SÍMBOLO CORRETO A RETLW B'11111111' ; 11 - RETORNA SÍMBOLO CORRETO B RETLW B'00111001' ; 12 - RETORNA SÍMBOLO CORRETO C RETLW B'10111111' ; 13 - RETORNA SÍMBOLO CORRETO D RETLW B'01111001' ; 14 - RETORNA SÍMBOLO CORRETO E RETLW B'01110001' ; 15 - RETORNA SÍMBOLO CORRETO F
34
Professor Sérgio Minas Melconian. ;*************************************INICIO DO PROGRAMA****************************** INICIO BANK1
;ALTERA PARA O BANCO 1
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF
B'00000011' TRISB B'00000000' TRISC B'00000000' TRISD
BANK0
;DEFINE RB0 E RB1 COMO ENTRADA ;DEFINE TODO O PORTC COMO SAÍDA ;DEFINE TODO O PORTD COMO SAÍDA
;ALTERA PARA O BANCO 0
CLRF PORTB CLRF PORTC CLRF PORTD CLRF FLAGS MOVLW MIN MOVWF CONTADOR GOTO ATUALIZA
;LIMPA O PORTB ;LIMPA O PORTC ;LIMPA O PORTD ;LIMPA TODOS OS FLAGS ;INICIA CONTADOR = MIN = 0 ;ATUALIZA O DISPLAY INICIALMENTE
;*************************************ROTINA PRINCIPAL******************************** MAIN
BSF MOVLW MOVWF MOVWF
PORTC,3 T_FILTRO FILTRO1 FILTRO2
;ATIVA O DISPLAY DA PLACA. ;INICIALIZA FILTRO1 = T_FILTRO ;INICIALIZA FILTRO2 = T_FILTRO
CHECA_BT0 BTFSC BOTAO_0 GOTO BT0_LIB
BTFSS ST_BT0 GOTO DEC GOTO CHECA_BT1
;O BOTÃO 0 ESTÁ PRESSIONADO? ;NÃO, ENTÃO TRATA COMO LIBERADO ;SIM ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? ;NÃO, CONTINUA ESPERANDO ;SIM ;BOTÃO JÁ ESTAVA PRESSIONADO? (FLAG) ;NÃO, EXECUTA AÇÃO DO BOTÃO ;SIM, CHECA BOTÃO 1
BCF
;MARCA BOTÃO 0 COMO LIBERADO (FLAG)
DECFSZ FILTRO1,F GOTO CHECA_BT0
BT0_LIB ST_BT0
CHECA_BT1 BTFSC BOTAO_1 GOTO BT1_LIB DECFSZ FILTRO2,F
;O BOTÃO 1 ESTÁ PRESSIONADO? ;NÃO, ENTÃO TRATA COMO LIBERADO ;SIM ;DECREMENTA O FILTRO DO BOTÃO
35
Professor Sérgio Minas Melconian.
BTFSS ST_BT1 GOTO INC GOTO MAIN
;TERMINOU? ;NÃO, CONTINUA ESPERANDO ;SIM ;BOTÃO JÁ ESTAVA PRESSIONADO? (FLAG) ;NÃO, EXECUTA AÇÃO DO BOTÃO ;SIM, VOLTA AO LOOPING
BCF ST_BT1 GOTO MAIN
;MARCA BOTÃO 1 COMO LIBERADO (FLAG) ;RETORNA AO LOOPING
GOTO CHECA_BT1
BT1_LIB
DEC BSF ST_BT0 MOVF CONTADOR,W XORLW MIN BTFSC STATUS,Z GOTO MAIN DECF CONTADOR,F GOTO ATUALIZA INC
INCF CONTADOR,F GOTO ATUALIZA
;AÇÃO DE INCREMENTAR ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO (FLAG) ;COLOCA CONTADOR EM W ;APLICA XOR ENTRE CONTADOR E MAX ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO ;RESULTOU EM ZERO? ;SIM, RETORNA SEM AFETAR CONT. ;NÃO ;INCREMENTA O CONTADOR ;ATUALIZA O DISPLAY
CALL CONVERTE
;CONVERTE CONTADOR NO NÚMERO DO DISPLAY
MOVWF
;ATUALIZA O PORTD PARA VISUALIZARMOS O VALOR DE ; CONTADOR NO DISPLAY. ;NÃO, VOLTA AO LOOP PRINCIPAL
BSF ST_BT1 MOVF CONTADOR,W XORLW MAX BTFSC STATUS,Z GOTO MAIN
ATUALIZA
;AÇÃO DE DECREMENTAR ;MARCA BOTÃO 0 COMO JÁ PRESSIONADO (FLAG) ;COLOCA CONTADOR EM W ;APLICA XOR ENTRE CONTADOR E MIN ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO ;RESULTOU EM ZERO? ;SIM, RETORNA SEM AFETAR CONT. ;NÃO ;DECREMENTA O CONTADOR ;ATUALIZA O DISPLAY
GOTO MAIN
PORTD
;**************************************FIM DO PROGRAMA******************************** END
;FIM DO PROGRAMA (OBRIGATÓRIO)
36
Professor Sérgio Minas Melconian. Exercícios Propostos Utilizando como parâmetro o quinto exemplo, faça as seguintes alterações: A) Faça um contador OCTAL (0 à 7). B) Faça um contador ALFABÉTICO de A à H.
37
Professor Sérgio Minas Melconian.
Esquema Elétrico da Placa de Teste
38
Professor Sérgio Minas Melconian.
Lay-out Placa de Teste
Observação: Adicione dois JUMPERS conforme representados em vermelho. 39