6ª aula - Páginas Pessoais

Propaganda
6ª aula
- revisão da aula anterior, diretivas em especial Macros:
Macros
● Permitem definir estruturas de programa parametrizadas
● Parecem “funções” das linguagens de alto nível
● Diretivas MACRO, LOCAL e ENDM
● Sintaxe:
simbolo
MACRO p1,p2,...
LOCAL simb2,...
(instruções de programa)
ENDM
Exemplos de Macros:
MOVLF MACRO FILE,K
MOVLW K
MOVWF FILE
ENDM
COMPARA MACRO FILE,K,DIF
MOVF FILE,W
SUBLW K
BTFSS STATUS,Z
GOTO DIF
ENDM
REP
L1
MOVLF CONT,D'0'
INCF CONT,F
COMPARA CONT,D'10',L1
GOTO REP
Boucing e Deboucing
Ver ruído em botões no material do Professor Amauri
Em operações de Liga/Desliga e mudança de nível lógico, surge um ruído (Bouncing)
na transição que, caso uma interrupção esteja habilitada ou até mesmo um contador de
evento, pode provocar várias interrupções ou contagens. As formas mais comuns de filtro
(Debouncing) são via software, programando um tempo (em torno de 100ms, dependendo da
chave) após as transições, de modo a eliminar o ruído antes de efetuar uma instrução, ou via
hardware, utilizando um capacitor de filtro em paralelo com a chave.
Exemplo de programa em Assembly usando botão sem filtro:
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
BOTÃO E LED - EX1
*
;*
DESBRAVANDO O PIC
*
;*
DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA
*
;* VERSÃO: 1.0
DATA: 17/06/03 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
DESCRIÇÃO DO ARQUIVO
*
;*-----------------------------------------------------------------*
;* SISTEMA MUITO SIMPLES PARA REPRESENTAR O ESTADO DE
;* UM BOTÃO ATRAVÉS DE UM LED.
*
;*
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ARQUIVOS DE DEFINIÇÕES
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628A.INC>
;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON &
_INTOSC_OSC_NOCLKOUT
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
PAGINAÇÃO DE MEMÓRIA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
#DEFINE BANK0
BCF STATUS,RP0
;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1
BSF STATUS,RP0
;SETA BANK 1 DE MAMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
VARIÁVEIS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20
;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
ENDC
;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
FLAGS INTERNOS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
CONSTANTES
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ENTRADAS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
SAÍDAS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE LED
PORTB,0 ;PORTA DO LED
; 0 -> APAGADO
; 1 -> ACESO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
VETOR DE RESET
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG
0x00
;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INÍCIO DA INTERRUPÇÃO
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
ORG
RETFIE
0x04
;ENDEREÇO INICIAL DA INTERRUPÇÃO
;RETORNA DA INTERRUPÇÃO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
SUBROTINAS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
DELAY
MOVLW .220
MOVWF CONT1
MOVLW .130
MOVWF CONT2
DENOVO
DECFSZ CONT1,F
GOTO DENOVO
DECFSZ CONT2,F
GOTO DENOVO
RETURN
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INICIO DO PROGRAMA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
CLRF
PORTA
;LIMPA O PORTA
CLRF
PORTB
;LIMPA O PORTB
BANK1
;ALTERA PARA O BANCO 1
MOVLW B'00000100'
MOVWF TRISA
;DEFINE RA2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB
;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG
;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON
;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0
;RETORNA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON
;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR ANALÓGICO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INICIALIZAÇÃO DAS VARIÁVEIS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ROTINA PRINCIPAL
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
BTFSC
BOTAO
;O BOTÃO ESTÁ PRESSIONADO?
GOTO
BOTAO_LIB
;NÃO, ENTÃO TRATA BOTÃO LIBERADO
GOTO
BOTAO_PRES
;SIM, ENTÃO TRATA BOTÃO PRESSIONADO
BOTAO_LIB
BCF
LED
;APAGA O LED
GOTO
MAIN
;RETORNA AO LOOP PRINCIPAL
BOTAO_PRES
BSF
LED
;ACENDE O LED
GOTO
MAIN
;RETORNA AO LOOP PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
FIM DO PROGRAMA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END
;OBRIGATÓRIO
O problema é que este tipo de verificação de botão não funciona de forma adequada
com um contador, por exemplo, pois o microcontrolador fará diversas leituras do estado do
botão enquanto está ocorrendo o repique (oscilação) da chave ou do sinal elétrico.
Para resolver este tipo de problema são utilizados filtros como o do programa abaixo:
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
CONTADOR SIMPLIFICADO - EX2
*
;*
DESBRAVANDO O PIC
*
;*
DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA
*
;* VERSÃO: 1.0
DATA: 17/06/03 *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
DESCRIÇÃO DO ARQUIVO
*
;*-----------------------------------------------------------------*
;* SISTEMA MUITO SIMPLES PARA INCREMENTAR ATÉ UM DETERMINADO
;* VALOR (MAX) DE DEPOIS DECREMENTAR ATÉ OUTRO (MIN).
*
;*
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ARQUIVOS DE DEFINIÇÕES
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628A.INC>
;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON &
_INTOSC_OSC_NOCLKOUT
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
PAGINAÇÃO DE MEMÓRIA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
#DEFINE BANK0
BCF STATUS,RP0
;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1
BSF STATUS,RP0
;SETA BANK 1 DE MAMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
VARIÁVEIS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20
;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
CONTADOR
;ARMAZENA O VALOR DA CONTAGEM
FLAGS
;ARMAZENA OS FLAGS DE CONTROLE
FILTRO
;FILTRAGEM PARA O BOTÃO
ENDC
;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
FLAGS INTERNOS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
#DEFINE SENTIDO FLAGS,0
;FLAG DE SENTIDO
; 0 -> SOMANDO
; 1 -> SUBTRAINDO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
CONSTANTES
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
MIN
EQU
.10
;VALOR MÍNIMO PARA O CONTADOR
MAX
EQU
.30
;VALOR MÁXIMO PARA O CONTADOR
T_FILTRO EQU
.2;30
;FILTRO PARA BOTÃO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ENTRADAS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
SAÍDAS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
VETOR DE RESET
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG
0x00
;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO
INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INÍCIO DA INTERRUPÇÃO
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR
; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO
; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS
ORG
0x04
;ENDEREÇO INICIAL DA INTERRUPÇÃO
RETFIE
;RETORNA DA INTERRUPÇÃO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INICIO DO PROGRAMA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK1
;ALTERA PARA O BANCO 1
MOVLW B'00000100'
MOVWF TRISA
;DEFINE RA2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB
;DEFINE TODO O PORTB COMO SAÍDA
MOVLW B'10000000'
MOVWF OPTION_REG
;PRESCALER 1:2 NO TMR0
;PULL-UPS DESABILITADOS
;AS DEMAIS CONFG. SÃO IRRELEVANTES
MOVLW B'00000000'
MOVWF INTCON
;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0
;RETORNA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON
;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
INICIALIZAÇÃO DAS VARIÁVEIS
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CLRF
PORTA
;LIMPA O PORTA
CLRF
PORTB
;LIMPA O PORTB
MOVLW MIN
MOVWF CONTADOR
;INICIA CONTADOR = V_INICIAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
ROTINA PRINCIPAL
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
MOVLW T_FILTRO
MOVWF FILTRO
;INICIALIZA FILTRO = T_FILTRO
CHECA_BT
BTFSC
BOTAO
;O BOTÃO ESTÁ PRESSIONADO?
GOTO
MAIN
;NÃO, ENTÃO CONTINUA ESPERANDO
;SIM
DECFSZ FILTRO,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO
CHECA_BT ;NÃO, CONTINUA ESPERANDO
;SIM
TRATA_BT
BTFSS
SENTIDO
;DEVE SOMAR (SENTIDO=0)?
GOTO
SOMA
;SIM
;NÃO
SUBTRAI
DECF
CONTADOR,F
;DECREMENTA O CONTADOR
MOVLW MIN
;MOVE O VALOR MÍNIMO PARA W
SUBWF CONTADOR,W
;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSC
STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO
ATUALIZA ;NÃO, ENTÃO CONTA >= MIN
;SIM, ENTÃO CONTA < MIN
INCF
CONTADOR,F
;INCREMENTA CONTADOR NOVAMENTE
;POIS PASSOU DO LIMITE
BCF
SENTIDO
;MUDA SENTIDO PARA SOMA
GOTO
MAIN
;VOLTA AO LOOP PRINCIPAL
SOMA
INCF
CONTADOR,F
;INCREMENTA O CONTADOR
MOVLW MAX
;MOVE O VALOR MÁXIMO PARA W
SUBWF CONTADOR,W
;SUBTRAI O VALOR DE W (MIN) DE CONTADOR
BTFSS
STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO?
GOTO
ATUALIZA ;SIM, ENTÃO CONTA < MAX
;NÃO, ENTÃO CONTA >= MAX
BSF
SENTIDO
;MUDA SENTIDO PARA SUBTRAÇÃO
GOTO
MAIN
;VOLTA AO LOOP PRINCIPAL
ATUALIZA
MOVF
CONTADOR,W
;COLOCA CONTADOR EM W
MOVWF PORTB
;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
BTFSS
BOTAO
;O BOTÃO CONTINUA PRESSIONADO?
GOTO
$-1
;SIM, ENTÃO ESPERA LIBERAÇÃO PARA
;QUE O CONTADOR NÃO DISPARE
GOTO
MAIN
;NÃO, VOLTA AO LOOP PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*
FIM DO PROGRAMA
*
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
END
;OBRIGATÓRIO
Os dois programas utilizados aqui como exemplos foram retirados do livro
Desbravando o PIC16F628A.
Utilização do compilador de linguagem C MIKROC PRO PIC
Manual pode ser obtido em:
http://www.mikroe.com/eng/downloads/get/30/mikroc_pic_pro_manual_v101.pdf
Mas comece por:
http://www.mikroe.com/eng/downloads/get/34/1st_project_c_pro_pic.pdf
Mostrar exemplos do MIKROC PRO que podem ser obtidos em:
http://www.mikroe.com/eng/product_downloads/download/
E o guia de referência rápida para o MikroC em
http://www.mikroe.com/eng/downloads/get/31/c_syntax_v102.pdf
Comparar programas feitos em Assembly com programas com iguais funções feitos
em C.
Exemplos de programas em C:
1) Gerador de forma de onda quadrada
void main (void)
{TRISB = 0;
while (1)
{PORTB.F5 = 1;
PORTB.RB5 = 0;
}
}
2) Pisca pisca de um LED
void main (void)
{TRISB = 0;
while (1)
{PORTB.F5 = 1;
Delay_ms(100);
PORTB.RB5 = 0;
Delay_ms(100);
}
}
3) Pisca pisca com 8 LEDs
void main (void)
{TRISB = 0;
while (1)
{PORTB = 255;
Delay_ms(100);
PORTB = 0;
Delay_ms(100);
}
}
Download