You are on page 1of 199
Fa) ag SSS ices | ore ott TCM Lite to ode Eee: i Save rr eee ear ae ete aecur te acu esl aaa NE PLab - Operacao, Simulagdo e Métodos para Solucao de Problemas ——— me Me sel eee le) ce) lo de Circuito Elétrico para Testes dos Exemplos e Implementagao dos— eyes iuee eter} Do modo como foi demonstrado acima, o arquivo deve estar localizado no mesmo diretéria de instalagao do MPLab. Esta é a melhor forma de referenciar-se aos arquivos fornecidos pela Microchip. Para os arquivos personalizados, deve ser escrita, além do nome do arquivo, a sua localizagao completa. Neste caso, os simbolos < ¢ > sao substituidos por aspas ("). #INCLUDE “Drive:diretério\nome_do_arguive. inc” J Veja agora o arquivo de include da Microchip para o PIC 16F84 (P16F84.INC). List : ; PL6FEd.INC Standard Header File, Version 2.00 Microchip Technology, Inc. NOLIST } Thig header file defines configurations, registers, and other useful bits of 4 information for the PICI6F84 microcontroller. These names are taken to match ; the data sheets as closely as possible. ; Note that the processor must be selected before this file + included. The processor may be selected the following ways 1. Command line switch MPASH MYPILE.ASM /PICLEFS4 2, LIST directive in the source file LIST P=PICLers4 3. Processor Type entry in the MPASM full-screen interface Revision Histery sRev: Date: Reason: 12.00 07/24/96 Renamed to reflect the name change to PICI6FB4. 1.01 05/17/96 Corrected BADRAM map 1.00 10/31/95 Initial Release Programagiio 49 Verify Processor 1éFa4 MESSG “Processor-header file mismatch. Verify selected processer.- ENDIF ‘TFNDEF : Register Refinitions W EQU F EQU jocon> Register Files— won neeene INDP EQU THRO EQU PCL EQU STATUS EQU FSR EQu PORTA EQU PORTB EQU BEDATA BQU EEADR BQU BCLATH EQU INTCON EQU OPTION_REG BQu TRISA EQU TRISB rou EBCONL EQu BECONZ ROU -- STATUS Bits -- TRE EoU H'o00T* BEL QU H' 0006" RPO EQU Ha005° NoT_T0 =Qu H‘o004+ ROT_PD FOU H*0003' z EQU #0002" pe EQU #9001" © EOU #0000" j----- INTCON Bits -- ———S GIE FOU H'0007" EEIE EGU H'0a06" POLE 7 Eu 0005" H* 0000" H*0001* H* 9000" H+0002 H*0002' Hroo03' H‘oo04+ H*O005" W' 0006 ‘4'0008" H'a003" HO00a' H'000B" H'oog1" H' 0085" H' 0086" Hoga" H'oo89" Desbravanda o PIC INTE FOU Hood" RBIE EQU H'0003" ‘OIF BQU H' 0002" INTE EQu H' 9002" RBIF EQU #0000" -- OPTION Bits -- NOT_REPU EQU #10007" INTEDG EQU 0006" procs FOU HrOO0S* ‘TOSE BOW H70004" PSA FOU H'0003" PSz EQU H' 0002" PSI QU H'0OOL* PSO QU H* 9000" poos++ BECONL Bits EEIF EQU HT G04" WRERR BQU '9003' WRER EQU #70002" wR, EQU H'O00L RD EQU H' 0000" z RAM Definition __MAXRAM H'CE* __BADRAM H'O07", H'SO'-H'2F*, H'S7" _cP_ON sgU-HTODOF" _CP_OFF BQU 0 HCOFFF' |_PWRTE_ON EQU HW'3EF7' _PHRTE_OFF EQU W3EFF! _¥DT_ON Bou HVSPRE! LNDT_OFF BOU H°3FFB! “p_psc BQU HU3EFC' XT_osc =QU H'QFFD! ~HS_OSC QU KOSEFE* RC_OsC EQU BOBFEF* LIST Programagia CONSTANTES E DEFINICOES: EQU E DEFINES Ao observarmos © arquivo mostrado anteriormente, encontramos, além dos ~ comentirios, a palavra EQU. Na verdade, EQU nao é um comande do PIC, mas sim uma diretriz para o compilador. Essa diretriz associa um nome a um ntimero. Desta mancira, fica muito mais facil nos referenciarmos a uma varidvel pelo seu home, no lugar do seu enderego na meméria. Isto também é muito utilizado para definirmos constantes que serdo utilizadas no decorrer da programacao. Quando for necessdrio alterar © valor dessa constante, bastar modificarmas 0 ntimero relacianado ao seu nome. Simples, nao é mesmo? Asintaxe para a utilizagao do EQU é a seguinte: mada varidvel 5QU Bndereco da mendria ] ou nome_da_constante EQU Valor_da_constante ] Aproveitames @ momenta também para informé-lo que um nimero qualquer pode ser representaco de varias formas dentro do assember do PIC: Decimal: D'??' ou .?? Hexadecimal: H"2?" ou OX?? Bindrio: B'??72727" ASCH: A‘? Vejamos ento um exemplo utilizado no arquivo PIGF84.INC: STATUS EQU H'0003" FSR EQU H'O004" PORTA. FOU H'g00s" PORTE EQU H'O006" Na hora de compilar o cédigo fonte, toda vez que aparecer a palavra PORTA, ela serd automaticamente substituida pelo mimero 05 (em hexa), que é 0 endereco de meméria para a porta A. Desta maneira, & muito mais facil programar utilizando 6 nome PORTA no lugar do ntimero 05, nao é mesmo? Isto torna as coisas mais faceis ainda quando nos referimos as varidveis de usuario ow constantes, que devem ser posteriormente alteradas. Neste caso, é muito. mais simples alterar o valor em uma definigdo do que no programa inteiro, Para este mesmo tipo de aplicagio existe também a diretriz #DEFINE. Esta, no entanto, € um pouco mais poderosa que a EQU, pelo fato de que ela nao substitui nomes somente por ntimeros, mas sim por expressées inteiras (substituicao de texto). Deshravando o PIC Essa diretriz € comumente utilizada para definirmos os pinos de entrada e saida do sistema, Para nos referenciarmos a um pino, devemos especificar o bit correto dentro do registrador da porta em questao, Podemos entao dar um nome ao conjunto registrador/bit para facilitar o entendimento do programa, Por exemplo: 7 DEFINE LED LED ¢ » nome da definiedo, e PORTB,1 é 0 que seré considerado toda vez que o nome for utilizado durante o programa. Desta forma, apés a utilizagio do define, podemos nas referir ao pino RBI com a palavra LED, Isto também facilita muito as alteracées futuras no hardware. Caso esse LED seja alterado para o pino RB2, basta alterarmos o #DEFINE, sem precisarmos modificar 0 cédigo inteiro. Futuramente, veremos que 0 #DEFINE pode ser utilizado também para a criagao de pequenos comandos. EXEMPLO 0 - ESTRUTURACAO Vejamos agora um exemplo da estruturacio completa. Este modelo sera utilizado, no decorrer deste livro, como ponto de partida para todos os programas. i NOME DO PROJETO if. CLIENTE ad DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA * :* versio: 1.0 DATA: 11/06/98 a DESCRICAO DO ARQUIVO * ARQUIVOS DE DEPINIGES . SINCLUDE 7 ARQUIVO PADRAO MICROCHIP PARA 1é6F84 i PAGINACKO DE MEMORIA . :DEFINIGAO DE COMANDOS DE USUARIO PARA ALTERACKO DA PAGINA DE MEMORIA DEFINE. BANK) BCF STATUS, RPO iSETA BANK 0 DE MEMORIA #DEFINE BANK] SSF STATUS, RPO SETA BANK L DE MAMORIA Programacéa 7 VARIAVEIS * + DEFINIGKO DOS NOMES E ENDEREGOS DE TODAS AS VARTAVBIS UTILIZADAS } PELO SISTEMA CBLOCK Oxoc ;ENDEREGO INICTAL DA MEMORIA DE iMSUARTO W_TEMP ;REGISTRADORES TEMPORARIOS PARA USO. STATUS_TEMP JUNTO AS INTERRUPCOES NOVAS VARIAVETS ENDC ;FIM DO BLOCO DE MEMORIA FLAGS INTERNOS . DEFINTCAS DE TODOS OS FLAGS UTILIZABOS PELO SISTEMA ‘CONSTANTES = ENTRADAS * ; DEPINICKO De Tonos OS PINOS QUE SERKO UTILTZADOS COMO ENTRADA i RECOMENDAMOS TAMBEM COMENTAR © SIGNIPICADO DE SEUS ESTADOS (0 8 1) A SALDAS. il i DEFINICAO DE TODOS OS PINOS QUE SERRO UTILIZADOS COMO Safina + RECOMENDAMOS TAMBEM COMENTAR 0 SIGNIPICADO DE SEUS ESTADOS (0 E 1} it VEYOR DE RESET * oRG — ox0g #ENDEREGO INICIAL DE PROCESSAMENTO GOTO INICIO af INICIO DA INTERRUPCAO * EMDERECG DE DESVIO DAS INTERRUPCOES, A PRIMETRA TAREFA & SALVAR 0S VALORES DE “W" E "STATUS" PARA RECUPERACKO FUTURA ORG = Oxod FENDERECO INTCIAL DA INTERRUPCAO MOVWF W_rEKP JCOPIA W PARA W_TEMP SWAPF STATUS, W MOVWE STATUS_TEMP ;COPIA STATUS PARA STATUS_TEME Desbravando o PIC ROTINA DE INTERRUPCRO « AQUI SERAO ESCRITAS AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS ERRUPCOES ROTINA DE SAiDA DA INTERRUPCAO OS VALORES DE “W E “STATUS DEVEM SER RECUPERADOS ANTES DE RETORNAR DA INTERRUPCAC SAT_INT SWAPF STATUS_TEMP,W MOVWF STATUS ;MOVE STATUS_TEMP PARA STATUS SWAPF W_TEMP, F SWAPF W_TEMP, # :MOVE W_TEMP PARA W RETFIE RGPINAS E SUB-ROTINAS . ; CADA ROTINA OU SUB-ROTINA DEVE POSSUIR A DESCRIGAO DE FUNCIONAMENTO } E UM NOME COSRENTE As SUAS FUNQGES SUB-ROTINAL ;CORPO DA ROTINA RETURN INICIO DO PROGRAMA. * INICIO BANKL JALTERA PARA © BANCO 1 MOVLW B'o0000000' MOVWF TRISA ;DEFINE ENTRADAS E SA{DAS DO PORTA MOVLW B'00000000' MOVWF RISB : ‘MOVLH B'20000100° MOVWF OPTION_RES DEFINE GPGOES DE OPERACAO MOVLW B'00000000° MOWHE INTCON {DEFINE ORGIES DE INTERRUPCGES BANKO ;RETORNA PARA Q BANCO EFINE ENTRADAS E SALDAS DO PORTB INICTALIZAGRO DAS VARIAVEIS Programagiio ROTINA PRINCIPAL ¥ ;CORPO DA ROTINA PRINCTPAL GoTo MAIN FIM DO PROGRAMA * END Algumas novas diretrizes de compilacao apareceram no exemplo e devem ser explicadas; ORG: Trata-se de um direcionamento Para a posicéo de meméria de Programacdo. So devemos nos preocupar com esse endereeamento. no inicio do programa (vetor de reset), no inicio das interrupgGes (vetor de interrupcao) @ em alguns casos especificos de paginacao da area de programa, que nao é muito importante no caso do 16F84. Observe que como o vetor de reset do PIC 16F84 é o endereca Ox00, antes da ese ita da primeira instrugdo ¢ dada a diretriz ORG Ox00, para que o Programa Comece neste ponto. Logo em Seguida, um pulo é dado para uma rotina localizada bem mais 3 frente (GoTo INICIO). Isto é necessério parque na endereso Ox04 deve ser iniciada a rotina de interrupgao. Para tal, uma nova diretriz é especificada: ORG 0x04. END: Essa diretriz deve ser sempre colocada ao final do programa, pois quando © compilador encontra-la, a compilagao seré terminada. Para uma melhor estruturagao, sempre deixamos a rotina principal no final do arquivo, seguida somente pelo END. CBLOCK e ENDC: E uma maneira simplificada de definirmos varios EQUs com enderecos seqiienciais, Observe que utilizamos este recurso na definigaio das varléveis de sistema, mas precisamos informar somente o enderego da primeira varidvel (CBLOCK 0x20). As demais so definidas na seqiiéncia. Isto Possibilita mucarmos facilmente o local de todo © bloco de varidveis, Este recurso 6 utilizado, por exemplo, quando estamos convertermos a programa de um modelo de PIC Para outro, cuja RAM de usuario inicia-se em um endereco diferente. Os demais itens apresentados neste exemplo € que ainda nio sao conhecides teferem-se a comandos que serao vistos nas préximas secdes. O apéndice B explica todas as diretrizes existentes. Desbravaide a PIC BIBLIOTECA MOURA LACERDA TRABALHANDO COM A MEMORIA © objetivo desta secio € 2 apresentagio da operacae e dos comandos relacionados 4 meméria do PIC. Como guardar e recuperar valores ¢ também mové-los de um lugar para outro. O REGISTRADOR WORK (W OU ACUMULADOR, Para reforcar os conceitos ja vistos, vale lembri-lo que o PIC possui um registrador temporario utilizado nas operagdes da ULA ¢ nao faz parte direta da memoria RAM do sistema. Esse registrador € 0 Work (W) e sera extremamente utilizado de agora em diante, j que ndo podemos ler ou escrever diretamente na meméria sem 0 uso dele. CONHECENDO OS BANCOS DE MEMORIA (BANKO_E BANK1) Como também ja foi visto do capitulo de meméria, o PIC 16F84 possul dois bancos de meméria para os registradores SFR. A meméria para varidveis do sistema € disponivel somente no banco 0. Por isso, quando queremos acessar algum registrador SFR que esta no banco 1, devemos primeiro informer ao sistema que queremos trabalhar com esse banco, Para tal, deve-se alterar o valor do bit RPO no registrador STATUS. Com 0 objetive de tornar esta tarefa muito mais facil, criamos dois comandos virtuais chamados BANKO e BANKI, que sao definides no arquivo-modelo da seguinte maneira: BTA BANK 0 DE MEMORIA SETA BANK 1 DE MEMORIA $DEFINE | BANKO BCF STATUS,RPO | WoEF TNE BANK] BSF STATUS, REO Desta forma, quando eserevermos BANKO, estaremos na verdade mandando limpar o bit RPO do registrador STATUS, e quando escrevermos BANK, estaremos mandande setar esse mesmo bit. Recomendamos no entanto, que, apés efetuadas as alteragées necessarias no bancol, o sistema retorne sempre para o banco 0. Por exemplo, observe como foram ajustados alguns registradores do banco 1 no arquivo-modela: [ BANKI ;ALPERA PARA O BANCO 1 MOVE B' 99090000" | MownE TRISE ;DEFINE ENTRADAS E SALDAS DD PORTS | mownw B-00000000" | mowwr ‘TRISA ;DEFINE ENTRADAS E SALDAS DO PORTA | moviw B*10000200- MOWAE OPTION_REG ;DEFINE OPCOES DE OPERACKO OWL B+00000000' Mower aINWTCoN ;DEFINE OPCGES DE INTERRUPCOES | Banko ;RETORNA PARA O BANCO O Programaéo Caso os comandos BANKO ¢ BANKI nao existissem, o sistema ficaria assim: BEF STATUS,RPO ;ALTERA PARA O BANCO 1 MOVLW B'oooo0000' wouWE TRIE ;DEFINS ENTRADAS E SAipAS pO PORTS MOVLW B'd0000000" MOUWF TRISA ;DEFINE ENTRADAS E SAIDAS DO PORTA MOVLW B'20000100° MOVWF OPTION_REG s DEFINE OPCOES DE OPERACAO MOVLW B'00000000° MOWHF Inncow FDSFINE OPCORS DE iTERRUPGoES ECF STATUS, RPO JRETORNA PARA 0 Bi Oo 0 LIDANDO COM DADOS (MOVLW, MOVWE, MOVE, CLRE E CLRW) Vamos aproveitar o exemplo acima para conhecermos também os trés comandos mais utilizados nos programas para PIC. Trata-se do MOVLW, MOVWF e MOVF. Vamos utilizar aqueles termos jd estudados para conhecermos a verdadeira funcao desses comandas? MOVLW = Move (MOV) uma literal {L) para o registrador work (W4. MOVWE = Mave (MOV} 0 valor de work (W) para um registrador (F). MOVF = Move (MOV) o valor de um registrador (F) para um local de destino passado como argumento {fou w}. As sintaxes destas instrugdes sao: MOVLH ok vem que k é o ntimero que serd colocade em W_ MOVWR OF jem que £ é o endeveco da mandria onde sera quardado 0 valor de W. MOVE fd jem que £ 6 0 registrador que serd movido para o destine 4 iLembre-se que existem dois destinos possiveis: we F Assim sendo, para guardar um nimero em uma Posigao de meméria, devenios primeiro mové-lo para 0 work (MOVLW) © depois mové-lo da work para o registrador propriamente dito (MOVWE) Por exemplo, para definirmos as condigées de operacao da maquina, devemos ajustar os bits do registrador OPTION_REG. A maneira mais rapida de fazermos isto é moyendo um nimero para o endereco desse registrader. O ntimero é representado na forma bindria para compreendermos melhor o estado de cada bit. Lembre-se que pela sintaxe do comanda MOVWF deveriamos especificar 0 endereco do registrador. No entanto, no arquivo de include, este enclereco foi Sobrecarregado no nome OPTION_REG. MOVLW —-B'10000700" MOvWF OPTION_REG ;DEFINE OPCOES DE OPERAGKO J a instrugiio MOVF ¢ utilizada para movermos 0 contetido de um registrador para outro registrador. Por exemple, veja como fica 0 cédigo para escrevermos em TEMPO2 6 mesmo valor existente em TEMPO1: Desbravando o PIC MOVF TEMPOL,W ;MOVE © VALOR DE TEMPO 1 PARA O WORK MOWWF TEMPO2 iMOVE G VALOR DE W {TEMPO1) PARA TEMPO2 Uma diivida que pode surgir agora € em relagdo ao outro destino possivel que pode ser utilizado com a instrue3o MOVE. Para que moveriamos © valor de um registrador para ele mesmo? Por mais idiota que possa parecer esta acao, ¢la tem alguima aplicagdio que serd vista mais adiante. Para limparmos um registrador, poderiamos mover O (zero) para ele, mas como. vocé jd deve ter observado, uma operacao de movimento de um ntimero para um registrador exige duas instrugdes (MOVLW e MOVWF), ¢ portanto, dois ciclas de maquina, A fim de agilizar este caso especifico de atualizacda do registrador, existe o comando CLRF: ‘CLRF = Limpa (CLR) o registrador (F} A sintaxe desta instrugao é: [kusr = jem que £ € 0 enderego da meméria que se deseja limpar Desta forma, as instrugdes: MOVEW _B00000000" . MOVWF _TRISB {DEFINE ENTRADAS E SAIDAS DO PORTB Poderiam ser substituidas por: [curr TRIse iDEFINE ENTRADAS E SAIDAS DO PORTB De maneira andloga, existe um comando similar para a limpeza do work, apesar do fato de que para mover 0 (zero) para o work também s6 é necessdria uma instrugdo. Entretando, as duas instrugdes que executam esta agio sao ligeiramente diferentes, pois uma afeta o STATUS de zero ¢ a outra nao. ‘MOVE 0x00 ;LIMPA O WORK SEM AFETAR 0 STATUS CLRW #TAMBEM LIMPA _O WORK E AFETA 0 STATUS DE ZERO INICIALIZANDO O SISTEMA Esta segao € destinada a uma melhor expl apresentada no arquivo-modelo. licagao e exemplificagao da estrutura DEFININDO LOCAIS PARA AS VARIAVEIS Seguindo a estrutura existente no nosso modelo, o primeiro bloco refere-se a definigio das varidveis. Isto porque os SFRs j4 esto definidos no arquivo de include (vide P16F84.INC), Desta forma, devemos criar espago e nomes para todas as varidveis que utilizaremos no programa. Recomendamos também comentar para que serve cada uma delas. Vejamos um exemplo: * VARIAVEIS . ; DEFINIGAO DOS NOMES E ENDEREQOS DE TODAS AS VARIAVEIS UTILIZADAS i PELO SISTEMA CBLOCK 0x00 sENDERECO INICIAL DA MEMORIA DE USUARIO W_TEMP sREGISTRADORES TEMPORARIOS PARA STATUS_TEMP ; USO JUNTO AS INTERRUPCORS ‘CONTADOR, FCONTADOR PARA © NUMERO DE TRANSMISSOES BYTE_TX NTE QUE SERA TRANSMITIDO BYTE_RX TEYTE QUE SERA RECEBIDO END }FIM DO BLOCO_DE MEMORIA, Neste exemplo, estamos usando as diretrizes CBLOCK ¢ ENDC. Sem a utilizagio delas, o mesmo cédigo seria escrito da seguinte maneira: a * VARIAVEIS : DEFINICRO DOS NOMES E ENDERECOS DE TODAS AS VARIAVEIS UTILIZADAS + PELO SISTEMA W_TEMP EQU OX0C ;REGISTRADORES TEMPORARIOS PARA STATUS_TEMP EQU OXOD ;USO JUNTO AS INTERRUPCOES CONTADOR EQU OX0E ;CONTADOR PARA © NUMERO DE TRANSMISSOBS BYTE_TX EQU OXOF ;BYTE QUE SERA TRANSMITIDO BYTE_RK QU OX10 ; BYTE QUE SERA RECEBIDO Lembre-se sempre que a mem6ria disponivel ao usuario para o PIC 16F84 vai de OxOC até Ox4F, RESERVANDO ESPACO PARA FLAGS Flags sao bits que definimos dentro de um byte para serem utilizados como chaves onvoff. Desta forma, em um tnico endereco de meméria (registrador) poderemos guardar até & flags que registrardo 8 estados diferentes. Por exemplo, um flag pode marcar se um byte ja foi transmitido ou nao, outro pode marcar se existe algum dado recebido ou nao, ¢ assim por diante. A primeira agio para podermos trabalhar com flags é a definicio de um registrador onde eles serao armazenados. Se muitos flags forem necessdrios, mais de um registrador pode ser utilizado, Desbravando 0 PIC VARTAVELS: } DEFINTCHO DOS NOMES E ENDEREGOS DE TODAS AS VARIAVEIS UTILIZADAS ELO SISTEMA BLOCK 0x00 TENDEREQO INICIAL DA MEMGRTA DE USUARIO WTEME | REGISTRADORES TEMPORARIOS PARA STATUS_TEMP ISO JUNTO AS INTERRUPGOES FLAG REGISTRADOR PARA FLAGS CONTADOR, ;CONTADOR PARA © NUMERO DE TRANSMISSOERS BYTE_TX ;BYTE QUE SERA TRANSMITIDO BYTE_RX ;BYTE QUE SERA RECEBIDO ENDC ;FIM DO BLOCO DE MEMORIA Depois, fica mais facil se definirmos nomes especificos para cada um dos Mags por meio da diretriz #DEFINE: FLAGS INTERNOS * DEFINICAO DE TODOS OF FLAGS UTILIZADOS FELO SISTEMA FLAG PARA INEFORMAR QUE © DADO POI TRANSMITIDO: 1 -> TRANSMITIDO 7 0 -> NAG TRANSMITIDO #DEFTNE § TRANSMITIDO FLAG, 0 =DEFINE RECEBIDO FLAG,1 ;FLAG PARA INPORMAR QUE O DADO }FOI RECEBIDO ; 1 -> RECEBIDO 10 -> NKO RECEBIDO Desta forma, o flag TRANSMITIDO fica armazenada no bit 0 do registrador FLAG, o RECEBIDO fica no bit 1. CRIANDO CONSTANTES ‘As constantes 40 muito titeis para simplificar alteragoes em valores do sistema, Por exemplo, imagine que scu sistema deva possuir wirios delays de atraso durante a execugao. Vamos supor que vocé crie todos esses delays baseadas em uma constante de tempo. Se ao final do projeto vacé descobrir que esses delays devem ser alterados, nao fica muito mais facil modificar somente a constante, a0 wes de editar todo o codigo? Com a criac4o de constantes, vocé podera substituir um ntimero (literal) por um nome qualquer: : CONSTANTES . ? DEPINIGKO DE TODAS AS CONTANSTES UTILIZADAS PELO SISTEMA EMPO DE DELAY DO SISTEMA EM SEG. PODE VARIAR DE 10 A 50 SEG CONTANTE PARA A FREOQUENCIA DE #PISCADA DO LED (50=1Hz) ‘TEMPO_DELAY EQU 2 FREQPISCA EQU 50 DEFININDO AS ENTRADAS E SAii Antes de comecar a escrever seu programa, é bom estar claro em sua mente fede preferéncia também no papel) como sera o hardware necessdrio ao sistema. Por isso, neste ponto vocé jj deve saber em quais pinos do PIC serdo ligadas as suas entradas e saidas. Para tornar tudo mais ficil ¢ compreensivel, serao dados homes a esses pinos por meio da diretriz #DEFINE, Por exemplo, suponhamos que seu projeto necessite de um botao. ligado ao pino RAO, um buzzer ligado ao pina RAI e & leds ligados aos pinos de RBO a RET. Poderiamos entao definir as entradas e saidas da seguinte man ” ENTRADAS . i DBFINICKO DE TODOS OS PINOS QUE SERKO UTILIZADOS COMO ENTRADA + RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DR SEUS ESTADOS (0 £1) *DEFINE. BOTAO PORTA, 0 *BOTAG DE START DO SISTEMA (PrNO 17) 7 0 => worko souTo ; 1 => BOTAO PRESSTONADG saiDas * ? DEFINIGAO DE TOROS O$ PINOS QUE SERXO UTILIZABOS Como SAipA 7 RECOMENDAMOS TAMBEM COMENTAR O SIGNIFICADO DE SEUS ESTADOS tO E1) ADEF INE SoM PORTA, 1 ;BUZZER (PINO 18) : 0 -> SEM som 3 1 => Com som #DEFINE LEDO PORTE, 0 ED 0 = (PINO 6) 0 => APAGADO 7 1 => ACESO 4DEFINE LED1 PORTS, 1 shED 1 — (PING 7) DEFINE LED2 PORTR,2 LED 2 = (PING 8} #DEFINE LED3 PORT, 3 LED 3 - (PINO 9) #Errur LEDS PORTH, 4 4 - [PINO 10) #DEFINE: LEDS PORTE, $ #LBD $ = (PINO 21) #DEPINE LEDS PORT, 6 FLED 6 - (PINO 12) #DEFINE LED] PORT, 7 iLED 7 - (PING 13) | 62 Desbravando @ PIC Lembre-se que o demonstrado acima é somente uma definigao de nomes para facilitar a programagao. N3o estamos ainda configurando os referidos pinos como entradas ou saidas propriamente ditas. Para tal, posteriormente configuraremos os registradores TRISA ¢ TRISB. O VETOR DE RESET Como também ja foi visto, o PIC possui um enderego para o qual o programa & desviado toda vez que um reset ocorre, scja cle pela energizagao do sistema, pelo master clear externo (/MCLR) ou pelo estouro de WDT, Esse endereca é chamade de vetor de reset, No caso do PIC 16F84, esse vetor localiza-se no enderego 0x00, mas em alguns modelos mais antigos, ele pode estar em outro: lugar {final da area de programagao). Portanto, a maneira que recomendamos para iniciar a escrita do programa pode ser vista no préximo exemplo: VETOR DE RESET . ORG 0x00 ;ENDERECO INICTAL DE PROGRAMA (RESET) coro INICIO J INICIALTZANDO OS REGISTROS DE CONFIGURAGKO. 7UMA VEZ CRIADO © VETOR DE RESET NO LUGAR CERTO, DEVEMOS ENTKO #INICIAR 0 SISTEMA, ESTA INICIALTZACKO DEVE PREOCUPAR-SE PRIMETRO COM 7A CONFIGURACKO DO MICRGCONTROLADOR E DEPOIS COM AS VARIAWEIS DO 7 PROGRAMA. 30S REGISTRADORES QUE DEVEM SER CONFIGURADOS SHO: TRISA, TRISB, #OPTION_REG E INTCON. VEJA NOVAMENTE O CAPITULO DEDICADO AOS SFRS #PARA RELEMBRA-LOS. INfCIo GO PROGRAMA . INICIO BANK JALTERA PARA © BANCO 1 MOWLW B‘ 00000000" MOWWF RISB ;DEFINE ENTRADAS E SA{DAS DO PORTB MOVLW B'0000000]' MOVWF TRISA ;DEFINE ENTRADAS & SAIDAS DO PORTA MOVLW B‘ 10000100" MOVWF OPTION_REG DEFINE OPCOES DB OpaRAGKO MOVLW B‘on000000° MOVWF INTCON ;DEFINE OPCOES DE INTERRUECOES BANKO iRBTORNA PARA 0 BANCO 0 Progranagéa No exemplo dado, a seguinte configuracao foi efetuada: Todo o PORTE como saida ("0” em todos os bits do TRISB); Pino RAO como entrada ("1" no bit zero do TRISA); Os demais pinos do PORTA como saida {"0” nos demais bits do TRISA: Prescaler de 1:32 no TMR0 e pull-ups desabilitados (veja bits da OPTION_REG); Todas as interrupydes desligadas (veja bits do INTCON); = Nao se esqueca que para alterar esses registradores & necessério mudar para o bance 1. Para melhor entendimento, consulte o capitulo 6, INICIALIZANDO AS VARIAVEIS € mu portante que as varidveis também sejam inicializadas, mesmo que seus valores devam ser iguais a zero, pois nunca se sabe como a meméria do PIC acordara. Inicializande as varidveis corretamente, muitos problemas podem ser evitados, a IMICIALIZACAO DAS VARIAVEIS + LRP PORTA iDESLIGA TODAS AS SAIDAS DO PORT A CLRF PORTE ;DESLIGA TODAS AS SATDAS DO PORT B MOVLW .10 MOVWF CONTADOR HINTCTA CONTADOR COM 10 (DECIMAL) TRABALHANDO COM ROTINAS Como em muitas outras linguagens de programacdo, no assembler do PIC existem dois tipos de rotinas: as rotinas de desvio e as retinas de chamada, que também podem ser consideradas fungdes. As rotinas de desvio nada mais sao que “pulos" no programa por meio da instrugio GOTO, exatamente como na linguagem BASIC. Acontece que no assembler do PIC o nimero da linha é substituide por um nome (label), Ja as rotinas de chamadas sao acessadas através da instrugao CALL. Essa instrugdo possibilita que o préximo ponto do programa ({PC+1) seja guardado na pilha (stack), para que o sistema possa retornar a ele mais tarde, por meio da instrugdo RETURN (ou similar) que € utilizada para encerrar a rotina. Para tornar mais facil a visualizacao desses dois tipos de rotina, veja o esquema seguinte: RETURN ROT fmaeru iversas strucoes versas coro MAIN Figura 11.1 ~ Rotines de Desvio e de Chamada. ROTINAS DE DESVIO ‘As rotinas de desvio sio utilizadas geralmente para deixar o programa mais estruturado e¢ organizado. No entanto, a instrugio GOTO é freqiientemente ilizada em qualquer programa para possibilitar “pulos” necessarias 4 logica do ul sistema. Na préxima segio (Tomando decisdes e fazendo desvios), isto ficard muito mais claro. Asintaxe dessa instrucao é: GOTO nome ;onde nome é a identificagdio do local para onde se deseja jpular Uma identificagio de local nada mais é do que um nome localizado na primeira coluna de texto do arquivo fonte. Para facilitar sua vida, recomendamos que os homes sejam escritos logo na primeira coluna, ¢ as instrugdes sejam indentadas a direita, por meio de uma tabulag3o, como pode ser observade no arquivo- modelo. Os nomes de rotinas nado podem possuir espagos. Como é muito importante que esses nomes tenham algum sentido em relagio a sua aplicacdo, recomendamos que o sublinhado { _ ) seja utilizado para ajudar na sua composigao. Por exempla: GOTO BT_PRESS ;pula para o local onde tratard o botdo pressionado GoTo BT_LIB jpula para © local onde tratard o botdo liberado Vejamos agora uma dica muito interessante ‘para quando precisamos executar “pulos” muito curtos. Por exemplo, imagine uma situagio em que é necessario pular somente 2 ou 3 linhas, para cima ou pata baixo. Poderfamos criar um nome para o local do pulo ¢ utilizar ¢ comando GOTO, como foi visto até agora, mas 4s vezes isso comeca a se tornar um problema, pois vocé ja mio consegue mais inventar tantos nomes. Para estas, ¢ para muitas outras situagGes que serao vistas adiante, é que a compilador possibilita o uso do §, Ele é utilizado para Programasio representar a linha atual do programa. Veja entéo como fica o comando GOTO em conjunto com o $: GOTO $43 7pula 3 linhas para ba Goro $-2 gpula 2 linhas para cima Nao recomendamos esta técnica para “pulos” muito grandes para nao complicar o entendimento ¢ a manutencao do programa. ROTINAS DE CHAMADA Ja as rotinas de chamada sio utilizadas quando uma tarefa deve ser repetida vdrias vezes ¢ nda se deseja rescrevé-la para nao gastar meméria de programa. Desta forma, a rotina pode ser usada como uma funcdo, que é chamada de diversos pontos do programa sem gerar problemas. Por exemplo, se seu sistema precisa de um delay de atraso em diversos pontos do programa para funcionar corretamente, podemos criar uma rotina denominada DELAY ¢ chamé-la quantas vezes forem necessdrias, em quantos pontos precisarmos, A instrugio utilizada para chamar uma rotina desse tipo é a CALL, Asintaxe dessa instrugdo é: CALL nome jonde noma 4 a identificagko da rotina As observagées feitas aos nomes empregados com a instrugo GOTO também sio vilidas para a instrugao CALL. A grande vantagem de utilizar uma rotina de chamada é que o endereco seguinte ao ponto de chamada (linha abaixo da instrug3o CALL) é armazenado na pil (Stack). Quando terminarmos a rotina com a instrugio RETURN, o sistema voltara exatamente para o enderego armazenado na pilha. Simples, nao € mesmo? No entanto, vale lembra-lo que outras rotinas podem ser chamadas de dentro da rotina atual, antes de darmos um RETURN. Isto iri gerar outros niveis de pilha com os respectivos enderecos de retorno. Acontece que o PIC 16F84 possui uma pilha de no maximo 8 niveis. Se este limite for ultrapassado, o primeiro nivel sera sobrescrito, impossibilitando que o sistema retorne a todos os pontos de chamada, podendo gerar um grave erro no programa. Para os sistemas apresentacios neste livro, e para muitos outros mais complexos, 8 niveis de pilha € mais que o suficiente, mas € sempre bom ficar alerta, principalmente porque existem PICs que sé possuem 2 niveis de pilha. Para retornar de uma rotina, devem ser utilizadas as instrugées RETURN ¢ RETLW. As sintaxes dessas instrugées sao: RETURN ;finaliza @ retina voltando ao Wltime enderego da pilha, | RETLW & jfinaliza a xotina voltando ao ltimo enderego da pilha com to valor k (literal) em W. 66 Desbravando 0 PIC Vale realcar que alguns modelos de PIC s6 passuem a instrugdo RETLW. TOMANDO DECISOES E FAZENDO DESVIOS Esta segao ird apresenta-lo as instrugdes capazes de executar testes ¢ tomar decisdes dentro do PIC. Devido 4 filosofia RISC, o set de instrugdes € bem resumido, como jé explicamos, ¢ voce vera que existem pouquissimas instrugdes voltadas a esta finalidade. Aproveitaremos a ordem natural das coisas para mostrarmos também como alteramos diretamente bits e flags. TESTANDO BITS E FLAGS (BTFSC E BTFSS, As instrugdes empregadas para testar diretamente bits, que podem ser portas ou flags, siio: BTFSC e BTFSS. Vamos utilizar o sistema de termos predefinidos para entendermos melhor suas funcdes: BTFSC = Testa (T) o bit (B) do registrador (F) ¢ pula (S) a préxima linha se a resposta for 0 (C). BTFSS = Testa (1) o bit (B) do registrador (F) e pula (S) a proxima linha se a respasta for I (S). As sintaxes dessas instrugdes sao: BIFSC£,b jem que f é o registrador ¢ be bit a sex testado Linhal ;pasea por esta linha se o bit testado for 1. Binbaz ipula direto para esta linha se e bit testade for 0, BTFSSf,b jem que £ € o zegistrador e b o bit a ser testado Linhal passa por esta linha se o bit testade for 0. Linha2 spula direte para esta linha se o bit testado for 1 Normalmente, as especificagées do registrador e do bit podem ser substituidas por um #DEFINE, como no exemplo abaixo: WDEFINE BOTAO PORTA,O ;DEFINE O BOTRO NO PINO RAO +0 => LIBERADO ; 1 -» PRESSIONADG BTFSS - BOTAD 70 BOTAO ESTA PRESSTONADO? GOTO BT_LIB 7NKO, WAI TRATAR BOTAO LIBERADO Goro BT_PRES 7SIM, VAI TRATAR BOTAQ PRESSIONADO Os mesmos testes podem ser executadas com flags para checar um certo estado do sistema. MUDANDO BITS E FLAGS (BSF E BCF) Agora que vocé ja sabe como testar se um dado bit esté em 1 (um) ou em 0 (zero), e também ja sabe como executar uma agdo especifica conforme o resultado obtido, ento esta na hora de aprender comé alterar o valor dos bits, Programagéa Utilizando As instrugSes empregadas para a alteragdo de um bit sao: BSF e Bt novamente a técnica de termos predefinides teremos: BSF = 0 bit (B) do registrador (F) deve ser setado (S) - igualado a 1 BCF = o bit (B) do registrador (F) deve ser zerado (C) - igualado a 0 As sintaxes dessas instrugées sao: BSF fb jem que f € 6 registrador e b o bit que serd setado BOF fb :em que ¢ 6 0 registrador e b o bit que serd zerado Aqui também o registrador ¢ 0 bit sio comumente substituidas por #DEFINES. Desta forma, podemos facilmente alterar o valor de um flag, ou entao de um bit de configuracdo dentro dos SFRs. TRABALHANDO COM AS PORTAS Esta seco ind se dedicar 8s dlicas de operagio para a correta utilizacao das portas do PIC. As portas so provavelmente o recurso mais paderoso de um micrecontrolador, Pois ¢ por meio delas que o PIC pode se comunicar com os demais componentes da sistema. Com essas portas podemos ler um botao, acender ¢ apagar um led, ativar um relé, controlar um motor, esctever em um display ¢ muito mais. O importante, por enquanto, € vocé conhecer ¢ dominar as maneiras de operar corretamente as portas para que seja possivel concretizar suas idéias. LENDO UMA PORTA Uma porta pede ser lida de duas maneiras: como um conjunto, isto é, todas os seus pinos de uma s6 vez, ow individualmente, As instrugdes necessarias para ambas as maneiras ja foram apresentadas, Por exemplo, podemos ter ligado a todo 0 PORTB um barramento paralelo de dados, em que cada pino representa um bit e 0 PORTB representa o byte tado. Entdo, para sabermos qual valor esta “escrito” no PORTB, basta lé-lo integralmente: onsideraremos que a varidvel DADO jé foi definida anteriormente MOVF PORTE, W 7ESCREVE © VALOR DE PORTS EM Ww MOVWF DADO ;ESCREVE © VALOR DE W EM DADO ;DADO = VALOR DE PORTE Neste exemplo, simplesmente copiamos o valor do registrador PORTB para o registrador DADO. Come o registrador PORTB expressa ¢xatamente o estado de todos os pines do port B, entda estamos lenda diretamente seus valores. E ‘observe que isto serve tanto para os pinos configurados como entrada quanto para os configurados como saida, No caso de um pino do tipo entrada, quando lemos © seu valor, estaremos obtendo o sinal imposto pelos circuites externos Desbravando 0 PIC ao PIC, No caso dos pinos do tipo saida, estaremos lendo © valor imposto pelo préprio PIC. Por outro lado, na maior parte das vezes, uma entrada é associada a somente um pino, ¢ nao ao Port inteiro. Neste caso, € muito mais facil trabalharmos diretamente com o bit em questao. © exemplo dado anteriormente para a leitura de um botao, com a utilizagao das instrugGes BTFSS e/ou BTFSC, € 0 melhor exemplo disto, ESCREVENDO EM UMA PORTA A escrita nas portas é totalmente similar ao proceso. de leitura, com algumas ressalvas. Durante 0 processo de escrita em um pino, nao estamos afetando diretamente o estado dele, mas sim um “latch” intermedidric, Vamos explicar isto de uma forma mais simplificada. A cada pino das portas € associada uma chave interna (latch) que é alterada toda vez que escrevemos em um desses pinos. Se o pino estiver configurado como. saida, entao seu estado também & afetado, mas se ¢le for uma entrada, entdo s6 o latch é afetado. Devido a isto, é possivel escrevermos um valor em um pino que € entrada, ¢ quando o alteramos para safda, seu estado sera garantido. Vejamos um exemplo: BANEL ;MUDA PARA BANCO 1 BSF vRIss,0 ;TRANSFORMA REO EM ENTRADA BANKO ;RETORNA PARA BANCO 0 ; AQUI PODE HAVER DIVERSOS COMANDOS | BSP PORTE,Q ;ESCREVE 1 NO LATCH DO RBO (QUE AINDA £ ENTRADA) BANKS ;MUDA PARA BANCO 1 BCE TRISB,O ;TRANSFORMA REQ EM SAIDA. NESTE MOMENTO O PINO SERA INICTALIZADO EM 1 DEVIDG AO LATCH BANKO ;RETORNA PARA BANCO _D Agora isto até pode parecer estranho, mas muitas vezes é totalmente necessario. Como jé havia sido demonstrado, para afetar diretamente um pino da porta, utilizam-se as instrugdes BSF ¢ BCF com o bit relacionado a este pino. Devido a esta estruturacio interna, também nunca devemos escrever e ler na mesma porta em instrucdes seguidas. Deve ser garantido pelo menos um ciclo de maquina entre a escrita ¢ a leitura, para assegurar as alteracoes executadas, Esse ciclo de maquina pode ser garantido pela instrugao NOP, que consome um ciclo sem fazer absolutamente nada. HOVLW . 10 TESCREVE 10 EM W MOVWE PORTB }TRANSFERE © VALOR DE W (10) PARA © PORT 5 NOP ;PERDE UM CICLO PARA ASSEGURAR A ESCRITA NO PORT MOVF PORTA,W :LB © VALOR DO PORT B E COLOCA EM W MOVWF DADO © VALOR DE W (PORTE) PARA DADO Programagéa Se nao fosse executada uma instrugdo de leitura logo apds a escrita, a instrugdo NOP nao seria necessdria. EXEMPLO 1 - BOTAO E LED Até aqui tudo bem, mas ja esté na hora de vocé ver algum exemplo pratico e funcional para tudo isto, nao € mesmo? Grande parte das informacdes até agora apresentadas refere-se 3s padronizagées ¢ dicas de programacio, mas e os Programas propriamente ditos? Pois nossa experiéncia afirma que ¢ muito importante ter um bom conhecimento destas bases para se tornar um programador versatil e cficiente, e com os dados assimilados até aqui ja é possivel construirmos nosso primeiro programa. Obviamente sera algo com uma légica muito simples, para utilizarmas somente os comandos ja vistos. O importante € que vocé analise e entenda a aplicagio desses comandos, a formatacao do arquivo, os comentarios, enfim, 0 projete come um todo, e naa s6 a simplicidade das suas operacoes. Para comegar, pensaremos num sistema que possua somente um botao ¢ um led. O led seré utilizado para representar o estado do botao, isto é, aceso para 0 botdo pressionado e apagado para o botao liberado. Para este primeiro exemplo, mostraremos © esquema ¢létrico completo. Nos préximos, consideraremos o hardware proposto no apéndice F. = 1 BOTAG E LED = EX1 7 DESBRAVANDO 0 PIC DESENVOLWIDO PELA MOSAICO ENGENHARIA E CONSULTORIA WERSKO: 1.0 DATA: 11/06/99 DESCRICAO DO ARQUIVO SISTEMA MUITO SIMPLES PARA REPRESENTAR O ESTADO DE UM BOTO POR METO DE UM LED re ARQUTVOS DE DEPINIGORS WINCLUDE ; ARQUIVO PADREO MICROCHIP PARA 16F8q jy Se Ge SW TORE Ee See RE ak BN ZR ie PAGINACKO DE MEMRIA iDEFINIGAG DE COMANDOS DE USUARIO PARA ALTERACAO DA PAGINA DE ¢MEMORIA #DEFINE BANKO BCF STATUS,RPO #SETA BANK 0 DE MEMORIA #DEFINE BANK] BSF STATUS,RPO 7SETA BANK 1 DE MAMGRTA rk VARIAVEIS +; DBFINIGAO DOS NOMES B ENDERECOS DE TODAS AS VARIAVETS UTILIZADAS 7; PELO SISTEMA CBLOCK Ox0c 7ENDEREGO INICTAL DA MEMORIA DE #USUARIO WTEMP ;REGISTRADORES TEMPORARTOS PARA STATUS_TEMP ; INTERRUPCOES ;ESTAS VARIAVEIS NEM SERko UTT- ;LIZADAS ENDC ;PIM DO BLOCO DE MEMORIA FLAGS INTERNOS DEFINIGAO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA CONSTANTES DEFINICGKO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA Programagio ENTRADAS . DEFINICAO DE TODOS OS PINOS QUE SERKO UTILIZADOS COMO ENTRADA RECOMENDAMOS TAMBEM COMENTAR 0 SIGNTFICADO DE SEUS ESTADOS (0 E 1) #DEPINE: ROTAO PORTA, 2 #PORTA DO BOTKO 0 => PRESSIONADG + 1 +> LIBBRADC “he satpas. * 7 DEPINICKO DE TODOS OS PINOS QUE SERKO UTILIZADOS COMO SAiDA ; RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 E 1) DEFINE LED PORTA, O 2 PORTA DO LED ~> APAGADO . ; 1 => ACESO aa VETOR DE RESEP ORG 0x00 ;ENDERECO INICIAL DE PROCESSAMENTO GOTO: INICIO INICIO DA INTERRUPCAG ee Bake ewe ae ae Ree Re Rte OW TRO aC AS INTERRUPQOES NAO SERAO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR TODO © SISTEMA EXISTENTE NO ARQUIVO-MODELO PELO APRESENTADO ABAIXO ESTE SISTEMA NAO E OBRIGATORIO, MAS PODS EVITAR PROBLEMAS PUTUROS ORG = 0x04 ENDERECO INICIAL DA INTERRUPCAQ. RETFIE RETORNA DA iNTERRUPGAG a InfcIO DO PROGRAMA * INICIO af RANKL t4q TALTERA PARA © BANCO 1 MOVLW B'00000100" MOWIF TRISA DEFINE RA2 COMO ENTRADA = DEMAYS ;C0MO SATDAS: MovEM B'00900000° MOVHF TRISB ;DEFINE TODO 0 PORTB COMO SATDA MOVEW B‘ 10000000" MOVWF OPTION_REG ;PRESCALER 1:2 NO TMRO ULL-~UPS DESABILITADOS Desbravanda a PIC ;AS DEMAIS CONFG, SAO TRRELEVANTES MOWLW B‘900D0000" MOVWF INTCON JTODAS AS INTERRUPCOES DESLIGADAS | BANKO @RETORNA PARA © BANCO 0 See eee eR DE ee ee eng pa a BREE eS oe INICIALIZAGAO DAS VARTAVEIS . CLRE PORTA HLIMPA © PORTA, | CLRF PORTE sLIMPA © PORTB e ROTINA PRINCIPAL * MAIN BIFSC BOTAO ;0 BOTHO ESTA PRESSTONADO? SOTO BOTRO_LIB iNAO, ENTKO TRATA BOTAO LIBERADO GOTG BOTAD_PRES ;SIM, ENTAO TRATA BOTAO PRESSTONADO BOTAO_LIB. RCF LED ;APAGA O LED GOTO | MAIN 7RETORNA AO LOOP PRINCIPAL BOTAO_PRES BSF LED ;ACENDE © LED GoTo MAIN FRETORNA AO LOOP PRINCIPAL at FIM DO PROGRAMA * END FOBRIGATORTO FAZENDO OPERACOES ARITMETICAS BASICAS © préximo passo deve ser dado na diregdo dos célculos. Basicamente, todos os programas implementados nes microcontroladores necessitam de algum tipo de conta para que sua légica funcione corretamente. Neste capitulo, veremos que a matematica nao € o ponto forte das instrugdes do PIC 16F84, Nao diretamente, mas veremos também que ele possui todos os recursos necessarios para que Possamos implementar as nossas préprias fungdes para célculos muito mais avangados; basta um pouce de conhecimento e muita criatividade. Bem, mas vamos comecar pelos célculos mais simples possiveis, as contas basicas de adigao ¢ subtracao. SOMANDO (INCE, INCFSZ, ADDWE E ADDLW) Para operagdes de adigao, o assembler do PIC possui dois grupos de instrugdes, sendo um usado para adicoes unitdrias e o outro para adigdes diversas. Dentro desses grupos, possuimos um total de quatro instrugées as quais serao mostradas juntamente com suas descrigdes por meio da técnica de termos predefinidos. INCF: Incremento unitario (INC) do registrador (F). INCFSZ: Incremento (INC) do registrador (F) pulando a préxima linha (8) se 0 resultado for 0 (Z) ADDWE: Soma (ADD) 0 valor de work (W) ao registrador (F). ADDLW: Soma (ADD) um niimero (L) a0 valor de work (W). A sintaxe correta para cada uma dessas instrugdes pode ser vista em seguida: €¢ registrador e do destino onde serd © resultado da conta (f + 1 -> dj é 0 registrador ¢ do destino ende iguardado o resultado da conta (£ + 1 -> dd; em que f 66 vegistrador e do destine onde serd uardado o resultado da conta (£ + W -> d) ADDL ie fem que k é o niimero que ger4 somado ac W resultado ¢ mantido em W (W + ki? Ww) ADDWE fd A instrugdo INCF é utilizada nermalmente para controlar contadores unitarios dentro do sistema ou para fungdes cspecificas. Por exemplo, vamos olhar um cédigo que chama uma rotina denominada BIP por oito vezes seguidas: CRLF CONTA TERA O CONTADOR Loop: CALL BIP ;CHAMA A ROPINA BIP QUE EMITIRA UM SON INCF CONTA, F FINCREMENTA © CONTADOR (CONTA = CONTA + 1) BIFSS CONTA,3 ;TESTA O BIT NUMERO 3 DO CONTADOR. QUANDO ;ESTE BIT FOR HIGUAL A 1, SIGNIPICA QUE CONTADOR = 8. GoTo LOOP NTADOR AINDA NAO # 8, RETORNA PARA LOOP FIM FCONTADOR = 6, ACABOU 0 EXEMPLO ‘Observe que nds checamos o valor do contador por meio da andlise de um de seus bits. Est4 é uma maneira muito utilizada pelos programadores, mas também muito restrita, pois s6 permite comparagdes com os valores relacionados a cada um dos bits pela regra da poténcia de 2 (1, 2, 4, 8, 16, 32, 64 © 128). Na verdade, a comparagao poderia ser feita em relagao a qualquer valor, mas teriamos de uti instrugdes ainda nao estudadas, por isso esta técnica foi empregada neste exemplo. Ja a instrucio INCFSZ € bem mais poderosa, pois, além do incremento, ela faz também uma comparagio para poder tomar uma decisao. Apds cada incremento, ela verifica se o resultado € igual a zero. Bem, mas quando uma soma de um ntimero 74 Desbravande 0 PIC positivo resulta em zero? Na matematica convencional, isto nunca acontecera, mas na aritmética de 8 bits, como no PIC, este é um resultado muito normal. Isto porque quando trabalhames com ntimeros de 8 bits, sempre que o limite de 255 é ultrapassado, o valor retorna para zero. Desta forma fica facil criarmos um contador especifico utilizado a instrugao INCFSZ, bastando para isso iniciarmos o contador com a diferenga entre 256 ¢ o ntimero de vezes que desejamos contar. Vejamos o exemplo anterior, sé que agora com um looping de dez vezes: MOVLW 246 MOVWF = CONTA ;INICIA © CONTABOR COM 246 (256 - 10) LOOF CALL BIB ;CHAMA A ROTINA BIP QUE EMITIRA UM SOM INCPSZ CONTA,F ©; INCREMENTA 0 CONTADOR (CONTA = CONTA + 1) ;RESULTADG = 0 (ESTOROU?) GoTo LOOP ;NHO, RETORNA PARA LOOP POIS NAO PASSOU 10 VEZES FIM SIM, ACABOU 0 EXEMPLO POIS JA PASSOU 10 VEZES Veja agora um exemplo para as instrugdes ADD, que sio utilizadas para somatérios diversos. 5 MOVEW .10 MOWwF NUM_1 pINICIA NUM_1 CoM 10 MovLW .20 MOWWF NUM_2 FINICIA NUM_2 COM 20 CLRF RESULTADO =; INICTA RESULTADG com 0 SOMAL }RESPOSTA = NUM_1 + 5 MOVE NUM_1,W ;COLOCA O VALOR DE NUM_1 (10) EM Ww ADDLW 5. 7SOMA 5 AD W {10+5=19) MOVWE RESULTADO =; COLOCA A RESPOSTA EM RESULTADG = 18 SOMAZ ;RESPOSTA = NUM_1 4 NUM_2 MOVE NIMLI,W ;COLOCA O VALOR DE NUM_1 (10) BM Ww ADDWF NUM_2,W ;SOMA O VALOR DE W (10) A NUM_2 (20) ;GUARD.EM W MOVWE RESULTADO =; COLOCA A RESPOSTA EM RESULTADO = 30 FIM ;FIM DO EXEMPLO Essas instrugdes afetam os trés flags relacionados a ULA do registrador de STATUS: C, DC e Z. Podemos checar o estado desses registradores para tomar decisGes conforme o resultado da conta efetuada. Por exemplo, imaginemos que precisamos somar trés registradores quaisquer, Como cada registrador possui 8 bits, para que nao haja erros, o resultado deveria ser guardado em um registrador de pelo menos 10 bits. Mas como fazer isso se as instrugdes sé operam com 8 bits? O flag de carry (STATUS, C) ird nos auxiliar nesta tarefa. 0 exemplo seguinte mostraré a soma de quatre némeros quaisquer (NUM_1 . NUM_3), guardando a resposta em dois bytes (BYTE_ALTO ¢ BYTE_BAIXO): Programagao PIMAGINEMOS QUE NUM_1, NUM2, © NUM_3 ESTAO COM VALORES QUATSQUER CLRF BYTEBAIXO ©; INICIA BYTE_BAIXO CoM 0 CLRF BYTE_ALTO =; INICIA BYTE_ALTO CoM 0 MOVF NUM_1.W MOVE O VALOR DE NUM_1 PARA Ww ADDWE NUM_2. br ;S0MA O VALOR DE WA NUM_2 GUARDANDO NO PROPRIO Ww BIFSC STATUS,C iA CONTA RESULTOU EM UM ESTOURO? INC BYTE_ALTO,F 51M, INCREMENTA 0 BYTE_ALTO aNKo MOVWE BYTE_BAIXO — ;COLOCA A RESPOSTA DA CONTA (W) EM BYTE_BAIxO ADDWE NUM_3.W 2SOMA © RESULTADO ANTERIOR (W) A NUM_3 GUARDANDO 7NO PROPRIO W BIFSC STATUS, tA CONTA RESULTOU EM UM ESTOURO? INCF BYTE_ALTO,F ;SIM, INCREMENTA 0 BYTE_ALTO 7NEO MOVWF BYTE_BAIXO ;COLQCA A RESPOSTA DA CONTA EM BYTE_BAIXO FIM PIM DO EXEMPLO COM RESPOSTA EM BYTE_ALTO iE BYTE_BAIXO SURTRAINDO (DECF, DECFSZ, SUBWF E SUBLW) As instrugdes para subtracao seguem os mesmos princi & adigdo, Vejamos entao quais sao elas: DECF: Decremento unitario (DEC) do registrador (F). DECFSZ: Decremento (DEC) do registrador (F) pulando a préxima linha (S) seo resultado for 0 (Z) SUBWF: Subtrai (SUB) 0 valor de work (W) do registrador (Fh. SUBLW: Subtrai (SUB) de um ntimero (1) o valor de work (W). Asintaxe correta para cada uma destas instrugdes pode ser vista em Sseguica: jos das vistas em relacdo DECF = f,d_ jem que f € © registrador e do destino onde sera rguardado © resultado da conta (£ - 1 -> d) DECFS2 £.b iem que £ 6 0 registrader « do destine onde sera squardado 9 resultado da conta (£ - 1 => d) SUBWF f,d jem que £ 6 0 registradox ¢ d o destino onde serd iguardado © resultado da conta (£ - W-> dj SUBLW =k jem que k € a nthero de onde serd subtraide o valor de W 10 Fesultado 6 mantido em W (k ~ W-> i} Analogamente aos exemplos dados na segio relativa 4 adi¢ae, vejamos a aplicagao da instrugdo DECFSZ para radar a funcao BIP por dez vezes: MOVLH 20 MOWWF CONTA =; INICIA @ CONTADOR com 10 oP CALL = BIP ;CHAMA A ROTINA BIP QUE EMITIRA UM som DECFS2 CONTA,F ;DECREMENTA 6 CONTADOR (CONTA = CONTA - 1) ;RESULTADO = 0 (RCABOU?) soTo) | «LOOP iNAO, RETORNA PARA LOOP POTS NEO PASSOU 10 VEZES Fin iSIM, ACABOU_O EXEMPLO Observe que para esse tipo de contador a utilizagao da instrugao DECFSZ no lugar da INCFSZ torna 0 programa mais facil de entender. As instrucdes SUB so utilizadas para subtragGes diversas: MOVE 10 MOVWE = -NUM_1 INICIA NOM_1 cow 10° MoviWw 20 MOWNE = NUM_2 PINICIA NUM_2 COM 20 CLR RESULTADO ;INICTA RESULTADO COM 0 SUB1 ;RESPOSTA = 30 - NUM_1 MOVE -NUM_1,@ © ;COLGCA 0 VALOR DE NUM_1 (10) EW sUBLH 30 [SUBTRAL WDE 30 (30 - 10 = 20} MOVWE RESULTADO ;COLOCA A RESPOSTA EM RESULTADO = 20 SuB2 ;RESPOSTA = NUM_2 - NUM_1 Move oNUML1,W © ;COLOCA O VALOR DE wum_1 (10) EM GUBWE © NUM.2,W ;SUBTRAT © VALOR OE W (10) De MUM 2 (20) => Wf MOVWF RESULTADO ;COLOCA A RESPOSTA EM RESULTADO = 10 FIM FIM DO EXEMPLO Aqui também podemos observar que, 40 contrario das instrucSes de adicio, a ‘cordem dos fatores para a subtracéo afeta diretamente 0 resultado. Em uma soma, o resultado pode ser zero ou positive, mas na subtragao ele pode ser zero, positivo ou negativo. Por meio da andlise do flag de carry podemos concluir qual a resultado correto da subtracao: Negativo: Sempre que o resultado da subtracio for negativo, o carry sera zero {0). Neste caso, o valor da resposta nao sera diretamente o mimero negative, ¢ sim a sua diferenga para 256. Po : Sempre que o resultado for positive, 0 carry sera um (1). Zero: Sempre que o resultado for zero, 0 carty serd um (1). Neste caso, o flag de zero também serd um (1). Vejamos entao um exemplo para a subtracao de dois niimeros quaisquer: NUM_1I ¢ NUM_2. 0 médulo do resultado seré colocado em RESP € © flag NEG sera setado sempre que o resultado for negativo: TIMAGINEMOS QUE NUM_1 © NUM_2 ESTRO COM VALORES QUATSQUER CLRF RESP ;LIMPA © REGISTRADOR ONDE SERA COLOCADA A RESPOSTA SUBL ;Num_2 - NUM_1 = RESP MovF NUM.1,W 9 ;MOVE © VALOR DE NUM_1 PARA W SUBWF NUM_2,W ;SUBTRAI O VALOR DE W (NUM_1) DE ;NUM_2 GUARDANDO EM W BIFSS STATUS,C ;TESTA CARRY. RESULTADO NECATIVO? GOTO ‘TRATALNE :SIM, PULA PARA TRATAR RESULTADO NEGATIVO ;NKO, RESULTADO POSITIVO OU ZERO MOVE RESP FCOLOCA © RESULTADO DIRETAMENTE EM RESP BCF NEG PLIMPA FLAG DE NUMERO NEGATIVO Goro FIM i FINALIZA Programagao [RRTA jes 7CCMD © FESULTADO FOE NEWATIVO, EWING RESP = 256 - w_ ;COMO © NUMERO MAXIMO PARA @ BITS E 255, ENTEO 1256 -> 0 SUBLW 20 jO-W => MOVWF RESP s8OLOCA 9 RESULTADO EM RESP BSF NEG #SETA O FLAG DE NUMERO NEGATIVO. FIM #PIM DO EXEMPLO, COM O MODULO DO RESULTADO EM RESF As instrugdes SUB afetam também os flags DC e Z do registrador STATUS, AS COMPARACOES MAIOR QUE, MENOR QUE E IGUA Como acabamos de ver, as instrugdes SUB afetam diretamente o flag de carry, e Por meio dele podemos identificar se o resultado foi negativo, pasitivo ou zero. Desta forma podemos identificar também se um niimero & maior, menor ou igual 4 outro. Para isso, utilizaremos a instrugdes SUBWF canforme o exempl FTMAGINEMOS QUE NUM_1 E Ntn|2 SKO DOTS RBGISTRADORES Com VALORES QUATSQUGE COMPARA MOVF NUM_1,W (OVE G VALOR DE NUM_1 PARA W SUBWF NUM_2,W HSUBTRAI O VALOR DE W (NUML1) DR 7NUM_2 GUARD, EM W BIFSS STATUS,c ;TESTA CARRY. RESULTADO NEGATIVO? GOTO RESPL SIM, ENTAO NUM_2 < NUM_1 (NUM_1 > NUM_2) SOTO RESP2 iwkO, ENTAO NUM_2 >= NUM_1 (NUM_1 <= NUM_2) FIM PIMAGINEMOS AGORA QUE NUM_1 # UM NUMERO QUALQUER (LITERAL) 75 NUM_2 B UM REGISTRADOR COM VALOR QUALQUER COMPARA MOVLW NUM #MOVE O NUMERO MUM_1 PARA Ww SUBWF NUM_2,W #SUBTRAI © VALOR DE W (NUM_1} DE MUM_2 ;GUARD. EM W BIFSS STATUS,¢ TESTA CARRY. RESULTADO NEGATIVG? GOTO RESFL iSIM, ENTAO NUM_2 < NUM_1 (NUML1 > NUM_2) GOTO RESP2 iNKO, ENTKO NUM_2 >= NUM_1 (NUM_1 <= NUM_2) FIM MULTIPLICANDO (RLF) Nao existem instrugées especificas de multiplicacao dentro da linguagem do PIC 16F84. No entanto, elas podem ser “construidas” utilizando as instrugdes vistas, Além disso, uma nova instrugdo, a RLF, ajudaré muito na hora de multiplicar um mimero. Vamos dar uma olhada na descricao desta instruga } RLF: Rotaciona (R) um bit para a esquerda (L) do registrador (F). Desbravando o PIC Asintaxe dessa instrucao é a seguinte: rem que £ @ 0 registrador e do destino onde serd iguardado a resultade da_retacéo £4 Puxa, mas 0 que a rotacdo tem a ver com a multiplicac3o? © que esta instrugio faz realmente? Na verdade, ela simplesmente desloca todos os bits do registrador para a esquerda, colocando o valor de carry no bit zero e depois *jogando" 0 valor do bit 7 em carry. Veja 0 préximo esquema para uma melhor compreensaa; r 0 Registrador © 6715/4]3]2]2]0 Tpo|aja T Tpolit Carry TET S 74] 212] 2]9 TEPEESEC T o(ifojisiypssifa T i ES Ea Ee i/oyifi}el]i jaya Figura 11.3 —Rotagao de 1 Bit para « Esquerda. Resultado Acontece que, matematicamente falando, se garantirmos que o bit que entra na posigao menos significativa (bitQ) seja zero, entdo cada vez que rotacionames o byte para a esquerda, estamos multiplicando seu valor por 2. Desta farma, se 0 byte for rotacionado trés vezes, seu valor sera multiplicado por 8 (2x2x2). Esta é uma forma simples ¢ rapida de multiplicacio, mas sé podemos efetuar contas om paténcias de 2. Neste caso, assim como nas contas de adico, o resultado da multiplicagao pode precisar de mais de 8 bits. O préximo exemplo mostra um registrador sendo multiplicado por aita: ;IMAGINEMOS QUE NUM_1 E UM REGISTRADOR COM VALOR QUALQUER CLRF BYTE_BAIXO ;LIMPA © REGISTRADOR BYTE_BAIXO. CLRP BYTE_ALTO = ;LIMPA 0 REGISTRADOR BYTE_ALTO MULTE RCF = STATUS,.C FLIMPA © CARRY RLF = NUM_1, JMULTIPLCA POR 2 (NUM_1 = NUM_1 x 2) RLF BYTE_ALTO,F ;ROTACTONA BYTE_ALTO PARA PEGAR O BYTE PERDIDO" NA CONTA RLF 0 NUM_1,F ;MULTIPLCA POR 2 (NUM_1 = NUM_1 X 4) RLF © BYTE_ALTO,F ;ROPACIONA BYTE_ALTO PARA PEGAR 0 BYTE "PERDIDO" NA CONTA RLF NUM_1,F iMULTIPLCA POR 2 (NUM_1 = Programacdo RLF = BYTE_ALTO,F ;ROTACIONA BYTE_ALTO PARA PEGAR O BYTE “PERDIDO- NA CONTA MOVF NUM_1.M :MOVE A PARTE BAIXA DA CONTA PARA W MOVWF BYTE_BAIXO ;ACERTA © VALOR DE BYTE_BAIXO FIM NESTE EXEMPLO © VALOR DE NUM_1 FOT ALTERADO Uma outra forma de efetuarmos multiplicagées com fatores que podem ser diferentes das poténcias de 2 € por meio de somas sucessivas. Esta técnica, porém, é muito mais lenta, variando o tempo de multiplicagao de acordo com o valor de um dos ntimeros (no exemplo = NUM_1): HIMAGINEMOS QUE NUM_1 E NUM_2 SEO REGISTRADORES COM VALORES QUATSQUER IMPA © REGISTRADOR BYTE_BATXO IMPA © REGISTRADOR BYTE_ALTO. LRF BYTE_BAIXO CLRF = BYTE_ALTO MULT NUM_L X NUM_2 MOVE -NUM_2,W MOVE © VALOR DE NUM_2 PARA W ADDWF BYTE BAIXO,F ;SOMA NUM_2 AO VALOR JA EXISTENTE BIFSC STATUS,C HOVE ESTOURO? INCF BYTE_ALTO,F ;SIM, INCREMENTA BYTE_ALTO AO DECFSZ NUM_1, © }DECREMENTA NUM_1. ACABOU? Goro MULT (0, CONTINUA SOMANDO- SIM, SOMA SUCESSIVA TERMINADA FIM jNESTE EXEMPLO O VALOR DE NUM_1 FOI ALTERADO Neste exemplo, a varidvel NUN_I ndo pode ser zero, pois neste caso a primeira vez que a instrugio DECFSZ fosse aplicada, NUN_1 eqiiivaleria a 255, e a multiplicagdo ficaria totalmente errada. Para corrigir este problema, antes de entrarmos na soma sucessiva, o valor de NUN_1 deve ser testado. No caso de zero, a multiplicagdo nem é feita. DIMIDINDO (RRF) A diviséo é a pior de todas a contas basicas que pademos fazer dentro de um microcontrolador (e fora dele também), principalmente porque aqui s6 podemos trabalhar com ntimeros inteiros. Analogamente ao que foi visto na secao de multiplicagio, podemos utilizar a instrucao RRP para conseguirmos um efeito contrario & instrugdo RLF. Vamos dar uma olhada na descricdo dessa instrugdo: RRF: Rotaciona (R} um bit para a direita (R) do registrador (FJ. A sintaxe dessa instrucao é a seguinte: RRE fd sem que f é o registrador e do destino onde sera iquardads o resultado da retagde O esquema mostra a rotagao com a utilizacéo 0 carry: 80 Desbravand O esquema mostra a rotagio com a utilizagao 0 carry: Registrador P Inicio ial DB SALE ETE] Processo Resultado Figura 11.4 ~ Rotagaa de 1 Bit para a Direita. No caso da divisdo, o resultado (parte inteira) caberé em um Gnico registrador de 8 bits, mas 0 resto da divisio poderd ser perdido por meio do carry. J IMAGINEMOS QUE NUM_1 E UM REGISTRADOR COM VALOR QUALQUER priva BCF STATUS, C ;LIMPA © CARRY BRE | -NUM_1,F HDIVIDE POR 2 (NUMLL = NUMA / 2) RRE = -NUM_1,F :DIVIDE POR 2 (NUM_L = NUM_L / 4) FIM NESTE EXEMPLO O VALOR DE NUM_1 POL ALTERADO. +E Q RESTO DA DIVISAO POI PERDIDO Jaa divisio por niimeros que nao sejam poténcias de 2 é extremamente mais complexa que a multiplicagao, pois nao existe uma maneira andloga ao processo de somas sucessivas, sendo o algoritmo necessario para tal operacdo, detalhado demais para o escopo deste livro, EXEMPLO 2 - CONTADOR SIMPLIFICADO Neste exemplo, utilizaremos as fungdes de incremento e decremento para implementar um contador bem simplificado. Duas constantes (MIN e MAX) sao utilizadas para especificar os valores limites para a contagem. A téenica de comparagao, vista na se¢Zo anterior, é aplicada para checar esses limites. Em relagio ao EXEMPLO 1, melhoramos a checagem do botdo pela implementacao de um filtro muito simples. Para considerarmos que o botao foi realmente pressionado, 0 pino relative ao botao é checado yarias vezes seguidas. Quanto mais vezes checamos, mais tempo o botdo tem de ser realmente pressionado para efetuar a fungao. A constante T_FILTRO ajusta a quantidade de vezes da checagem. Ao atingir o valor maximo, o contador passa a decrementar o valor até que o limite minimo seja novamente alcangado, voltando a0 inicio do processo. O valor do contador ¢ mostrado de forma bindria no PORTS. CONTADOR SIMPLIFICADO - Bx2 ¥ DESBRAVANDO © PIC . DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA * VERSKO: 1.0 DATA: 11/06/99 . DESCRICKO DO ARQUIVO SISTEMA MUITO SIMPLES PARA INCREMENTAR ATE UM DETERMINADO * VALOR (MAX) E DEPOIS DECREMENTAR ATE OUTRO (Hin) : ze ARQUIVOS DE DEFINICOES @INCLUDE ZARQUIVO PADRAQ MICROCHIP PARA 16F84 ae PAGINACAO DB MEMORIA * HDEPINICAO DZ COMANDOS DE USUARIO PARA ALTERAGAO DA PAGINA DE MEMORIA DEFINE BANKO ECF STATUS, RPO SETA BANK 0 DE MEMORIA #DEFINE BANK] BSF STATUS,RPO #SBTA BANK 1 DE MEMORTA VARIAVEIS * DEFINIGAO DOS NOMES © ENDEREGOS DE TODAS AS VARTAVEIS UTILIZADAS ) PELO STSTEMA EBLOCK Ox0C FENDERECO INICIAL DA MEMORIA DE ;USUARTO WTEMP #REGISTRADORES TEMPORARIOS PARA ‘STATUS_TEMP ; INTERRUPQUES HESTAS VARIAVEIS NEM SERAO UTILTZADAS CONTADOR iARMAZENA © VALOR DA CONTAGEM PLAGS sARMAZENA OS FLAGS DE CONTROLE PILTRO sFILTRAGEM PARA O BOTAG END =FIM DO BLOCO DE MEMORIA i* PLAGS INTERNOS #. : DEFINICAO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE SENTIDO PLAGS, 0. PFLAG DE SENTIDO 70 => SOMANDO 1 => SUBTRAINDO 82 Desbravando o PIC CONSTANTES DEFINICAO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU 10; VALOR MENIMO PARA © CONTADOR MAX EQU 300 | VALOR MAXIMO PARA © CONTADOR TLFILTRO EQU +230 ; FILTRO PARA BoTKO * ENTRADAS ” ; DBFINICRO DE TODOS OS PINOS QUE SERKO UTILIZADOS COMO ENTRADA 7 RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADG DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO PORTA,2 FPORTA DO BOTKO 5 0 -> PRESSTONADO ¢ 1 -> LIBERADO * SAIDAS 7 DEFINICKO DE TODOS Of PINOS QUE SERKO UTILIZADOS como saAfDA 7 RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 E 2) WETOR DE RESET 2 ORG 0x00 ; ENDERECO INICIAL DE PROCESSAMENTO GoTo INTCTO os INICIO DA INTERRUPCAG : 7 AG INTERRUPCOES NAO SERAO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR TODO © SISTEMA EXISTENTE NO ARQUIVO-MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NAO # OBRIGATORIG, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 FENDEREGO INICIAL DA INTERRUPCRO RETFIE FRETORNA DA INTERRUPGRO Inicio DO PROGRAMA * INTCTO 3 BANK2 ZALTERA PARA O BANCO 1 MOVLH B‘o009Ra00 MOUWF TRISA #DEFINE RA2 COMO ENTRADA E DEMAZS #CoMO SAIDAS MOVLN B°80000000 MOVWF TRISB iDEFINE TODO © FORTE Como SADA (Programagda MOVLW B'10000000" MOVWE OPTION _REG MOVLW B'00000000" MouWe INTCON BANKO CLRF PORTA CLRF PORTB. KOVIN MIN MOVWF CONTADOR: en ere MAIN MOVLW T_FILTRO. 1 MOVWF FILTRO | cueca_sr BIFSC BOTAO oro. MAIN i { DECFSZ FILTRO,F i \ Goro cHECA_ET TRATALBT BIPS$ SENTIDO GOTO SUA SUBTRAT DECF CONTANOR, F MOVIN MIN SUBWE CONTADOR, Ww BIFSC STATUS,C GOTO ATUALIZA INGF CONTADOR, F BCF SENTIDO. GOTO MAIN SoMa ;PRESCALER 1:2 NO THRO ;PULL-UPS DESABILITADOS: 3S DEMAIS CONPG. SKO IRRELEVANTES TODAS AS INTERRUPQUES DESLIGADAS RETORNA PARA 0 BANCO 0 INTCTALTZAGAO DAS VARIAVEIS * ;LIMPA O PORTA 7LIMPA O PORTB PINECIA CONTAGOR = V_INICTAL ROPINA PRINCIPAL . JINICIALIZA FILTRO = T_FILTRO 30 BOTAO ESTA PRESSIONADO? iNAG, ENTAO CONTINUA ESPERANDO 4ST :DECREMENTA © FILTRO DO BOTAO ;TERMINOU? iNKO, CONTINUA ESPERANDO iI :DEVE. SOMAR {SENTIDO=0)? iSTM inko ;DECREMENTA 0 CONTADOR :MOVE © VALOR MINTO PARA W ;SUBPRAT © VALOR DE W (MIN) DE CONTADOR TESTA CARRY, RESULTADO NEGATIVO? ;NKO, ENTAO COWTA >= Min :SIM, ENTKO conta < Min }INCREMENTA CONTADOR NOWAMENTE ;POLS PASSOU DQ LIMITE :MUDA SENTIDO PARA SOMA VOLTA AO LOOP PRINCIPAL Desbravande o PIC

You might also like