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); } }