Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetivo:
Desenvolver habilidades e competências para o
desenvolvimento de projetos de circuitos eletrônicos
microcontrolados.
Escrita - quando a CPU envia uma informação para ser armazenada numa
localidade de memória ou para um dispositivo de I/O. Por exemplo, quando a
CPU envia uma informação para o vídeo, dizemos que ela escreveu no vídeo.
- SET(conjunto) de instruções;
- Velocidade com que as instruções são executadas;
- Multiprocessamento (execução de várias instruções simultâneas);
-Quantidade de memória que é capaz de endereçar;
- Comprimento da via de dados
- Etc.
FLASH-ROM:
- Somente Leitura
- Programável Eletricamente pelo usuário
- Pode ser reprogramada por software.
.
Microcontroladores PIC16F628A/648A – Curso Básico Wagner da Silva Zanco
MEMÓRIA VOLÁTIL
DRAM
- Leitura e escrita
- Fabricada com capacitores
- Precisa de REFRESH para manter os dados armazenados, mesmo com a energia ligada.
SRAM
- Leitura e escrita
- Fabricada com Flip-flops
- Não precisa de refresh
OTP - Estes dispositivos utilizam memória PROM para armazenar os programas. Eles vem de fábrica vazios,
sendo a gravação do programa feita pelo usuário, não podendo o mesmo ser regravado. Isto impede a
utilização destes componentes na fase de desenvolvimento e teste de programas. Os mesmos são identificados
pelo sufixo “C”.
EPROM - Estes componentes possuem uma janela onde podemos, através da exposição a raios ultravioletas,
apagar os programas gravados no chip. Embora seja trabalhoso efetuar o apagamento do programa, estes
componentes podem ser utilizados na fase de testes e desenvolvimento de programas. O sufixo pode ser “JW”
para dispositivos com encapsulamento do tipo DIP ou “CL” para dispositivos com encapsulamento do tipo
PLCC.
FLASH - Identificados pelo sufixo “F”, estes componentes permitem ser apagados/regravados milhares de
vezes através de sinais elétricos aplicados em alguns de seus pinos, o que pode ser feito automaticamente por
um circuito gravador de Flash como o Picstart Plus, fabricado pela Microchip ou o JDM, cujo hardware é
encontrado facilmente na internet. Estes componentes são a melhor opção para teste de programas e
implementação final dos circuitos, visto que estão ficando cada dia mais baratos.
PORTA(RA7:RA0)
PORTB(RB7:RB0)
Bit 6: /INTEDG: Configura a borda que irá gerar interrupção no pino RB0/INT
1 = Interrupção ocorrerá na borda de subida
0 = Interrupção ocorrerá na borda de descida
Interrupções normais:
Estouro de TMR0
Interrupção externa RB0/INT
Mudança de estado num dos pinos (RB7:RB4)
Interrupções de periféricos:
Término de escrita na EEPROM
Módulo comparador
Interrupção de USART (recepção e transmissão) A interrupção pode ser tratada ou não. Para que uma
Módulo CCP interrupção seja tratada, ela precisa estar habilitada. A
Estouro do TMR1 habilitação é feita da seguinte forma:
Interrupção quando TMR2=PR2
1º - Habilitar a chave individual (INTCON ou PIE1).
2º - Habilitar a interrupção de periférico (INTCON<6>) se fonte
for um periférico.
3º - Habilitar a chave geral de interrupção(INTCON<7>).
Bit 0: /BOR: Bit de sinalização de Brown-out Reset (reset por queda de tensão)
1 = Não houve um Brown-out Reset
0 = Houve um Brown-out Reset (setar flag por software depois do BOR)
Operando
Operando Comentário
Código de operação
PORTA(RA7:RA0)
PORTB(RB7:RB0)
;***************************************************************************************************************************
BCF STATUS,RP1
BSF STATUS,RP0 ;SETA O BANCO 1
BCF STATUS,RP1
BCF STATUS,RP0 ;SETA O BANCO 0
;***************************************************************************************************************************
BCF STATUS,RP1
BSF STATUS,RP0 ;SETA O BANCO 1
BCF STATUS,RP1
BCF STATUS,RP0 ;SETA O BANCO 0
;**************************************************************************************************************************
;************************************************************************************************************
;ESTE CODIGO LE O BIT RB0 (PORTB<0>)
;************************************************************************************************************
;************************************************************************************************************
;ESTE CODIGO LE TODOS OS BITS DO PORTB DE UMA SO VEZ E COLOCA O VALOR LIDO EM TEMP
;************************************************************************************************************
;************************************************************************************************************
;ESTE CODIGO ESCREVE INDIVIDUALMENTE NO BIT RA0 (PORTA<0>)
;************************************************************************************************************
;ESTE CODIGO ESCREVE NO PORTB O VALOR 0Fh, OU SEJA, O NIBBLE ALTO DO PORTB E APAGADO E
;O NIBBLE BAIXO E SETADO.
Label
Mnemônico
Operando
Comentário
Diretivas
Label
É uma string utilizada, entre outras coisas, para representar o
início de um bloco de instruções que executa uma tarefa definida
dentro do programa. O bloco de instruções é normalmente
chamado de sub-rotina. O label deve começar na coluna 1 e pode
ter um comprimento máximo de até 32 caracteres, tendo
obrigatoriamente que começar com um caractere alfanumérico ou
_(underline). O label pode ser sucedido pelo :(colon), o qual é
tratado como um operador do label e não como parte dele.
Mnemônico
O PIC16F628A possui um conjunto de 35 instruções e sua
representação no programa segue uma lógica, definida por sua
sintaxe. A sintaxe define a forma correta de escrever uma
instrução. O mnemônico é parte da sintaxe de uma instrução e
especifica qual tarefa será executada. A parte da instrução que
especifica a tarefa que será realizada é chamada de Op Code
(código de operação). É aconselhável que todas as instruções
sejam escritas com letras maiúsculas para evitar problemas, visto
que alguns editores fazem distinção entre letras maiúsculas e
minúsculas.
Microcontroladores PIC16F628A/648A – Curso Básico Wagner da Silva Zanco
ELEMENTOS BÁSICOS DA LINGUAGEM
ASSEMBLY
Operando
Comentário
É um texto colocado após cada instrução para informar a tarefa
que está sendo executada, fazendo com que o programa fique
mais legível e fácil de entender. Todo comentário deve ser
precedido do ; (ponto-e-vírgula), fazendo com que tudo que esteja
escrito a partir do ponto-e-vírgula, até o final da linha, seja
desprezado pelo montador. O uso de comentários após cada
instrução é um hábito que deve ser cultivado pelos
programadores, principalmente pelos iniciantes. O comentário
deve ser escrito com letras maiúsculas, sem acento ou Ç (cedilha).
Diretivas
Conhecidas também como pseudo-instruções, são comandos que
não fazem parte do set de instruções do microcontrolador, mas são
reconhecidos pelo programa montador (MPLAB IDE). As diretivas
não são convertidas diretamente em linguagem de máquina. Elas
são usadas para controlar o Assembly. As diretivas mais utilizadas
em programas escritos em Assembly são: #DEFINE, #INCLUDE,
ORG, EQU, MACRO, ENDM, CBLOCK, ENDC e END.
;**********************************************************************************************
; NOME DO PROGRAMA
; DESENVOLVIDO POR (AUTOR)
; VERSAO
; DATA
;**********************************************************************************************
;*********************************************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA O PIC16F628A
;*********************************************************************************************************
;**********************************************************************************************************************************************
W_TEMP EQU 0X20
STATUS_TEMP EQU 0X21
CONTADOR EQU 0X22
FILTRO1 EQU 0X23
FILTRO2 EQU 0X24
FLAGS EQU 0X25
TEMP1 EQU 0X26
;************************************************************************************************************************
;**********************************************************************************************************************************************
#DEFINE STATUS_BOTAO FLAGS,0
#DEFINE STATUS_LED FLAGS,1
;**********************************************************************************************************************************************
;**********************************************************************************************************************
; ENTRADAS
;**********************************************************************************************************************
; PINOS QUE SERAO UTILIZADOS COMO ENTRADA
#DEFINE BOTAO1 PORTA,1 ;0 --> PRESSIONADO
;1 --> LIBERADO
#DEFINE BOTAO2 PORTA,2 ;0 --> PRESSIONADO
;1 --> LIBERADO
;**********************************************************************************************************************
; SAIDAS
;**********************************************************************************************************************
; PINOS QUE SERAO UTILIZADOS COMO SAIDA
#DEFINE LED1 PORTB,0 ;0 --> APAGADO
;1 --> ACESO
;*********************************************************************************************************************
;*********************************************************************************************************
ORG 0x00 ;ENDERECO INICIAL DE PROCESSAMENTO
GOTO INICIO ;DESVIA PARA INICIO
;*********************************************************************************************************
;*********************************************************************************************************
ORG 0x04 ;ENDERECO INICIAL DA INTERRUPCAO
RETFIE ;RETORNA DA INTERRUPCAO
;*********************************************************************************************************
;****************************************************************************************************************************************
INICIO
BANK1 ;ALTERA PARA BANCO 1
MOVLW B'00000110'
MOVWF TRISA ;DEFINE RA1 e RA2 COMO ENTRADA E DEMAIS COMO SAIDA
MOVLW B'00000000'
MOVWF TRISB ;DEFINE O PORTB COMO SAIDA
MOVLW B'10000000'
MOVWF OPTION_REG ;RESISTORES PULL_UPS DESABILITADOS <7>
;DEMAIS BITS IRRELEVANTES
MOVLW B'00000000' ;DESLIGADA CHAVE GERAL DE INTERRUPÇÃO <7>
MOVWF INTCON ;DEMAIS BITS IRRELEVANTES
BANK0 ;ATIVA BANCO 0
MOVLW B'00000111' ;CONFIGURA RA3:RA0 COMO I/O <2:0>
MOVWF CMCON
;*******************************************************************************************************************************************
;*************************************************************************************************************
CLRF PORTA ;LIMPA PORTA
CLRF PORTB ;LIMPA PORTB
MOVLW .250
MOVWF TEMP5 ;INICIALIZA TEMP5 COM 250
MOVLW .256-125 ;W RECEBE 131 (256 - 125)
MOVWF TMR0 ;INICIALIZA TMR0 COM 131
**************************************************************************************************************
;*******************************************************************************************************************************************
;ROTINA PRINCIPAL. ESTE PROGRAMA ACENDE UM LED ENQUANTO O BOTAO 1 ESTIVER PRESSIONADO.
MAIN
BTFSC BOTAO1 ;BOTAO1 ESTA PRESSIONADO?
GOTO APAGA_LED ;NAO, DESVIA
GOTO ACENDE_LED ;SIM, DESVIA
APAGA_LED
BCF LED ;APAGA LED
GOTO MAIN ;RETORNA AO INICIO
ACENDE_LED
BSF LED ;ACENDE LED
GOTO MAIN ;DESVIA
;*******************************************************************************************************************************************
END ;FIM DO PROGRAMA
;*******************************************************************************************************************************************
;**********************************************************************************************************
CLRF COUNT ;COUNT=0
;**********************************************************************************************************
Uma outra forma de inicializar uma variável é atribuir um valor diferente de zero a ela. Neste
caso, o valor numérico tem primeiro que ser colocado em W e depois ser passado para a
variável por meio da instrução MOVWF.
;**********************************************************************************************************
MOVLW H'17' ;W RECEBE 17h
MOVWF COUNT ;COUNT RECEBE CONTEUDO DE W
;**********************************************************************************************************
- Desvio incondicional
- Desvio condicional
- Interrupção
- Reset
;******************************************************************************************************************
GOTO LOOP ;desvia programa para LOOP
;******************************************************************************************************************
No lugar do label pode ser colocado o endereço em hexa. Para o MPLAB tanto faz o uso de um ou
de outro modo. Neste caso o programa será desviado para o ponto onde for encontrado o endereço
precedido da diretiva ORG.
;******************************************************************************************************************
GOTO 0x22 ;desvia programa para endereco 0x22 da memoria de programa
;******************************************************************************************************************
Microcontroladores PIC16F628A/648A – Curso Básico Wagner da Silva Zanco
GOTO
A instrução GOTO pode ser usada em conjunto com o caractere especial $ (dólar), quando o desvio
for de apenas algumas linhas.
;******************************************************************************************************************
GOTO $+2 ;SALTA DUAS LINHAS DE CODIGO PARA BAIXO
GOTO $-3 ;SALTA TRES LINHAS DE CODIGO PARA CIMA
;*****************************************************************************************************************
*
;*****************************************************************************************************
;ESTE CODIGO CARREGA O CONTADOR DE PROGRAMA COM 0x150
;*****************************************************************************************************
;A DIRETIVA ORG E USADA AQUI PARA INFORMAR QUE ESTE BLOCO DE CODIGO
COMECA NO ENDERECO 0x150 DA MEMORIA DE PROGRAMA
ORG 0x150
;**************************************************
RETLW .25 ;RETORNA COM W = 25
;**************************************************
Para que o programa possa voltar ao ponto em que houve uma chamada à
sub-rotina, o endereço da primeira instrução após a instrução CALL (PC
+1) é salvo em uma pilha, que é nada mais que uma memória RAM com
algumas localidades. O PIC16F628A possui uma pilha com oito níveis, em
que podem estar armazenados até oito endereços de retorno. Isso significa
que uma sub-rotina pode ser chamada de dentro de outra sub-rotina num
limite de oito chamadas. Se o limite for ultrapassado, o primeiro endereço
de retorno será sobrescrito, impossibilitando o retorno ao primeiro nível de
chamada, provocando um sério erro no programa, com resultado
imprevisível.
BTFSC f,b Testa o bit b do registrador f e salta a próxima linha se ele for zero
BTFSS f,b Testa o bit b do registrador f e salta a próxima linha se ele for um
;***********************************************************************************************
BTFSS PORTB,0 ;LED ESTA ACESO? SE SIM PULA A PROXIMA LINHA
GOTO ACENDE_LED ;NAO, DESVIA
GOTO APAGA_LED ;SIM, DESVIA
;***********************************************************************************************
;************************************************************************************
DEC_COUNT
MOVLW .10 ;W RECEBE 10
MOVWF COUNT ;COUNT RECEBE 10
LOOP
CALL DELAY_100mSEG ;CHAMA SUB-ROTINA DE TEMPO 100mSEG
DECFSZ COUNT,F ;DECREMENTA COUNT. COUNT=0?
GOTO LOOP ;NAO, VOLTA AO LOOP
GOTO UM_SEG ;SIM, PASSOU UM SEGUNDO, DESVIA
;************************************************************************************
Microcontroladores PIC16F628A/648A – Curso Básico Wagner da Silva Zanco
Desvio Provocado por uma Interrupção
Quando uma interrupção ocorre, estando habilitada, o programa é desviado para o endereço
0x04 no qual começa a sub-rotina que irá tratar o evento que deu origem à interrupção. Ao
encontrar a instrução RETFIE, o programa volta ao ponto em que foi interrompido.
O tratamento de uma interrupção e uma chamada à sub-rotina por meio da instrução CALL
funcionam de forma semelhante, sendo diferenciados pelo elemento responsável pelo desvio,
que, no caso da interrupção, é provocado por um evento de hardware.
;********************************************************************************************
MOVLW .0 ;W RECEBE 0
MOVWF PCLATH ;PCLATH RECEBE 0
MOVWF PCL ;PCL RECEBE 0, RESET
;*******************************************************************************************
Uma outra forma de provocar um reset por software é usar a instrução GOTO, fazendo com que o
programa desvie para a localidade 0x00.
;********************************************************************************************
GOTO 0x00 ;RESET
;********************************************************************************************
- Soma
- Subtração
- Lógica OU
- Lógica And
- Ou-exclusivo
ADDWF f,d d ← (W + f)
ADDLW k W ← (W + K)
;*********************************************************************************************************
INC_DEBOUNCE
TESTA_BOTAO1
;********************************************************************************************************
;***********************************************************************************************
SOMA_DOIS_BYTES
RESULT_9BITS
;***********************************************************************************************
;******************************************************************************************************************************
;ESTA ROTINA VERIFICA SE O VALOR ARMAZENADO EM COUNT E MENOR, MAIOR OU IGUAL A 150
COMPARA_VALOR
MOVF COUNT,W ;W RECEBE COUNT
ADDLW .106 ;W = COUNT + 106
BTFSS STATUS,C ;W ESTOUROU?
GOTO MENOR ;NAO, COUNT E MENOR QUE 150, DESVIA
;SIM, COUNT E MAIOR OU IGUAL A 150, CONTINUA
BTFSS STATUS,Z ;W = 0?
GOTO MAIOR ;NAO, CONTEUDO DE COUNT E MAIOR QUE 150, DESVIA
GOTO IGUAL ;SIM, CONTEUDO DE COUNT E IGUAL A 150, DESVIA
;******************************************************************************************************************************
DECF f,d d ← (f − 1)
SUBWF f,d d ← (f − W)
SUBLW k W ← (K − W)
;*******************************************************************************************************************
TEST_SOM
LOOP
CALL EMITE_SOM ;CHAMADA A SUB-ROTINA QUE EMITIRA SOM
DECFSZ COUNT,F ;DECREMENTA COUNT, COUNT=0?
GOTO LOOP ;NAO, DESVIA
BCF SOM ;SIM, APAGA FLAG SOM
RETURN ;RETORNA
;*****************************************************************************************************************
;COMO O RESULTADO E NEGATIVO, O MESMO APARECE EM COUNT EM COMPLEMENTO DE DOIS (256 - 15).
;AS DUAS INSTRUCOES A SEGUIR RECUPERAM O MODULO DO RESULTADO.
RESULT_POSITIVO
COMF COUNT,F ;COMPLEMENTO DE UM DE COUNT
INCF COUNT,F ;COMPLEMENTO DE DOIS DE COUNT
RETLW .1 ;RESULTADO POSITIVO
RESULT_ZERO
MOVF COUNT,W ;W RECEBE COUNT
BTFSS STATUS,Z ;RESULTADO E ZERO?
GOTO RESULT_NEGATIVO ;NAO, RESULTADO NEGATIVO, DESVIA
RETLW .0 ;SIM, RETORNA
RESULT_NEGATIVO
RETLW .2 ;RESULTADO NEGATIVO
;***********************************************************************************************************************
W=0 ;COUNT=10
W=1 ;COUNT<10
W=2 ;COUNT>10
;********************************************************************************************
COMPARA_VALOR2
IORWF f,d d ← (W ou f)
IORLW k W ← (W ou K)
ANDLW k W ← (W and K)
XORLW k W ← (W xor K)
As instruções estudadas neste item não executam funções lógicas ou aritméticas diretamente,
embora possam ser usadas em sub-rotinas com estes fins.
-COMF (Complemento)
- SWAPF (Troca ou Inversão)
- Rotação (RRF e RLF)
Essa instrução complementa todos os bits de um byte, ou seja, o bit que está em nível 1 vai para
0 e vice-versa. A inversão de nível lógico em todos os bits de um byte é chamada de
complemento de um.
Essa instrução inverte o nibble alto do byte (quatro bits mais significativos <7:4>) com o nibble
baixo (quatro bits menos significativos <3:0>). Ela é amplamente utilizada em operações
matemáticas no código BCD.
- Par
- Impar
O projetista determina qual das duas ele utilizará no projeto. O bit de paridade pode ser
utilizado em outras aplicações, como transmissão de dados serial, por exemplo.
COUNT_MENOR
INCF COUNT,F ;INCREMENTA UNIDADE
MOVF COUNT,W ;W RECEBE COUNT
ANDLW B'00001111' ;MASCARA NIBBLE SUPERIOR DE W
XORLW B'00001010' ;W = W xor H'0A'
BTFSS STATUS,Z ;UNIDADE > 9?
RETURN ;NAO, RETORNA
MOVLW B'11110000' ;SIM, W = H'F0'
ANDWF COUNT,F ;ZERA UNIDADE
SWAPF COUNT,F ;INVERTE DEZENA COM UNIDADE
INCF COUNT,F ;INCREMENTA DEZENA
SWAPF COUNT,F ;DEZENA E UNIDADE VOLTAM AS SUAS POSICOES
RETURN ;RETORNA
;*********************************************************************************************************************************************
O acesso à memória via endereçamento indireto é feito por meio dos registradores INDF e
FSR, que ocupam, respectivamente, os endereços 00h e 03h do banco 0, com espelho
nos demais bancos de memória (ver mapeamento de memória RAM).
Diferentemente do endereçamento direto, em que o endereço da localidade de memória
que será acessada aparece no operando da instrução, no endereçamento indireto, o que
aparece na instrução é um ponteiro para a localidade de memória que será acessada.
Neste contexto, o conteúdo do registrador FSR aponta para o endereço de memória,
enquanto o valor contido em INDF é o valor armazenado no endereço apontado por FSR.
INICIA_RAM
MOVLW H'FF'
MOVWF INDF ;LOC. ENDERECADA POR FSR RECEBE H'FF'
MOVLW H'7F' ;W RECEBE 7Fh
XORWF FSR,W ;W = FSR xor 7Fh
BTFSC STATUS,Z ;BLOCO DE MEMORIA CHEGOU AO FIM?
RETURN ;SIM, RETORNA
INCF FSR ;NAO, INCREMENTA FSR
GOTO INICIA_RAM ;DESVIA
;**********************************************************************************************
Se a sub-rotina anterior for implementada utilizando o
endereçamento direto, o número de instruções será muito
maior. O endereçamento indireto pode ser usado em muitas
outras aplicações, reduzindo significativamente o código, ser
for utilizado de forma conveniente.
Microcontroladores PIC16F628A/648A – Curso Básico Wagner da Silva Zanco
Tabelas
Tabela é um recurso muito poderoso que podemos utilizar para armazenar informações.
Tanto a memória RAM quanto a memória de programa podem ser utilizadas para o
armazenamento dos dados de uma tabela.
;**********************************************************************************************************************************************