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 INGF CONTADOR, ;INCREMENTA O CONTADOR MOVLW MAX ;MOVE © VALOR MAXIMO PARA W SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MAX) DE CONTADOR BIFSS STATUS,C {TESTA CARRY. RESULTADO NEGATIVO? SIM, ENTAO CONTA < MAX iNAO, ENTAO CONTA >= MAX GOTO ATUALIZA BSF SENTIEO :MUDA SENTIEO PARA SUBTRAGAG GOTO | MAIN {VOUTA AO LOOP PRINCIPAL ATUALIZA : MOVE CONTADOR,M © ;COLOCA CONTADOR EM Ww MOWWF PORTE ZATUALIZA © PORTS PARA see ee :VISUALIZARMOS O VALOR DE CONTADOR Srsew bit Bess MSorno +0 BOTAO CONTINUA PRESSIONADO? coro §-1 2SIM, ENTRO ESPERA LIBERAGAO PARA QUE © CONTADOR NAO DISPARE GoTo MAIN #NAO, VOLTA AO LOOP PRINCIPAL FIM DO PROGRAMA . END jOBRIGATORIO TRABALHANDO DIRETAMENTE COM BYTES Muitas vezes, pelos mais diversos motivos, precisamos operar diretamente com os valores dos bytes guardados nos registradores, seja para efetuar uma conta, uma mdscara ou filtro ou ainda uma comparacao. AS: como em qualquer outra linguagem, no assembler do PIC possuimos instrugdes para as operagées légicas que trabalham com bytes, operando bit a bit. Cada uma delas, ¢ também suas aplicagdes, serdo vistas separadamente nas secBes seguintes. AND (ANDWF E ANDLW) A operagao AND € um “E Iigico" entre dois bytes. Cada bit do primeiro byte é © comparado com o seu bit relative no segundo byte, resultando em um teres valor, conforme a tabela seguinte, que expressa uma multiplicagao: ALB olalols 0 a a wl-jclel> | C Observando os resultados mostrados na tabela, podemos compreender 0 porqué do nome AND (E). E que o resultado sé é 1 quando primeiro E o segundo bit sdo 1, Vejamos entao o resultado da operacdo AND em dois bytes quaisquer: As instriugdes responsaveis por esta operacdo dentro do assembler do PIC saa: ANDLW: Operagao “E” (AND) entre um nimero (L) e o valor de work (W). ANDWF: Operaco “E” (AND) entre 0 valor de work (W) e 0 registrador (F), Asintaxe dessas instrugdes € a seguinte: ANDLY K em que k é um dos mimeros ew @ © outro 70 resultade 6 mantido em W ANDYF £,d jem que £ é © registrador e @ o destino onde serd iguardade o resultado da operaciio Utilizamos a operagao AND sempre que desejamos “mascarar” um valor, forganda determinados bits para zero, Por exemplo: imagine que vocé esté trabalhando com um determinado registrador, mas antes de efetuar o Processamento necessario, deve ser garantido que o valor dele nunca seja maior que 15. Uma maneira muito eficiente de conseguir isto € por meio do mascaramento do registrador, isto é, forgaremos os 4 bits mais significativos para zero, Veja o cédigo para entender corretamente 0 pracesso: ;IMAGINEMOS QUE NUM_1 E UM REGISTRADOR COM VALOR QUALQUER MOVLW B*Q0Q01111" ;COLOCAMOS A “MASCARA” EM W. NESTE CASO, 77ERAREANS OS 4 BITS MATS SIGHIFICATIVOS (DIRETTAD ANDWE NUM_1,P FAPLICA A MASCARA AQ NUH_1 A PARTIR DE AGORA NUM_i ESTA ENTRE 0 F 1S Aregra de aplicacao da mascara para a operagdo AND é a seguinte: os bits em 1 (um) no afetam o resultado, j4 os bits em 0 (zero) forgam o resultado para zero também (lembre-se da relacao de multiplicacao). 86 Desbravande 0 PIC OR (IORWF E TORLW4 A operacio OR é um “OU légico” entre dois bytes. Exatamente como na operagio AND, cada bit do primeiro byte é comparado com 0 seu bit relative no segundo byte, resultando em um terceiro valor. Neste caso, entretanto, a tabela-verdade & diferente, expressando os resultados semelhantes a uma soma: Aes Bo | A+B o o oO 0 1 1 i o 1 1 1 i Observande novamente os resultados mostrados na tabela, podemos compreender também © motivo do nome OR (OU). Desta vez, o resultado é 1 quando 9 primeira OU o segundo bit é 1. Vejamos entao o resultado da operacgao OR nos mesmos bytes mostradas na operagao AND: ByteT=| 0 1 1 0 O to pytez | o | o | 1 0 1 1 1 0 OR 0 1 1fol[i 1 1 1 As instrugdes responsaveis por esta operagao dentro do assembler do PIC sao: IORLW: Operacao QU (IOR) entre um numero (L} ¢ 0 valor de work (W). IORWF: Operacao OU (OR) entre o valor de work (W) ¢ 0 registrador (F) Asintaxe dessas instrucées é a seguinte: TORLWk vem que k & um dos niimeres e W € o outro yo resultado mantido em W TORWE£,d jem que f € 0 registrador ¢ d o destino onde sera iguardado o resultado da operacie Assim coma a opera¢ao AND, esta operagao também é utilizada para “mascar um valor, s6 que com efeito contrario, pois ela forga os bits para 1 (um). A regra de aplicagio da mascara para a operagdo OR é a seguinte: os bits em 0 (zero) nao afetam o resultado, jd os bits em 1 (um) forcam o resultado para 1 (um) também. XOR (XORWF E XORLW) Existe uma terceira operagao légica que é o XOR, ou “OU exclusivo". Esta operagao é muito semelhante ao OR ja analisado, com a diferenga de que dois bits em 1 resultam em @ (zero). Vejaa tabela-verdade seguinte: Programagao A B AGB o oO a 0 1 1 1 a 1 a 0 A légica simplificada desta operacao é que dois bits iguais resultam em 0 (zero), enquanto bits diferentes resultam em 1 (um). Vejamos entao o resultado da Operagdo XOR nos mesmos bytes mostrados nas operacdes anteriares: Byte 1 0 1 1 0 o [ft 1 1 | Byte? | 0 1 0 ft I 0 XOR ofa 0 0 1 0 o 1 As instrucGes responsaveis por esta operacdo dentro do assembler do PIC sia: XORLW: Operacio OU exclusiva (XOR) entre um niimero [L) e 0 valor de work Mw). XORWF: Operacao OU exclusiva (XOR) entre o valor de work (W) eo registrador (F). Asintaxe dessas instrucdes é a seguinte: ‘XORLW k yem que k é um dos wimeros @ Wo outro 7@ resultado é mantido em W XORW F.d jem que f é 0 registrader © do destino onde serd iguardade © resultado da operacso Uma aplicacéo muito comum para a operagio XOR é a comparacdo entre dois himeros, Como a comparacio é feita bit a bit, e sempre que os bits forem iguais o resultado é zero, entdo se os nimeros forem iguais, © resultado final sera zero também: CREF CONTA 2ERA 0 CGNTADOR LOOP CALL BIP sCHAMA A ROTINA BIP QUE EMITIRA UM SOM INCF CONTA, HINCREMENTA O CONTADOR (CONTA = CONTA + 1) MOWLW 5 MOVE 5 PARA O WORK XORWE CONTA, W ;MOR ENTRE CONTA E 5 (comparacKo) BIPSS STATUS, z ;0 RESULTADO DA OPERRCAD FOI ZERO? 60TO Loop NAO, ENTAO CONTADOR DIFERENTE DE 5 ; CONTINUA Pine SIM, CONTADOR = 5, ACABOU 0 EXEMPLO Para testar se o valor de um registrador é igual a zero, existe uma maneira ainda mais simples e que utiliza menos instrugdes, sendo, portanto, mais rapida. Voce se lembra de que, quando vimos a instrugio MOVE, deixamos de explicar o porqué da possibilidade de movermos um registrador para ele mesmo? Pois aqui Desbravando o PIC esti o motivo. Sempre que um registrador com valor zero € movido, mesmo que seja para ele mesmo, 0 flag de zero é setado. Desta forma, fica muito simples descobrirmos se um registrador 6 zero ou nao: VIMAGINEMOS QUE NUM_1 £ UM REGISTRADOR COM VALOR QUALQUER Move NUM_1,F {MOVE 0 VALOR DO REGISTRADOR PARA ELE MESMO BIFSS STATUS, 2 }O RESULTADO DA OPERAGKO FOI ZERG? GOTO DIF MEO, ENTRO NUM_1 DIFERENTE DE ZERO GOTO ZERO ;SIM, ENTAO NUM_1 IGUAL A ZERO __| Outra aplicagdo também muito eficiente para a operagdo XOR é a inversao de um flag ou de um pino de saida, Imagine uma fungao que deve simplesmente inverter o estado de um sistema por meio de um flag denominada LIGADO, \dependentemente do estado anterior: 7PLAG QUE DETERMINA © ESTADO DO SISTEMA ; 0 -> DESLIGADO ; 1 -> LIGADO WOEFINE LIGADO FLAGS,0 }IMRGINEMOS QUE LIGADO # UM FLAG QUE PODE ESTAR BM QUALQUER BSTADO (0 OU 1) Inversio MOVLW B’Oo000001" FOOLOCAMOG A “MISCARAT EM W. NESTE CASO DEVENS ;OOLGCAR 1 NOS BITS QUE DESSIAMOS INVERTER KORWF FLAGS, F :DEVEMOS APLICAR A OPERAGHO DIRETAMENTE AQ PREGISTRADOR FLAGS, ONDE ESTA ARMAZENADO }O FLAG QUE DEVEMOS INVERTER RETURN GFINALIZA A _ROTINA Este mesmo tipo de cédigo pode ser aplicado também a uma porta para a inversiio da saida, para fazer, por exemplo, um led ficar piscando. COMPLEMENTO (COMF} A operacdo de complemento, ao contrario das anteriores. trabalha com apenas um byte, invertendo o valor de cada um de seus bits. Ela recebe este nome porque, ao fazermos esta operacao, estamos encontrando o complemento do ntimero em relacao a 255 (OxFF). Por exemplo, o complemento de 0 é 255, delé 254, de 2 6 253 e assim sucessivamente. Veja 0 efeito pratico da operacao sobre o valor de um byte qualquer: eee 1 a a) 1 0 0 o fo Byte 0 Gomplemento | 1 A instrugio responsdvel por esta operagao dentro do assembly do PIC é: COMF: Operacao de complemento (COM) do registrador (F). A sintaxe dessa instrucao é a seguinte: COMP fd rem que £ 4 0 registrador e do destine onde serd iguardade o resultado da operacae INVERSAO (SWAPF) A tiltima operagao implementada dentro do assembler do PIC ¢ a Swap, que em portugués significa troca. Seu efeite sobre um byte é a inversao entre os 4 bits mais significativos e os 4 menos significativos. Veja o esquema seguinte para um melhor entendimento: Registrador F (_tafeto] 7/*]5]4]3]2]1]0 TPT] t [tf ope lee Process 7/6 oO Figura 11.5 ~ Esquema da Instrucéo Swap. CONTANDO TEMPO E CRIANDO DELAYS A contagem de tempo dentro de sistemas micrecontrolados é extremamente utilizada e importante. Uma vez que o sistema é digital e preciso (o nivel de precisdo depende do oscilador), 0 tempo pode ser facilmente mensurado, facilitando o gerenciamento de eventos, a freqiiéncia de funcionamento de determinadas tarefas ¢ muito mais. w a | x ‘0 tempo dentro do PIC pode ser medido de trés maneiras: = Contondo os ciclas de mdquina por meio de loopings; = Contando os cictos de méquina por intermédio do contador timer 0 (TMRO); ow = Contando pulsos externas por meio da entrada TOCKI ¢ do TMRO. As duas primeiras téenicas so as mais utilizadas ¢ dependem diretamente da freqiiéncia de trabalho do oscilador do sistema. A terceira, por sua vez, depende Desbravando PIC exclusivamente de um sinal externo, e pode ser facilmente utilizada para contar tempo com base nos 6OHz da rede elétrica. CONHECENDO MELHOR O TIMER 0 E O PRESCALER O timer 0 € o melhor auxiliar para a contagem do tempo dentro do PIC. Ele nada mais é que um contador automéatico de & bits para os ciclos de maquina ou pulsos externos. O timer 0 é armazenado diretamente na RAM do sistema na posi¢ao 0x01 e é denominado internamente como TMRO. Para que o TMRO seja realmente poderoso na sua fungdo de contagem do tempo, o bit TOCS do registrador OPTION permite escolher a maneira como ele sera incrementado: por meio dos ciclos de maquina (TOCS = 0) ou de pulsos externas (TOCS = 1). No caso do TMRO estar sendo utilizado para a contagem de pulsos externos, por meio do pino 3, é importante checar também o estado do bit TOSE (OPTION) que ira dizer ao sistema se o incremento devera ser feito na borda de subida (TOSE=0) ou na borda de descida (TOSE=1) do pulso. O TMRO incrementado por pulsos externos pode ser utilizado para muitas outras finalidaces além da contagem de tempo, tais como: freqiiencimetros, contadores ete. ‘Caso o prescaler esteja em 1:1, a cada ciclo de maquina ou pulso o TMRO & incrementado em uma unidade. Quando mudamos 0 valor do prescaler, afetamos diretamente o incremento do TMRO. Por exemplo, caso o presealer esteja ajustado em 1:8, serao necessdrios & ciclos de maquina ou pulses para que o TMRO seja incrementado. Nao se esqueca que para que isto realmente funcione, © prescaler deve estar aplicado ao TMRO, © nao ao WDT (veja o bit PSA do registrador OPTION), UTILIZANDO 0 TIMER PARA MARCAR TEMPO Uma vez definida e ajustada a forma como o TMRO serd incrementado, o préximo passo € definirmos a base de tempo que itd compor o sistema. Para isso, precisamos inicialmente da freqiiéncia do oscilador. Em todos os exemplos deste livro, utilizaremos uma freqiiéncia padrao de 4MHz, mas os valores podem ser ajustados de acordo com as suas necessidades. Como ja explicamos anteriormente, os ciclos de maquinas do PIC rodam numa freqiiéncia quatro vezes menor que © clock principal. Neste caso, entao, a freqiiéncia interna é de IMHz, ou seja, um ciclo acontece a cada Ips. Esta é, portanto, a nossa primeira base de tempo. Mas suponhamos que o que realmente queremos € uma rotina que demore Ims. Para atingirmos este objetivo, devemos trabalhar com duas variaveis: 0 valor do TMRO e¢ © prescaler (PS). Por exemplo, inicialmente regularemos o PS para 1:4. Nestas condigdes, seriam necessarios 250 incrementos do TMRO para contar Ims, certo? Acompanhe a canta: Tempo do ciclo (ips) x prescale (4) x TMRO (250) = ims Programapo Vejamos entdo o cddigo de uma fung3o que aguarda Ims: 7CONSIDEREMOS QUE O PS ESTA CONPIGURADO EM 1-4 DELAY :ROTINA DE Ims CURE THRO 7LIMPA © TIMER 0, ESTE COMANDO LIMA TAMBEH 0 PS Dit MOVLW .250 SUBWF TMRO,W ;SUBTRAL O TMRO GE 250 GUARDANDO EM Ww BTFSS STATUS,C TMRO >= 250 ? GOTO DLL 7RAO, AINDA NAO ACABOU 0 TEMPO. CONTINUA ESPERANDO RETURN ZSIM, PINALIZA A ROTINA Esta rotina no é extremamente precisa, pois o TMRO pode ser incrementado em qualquer uma das linhas. Por isso nao devemos arriscar a confiar simplesmente na comparacao de igualdade, pois, dependendo do PS e do tamanho da rotina, 0 ‘TMRO pode ultrapassar o valor limite antes de passar pela instrugio de comparagio. A maneita mais precisa de contar o tempo seri vista pasteriormente na secao de interrupgoes. Uma outra mancira de implementar esta rotina é iniciarmos © TMRO com 6 (256- 250) e depois ficar esperando o TMRO chegar em zero. Neste caso, fica mais di efetuar a comparagao “maior ou igual”. Outra observacao importante que pedemos fazer sobre este cédigo é o fato de que, como 6 TMRO é incrementado automaticamente, nao é obrigatério ficarmos parados dentro de uma rotina para contarmos © tempo. Isto pode ser feito na rotina principal do sistema. UTILIZANDO REGISTROS TEMPORARIOS PARA CRIAR DELA Quando precisamos de uma rotina especifica para a perda de tempo (delay), similar ao tiltimo cédigo apresentado, ¢ mais recomendado contar o tempo por meio de registradores tempordrios, liberando assim o TMRO e também o prescaler. Lembre-se de que se o PS estiver sendo utilizado no TMRO, ele nao podera ser usado no WDT, e logo vacé descobrira que isto pode fazer muita falta. A idéia aqui é criar contadores dentro de outros contadores para contar a quantidade certa de ciclos de maquina ¢, conseqiientemente, o tempo. O segredo € calcular corretamente a quantidade de ciclos utilizados para cada looping. Para isso, lembre-se que instrugdes que geram desvios, tais como: GOTO, CALL, BTFSS, BTFSC, DECFSZ ¢ INCFSZ, podem utilizar 2 ciclos, ¢ nao 1. Veja o codigo para uma mesma retina de ims: Desbravando o PIC DELAY PROTINA DE ims MOVEN .250 MOVWF TEMP1 ;INTCIA TEMP1 com 250 DL_1 Nop ;PERDE UM CICLO SEM EPETUAR AGO DSCFS2 TEMPL,F ;DECREMENTA © CONTADOR TEMP1. ACABOU? GoTo DL_1 ;NAO, CONTINUA ESPERANDO RETURN ;SIM, FINALIZA A ROTINA ;LEMBRE-SE QUE MAIS 6 CICLOS SERAO GASTOS NAS ;INSTRUGOES CALL, RETURN E NA INICIALIZACAO DO TEMPA Desta forma, cada looping (DL_1) dura quatro ciclos, que dura 4s. Como o contador TEMP! sera decrementado 250 vezes, a rotina dura Ims. Observe que para acertar a duragao do looping em 4 cictos, foi utilizada a instrucdo NOP. Ela simplesmente nao faz nada, mas gasta um ciclo. Essa instrugio deve ser usada quantas vezes forem necessdrias, sempre que vocé precisa’ “gastar" algum tempinho. 8 Dica: 2 NOPs seguidos podem ser substituidos por GOTO §-+1, que também perde 2 cielas. Caso a rotina tenha que durar mais tempo, outros contadores auxiliares podem ser criadas, iniciados ¢ decrementados. Basta estruturar o codigo corretamente e calcular os valores exatas. EXEMPLO 3 - PISCA-PISCA Este exemplo dedica-se ao emprego de delays e¢ inversio de estados por meio da operacio XOR. Ao invés de piscarmos um simples led, piscaremos um grupo inteiro, definido pela constante DISPLAY. Desta forma, serd possivel mantermos um numero, ou outro simbolo qualquer, piscando no display. A constante DISPLAY sera definida conforme os segmentos que devemos acender para construir 0 simbolo desejado, Os botdes | ¢ 2 (RAI ¢ RA2) sero utilizados para alterar o valor da variavel CONTADOR, mudando com isso a freqtiéncia do pisca- pisca. As constantes MIN e MAX definem os limites para o CONTADOR e¢, consegiientemente, para a freqiiéncia. Observe que a rotina DELAY foi feita para multiples de milissegundos, mas nao foi precisamente calibrada, pois desconsiderou os tempos gastos para entrada, saida e alguns processamentos internos. ol PISCA-PISCA = EX3 + ie DESBRAVANDO © PIC * im DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA ‘ = WERSAO: 1.0 DATA: 11/06/99 * Programagéo DESCRIGAO DO ARQUIVO i* PISCA-PISCA VARIAVEL PARA DEMONSTRAR A IMPLEMENTACEO DE * DELAYS E A INVERSAG DE PORTAS. * i ARQUIVOS DE DEFINIQOES * SINCLUDE #ARQUIVO PADRAO MICROCHIP PARA 16F84 ‘* PROT Co: DE MEMORIA a sPEFINICAO DE COMANDOS DE USUARTO PARA ALTERACKO Da PAGINA DE MEMORIA #DEFINE BANKO BCP STATUS, RPO PSETA BANK 0 DE MEMORIA #DEFINE BANK] BSF STATUS, RPO SETA BANK 1 DE MAMORTA VARIAVEIS . FRR Soke See We ee BYE W beg Guede wl ecace we 7 DEPINICKO Dos NOMES E ENDERECOS DE TODAS AS VARTAVEIS UTTLIzaDAS + PELO STSTEMA BLOCK Ox0e #ENDERECO INTCTAL DA MEMORIA DE USUARIO W_TEMe #REGISTRADORES TEMPORARIOS PARA STATUS_TEMP ; INTERRUPCOES sESTAS VARTAVEIS NEM SERKO UTILIZADAS CONTADOR iBASE DE TEMPO PARA A PTSCADA FILTRO iFILTRAGEM PARA 0 BOTKO TEMPOL JREGISTRADORES AUXILTARES DE TEMPO ‘TEMPO2 ‘TEMPOS ENDC #FIM DO BLOCO DE MEMORIA * PLAGS INTERNOS * 2 DEFINICKO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA * CONSTANTES Ee DEFINTCAD DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA [ee BQU 10 ) ae EQU 240 \step | Bou ws MULTIPLG | ZOU os ;A CONSTANTE DISPLAY REPRESENTA 0 SiMBOLG QUE APARECERA PISCANDO NO PDISPLAY. 1=LED LIGADO E O=LED DESLIGADO. A RELAGAO ENTRE BITS E +SEGMENTOS E A SEGUINTE: 'EDC.BAFG* abet Let aconde em 3 a kbs 4 a : oo ra. ft * 3 $ : 9 ¥ i et “e f z = 4 5 DISPLAY EQU -BTLO0101011' ; (LETRA H} (Wik ERD Cele SWS Me Wee whee GW eke eee ec * ENTRADAS * DEFINIGRO DE TODOS OS PINGS QUE SERRO UTILIZADOS COMO ENTRADA RECOMENDAMOS TAMBEM CGMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) 4DEPINE Brl PORTA, 1 FBOTAO 1 - INCREMENTA 7 0 -> PRESSIONADO ¢ 1 -> LIBERADO WDEFINE BT2 = PORTA,2 ;BOTRO 2 - DECREMENTA 7 0 -> PRESSIONADO 7 1 +> LIBERADO * SMIDAS * } DEFINTCRO DE TODOS OS PINOS QUE SERAO UTILIZADOS COMO SATDA } RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 E 1) VETOR DE RESET = ORG 0x00; ENDERECO INICIAL DE PROCESSAMENTO coro INICIO ee ee a ae ee * INiCrO DA INTERRUPCAO * AS INTERRUFCOES NEO SERAO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR TODO © SISTEMA EXISTENTE NO ARQUIVO-MODELO PELO APRESENTADO ABAIXO ESTE SISTEMA NKO # OBRIGATGRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG = (Oxdd sENDERECO INICIAL DA INTERRUPCAO RETFIE PRETORNA DA INTERRUPGAQ Programagaa + ROTINA DE DELAY * 2 ESTA ROTINA AGUARDA ‘TANTOS MILTSSEGUNDOS QUANTO 0 VALOR PASSADO POR W. POR EXEMPLO, SE W = .200, ELA AGUARDARA 200 MILISSEGUNDOS. 0 DELAY PRINCIPAL DURA Ims, POIS POSSUI 5 INSTRUCGES (Sus) BE # RODADO 200 VEZES (TEMPC1). PORTANTO 200 * Sus = Ima. © DELAY PRINCIPAL & RODADO TANTAS VEZES QUANTO FOR 0 VALOR DE TEMPO2, 0 QUAL & INICIADO COM © VALOR PASSADO EM W. spn ple, DeLay eat eee MOVIE TEMPO2 samteza tea fy con O Valen” ;PASSADO EM W DLL MovEW 200 MOVE TEMPO2 bbz 7ESTE DELAY DURA lms (5*200) Boroowsge fos8le Sase denls lous Nop d i DECES2 TEMPOI,F DECREMENTA TEMPOL. acagotr? coro pL2 NEO, CONTINUA AGUARDANDO 7SmN DECFS2 TEMPO2,F ©; DECREMENTA TEMPO2. ACABOU? GOTO DLL #NAO, CONTINUA AGUARDANDO 7m RETURN et tNfcIo DO PROGRAMA * imrcr0 BANE iALTERA PARA © BANCO 1 MOVEW B*00000110 MOvWE TRISA ;DBPINE RAL E 2 COMO ENTRADA E DEMATS :OMo SAiDAS MOVEW B‘oD009000" MOVWF TRISB #DEFINE TODO © PORTR Como safpA MOVLM B' 10000000" MOVWF OPTION_REG ;PRESCALER 1-2 NO THRO ;PULL-UPS DESABILITADOS AS DEMATS CONFG. SKO ITRRELEVANTES MownW B*90000000° MOWWE INTCON FTODAS AS INTERRUPCOES DESLIGADAS BANKO #RETORNA PARA O BANCO 0 CLRF PORTA MOVLW DISPLAY MOVWF PORTE MOVLW MIN JO MOVWF CONTADOR MAIN MOVE CONTADOR, w CALL DELAY BESS BL Goro INCREMENTA BIFSS BT2 GOTO DECREMENTA DECFS2 TEMPO3 , F SoTo MAINI HOVLW DISPLAY XORWF PORTE, F GOTO MAIN! DECREMENTA MOVLW STEP SUBVF CONTADOR, F MOVLW MIN SUBNF CONTADOR, W BIPSC STATUS,C GOTO MAIN INICIALY2AGRO DAS VARIAVETS FLIMPA O PORTA ;ACENDE 0 VALOR CERTO NO DISPLAY VINICIA CONPADOR COM VALOR MIN. ROTINA PRINCIPAL, }INECIA COMTADOR DE MULTIPLICACAO. ;BOIS OS TEMPOS GERADOS POR DELAY iSKG MUITO PEQUENOS, GERANDO FREQ. JMUITO ALTAS PARA A VISUALTZACEO. #COLOCA CONTADOR EM W PARA CHAMAR A ROTINA DE DELAY #CHAMA ROTINA DE DELAY #BOTAO 1 PRESSTONADO? SIM, DEVE INCREMENTAR sNAO #BOTRO 2 PRESSIONADO? :SIM, DEVE DECREMENTAR iRko :DECREMENTA CONTADOR DE MULT. ACAROU? NAO, CONTINUA AGUARDANDO :SIM FAPGS TRANSCORRIDO O TEMPO, IRA INVERTER O$ LEDS CORRETOS POR NETO sDA MASCARA “DISPLAY" EB DA OPERACKO #XOR HINVERTE LEDS -> PISCA COMBCA NOVAMENTE OD ene LPN A ;DECREMENTA O CONTADOR EM STEP ;MOWE O VALOR MiNIMO PARA W ;SUBTRAT O VALOR DE W (MIN) DE CONTADOR ;TESTA CARRY. RESULTADO NEGATIVO? iNKo, ENTAO CONTA >= MIN ;SIM, ENTAO CONTA < MIN Progremagéo MOVLW MIN MOVWF CONTADOR CERTA CONTADOR NO MINIMO, POIS ASSOU DO VALOR BTFSS BT2 TAO 2 CONTINUA PRESSTONADO? GoTo §-1 IM, AGUARDA LIBERACAG iO coro MAIN sVOLTA AO LOOP PRINCIPAL INCREMENTA, MOVLW STEP ADDWF CONTADOR,F ;INCREMENTA 0 CONTADOR EM STEP MOVE © VALOR MAXIMO PARA W UETRAI O VALOR DE W (MIN) DE CONTADOR ‘ESTA CARRY. RESULTADO NEGATIVO? TM, ENTHO CONTA < MAX 0) Gefades =vifiiy i8KO, ENTKO CONTA >= MAX! _ MOVLW MAX SUBYF CONTADOR, W BTPSS STATUS.C GoTo MAIN FACERTA CONTADOR NO MAXIMO, POIS PASSOU DO VALOR BIFSS BT1 iBOTAO 1 CONTINUA PRESSIONADO? GOTO §-1 SIM, AGUARDA LIBERAGKO. #NAO GoTo MAIN VOLTA AQ LOOP PRINCIPAL FIM DO PROGRAMA END ;OBRIGATORIO OPERANDO DIRETAMENTE COM O PROGRAM COUNTER Como ja dissemos anteriormente, existe um SFR denominado PCL que sempre contém o enderego da meméria de programa que serd executado em seguida. O interessante desse registrador é que se alterarmos diretamente 0 seu valor, mudamos também 6 ponto de execugao do programa. Mas tome muito cuidado com essas alteragdes para que seu programa nao va parar em um ponto desconhecido. USANDO 0 PCL PARA ESCOLHER ENTRE VARIAS ROTINAS Uma das aplicagdes ideais para trabalhar diretamente com 6 PCL é a necessidade de desviar para uma rotina especifica de acordo com um determinado indice. Por exemplo, suponhamos que um sistema possua um teclado de seis botées que sdo monitorados por uma rotina especifica. O ntimere do botao pressionado (1 a 6) € colocado na varidvel TECLA. Se nenhum botao estd pressionado, entio TECLA = 0. Veja agora o cédigo que chamard a retina certa, dependendo da tecla pressionada: Desbravando o PIC ‘TRATA_TECLA FROTINA DE TRATAMENTO DA TECLA MOVLW B'00000111" ANDWF TECLA,W ;MASGARA TECLA PARA LIMITAR VALOR EM 7 ADDWF PCL, F AD PCL PARA PULAR PARA O PCNTO CERTO GOTO SEM_TECLA -> NEO HA TECLA PRESSIONADA GOTO TECLAL => PULA PARA ROTINA TECLA1 GOTO TECLAZ > PULA PARA ROTINA TECLA2 GOTO TECLA3 -> PULA PARA ROTINA TECLAI GOTO TECLAd -> PULA PARA ROTINA TECLA4 GOTO = TECLAS -> PULA PARA ROTINA TECLA5 GOTO TECLAG -> PULA PARA ROTINA TECLAS GOTO _BRRO -> NAO EXISTE O mascaramento do indice para limitar seu valor antes de somé-lo ao PCL &é extremamente importante para evitar que um erro de célculo trave 0 sistema. Como o PCL controla somente os 8 bits menos significativos do program counter, essa rotina nunca pode ser implementada entre blocos da meméria de programacao (cada blaco possui 256 enderegos). USANDO 0 PCL PARA MONTAR UMA TABELA DE VALORES Outro exemplo de aplicagao para alteragdo do PCL é a criacao de uma tabela na area de programacdo. O conceito € muito similar ao apresentado anteriormente, s6 que em vez de desviar para rotinas especificas, um mimero € retornada ditetamente para cada valor do indice. Podemos utilizar essas tabelas, por exemplo, para converter valores nas mais diversas aplicagdes: CONVERTE FROTINA DE CONVERSKO (NUM * 3 + 2) MOVLW B°00000111° ANDWE NUM, W MASCARA NUM PARA LIMITAR VALOR EM 7 ADDWF FCL,F SOMA TECLA AO PCL PARA PULAR PARA O PONTO CERTO RETLW .2 :NUM = 0 -> RETORNA 2 RETLW 5 ;NUM = 1 -> RETORNA 5S RETLM 8 sNUM = 2 -> RETORNA 8 RETLW .11 sNUM = 3 -> RETORNA 11 RETLW .1d ;NUM = 4 => RETORNA 14 RETLW .17 FNUM = 5 -> RETORNA 17 RETLW .20 FNUM = 6 <> RETORNA 20 RETLW .23 aNUM = 7 -> RETORNA 23 EXEMPLO 4 - CONTADOR MELHORADO , © exemplo 4 € um aperfeigoamento do exemplo 2, com a utilizacao de dois botGes para incrementar e decrementar o contador unitariamente. Outra grande diferenga entre os exemplos em questdo é que agora o valor do contador é mostrado no display de forma hexadecimal, ¢ nic mais nos leds de forma binaria. Para isso, utilizamos © recurso de soma do program couter (PC) para criarmos Programagao 99 uma tabela de conversdo. Como sé temos um display, temos de nosso contador em OF (15). ee CONTADOR MELHORADO - EX4 : DESBRAVANDO © PIC . DESENVOLVINO PELA MOSAICO ENGENHARTA E CONSULTORIA * VERSA: 1.0 DATA: 11/06/99 $ TLCS cee ee ae ee eo DESCRIGKO DO ARQUIVO * CONTADOR QUE UTILIZA DOIS BOTOES PARA INCREMENTAR B DECRE- MENTAR © VALOR CONTROLADO PELA VARIAVEL "CONTADOR". ESTA VARIAVEL ESTA LIMITADA PELAS CONSTANTES “MIN* E “MAX © VALOR DO CONTADOR # MOSTRADO NO DISPLAY. * ARQUIVOS DE DEFINICGES * WINCLUDE @ARQUIVO PADRAG MICROCHIP PARA 16F84 PAGH DE MEMORIA * FDBFINIGAG DE COMANDOS DE USUARIO PARA ALTERACAO DA PAGINA DE MEMORTA % #DEFINE BANKO BCF STATUS, RPO =SETA BANK 0 DE MEMORIA #DEFINE BANK1 BSP STATUS, RPO ;SETA BANK 1 DE MANORIA VARIAVEIS 45 G0y tee EW We eee we alee ele Sele HE HEE Re BEFINICAO DOS NOMES E ENDERECOS DE TODAS AS VARIAVETS UTILIZADAS : PELO SISTEMA CBLOCK Ox0C FENDEREGO INICIAL DA MEMORIA DE ;USUARTO W_TEMP ;REGISTRADORES TEMPORARIOS PARA STATUS_TEMP ; INTERRUPCOES: FESTAS VARIAVETS NEM SERAO UTI- :LEZADAS CONTADOR ;ARMAZENA © VALOR DA CONTAGEN FLAGS FARMAZENA OS FLAGS DE CONTROLE FILTROL ;FILTRAGEM PARA Q BOTAO 1 FILTRO2 :FILTRAGEM PARA 0 BOTAO 2 EMDC FIM DO BLOCO DE MEMORIA 100 Desbravando a FIC Me TCA MOURA LACERL ‘ FLAGS INTERNOS: } DEFINIGAG DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA, #DEF INE ST_BTl FLAGS, 0 STATUS DO BOTAO 1 *DEFINE ST_BT2 FLAGS, 1 FSTATUS DO BOPEO 2 a CONSTANTES # DEPINIGAO DE TODAS AS CONSTANTES UTILIZADAS PELO STSTEMA MIN EQU -o HVALOR MINIMO PARA O CONTABOR MAX EQU 15 7VALOR MAXIMO BARA © CONTADOR T_FILTRO EQU +255 =; FILTRO PARA BOTAO = ENTRADAS DEFINIGAO DE TODOS OS PINOS QUE SERAO UTILTZADOS COMO ENTRADA 7 RECOMENDAMOS TAMBEM COMENTAR 0 SIGNIFICADO DB SEUS ESTADOS (0 = 1) #DEPINE BOTAOL PORTA, 1 FPORTA DO BOTAO 0 => PRESSIONADO 1 -> LIBERADG (DEFINE BOTAO2 PORTA, 2 PORTA DO BoTKo ; 0 -> PRESSIONADO j 1 -> LYBERADO 7° SATDAS 4 + DEFINICAO DE TODOS OS PINOS QUE SERAO UTILIZADGS como SATDA + RECOMENDAMOS TAMBEM COMENTAR © SIGNYFICADO DE SEUS ESTADOS (0 & 1) sf VETOR DE RESET © ORG 0x00; ENDEREGO INICIAL DE PROCESSAMENTO GOTO INECTO “ INicto DA INTERRUPCAG + AS INTERRUPCOES NAO SERAO UTILIZADAS, POR ISSO PODEMOS SUSSTETUTR TODO 0 SISTEMA EXISTENTE NO ARQUIVO-MODELO PELO APRESENTADO ABATXO 7 ESTE SISTEMA WAQ E GBRIGATORIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG = Ox04 FENDEREGO INICIAL DA INTERRUPCAO RETFIE FRETORNA DA INTERRUPCAO Programagéo 101 i” ROTINA DE CONVERSAO BINARIO -> DISPLAY * ESTA ROTINA IRA RETORNAR EM W, © SIMBOLO CORRETO QUE DEVE SER MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTABOR. 0 RETORNO JA ESTA FORMATADO PARA AS CONDICDES DE LIGAGAO DO DISPLAY AO PORTE. a ee 3 “hb 3 a : fe *¢ ’ 7 a8 CONVERTE MOVF CONTADOR,W — ;COLOCA CONTADOR EM Ww ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR iCONSIDERAR SOMENTE ATE 15 ADDF PCL, F JBCEDC.BAFG' ; POSTCKO CORRETA DOS SEGMENTOS RETLW B'11101110' ; 00 - RETORNA sfMBOLO CORRETO RETLW B‘00101000' 01 - RETORNA simBoLo CORRETO RETLW B'12001101° 02 - RETORNA siMBOLO CORRETO RETLW B'01101101' ; 03 ~ RETORNA SimBoLO CoRRETO RETLW B'00101011' ; 04 - RETORNA simpoLO CORRETO RETLW B'01100111° 05 - RETORNA SiMBOLO CORRETO RETLW B'1i100111' ; 66 - RETORNA SiMBOLO CORRETO RETLW B'00101100' ; 67 - RETORNA SiMBOLD, CORRETO RETLW B'121101111' ; 08 - RETORNA simsoLo CORRETO RETLW B'01101211° 09 - RETORNA SIMBOLO CORRETO RETLW B'10101111' ; 10 ~ RETORNA SiMBOLO CORRETO RETLW B'11100011' ; 11 - RETORNA siMmoLo CORRETO RETLW B'11000110" 12 - RETORNA SiMBOLO CORRETO RETLW B'11101001' ; 13 = RETORNA SiMBOLO CORRETO RETLW B'11000211' 14 - RETORNA SIMBOLO CORRETO RETLW B'10000111' ; 15 - RETORNA S{MBOLO CORRETO aaaoTewedAMeaunra InfcTo BO PROGRAMA *. INICIO ‘BANK ;ALTERA PARA O BANCO 1 MOVLW B*00000120" MOVWF TRISA ;DEPINE RAl E 2 COMD ENTRADA E DEMAIS ;comO SAIDAS MOVLM B:00000000" 102 Desbravanda o PIC NOWWF NOVLI MOWWE MOVLW NOWWE BANKO ie MAIN HOVLW MovWE MOVWE ECA_BTL BIFSC GOTO TRISE B+10000000" OPTION_REG B'o9000000" INTCON PORTA PORTE FLAGS MIN courapor ATUALIZA T_FILTRO FILTROL PILTROZ BOTAOL BT1_LIB iSIM DECFSZ FILTROL,F © ;DECREMENTA © FILTRO DO HOTRO | TERMINOU? GOTO CHECALBT1 =; NAO, CONTINUA ESPERANDO ;SIM BIFSS ST_BTL ;BOTAC JA ESTAVA PRESSIONADO? coro | DEC NEO, EXECUTA ACKO co BOTKO GOTO CHECA_BT2 SIM, CHECA BOTAO 2 Brl_Lis BCE ST_BT1 sMARCA BOTKO 1 COMO LIBERADO cHECA_Br? BIFSC BOTAG2 70 BOTKO 2 ESTA PRESSIONADO? GoTo) | BTZ_LIB iWKa, ENTAO TRATA COMO LIBERADO SIM DECFSZ FILTRO2,F © ; DECREMENTA © FILTRO Do BOTAO a TERMINOU? GOTO «CHECALBT2 ©; NAO, CONTINUA BSPERANDO :SIM ;DEFINE TODO O PORTB COMO SAIDA. RESCALER 1:2 NO TMRO :PULL-UPS DESABILITAOS ;AS DEMAIS CONFG. SEO IRRELEVANTES ;TODAS AS INTERRUPGUES DESLIGADAS ;RETORNA PARA O BANCO 0 INICTALIZAGHO DAS VARTAVEIS ;LIMPA © PORTA :LIMPA © PORTB AMPA TODOS Of FLAGS ;INICIA CONTADOR = MIN TUALIZA G DISPLAY INTCTALMENTE ROTINA PRINCIPAL * NICIALIZA FILTROL = T_FILTRO pINICIALIZA FILTROZ = T_FILTRO 70 BOTAO 1 ESTA PRESSIONADO? NAO, ENTAO TRATA COMO LIBERADO Programagdo 103 BIFSS ST_BT2 core INC GOTO MAIN BT2_LIB. BCF © ST_BT2 GoTo | MAIN DEC BSF ST_ET1 MOVE CONTADOR XORLW MIN BIFSC STATUS, 2 goto MAIN DECF CONTADOR, F Goro ATUALIZA INC BSF -ST_BT2 MOVE CONTADOR, Ww XORLW MAX BIFSC STaTus,z GOTO = MAIN INCF CONTADOR, F GOTO ATUALIZA RTUALIZA CALL CONVERTE MOVWE PORTE SOTO MAIN END TAO JA ESTAVA PRESSTONADO? iG, EXECUTA ACAO BO BOTAO SIM, VOLTA AO LOOPING MARCA BOTAO 2 COMO LIBERADO RETORNA AQ LOOPING JACRO DE DECREMENTAR JMARCA BOTKO 1 COMO JA PRESSTONADO :COLOCA CONTADOR EM Ww TAPLICA XOR ENTRE CONTADOR E MIN ;PARA TESTAR TGUALDADE. SE POREM FTGUAIS, © RESULTADO SERA ZERO 7RESULTOU EM ZERO? :SIM, RETORNA SEM AFETAR CONT. snKo J DECREMENTA © CONTADOR PATUALIZA O DISPLAY saCKO DE INCREMENTAR sMARCA BOTAO 2 COMO JA PRESSIGNADO FCOLOCA CONTADOR EM W 7APLICA XOR ENTRE CONTADOR E MAX 7PARA TESTAR IGUALDADE. SE FOREM ;TGUATS, © RESULTADO SERA ZERO ;RESULTOU EM ZERO? ;SIM, RETORN SEM APETAR CONT 2nKo INCREMENTA © CONTADOR ;ATUALIZA © DISPLAY iCONVERTE CONTADOR NO NUMERO DO : DISPLAY TUALIZA © PORTE PARA sVISUALIZARMOS 9 VALOR DE CONTADOR NO DISPLAY iNKO, VOLTA AO LOOP PRINCIPAL FIM DO PROGRAMA iOBRIGATORIO 104 ACESSO INDIRETO A MEMORIA Até aqui acessamos varias vezes a meméria do PIC, mas todas elas foram de forma direta, isto ¢, passando diretamente o endereco desejado como argumento de alguma instrucao. Mas existe uma outra maneira de acessarmos a meméria, por meio de registradores auxiliares, tornando © acesso indireto. O conceito é um pouco estranho, mas com o tempo vocé descobriré que este sistema € muito poderoso. TRABALHANDO COM FSR E INDF acesso indireto utiliza dois SFRs que séo denominados FSR ¢ INDF. Q primeira refere-se ao endereco que desejamos acessar e 0 segundo ao valor propriamente dito, que pode ser lido ou eserito. Se vocé j4 trabalhou com alguma linguagem de programagao que possui ponteiros, como o C++, vai reconhecer logo as semelhancas. Mas vejamos um exemplo pratico: a fungao do cédigo seguinte sera iniciar um bloca de X bytes da RAM com o valor 0 (zero). © bloco terd seu enderego inicial definido por INICIO_BLe 9 final por FIM_BL. INECO_BL BQU = =0XZ0) ; ENICIO DO BLOCO NA RAM FIM_BL EQU 0X2F | FIM DO BLOCO NA RAM LIMPA_BLOCO GROTINA DE LIMPEZA DA RAM MOVLW INTCrO_BL MOVWF FSR INICIA © PONTEIRO PARA © COMECO DO BLOCO LB_1 CLRF INDE ,F iNA VERDADE, ESTAMGS LIMPANDO O ENDEREQO EXISTENTE :NQ REGISTRADGR FSR MOVLY FIM BL XORWP FSR,W COMPARA © PONTEIRO COM O FIM DO BLOCO BIFSC STATUS, Z #JK LIMPOU 0 ULTIMO ENDERECO? RETURN iSIM, FINALIZA A ROTINA INCF FSR, F #NKO, INCREMENTA 0 PONTEIRO PARA ACESSAR © 7PROXIMO BYTE Soro ppt ;VOLTA AO LOOPING Existem muitas outras aplicagdes para 0 acesso indireto, mas nada melhor que o tempo e 0 uso para que vocé realmente as aprenda. EXPLORANDO AS INTERRUPCOES Finalmente, vocé podera conhecer ¢ explorar as potencialidades das interrupcées do PIC. Nesta segdo, vocé ira descobrir o quanto poderosas sao essas interrupgées e para que realmente elas servem. No decorter deste material, ja foi apresentada uma introducao e varias referéncias as interrupcdes, mas agora chegou a hora de nos aprofundarmos no assunto, aprendendo a trabalhar com Programogdo 105 elas. Maiores detalhes sobre a finalidade de cada uma das interrup¢des existentes podem ser revisados no capitulo 4. LIGANDO AS CHAVES CORRETAS A primeira operacao relativa ao uso das interrupgGes refere-se as suas chaves de habilitacao. Existem dois tipos de chaves: Individuais: S30 as chaves que habilitam ¢ desabilitam cada uma das interrupgdes individualmente (Geralmente denominadas Mascaras). Geral: Desabi todas as interrupgées simultaneamente, ou habilita todas aquelas que esto com suas chaves individuais ligadas. Portanto, para utilizarmos uma determinada _interrupg3o, devemos primeiramente ligar a sua chave individual, ligando depois a chave geral. Os exemplos praticos dessas chaves serdo vistos logo adiante. A.ESTRUTURA BASICA DA ROTINA DE INTERRUPCAO (RETFIE) Quando uma interrupg’o estiver habilitada (ligada), sempre que a aqao responsavel pela geracao dela ocorrer, o programa serd paralisado ¢ automaticamente desviado para o endereco 0x04, independentemente do tipo de interrupgao, Mas nao s¢ preocupe, o sistema guarda o local do programa que estava sendo executado para que ele possa retornar ao mesmo ponto apds a interrupcao ter sido tratada, Entretanto, para retornar da rotina de interrupgao, nao devemos utilizar as instrugées de retorno convencionais, ¢ sim trugao RETFIE. Antes de efetuar qualquer tarefa dentro da rotina de interrupgdo, lembre-se de que tudo que for alterado em relacao as variaveis do sistema permanecera desta forma, quando © sistema voltar a ser executado no ponto em que estava. Por isso, devemos ter muito cuidado com as varidveis, principalmente as tempordrias, que utilizamos enquanto estamos tratando a interrupgdo. Por exemplo, se no meio do programa estamos utilizando uma variavel denominada TEMP para guardar um valor qualquer temporariamente, ¢ dentro da interrup¢ao utilizarmos essa mesma varidvel para outra finalidade, quando voltarmos ao programa principal, poderemos ter alterado toda a ldgica do sistema. Com base nesta mesma observacdo, & necessdrio também que os registradores importantes ao funcionamenta do programa, tais como; 0 W ¢ 0 STATUS, nao sejam alterados. Mas como nio afetar esses registradores, se alguns de seus bits sdo controlados pelo préprio hardware? Nao existe uma maneira de mos que esses registradores scjam afetados durante o tratamento da interrupcao, pois eles sio necessirios para a execugdo de qualquer codigo. A tinica maneira de resolvermos o impasse, entio, é guardarmos os scus valores em registradores temporarios logo que entramos na interrupgao, para recuperd-los na hora de sairmos. 106 Desbravando o PIC Vejamos como fica a estrutura basica de uma rotina de tratamento de interrupsdes: intero DA INTERRUPCKO * } ENDERECO DE DESVIO DAS INTERRUPCOES. A PRIMEIRA TAREFA £ SALWAR OS + VALORES DE “W" E "STATUS" PARA RECUPERACAO FUTURA ORG 0x04 ;ENDEREGO INICIAL DA INTERRUPCAO MOVWE W_TEMP :COPIA W PARA W_TEMP SWAPP STATUS,W oo © 4 UG anes: 04 ay he oi MOVWP STATUS_TEMP ;COPIA STATUS PARA sharus ramp ROTINA DE INTERRUPCAO : i AQUI SERAO ESCRITAS AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS 3 INTERRUPGOES 7 ROTINA DE SAIDA DA INTERRUPCAO it 7 0S VALORES DE “W* E “STATUS* DEVEM SER RECUPERADOS ANTES DE ;} RETORNAR DA INTERRUPGAO SAI_INT SWAPF STATUS_TEMP,W MOVHF STATUS ;MOVE STATUS_TEMP PARA STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ;MOVE W_TEMP PARA W RETFIE Observe a maneira como W e STATUS sfio gravados na memoria em W_TEMP e STATUS TEMP. Este cddigo deve ser sempre repetida desta mesma maneira, para evitarmos alteragdes nos registradores enquanto estamos tentando grava- -los. A _utilizagio do SWAPF em substituigao ao MOVE evita a alteracao do STATU! ra_alguns modelos de PIC que possuem outros registradores Tiiportantes ao funcionamento, que também nao podem ser afetados pela interrupcao, tal como o PCLATCH, esta estrutura deve ser incrementada para salvar ¢ recuperar todos os registradores necessdrios. Outra dica extremamente til é que, como a interrupcao pode ocorrer a qualquer Momento, nao temes como saber qual era o banco de memGria selecianado no dado momento, Por isso, recomendamos que apdés gravar os valores de W e STATUS, vocé selecione um banco especifico com 0 qual ira trabalhar. CHECANDO QUAL FOI A INTERRUPCAQ OCORRIDA Agora que jd temos uma estrutura basica, que é tinica para tratar todo tipo de interrupgao, vocé deve estar se perguntando: Como vou saber, entdo, qual foi a interrupgao que aconteceu? Este seré nosso préximo passo, e vocé descabrira como € facil. S07 Programagao 8 Quande a agdo responsavel pela interrup¢ao acontece, o microcontrolador § ~ processa o seguinte algoritmo: \ (C Becca a agia >) Pe Desvia 9 programa pare Sola. ¢ fag relasve & intarupgao: L ‘So enederege O4H (TOIF ANTE, ABIF atc) l Fotina impiementaca plo pragramador eee para tratamanto ead ada? as imerrupges Esta rotina 56 6 fnaizaga j coors a metucte * ARETE lr encore oe ioe a y Pala sve gor (5) 3 ® & a Freon oo ttkno odor nav peal) carck angie a Grave enderege de reteana. Cae (PCs) na pina Figura 11.6 —Fluxograma das Interrupgoes. Desta maneira, quando uma interrupgao acontece, o flag relative a ela é imediatamente setado. Por meio desse flag sera possivel, entao, descobrir qual foi a interrupgao ocorrida. Observe que o flag € alterado automaticamente, mesmo que as chaves de habilitagao da interrup¢ao estejam desligadas, evitando que 0 desvio acontega. Isto pode ser utilizado, por exemplo, para executarmos uma tarefa relativa 4 agao da interrupgio, sem, contudo, entrarmos na interrup¢ao propriamente dita. Observe também que a chave geral (INTCON,GIE) é desligada automaticamente antes de © programa desviar para o tratamento da interrupgaa, senda religada, também automaticamente, através do RETFIE, antes de voltarmos dela. Isto é Necessario para que uma nova interrup¢ao nao aconteca durante o tratamento No entanto, é possivel religarmos o GIE manualmente dentro da rotina de interrupcao, para sobrecarregarmos o pracesso, mas isto deve ser feito com muito cuidado para nao travar © sistema. Neste caso, por exemplo, 0 We 0 STATUS deveriam ser gravados navamente em outras duas varidveis que nio o W_TEMP e o STATUS_TEMP. 1038 Desbravando a PIC Ao contra do GIE, os flags relativos as interrupg6es sao setados automaticamente pelo hardware, mas nao sao limpos por ele. A limpeza desses flags deve ser feita manualmente pelo software, como sera visto em seguida. Se isto nao for feito, uma nova interrup¢ao acontecera tao loge © programa saia da interrupgao atual, TRATANDO A INTERRUPCAO DE TIMER Como ela ocorre quando o TMRO estoura, pode ser usada para criar bases de tempo com extrema precisao. Acertando o prescaler ¢ o valor inicial do TMRO, podemos mensurar tempos nos mais diversas valores. Para que essa intertup¢do possa ocorrer, sua chave individual INTCON,TOIE deve estar ligada (1), Dentro da rotina de tratamento devemos testar o flag INTCON,TOIF, para sabermos se foi essa interrupgao que ocorreu. Antes de sairmos do tratamento, devemos limpar esse mesmo flag manualmente. Veja entao como fica um tratamento de interrupgaa de TMRO que gera uma base de tempo para piscar um LED. O resto da estrutura necessdria € 0 mesmo. apresentado anteriormente. ROTINA DE INTERRUPGKO. AQUI SERAO ESCRITAS AS ROTINAS DE RECONHECIMENTG E TRATAMENTO DAS INTERRUPCOES TESTEL BOPSS INTCON, TOIF goro SAT_INT. ;FOI INTERRUPCAO DE TIMER? sNAO, FINALIZA. ;OBS: SB OUPRAS INTERRUPQOES ESTIVEREM ATIVAS ;DEVE PULAR PARA TESTE ;SIM, TRATA INTERRUPGRO DE TIMER BCF INTCON,TOIF ;LIMPA FLAG DA INTERRUPCEO DECFSZ TEMPOl, F =; DECREMENTA TEMPO1, ACABOU? coro SAI_INT pNAO, FINALIZA A INTERRUPCAO SIM, ACABOU BASE DE TEMPO BIFSS LED ;LED ESTA ACESO? GOTO LED_ON NAO, ENTAO ACENDE LED_OFF ;SIM, ENTAO APACA BCF LED ;APAGA O LED coro FIM_TMRO ;PULA PARA FIM_TMRO ‘LED_ON BSF LED ;ACENDE 0 LED FIM_THRO MOVLW .100 MOVWE ‘TEMPOL ;REINICIA BASE DE TEMPO GOTO SAT_INT :FINALIZA A INTERRUPGAO i 3 Programacao 109 TRATANDO A INTERRUPCAQ EXTERNA A interrupgao externa € uma das mais usadas. Podemos emprega-la em vias de recepgio de dados, sinais externos importantissimos que devem ser tratados rapidamente, vias de sineronismo e muito mais. Essa interrupsio pode acontecer na borda de subida ou de descida do sinal. Para configurarmos qual das duas bordas deve gefar a interrupcdo, devemos acertar o valor do bit INTEDG do registrador OPTION. Quando esse bit esta em 1, a interrupgdo acontecera na subida do sinal, ¢ quando esté em 0, na descida dele. Para que essa interrup¢ao possa ocorrer, sua chave individual INTCON,INTIE deve estar ligada (1). Dentro da rotina de tratamento devemos testar o flag INTCON,INTF, para sabermes se foi essa interrupgo que ocorreu, Antes de sairmos do tratamento, devemos limpar esse mesmo flag manualmente. TRATANDO A INTERRUPCAO DE MUDANCA DE ESTADO Essa interrup¢io deve ser usada em sinais que devem ser tratados tanto na subida como na descida. Um sincronismo com a rede elétrica é um bom exemplo de aplicagao. Para que esta interrupgio possa ocorrer, sua chave individual INTCON,RBIE deve estar ligada (1). Dentro da rotina de tratamento devemos testar o flag INTCON,RBIF, para sabermos se foi essa ifterrupgao que ocorreu. Antes de sairmos do tratamento, devemos limpar esse mesmo flag manualmente, EXEMPLO 5 - TIMER SIMPLIFICADO 0 timer simplificado foi colocado como exemple para demonstrar 0 uso das interrupgées. Neste caso, estamos utilizando a interrupgio de TMRO para gerarmos um contador de segundos. Desta forma, nosso timer terd seu valor decrementado a cada segundo, indo de um valor inicial (W_INICIO) até zero. Um botao ¢ utilizado para disparar o timer ¢ outro para paralisd-lo, Enquanto o timer estiver rodando, o led permanece aceso, A contagem de tempo € feita com base no prescaler (1:64), na inicializagio do TMRO (256-125) e em um contador auxxiliar (TEMP1) que ¢ inicializade em 125, Desta forma, a interrupgdo aconteceré a cada 8ms (64us x 125). O contador auxiliar multiplicard este tempo por 125, resultanto em 1 segundo (8ms x 125 = 1s). 110 Desbravando o PIC ‘TIMER DE SECUNDOS - EXS DESBRAVANDO 0 PIC DESENVOLVIDO PELA MOSAICO ENGENHARIA & CONSULTORIA VERSAO: 1.0 DATA: 11/06/99 tot natal DESCRIGKO DO ARQUIVO . atlases pens Seem + TIMER DECRESCENTE EM SEGUNDOS. © VALOR INICTAL E DETERMINADO = * PELA CONSTANTE V_INICIO EB PODE ESTAR ENTRE 1 & 9 SEGUNDOS. * © BOTAO 1 DISPARA O TIMER, MOSTRANDO 0 TEMPO RESTANTE NO- = DISPLAY. © BOTAO 2 PARALIZA O TIMER. O LED E UTILIZADO PARA + INDICAR © ESTADO ATUAL DO TIMER: ACESO=RODAMDC FE APAGADO=PARADO a ARQUIVOS DE DEFINIGOES # #INCLUDE ARQUIVO PADRAO MICROCHIP PARA 16F84 {EO ee eee PAGINACKO DE MEMORIA * :DEFINICHO DE COMANDOS DE USUARIO PARA ALTERACKO DA PAGINA DE MEMORIA ADEPINE BANKO BCF STATUS,RPO #SETA BANK 0 DE MEMORTA #ORFINE BANK] BSF STATUS,RPO ETA BANK 1 DE MEMORIA * VARIAVEIS * Pe ke Ee eG ed ee eee ee we ae ee # DEFINIGAO DOS NOMES E ENDERECOS CE TGDAS AS VARTAVEIS UTILIZADAS ¢ PELO SISTEMA CBLOCK Ox0C TENDERECO INICIAL DA MEMORIA DE. USUARIO W_TEMP ;REGISTRADORES TEMPORARIOS PARA STATUS_TEMP ; INTERRUPQOES: VESTAS VARIAVEIS NEM SERAO UTILIZADAS ‘TEMEO JARMAZENA © VALOR DO TEMPO FLAGS ARMAZENA OS FLAGS DE CONTROLE TEMPL sREGISTRADORES AUXILIARES TEMP2 PILTROL :PILTROS nos BoTdES FILTROZ =NDC #FIM DO BLOCO DE MEMORIA * FLAGS INTERNOS . ; DEFINICKO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE FLFIM FLAGS.0 {FLAG DE FIM DE TEMPO ST_BTL FLAGS, 1 ST_BT2 FLAGS, 2 DEFINE DEFINE ;STATUS DO BOTRO #STATUS DO BOTAQ CONSTANTES: 1 2 } DEFINIGAO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA te 0 a EQU 4255 ;VALOR INICIAL DO TIMER (1 A 15 SEG.) +WALGR DO FILTRO bos BOTOES V_INICIO ‘T_FILTRO . ENTRADAS: * ;} DEFINICKO DE TODOS OS PINOS QUE SERKO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEPINE BOTAOL PORTA, 1 ;PORTA DO BOTKO ; 0 -» PRESSTONADO ; 1 -> LIBERADO SDEFINE BOTAQ2 PORTA, 2 iPORTA DO BOTAO : 0 -> PRESSIONADO 4: 1 => LIBERADO a. saipas *. 7 BEPINICAO DE TODOS OS PINOS QUE SERKO UTTLIZADOS coMO SAEDA ; RECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 E 1) WDEFINE LED PORTA, 3 iLED :0 -> DESLIGADO rl -> LIGADO VETOR DE RESET * ‘ORG Goro ox00 INICIO ImfcTo DA INTERRUPCEO . GENDERECO INICIAL DE PROCESSAMENTO UPILIZAREMOS SOMENTE A INTERRUGRO DE TMRO, MAS EFETUAREMOS 0 TESTE 7 PARA TERMOS CERTEZA DE QUE NENHUM PROBLEMA ACONTECEU. E NECESSARIO 7 SALVAR E RECUPERAR OS VALOR DE W E STATUS. ORG O04 7ENDERECO INICIAL DA INTERRUPCAO MOVWF W_TEMP ;SALVA W OEM W_TEMP SWAPF STATUS, MOVWE STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP BTFSS INTCOM,TOIF ;£ INTERRUPCAO DE TMRO? eoTo SAT_int NEG, SAI SE ACKO 781M 112 Desbravando o PIC MOVWF THRO PREINICIA THRO : CFS? TEMP1,F ZINCREMENTA CONTADOR AUXILIAR. ACABOU? en hen OTO SAT_INT iNKO, SAT SEM AGAG i sm 6 MOVLH .125 ane" MOVWF TEMPL, J” .2";REINICIALIZA TEMPO AUKILIAR Brrsc Frit * JK CHEGOU AO FIM? GOTO SAI_LINT #SIM, BNTAQ NAO DECREMENTA 0 TEMPO ees, iNKO DECFSZ TEMPO, F #DECREMENTA TEKPO. ACABOU? GOTO | SAT_INT NRO, SAT DA INTERRUCEO :SIM BSP FLFIM :MARCA FIM DO TEMPO GOTO SAI_INT ¢SAL DA INTERRUPCKO a FIM DA INTERRDEGKO * SAX_INT ‘SWAPF STATUS_TEMP.W MOVWF STATUS ;RECUPERA STATUS i SWAPF W_TEMP,F SWAPF W_TEHP,W sRECUPERA W RETFIE #RETORNA DA INTERRUPCAO “ ROTINA DE CONVERSAO BINARIO -> TRATAMENTO DA INTERRUPCAO DE TNRO ESTA ROTINA IRA CONTAR © TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARIAVEL “TEMPO” SERA DECREMENTADA, 1 SEGUNDO = 64us (PRESCALER) x 125 (TMRO) x 125 (TEMP) BCF INTCON,TOIF jLIMPA FLAG DA INT. MOVE (.256-.125) 7 ESTA ROTINA IRA RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER } MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. 0 RETORNO JA ESTA FORMATADO PARA AS CONDICOBS DE LIGACKO DO DISPLAY AO PORTB. MOVF TEMPO, W }OOLOCA TEMPO EM W Programacdo ANDLW B"O00001111' ;:MASCARA VALOR DE CONTADOR ONSIDERAR SOMENTE ATE 15 ADDWE PCL, F : B'EDC.RAFG' ; POSICAO CORRETA DOS SBSUTMENTOS RETLW B'11101110" ; 00 - RETORNA SIMBOLO CORRETO 0 RETLW B'00101000° ; O1 - RETORNA SIMBOLO CORRETO 2 RETLW 5°11001101' ; 02 - RETORNA SfmMBoLO CORRETO 2 RETLW B'OL1O1101" ; 03 - RETORNA SIMBOLO CORRETO 3 RETLW B'00101011' ; 04 - RETORNA SIMBOLO CORRETO 4 RETLW B'OL100111' ; 05 - RETORNA S{MBOLO CORRETO 5 RETLW B'11100111" ; 06 - RETORNA STMBOLO CORRETO 6 RETLW B‘GOI0L100' ; 07 - RETORNA SimBOLO CORRETO 7 RETLW B'1L101111' ; 08 = RETORNA SiMBOLO CORRETO & RETLW B'O1101111" ; 09 ~ RETORNA SIMBOLO CORRETO 9 RETLW B'101G1111' ; 10 - RETORNA SiMBOLO CORRETO A RETLW B'11100011" ; 11 - RETORNA SIMBOLO CORRETO b RETLW B°11000110' ; 12 - RETORNA SIMBCLO CORRETO C RETLY B'11101001" ; 13 - RETORNA SIMBOLO CORRETO 4 RETLW B‘L10Q0111‘ ; 14 - RETORNA SfMBOLO CORRETO E RETLY B'10000111" ; 15 - RETORNA SIMBOLO CORRETO F je ee ee ne ee ee a* ROTINA DE ATUALIZAGKO DO DISPLAY . owe een ee en eee hee ; ESTA ROTINA CONVERTS 0 VALOR DE TEMPO POR MEIO DA ROTINA CONVERTE j B ATUALIZA 0 PORTE PARA ACENDER O DISPLAY CORRETAMENTE ATUALIZA CALL CONVERTE CONVERTE CONTADOR NO NUMERO DO DISPLAY MOVWF PORTE ;ATUALIZA O PORT PARA ;VISUALIZARMOS 0 VALOR DE CONTADOR :NO DISPLAY RETURN 7NKO, RETORNA ROTINA DE DESLIGAR O TIMER + ; ESTA ROTINA EXECUTA AS AQOES NECESSARIAS PARA DESLIGAR O TIMER DESL_TIMER BCF INTCON,GIE =, DESLIGA CHAVE GERAL DE INT. Bce OLED :APAGA © LED RETURN ; RETORNA ROTINA DE LIGAR O TIMER ® ; ESTA ROTINA EXECUTA AS AGOBS NECESSARIAS PARA LIGAR O TIMER LIGA_TIMER HTFSC INTCON,GIE ; TIMER JA ESTA LIGADO? RETURN ; SIM. RETORNA DIRETO 114 ECF MOVLW MOVIE MOvLWY MOWWE BSF BaF RETURN INICIO BANK MOVLW MOVWE MOVLW MOVIE MOVLW MOVWE CLRE CLRE CLRF MOVLW MOWE CALL BIFSC CALL CALL MOvWE MOVWE INTCON, TOIF 256-125 THRO 125 TEMPI INTCON, GIE. LED Bro0na0i10" TRISA Br90000000° ‘TRISB B'10000102° ‘OPTION_REG Broo100000° inTcon PORTA, PORT FLAGS V_INICIO TEMPO ATUALTZA ROTINA PRINCIPAL F_FIM DESL_TIMER ATUALIZA ‘T_FILTRO FILTROL PILTRO2 7NKo ;LIMPA FLAG DE INT. DE TRO FINICIA TMRO CORRETAMENTE HINICIA TEMP] CORRETAMENTE LIGA CHAVE GERAL DE INTERRUPCOES FACENDE © LED pRETORNA INfCIO DO PROGRAMA. * JALTERA PARA O BANCO 1 DEFINE RAL E 2 COMO ENTRADA B DEMATS 7COMO SATDAS #DEFINE TODO © PORTE COMO SAIDA #PRESCALER 4 NO TMRO {PULL-UPS PESABLLITALOS AS DEMAIS CONFG. SAO IRRELEVANTES ;HABILITADA SOMENTE A INTERRUPGAO TMRO CHAVE GERAL DAS INTERRUGOES DESLIGADAS ;RETORNA PARA Q BANCO 0 INICIALIZACA® DAS VARIAVETS :LIMPA © PORTA ;LIMPA @ PORTE sLIMPA TODOS OS FLAGS FINICIA TEMPO = Y_INICIO ;ATUALIZA O DISPLAY INICIALMENTE :CHEGOU AQ FIN? ;SIM, ENTAO DESLIGA 0 TIMER 3NKO PATUALIZA O DISPLAY HINICIALIZA FILTROL = T_FILTRO pINICIALIZA FILTRO2 = T_FILTRO Programagéo ws CHECA_BT BIFSC BOTAOL oro BTl_LIEB DECFS2 FILTROL,F GoTo CHECA_ST1 BIFSS ST_BT1 GOTO ACAO_BT1L GOTO CHECA_BT2 BTl_ure BCE ST_LETL CHECA_BT2 BIFSC BOTAO2 Gora) BT?_LIB DECPS2 PILTRO2,F GoTo CHECA_pT2 BIFSS sT_pr2 GOTO ACAO_BT2 GoTo | MAIN BT2_LIB ECF sT_BT2 coro MAIN ACAG_BT1 BSF -ST_BT CALL LIGA_TIMER Goro MAIN ACAO_BT2 BSF sT_pT2 CALL DESL_TIMER GOTO MAIN #0 BOTAO 1 ESTA PRESSTONADO? iNKO, ENTAO TRATA COMO LIBERADO 7SIM ?DECREMENTA 0 FILTRO DO BOTAO ;TERMINGU? :NBO, CONTINUA ESPERANDO 7ST ;BOTKO JA ESTAVA PRESSIONADO? iNKO, EXECUTA AGKO DO BOTHO SIM, CHECA BOTKO 2 oye sMARCA BOTKO 1 COMO LIBERADO 70 BOTAO 2 ESTA PRESSTONADO? NKO, ENTAO TRATA COMO LISERADO SIZ #DECREMENTA © FILTRO DO BOTKO #TERMINOU? ;NKO, CONTINUA ESPERANDO 7ST #BOTAO JA ESTAVA PRESSTONADO? iNAG, EXECUTA ACKO DO BOTA. 1SIM, VOLTA AO LOOPING sMARCA BOTAO 2 COMO LIBERADO FRETORNA AO LOOPING 7ACKO PARA @ BOTAO 1 ;MARCA BOTA 1 COMO JA PRESSTONADO ;LIGA O TEMER GAGEO PARA © BOTKO 2 sMARCA BOTKO 2 COMO JA PRESSTONADO FDESLIGA O TIMER sNKO, VOLTA AO LOOP PRINCIPAL FIM DO PROGRAMA * ;OBRIGATORIO UTILIZANDO A EEPROM Uma das grandes vantagens de izarmos 0 PICIGFS4 é 0 fato de que ele possui uma EEPROM interna de 64 bytes. Coma ja dissemos, essa memoria nao é volatil e com cla podemos guardar dados, mesmo quando o sistema fica sem alimentagio. [sto é muito utilizado para sistemas que precisam manter dados ou configuragdes programadas pelo usuario. Uma discadora telefanica € um bom exemplo disso, pais o usuario sé precisa programar os niimeros que serio chamados uma tnica vez. Muitas vezes, uma meméria EEPROM externa € necessaria, principalmente quando os 64 bytes dispaniveis nao sao suficientes. Neste caso, porém, além de as rotinas de escrita ¢ leitura serem mais complexas, sdo necessérios também pelo menos dois pinos para interligar a memoria ao microcontrolador. Por isso, j4 que o PICI6F84 possui a EEPROM interna, estudaremos somente a comunicagio com ela, deixando as memérias externas para uma futura oportunidade. ESCREVENDO NA EEPROM A primeira ago que faremos em relagio & EEPROM é a operacao de eserita, Na verdade, ela é ligeiramente mais complexa que a operagao de leitura, mas cronologicamente € mais interessante aprendermos primeira a escrever. Afinal, como poderemos ler alguma coisa se nao escrevermos nada? A complexibilidade da escrita € devido ao sistema de protegio que o PIC possi para evitar escritas acidentais na meméria. Por isso, a inicializagdo da escrita parecer um pouco confusa e desnecessdria, mas isso torna o sistema bastante robusto e seguro. Aescrita da EEPROM deve acompanhar 0 seguinte roteiro: 1. Qendereco para a escrita deve ser colocado em EEADR. Como existem 64 bytes disponiveis, esse endereco deve estar entre 0 ¢ 63. 2. OQ dado a ser escrito deve ser colocado em EEDATA, Sé podemos escrever um byte de cada vez. 3. As interrupgdes devem ser desligadas para evitarmos canflitos. 4. Aescrita deve ser habilitada por meio do bit EECON1T,WREN (1). O registrador EECON2 deve ser carregado com os valores 0x55 ¢ OxAA, seqiiencialmente. Este pracedimento ¢ obrigatério e utilizado para a protegio da escrita. 6. A-escrita deve ser iniciada setando o bit EGCONI AWR (1) ¢ limpando o bit EECONI,WREN (0) 7. As interrupgdes podem ser novamente ligadas. 8. A operacao de escrita é um pouco demorada, e ela sé tera terminado quando o bit EECON1,WR tiver sido limpo automaticamente pelo hardware. a Programacéo 7 Por isso, normalmente ficamos esperando que isso aconteca. No caso de no podermos ficar esperando pelo fim da escrita, podemos ligar a interrupgio de escrita na EEPROM por meio do bit INTCON,EEIE, ¢ esperarmos que ela aconte¢a para considerarmas finalizada a eserita. 9. Caso algum erro ocorra durante a operagao de escrita, o bit EECON1,WRERR. sera setada (1), No caso de sucesso na operacdo, esse bit seré mantido em zero (0). Veja entio como fica uma rotina completa de escrita na EEPROM sem uso da interrupgao: * ROTINA DE ESCRITA NA E2PROM * 10 ENDEREGO ONDE QUEREMOS ESCREVER DEVE SER INICTALMENTE COLOCADO EX sEEADR ANTES DE CHAMAR ESTA ROTINA. 70 DADO A SER ESCRITO DEVE SER COLOCADO EM W ANTES DE CHAMAR A ROTINA ESCR_E2PROW MOWWF EEDATA ;ACERTA DADO PASSADO EM W ECF INTCON,GIE _; DESARILITA INTERRUPGOES PANK1 BANCO 1 BSF = EECONI,WREN ;HABILITA ESCRITA MOVEW 0x55 PINICIALIZAGAO DA ESCRITA MOVWF EECON2 7 (PROCEDIMENTO OBRIGATORIO) MOVIN OXAA MOVWE ECON? BSF FECON1,WR =; INICIA ESCRITA BCF - BECON1, REN BIFSC EECON1,WRERR ;HOUVE ERRO? GOTO ESCR_E2PROM+1 ;SIM, TENTA NOVAMENTE SEM AFETAR EEDATA BIFSC EBCONL,we = ;wKO, ACABCU ESCRITA? goro $-3 :NKO, CONTINUA ACUARDANDO BANKO :SIM, BANCO 0 BSF INTCON,GIE -;HARILITA INTERRUPCOES NOVAMENTE RETURN PRETORNA Esta rotina nao é perfeita, pois se ocorrer um erro, o sistema tenta escrever o dado novamente, mas nao limita a quantidade de tentativas, Por isso, se um erro séria ocorrer ¢ a memoria nado conseguir mais ser gravada, o sistema ficara travado. O certo talvez fosse informar ao usudrio por meio de um cédigo de erro TRATANDO A INTERRUPCAO DE FINAL DE ESCRITA DA EEPROM Essa interrupgao deve ser usada em sistemas que nao podem ficar parados esperando a operacdo de escrita terminar. Por isso, tao logo a operagao de escrita seja iniciada, a rotina deve ser finalizada (ndo deve Possuir © teste do bit EECON,WR, como no exemplo anterior). Quando a escrita for terminada, uma interrupgao ira ocorrer e o sistema poderd tomar as agdes pertinentes. Para qite essa interrupeo possa ocorrer, sua chave individual INTCON.EEIE deve estar ligada (1). Dentro da rotina de tratamento devemos testar o flag EECON1,EEIF, para sabermos se foi essa interrupgae que ocorreu. Antes de sairmos do tratamento, devemos limpar esse mesmo flag manualmente, LENDO DA EEPROM Agora que voc@ jé sabe escrever alguma coisa nos enderecos disponiveis da EEPROM, pederemos ler essa informacao de volta per intermédio de uma retina de leitura. A leitura é muito mais simples, pois nao necessita de tanta protecio, ¢ também muito mais répida. O roteiro para a criacao da rotina de leitura é o seguinte: 1. Oendereco para a leitura deve ser colocado em EEADR. Como existem 64 bytes disponiveis, este endereco deve estar entre 0 ¢ 63. 2. A leitura deve ser ligada por meio do bit EECON1,RD (1). A leitura terminard quando este bit voltar automaticamente para zero, 0 que acontece quase que imediatamente. 3. Odado lido serd calocado em EEDATA. Arotina de exemplo para a leitura é bem simples: ROTINA DE LELTURA NA E2ZPROM 70 ENDERECO ONDE QUEREMOS LER DEVE SER INICIALMENTE COLOCADO EM EEADR ANTES DE CHAMAR ESTA ROTINA. 7 DADO LIDO SERA DEVOLVIDO EM Ww LE_E2PROM BANK1 ;BANCO 1 BSF FECOM1, RD ;PREPARA LETTURA BANKO ;BANCO 0 MOVE EEDATA,W ;COLOCA DADO EM Ww RETURN ;RETORNA. EXEMPLO 6 - CONTADOR FINAL Esta é a versao final do contador iniciado no exemplo 2. Possui todas os recursos do exemplo 4 mais o armazenamento do valor do contador na meméria nao volatil {EEPROM}, para que esse dado nao seja perdido mesmo no caso de desligamento da alimentagao, Observe que a EEPROM € inicializada por intermédio da diretriz DE. Programacao DESBRAVANDO 0 PIC DESENVOLVIDO PELA MOSATCO ENGENHARIA E CONSULTORZA VERSAO: 1.0 DATA; 11/06/99 ae CONTADOR FINAL - EX6 DESCRICKO DO ARQUIVO CONTADOR QUE UTILIZA DOIS BOTOES PARA INCREMENTAR E DECRE- * MENTAR © VALOR CONTROLADO PELA VARIAVEL *CONTADOR*. ESTA “ VARTAVEL ESTA LIMITADA PELAS CONSTANTES ‘MIN™ E -MAX-_ * © VALOR DO CONTADOR # MOSTRADO NO DISPLAY E ARMAZENADO NA. * EEPROM PARA NAO SER PERDIDO MESMO NO CASO DE RESET ARQUIVOS DE DEFINICOES a #INCLUDE FARQUIVO PADRAO MICROCHIP PARA 16F84 - PAGINAGAG DE MEMORTA . eee Ae ee a eee ow ROR Rae a RU JDEPINICAG DE COMANDOS DE USUARIO PARA ALTERAGKO DA PAGINA DE MEMORIA *DEFINE BANKO BCF STATUS, RPO FSETA BANK 0 DE MEMORIA #DEFINE BANKL BSP STATUS, REO 7SETA BANK 1 DE MAMORIA ” VARIAVEIS ¢ 4 DEFINICRO DOS NOMES E ENDERECOS DE TODAS AS VARIAVEIS UTILIZADAS ? PELO sistema BLOCK Ox0c FENDERECO INKCIAL BA MEMORIA DE ;USUARTO W_TEMP ;REGISTRADORES TEMPORARIOS PARA STATUS_TEMP ; INTERRUPGOES ;ESTAS VARIAVEIS NEM SERAO UTILIZADAS CONTADOR ARMAZENA © VALOR DA CONTAGEM FLAGS :ARMAZENA OS FLAGS DE CONTROLE FILTROL JRILTPRAGEM PARA O BOTKO 1 PILTROZ JPILTRAGEM PARA 0 BOTKO 2 =NDC FFIM DO BLOCO DE MEMORIA SO RW WE Ee ee a de ee oe = FLAGS INTERNOS * ; DEPINECGAO DE TODOS 0S FLAGS UTILIZADOS PELO SISTEMA aDEPINE ST_BT] FLAGS, 0 STATUS DO BOTKO 1 $DEPINE ST_BT2 FLAGS, 1 STATUS DO BOTAO 2 120 Desbravando 9 PIC ze CONSTANTES } DEFINICGAG DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN equ 4d VALOR MINIMO PARA 9 CONTADOR MAX, rou 15; MALOR MAXIMO PARA © CONTADOR TLEILTRO = BQU 255; PILTRO PARA BOTAO POS_MEM EQU oO ;ENDERECO DA EEPROM ONDE SERA ;ARMAZENADO © VALOR DO CONTADOR if ENTRADAS EFINICHO DE TODOS OS PINOS QUE SERAO UTILIZADOS COMO ENTRADA ECOMENDAMOS TAMBEM COMENTAR © SIGNIFICADO DE SEUS ESTADOS (0 EB 1) ao ADEFINE BOTAGL PORTA, 1 PORTA DO BOTAO 0 -> PRESSIONADO. ; 1 -> LIBERADO #DEFINE BOTAO2 PORTA, 2 DO BOTRO PRESSIONADO LIBERADG safpas * DEPINIGHO DE TODOS OS FINOS QUE SERAO UTILIZADOS como sAiDA 3} RECOMENDAMOS TAMBEM COMENTAR 0 SIGNIFICADO DE SEUS ESTADOS {0 E 1) INICTALIZACKO DA EEPROM * ORG = -H'2100'+POS_MEM ;INECIO DA EEPROM DE fe] iVALOR INICIAL PARA CONTADOR = 5 iVIDE DIRETRIZ "DE" NO APENDICE B VETOR DE RESET . ORG = 0x00 ;ENDERECO INICIAL DE PROCESSAMENTO core INICTO i INiCIO DA INTERRUBCAG . ; AS INTERRUPQOES NRO SeRKO UTILTZADAS, POR [SSO PODEMOS SUBSTITUIR ; TODO © SISTEMA EXISTENTE NO ARQUIVO-MODELO PELG APRESENTADO ABAIXO ; ESTE SISTEMA NAO E OBRIGATORIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 8x04 jENDEREGO INICIAL DA INTERRUPGAO | Pragramagéo 121 RETFIE RETORNA DA INTERRUPGAO “ ROTINA DE CONVERSAO BINARTO -> DISPLAY ic } ESTA ROTINA TRA RETORNAR EM W. © SEMHOLO CORRETO QUE DEVE SER ‘ MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JA ESTA FORMATADO PARA AS CONDICOES DE LIGAGAO DO DISPLAY AG PORTS. } a pe Lo ae CONVERTE, MOVF CONTADOR,W © ;COLOCA CONTADOR EM W ANDLW B‘O0001111" ;MASCARA VALOR DE CONTADOR ;CONSTDERAR SOMENTE art 15 ADDWE PCL,F : B'EDC.BAFG' ; POSICRO CORRETA DOS SEGUIMENTOS RETLHW B'11101110' 00 - RETORNA SIMBOLO CORRETO 0 RETLW 8'00101000' ; 01 = RETORNA simBoLO CORRETO 02 ~ RETORNA SEMBOLO CORRETO RETLW B'01101101' ; 03 ~ RETORNA SimpoLo CORRETO RETLW B*O0101011° 04 - RETORNA SEMBOLO CORRETO RETLW B'01100211' ; 05 ~ RETORNA SEMROLO CORRETO RETLW B'L1100111' ; 06 ~ RBTORNA SiMBOLO CORRETO RETLW B‘00101100" ; 07 ~ RETORNA SiMBOLO CORRETO RETLW B'12101112' ; 08 - RETORNA SIMBOLO CORRETO RETLW B'01101111* ; 09 - RETORNA SIMBOLO CORRETO RETLW B‘ 10101111" 10 = RETORNA SIMBOLO CORRETO RETLW B'11100021° 11 - RETORNA SfmmoLo CORRETO RETLW B'11000110' 12 - RETORNA SimBOLO CORRETO RETLW B111101001" 13 - RETORNA SiMBOLO CORRETO RETLW B'11000111' ; 14 - RETORNA SfMBOLO CORRETO RETLW B'10000121' ; 15 - RETORNA STMBOLO coRRETO a ROTINA DE LEITURA NA E2PROM . je ee SD eee ee ee nee ee oe Kale eee Ree } ESTA ROTENA LE O BYTE DO ENDERECO ACERTADO POR EEADR E COLOCA 3 0 VALOR EM W, RETLW B*11001101° THONU PrP eowaueNe LE_E2PROM BANK @BANCO 1 BSF EECONI,RD =; PREPARA LEITURA BANKO 7BANCO 0. MOVF EEDATA,W iCOLOCA DADO EM W AE te MELAS RETURN ;RETORNA, * ROTINA DE ESCRITA NA E2PROM + ESTA ROTINA ESCREVE © DADO PASSSARO EM W NO ENDERBCO ACERTADG ANTERIORMENTE EM BEADR ESCR_E2PROM MOVWE EEDATA FACERTA DADO PASSADO EM W BCF INTCON,GIE ;DESABILITA INTERRUPCSES BANKL FBANCO 1 BSF = EECON1,WREN ;HABILITA ESCRITA MOVLW 0x55 FINICIALTZACAO DA ESCRITA MOVWF EECON2 MOVLW OXAA. MOVWF BECON2 BSF EECONA,WR =; INICIA ESCRITA BCF EECON, WREN BTFSC EECONI,WR ;ACABOU ESCRITA? GOTO $-1 GNKO, AGUARDA BANKO SIM, BANCO 0 BSF INTCON,GIE =; HABILITA INTERRUPCOES RETURN ;RETORNA * ROTINA DE LEITURA DO VALOR DO CONTADOR a. ; ESTA ROTINA LE @ VALOR DA MEMORIA E COLOCA © RESULIPADO NA i VARIAVEL “CONTADOR" . LE_CONTA MOVLW POS_MEM MOVWF BEADR ;ACERTA Q ENDEREGO PARA LEITURA CALL LE_E2PROM ;EFETUA A LEITURA DA EEPROM MOVWE CONTADOR jATUALIZA © CONTADOR RETURN ;RETORNA, F ROTINA DE ESCRITA DO VALOR bo CONTADOR * i; ESTA ROTINA ESCREVE © VALOR ATUAL DE CONTADOR NA MEMORIA EEPROM ESCR_CONTA MOVLW POS_MEM MOVWE BEADR JACERTA 0 ENDEREGO PARA LETTURA MOVE CONTADOR,W ;COLOCA CONTADOR EN W CALL ESCR_EZPROM ;EFETUA A ESCRITA EEPROM RETURN RETORNA INfCrIO DO PROGRAMA = inre10 Programacéo cH 124 BANK Moviw B‘00000110° MOVHF TRISA MOVLW B*O0000000" MOUWF TRISB MOvEW B*10000000° MOWWE OPTION_REG MOVLW B*00000000' MOVWF INTCON CLRF PORTA CLRF PORTB CLRF FLAGS CALL LE_CONTA ATUALIZA ‘T_PILTRO FIUTROL PILTROZ CHECA_BTL BTFSC BOTAO] coro BT1_LIB DECFS% FILTROL,F GoTo | CHECA_BT1 BIFSS ST_aTL SOTO PEC GOTO CHECA_BT2 Brl_uzs ECF ST_BT1 ECA_BT2 ETFSC BOTAO2 GOTO -BT2_LIB DEGFS2 FILTRO2.P TALTERA PARA 0 BANCO 1 SDEFINE RAL E 2 COMO ENTRADA E DEMAIS #CoMO SAIDAS ;DEFINE TODO O PORTB COMO SALDA RESCALER 1:2 NO TMRO 7PULL-UPS DESABILITADOS § DEMAIS CONFG. SAO IRRELEVANTES #TODAS AS INTERRUPCORS DESLIGADAS RETORNA PARA O BANCO 0 INICIALIZAGAO DAS VARIAVETS « SO eee eR ew ee :LIMPA © PORTA :LIMPA O PORTE ;LIMPA TODOS OS FLAGS FINICIALIZA CONTADOR COM VALOR ;DA EEPROM FATUALIZA O DISPLAY INICTALMENTE A ee ROTINA PRINCIPAL FINICIALIZA PILTRO1 = T_FTLTRO FINICIALIZA FILTROZ = T_FILTRO 70 BOTKO 1 ESTA PRESSIONADO? INKO, ENTAO TRATA COMO LIBERADO 351M sDECREMENTA © FILTRO BO BOTKO. i TERMINOU? iNKO, CONTINUA ESPERANDO :STM :BOTKO JA ESTAVA PRESSTONADO? iNKO, EXECUTA ACAO bo BoTKo 381M, CHECA BOTAO 2 iMARCA BOTRO 1 COMO LIBERADO :0 BOTAO 2 ESTA PRESSIONADO? iNAO, ENTAO TRATA COMO LIBERADO iSiIM jDECREMENTA O FILTRO DO BOTAO Desbravando a PIC Goro CHECA_BT2 BTFSS ST_BT2 oro INC GOTO MAIN BT2_LIB ECF = ST_BTZ GoTo MAIN DEC BSF ST_BTl MOVF CONTADOR, W XORLW HIN BTFSC STATUS, 2 Gora MAIN DECF CONTADOR, F CALL © BSCR_CONTA GOTO ATUALIZA ING BSF = ST_BT2 MOVF CONTADOR, W MORLW MAX BTFSC STATUS, 2 GoTo MAIN INCF CONTADOR, F CALL BSCR_CONTA APUALIZA CALL CONVERTS MOVWF PORTE GOTO MAIN Programagiio }TERMTHOU? iNRO, CONTINUA ESPERANDO iI ;BOTRO JA ESTAVA PRESSTONADO? :NKO, EXECUTA ACKO DO BOTAO ;STM, VOLTA AO LOOPING ;MARCA BOTKO 2 COMO LIBERADO ;RETORNA AO LOOPING +ACKO DE DECREMENTAR ;MARCA BOTRO 1 COMO JA PRESSYONADO ;COLOCA CONTADOR EM W 7APLICA XOR ENTRE CONTADOR E MIN PARA TESTAR IGUALDADE, SE FOREM FIGUAIS, © RESULTADO SERA ZERO ;RESULTOU EM ZERO? ;SIM, RETORNA SEM AFETAR CONT. NRO ;DECREMENTA © CONTADOR ;MPUALTZA VALOR DE CONTADOR NA }EEPROM ;ATUALIZA © DISPLAY ;AGRO DE INCREMENTAR MARCA BOTKO 2 COMO JA PRESSTONADO COLOCA CONTADOR EW APLICA XOR ENTRE CONTADOR E MAX #PARA TESTAR IGUALDADE. SE FOREM FIGUAIS, © RESULTADO SERA ZERO ;RESULTOU EM ZERO? ;S7M, RETORNA SEM AFETAR CONT. NO }INCREMENTA 0 CONTADOR ;RTUALIZA © VALOR DE CONTADOR NA 7EEPROM sMPUALIZACAO [O DISPLAY ;CONVERTE CONTADOR NO NUMERO DO ; DISPLAY :RTUALIZA © PORTE PARA VISUALIZARMOS © VALOR DE CONTADOR NO DISPLAY ;NKO, VOLTA AOD LOOP PRINCIPAL PIM DO PROGRAMA sOBRIGATORIO MODO SLEEP Como © proprio nome diz, quando entramos neste modo, estamos colocando o controlador para “dormir”. Esta é uma das melhores maneiras de economizar energia em sistemas que podem ficar paralisados temporariamente. Este modo € muito utilizado em sistemas alimentados por pilhas ou baterias, pois PIC passa a consumir somente cerca de 2A. Quando entrames neste modo, © oscilador & imediatamente paralisado, e com ele tode o pracessamento. O estado das portas € mantido, isto é, aquelas que €ram entradas continuam como entradas, assim como o nivel légica das portas que eram saidas. No entanto, como o objetivo normalmente é economizar energia, o estado das portas deve ser minuciosamente checado ¢ acertada antes de entrarmos neste modo. Configurar as portas para entrada, quando possivel, resulta em maior economia de energia. ENTRANDO NO MODO SLEEP (SLEEP) Para entramos no modo Sleep (Power-down), devemos executar a instrugao SLEEP. No entanto, antes de o oscilador ser desligado, 0 bit /PD do STATUS é limpo (0) ¢ o bit (70 € setado (1). Esses bits serao utilizados na hora de sairmos do Sleep. Como ja dissemos, 0 estado das portas 6 mantido. O pino de master Clear (MCRL) deve permanecer o tempo tado em nivel légico alto (1). Vale observarmos que, neste modo, apesar de todo o sistema ser paralisado, o oscilador relativo ao WDT continua funcionando, SAINDO DO MODO SLEI Uma vez dentro do modo Slee} existem trés maneicas possiveis de sairmos dele: 1. Por meio de um reset externa, por intermédio do pino [MCRL 2, Por um estouto de WDT, no caso de ele estar habilitado, 3 Devido a uma interrupedo externa ou per mudanga de estado, gerada nos pinos RBO, RB4, RES, RB6 ou RB7. A interrupedo de final de escrita na EEPROM também pode fazer com que o PIC saia do mado sleep. Ja a interrup¢ao de timer 0 jamais acontecerd no modo sleep, pois o timer para de ser incrementado, uma vez que no hé mais ciclos de maquina. No primeiro caso, um reset de hardware foi necessario, 6 que ira reinicializar o sistema, independentemente de estarmos no modo sleep ou nao. Esse reset pede ser reconhecido, checando os estados dos bits [TO = 1 e (PD = 0. Ja no segundo caso, o sistema “acordara" por causa de um estoruro do WDT. Como esse timer nao ¢ paralisada no modo sleep, caso ele esteja ligado, acontecerd um estouro, pois nao esté sendo executada a instrugao CLRWDT nenhuma vez. Quando isto acontecer, o programa continuard a ser executado na 126 linha seguinte & instrugao SLEEP. Podemos checar esta situagdo por meio do bit JTO = 0. £8 Arengio: alguns madelos de PIC resetam quando acoutece um estouro de WDT, voltando ao inicio do programa, endo @linha segwinte a instrugGo SLEEP. © terceira ¢ tiltimo caso é 0 mais complexe de todos. No caso da chave individual da interrupeio estar ligada, o sistema sairi do modo sleep, executando a linha seguinte @ instrugao SLEEP, Caso contrario (chave desligada), ‘9 sistema continuard dormindo. Caso a chave geral GIE também esteja ligada, entio ne ciclo seguinte o programa serd desviado para 0 enderego 0x04, a fim de teatar a interrupgao ocorrida. Por isso, quando desejamas realmente tratar a interrupgao que acordaré o PIC, devemos colocar um NOP apés a instrucao SLEEP, evitando assim que qualquer ago seja tomada antes do tratamento da interrupeda. TRABALHANDO COM WACHTDOG (WDT) (CRLWDT) O WDT (Wachtdog timer) € um recurso poderosissimo que deve ser sempre utilizade. Por isso, @ bom vocé se acostumar a utilizé-lo em todos os seus sistemas desde 0 comeco. Jd falamos sobre 0 WDT diversas vezes até agora, mas nao custa nada relembrarmos seus conccitos e funcdes. ‘Trata-se, entdo, de um contador automatico incrementado por meio de um oscilador préprie, independente do oscilador principal do sistema Com o prescaler de 1:1, 0 seu tempo de estouro, du seja, 256 incrementos, € equivalente a 18ms. O prescaler € utilizado para aumentarmos este tempo. Caso © WDT estoure, um reset do sistema ira ocorrer imediatamente. Esta situagao pode ser checada, analisando o bit (10 do registrador STATUS, UTILIZANDO 0 WDT PARA EVITAR TRAVAMENTOS A principal fungio do WDT em sistemas profissionais € evitar que eles travem por um problema no software. Desta forma, nosso sistema deve executar a instrugio CLRWDT numa freqiiéncia mais rapida que a do estoure do contador. ‘Como essa instruc3o limpa o contador, este jamais estourard. Caso o programa se perca, ou trave em um ponto estranho, a instrugie CLRWDT nao sera mais executada ¢ 0 WDT estourard, gerando um reset forcado ¢ saindo do travamento, Simples, ndo é? Nem tanto. Acontece que para este conceito realmente funcionar, 0 ideal € que sé exista uma instrugio CLRWDT em todo o programa. Por isso, € muito comum perder muito tempo escolhendo o ponto ideal em que essa instrugao deva ser colocada. O normal é ela ficar dentro do looping principal do sistema. Acontece que, como © presealer nao pode ser utilizado com o WDT € 0 TMRO ao mesmo tempo, as vezes ficamos limitados a limpar o WDT a cada i8ms, ¢ nem sempre a nossa rotina principal leva menos tempo que isso. Nao é proibido introduzirmos mais 127 instrugdes CLRWDT em outros locais do soft (muitas vezes esta é a tnica solucao}, mas lembre-se que se seu sistema possuir esta instrugao por todo lado, ele nunca destravard por meio do estouro do WOT, Lembramos ainda que a limpeza do WDT nao deve ser executada dentro de interrupgdes de timer, ou interrupges extemas que acontecam periodicamente. Normalmente, essa parece uma solugao simples ¢ ripida, mas lembre-se que mesmo com o sistema travado em alguns pontos, as interrupgdes podem continuar acontecendo. UTILIZANDO O WDT PARA MELHORAR A INICIALIZACAO Uma outra fungao para o WDT, que nés também recomendamos, é a melhoria da inicializagao do sistema apés reset, por meio de um tempo de parada para estabilizagdo, O conceito aqui é o seguinte: logo no comego do programa, checamos se © reset foi ocasionado por um estouro de WDT. Se nao foi, (no caso de energizagio do sistema) entao ficamos parados em um looping infinito, esperando que o WDT estoure. Quando isto acontecer, o sistema sera iniciado novamente, pulando esse looping infinito. Com isso, conseguimos que o programa demore um tempo entre a energizagdo do PIC ¢ © inicio do processamento real. Isto ajuda muito na estabilizagao de todo o hardware, evitando muitos problemas de inicializagao. O tempo de atraso pode ser regulado por intermédio do prescaler. i INICIO DO PROGRAMA * Intc1o, BANEL ;ALTERA PARA 0 BANCO 1 MOVLW B‘ 00009000" MOVWE TRISA ;DEFINE ENTRADAS E SALDAS DO PORTA MOVLW B'00000000' MOVWF TRISB ;DEPINE ENTRADAS E SAIDAS DO PORTE MOVLW B'10001112 MOVWF OPTION_REG DEFINE OPQOES DE OPERACKO #PRESCALER DE 1:12 APLICADO AO WOT #PARA TEMPO DE RETARDO INICIAL 7SER BEM ALTO (128 X 18ms) MOWLW B*90000000" MOVWF INTCON ;DEFINE OpGOES DE INTERRUPCOES BANKO :RETORNA PARA © BANCO 0 BIFSS STATUS,NOT_TO ;RESETOU POR WDT? GOTO VAR_LOCATS ;SIM, TNICIA VARIAVEIS LOCAIS ;NKO, INICIA VARIAVEIS GERATS =” INCIALIZAQKO DAS VARIAVEIS GERAIS = 128 ; INICIALIZAGAG DE TODAS AS VARIAVEIS QUE DEVEM SER ACERTADAS ouANDO 7 © PIC B ENERGIZADO OU RESETADO PELO MASTER CLEAR. ; VAR_GERAIS } COLOQUE SUAS VARIAVETS AQUI coro ¢ ;LOOP INFINITO ESPERANDO ESTOURO DE WOT se INCIALTZacKO DAS VARIAVEIS Locars * INICIALIZAGAO DE TODAS AS VARTAVEIS QUE DEVEM SER ACERTADAS QUANDO } 0 PIC & RESETADO PELO WOT, A FIM DE TORNAR ISTO 0 MAIS TRANSPARENTE } POSSIVEL PARA O USUARIO DO SISTEMA VAR_LOCATS 3 COLOQUE SUAS VARIAVEIS AQUI i ROTINA PRINCIPAL 7 COLOQUE SEU PROGRAMA AQUI GOTO MAIN No caso deste exemple, pedemos observar ainda um outro recurso implementado ¢ bastante interessante, Trata-se da criacda de duas secoes para inicializagao de varidveis. A primeira, que neste caso chamamos de VAR_GERAIS, & processada quando © PIC é alimentade ou resetado pelo hardware. Nessa secéo, devem ser colocadas todas as varidveis que precisam ser acertadas quando o programa ¢ iniciado. Ja na segunda se¢ao, que denominamos VAR_LOCAIS, podemos colocar as varidveis que devem ser modificadas caso o sistema trave e force um estouro de WDT, Isto é utilizado para que, caso o sistema seja obrigado a resetar por WDT, o fato passe despercebido ao usuario final. Podemos utilizar este mesmo conceito para elaborar um sistema ainda mais eficiente em matéria de destravamento. Imaginemos que em todas as rotinas do sistema um registrador € atualizado com um indice que indique a regiao do programa que esta sendo executada naquele momento. Caso o sistema trave © seja resetado por meio da WDT, basta nao alterarmos o valor desse registrador, consultando-o ¢ pulando para a mesma regiao do programa que estava sendo executada, Este sistema é extremamente eficiente para evitarmos travamentos e surpresas aos usuarios, No entanto, nao é tac simples quanto parece, pois todas Programagao 129 as demais variaveis do sistema devem ser acertadas para evitar outros problemas na légica. UTILIZANDO 0 WDT PARA AJUDAR NA SOLUCAO DE PROBLEMAS O watchdog também pode ser de alguma utilidade na debugacio do sistema, caso vocé niio possua um emulador. A mesma sugestao dada acima, em relacio a mantermos uma varidvel que determina a tegiae do programa que esta senda executada, pode ser utilizada para indicar ao programador onde o programa estd twavando. Basta para isso criar uma rotina que paralise o sistema quando houver um reset devido ao WDT e mostre, de alguma forma, o valor dessa variavel. Com isso o programador podera determinar a regido de travamento para tentar resolver o problema. Desbravando 0 PIC Desbravafida o PIC NOVAS CONSIDERAGOES SOBRE O HARDWARE Puxa, vocé jé chegou bem longe em relacdo & programacao do PIC. Na verdade, vocé j4 aprendeu basicamente tudo relacionado 4 programacao e jd deve ser capaz de criar seus préprios sistemas. Daqui para frente serao vistas algumas dicas para ajuda-to a resolver problemas e melhorar seu rendimento como programador. EVITANDO PROBLEMAS COM 0 PIC E SUAS PORTAS O PIC é um componente extremamente resistente. Dificilmente ele queima por motives de curto ou estatica, nem mesmo no caso de ser montado ao contrario (em relagdo ao soquete). No entanto, ele € um componente eletrénico ¢ relativamente caro para ficarmos desperdigando. Por isso, um pouco de cuidado- e precaucio nao fardo mal a ninguém: "Evite contato direto de sua mdo.com os pinos do componente, devido @ eletricidade estdtica. " Na hora de retird-to do soquete, muite cuidado para néo entortar os terminais, Camo normaimente 0 PIC deve ser retirado, gravado e remontada por vérias vezes até que 0 sistema funcione corretamente, as pernas podem quebrar, inutilizando o componente. 0 mais indicado € a utilizagae de uma pinga de retirada de Cis e utilizar mais um soquete. = Cuidado com a configuragae des portas, para evitar um curte em uma porta selecionada coma saida. = Checar a capacidade mdxima de saida das portas utilizadas para evitar uma sobrecarga. O PIC possui una capacidade relativamente alta em suas portas, mas se for necessdrio, utilize drives externas, = PIC é um microcontrolader bastante imune a ruidos, mas é previsivel que ele ndo seja 100% eficiente nesta fungdo. Por isso, quanto mais se planejar a imunidade a ruidos do seu circuito (e também da placa), menos problemas vocé tera. POWER-ON RESET (POR) MELHORADO O objetivo do POR melhorado, em relacdo ao sistema basico ja apresentado, 6 a possibilidade de alterarmos a constante de tempo da estabilizacao do circuito ¢ da fonte antes de © PIC comecar a funcionar. Um circuito baseado em um RC ligado ao (MCLR é capaz de criar este retarco. Esse sistema é recomendaca em casos que possuem uma fonte que demora muito para atingir a tensao estabilizada. Novas Consideracées sobre o Hardware 131 Figura 12,1- POR Externo Melhorada, No circuito apresentado, o diodo DI é utilizado para ajudar a descarregar 0 capacitor C3 quando a fonte ¢ desligada, resetando o sistema mais rapidamente. © tempo de retardo pode ser regulado, variando os valores de RI ¢ C3. O valor fecomendado de RI deve estar abaixo de 40K. Quanto ao R2, que é utilizado para limitar a corrente maxima no /MCRL, seu valor deve estar entre 100R € IK. © PIC 1GF84 possui um sistema interno (Power-UP Timer) para criar este mesmo retardo apés a alimentagao do sistema, que pode ser ligado eu nao, conforme a configuracio na hora de gravar o PIC. No entanto, esse sistema interno nao pode ter seus valores alterados, por isso, em certas situagdes, o circuito exteno € 0 mais recomendavel. BROWN-OUT © circuito de Brown-Out € utilizado para forcar um reset quando a tensio de alimentacao sofre uma pequena queda. Ele & extremamente recomendado em projetos que possibilitam ao usudrio desligar e religar rapidamente a alimentacao. Nestes casos, o brown-out pode evitar problemas de reinicializagao. Figura 12.2 - Brown-Out Externo. Este Circuito fard com que o sistema reset quando Vdd < Vz (DZ1) + 0.7 Voles. A regulagdo da tensio de referéncia injetada na base do transistor pode ser conseguida por meio de um divisor resistive no lugar do zener DZ1 € do resistor RI. Esse sistema pode ser mais barato, no entanto é também muito menos preciso. 132 Desbravando o PIC Desbravande 0 PIC SIMULANDO E “DEBUGANDO” O SISTEMA INTRODUCAO O MPLab é uma ferramenta extremamente poderosa, pois possui diversos recursos para rodar um programa em modo de simulagdo, possibilitando o monitoramento de todo o sistema para identificar e solucionar problemas. 0 que nés veremos a partir de agora é um apanhado geral dos principais recursos disponiveis para que voc€ possa ganhar tempo na solucao de problemas do seu sistema. UMA LISTAGEM COMPLETA (ABSOLUT LIST) A absolut list é uma listagem detalhada do programa apés a compilagio. Além de mostrar o cédigo no assembler original, ela introduz uma série de outras informagGes capazes de nos ajudar a entender o que esta acontecendo, Essa listagem pode ser acessada pelo menu “Window”, opcio “Absolut List”. As principais informacdes disponiveis sao: = Cédigo fonte original: Mensagens de erros e alertas nas posicdes corretas; Namero de linha de texto; Posigéo na meméria de programaciio; Definicao de todos os simbolos (defines, variaveis, constantes, ete.); Mapa da meméria de programacas Relatério de meméria ocupada ¢ livre; Relatério de compilacao; Formatagao apropriada para impressao. Muitas opgdes de geracio dessa listagem podem ser alteradas por meio da diretriz LIST (veja apéndice B). Simulendo ¢ “Debugando” 133 ACERTANDO AS CONDICOES DO HARDWARE A simulagao dentro do MPLab € muito itil, pois ela pode ser realizada sem a montagem de nenhum hardware, economizando tempo e recursos, E légico que em certas situagées a simulacdo torna-se complicada, demorada ¢ 3s vezes até impossivel, obrigando-nos a partir para um protétipo real ou a utilizagdo de um emulador, Mas na maioria dos casos, © simulador sera capaz de resolver uma grande quantidade de problemas. Antes de comegar uma simulagao, vocé deve informar ao MPLab quais as reais condigées de funcionamento da sua maquina, isto é, como seré o hardware extern ao PIC. Por meio do menu “Option” vocé teré acesso 9 ET] duas telas de configuragio do hardware, por intermédio da op¢ao “Processor Setup”. Na tela de "Clock", poderemos escolher a freqiiéncia de trabalho do oscilador, © acerto dessa freqtiéncia é primordial para o correto funcionamento da ferramenta de medicao de tempo real. Figura 13.1 —Alteragdo do Clock. Ja na tela de escotha do hardware, podemos configurar uma série de outras opcdes relativas 20 seu funcionamento, como, por exemplo, a ativagéo do WDT que 56 poderia ser ligado na hora de gravarmos o PIC, EXECUTANDO 0 PROGRAMA Uma vez acertadas as condicdes da maquina para o correto funcionamento do sistema, entéo podemos comecar a rodar o programa para verificarmos se a légica implementada esté realmente correta, Existem varias maneiras de executarmos © programa. Vejamos entao cada uma delas. RODANDO DIRETO (RUN) No modo Run, o programa sera executado da maneira mais rapida possivel (a velocidade real depende da computador utilizada) ¢ 36 parara quando receber uma instrugéo para tal. Desta maneira, enquanto o Programa esta sendo executado, vocé nao visualiza nada do que esta acontecendo. Quando o programa for paralisado, todos os dados de monitoramento serao atualizados, Para vocé saber que o modo Run esté em execu¢ao, a barra de status do MPLab fica amarela. Este modo é ligado per meio do menu “Debug/Run/Run” ou pela tecla F9. RODANDO EM MOBO DE ANIMACAO (ANIMATE) © modo Animate executa o programa de maneira similar ao modo Run, entretanto o MPLab mostra qual linha do programa esta sendo executada no momento ¢€ atualiza todos os dados de monitoramento. Por isso, 0 modo Animate € muito mais lento que o Run, A velocidade depende tanto do computador quanto da quantidade de dados que esto sendo monitorados, O acesso ao modo Animate € feito por intermédio do menu “Debug/Run/Animate” ou pela combinacao de teclas CTRL+F9. PARALISANDO A EXECUCAQ (HALT) A execucao pode ser paralisada a qualquer momento pela tecla F5 ou pelo menu “Debug/RunvHalt", RODANDO PASSO A PASSO (STEPS, Muitas vezes o modo Animate ainda é rapido demais para que passamos avaliar corretamente 0 que esté acontecendo. Por isso 0 MPLab possibilita que © programa seja executade passe a passo, isto é, uma linha de cada vez. Desta forma, cada linha pode ser executada pelo menu “Debug/Run/Step" ou por intermédio da tecla F7. Existem situagSes ainda em que nao nos interessa a visualizacdo de todas as instrugdes de sub-rotinas, pois elas ja foram testadas e isto sé resultaria ¢m perda de tempo. Por isso foi criada uma segunda maneira de execugdo passo a passo, que executa diretamente as sub-rotinas de forma continua, sem perder tempo com elas. Para isso podemos utilizar o menu “Debug/Rum/StepQver” ou a tecla FB. imulando & RESETANDO O PROGRAMA O programa também pode ser resetado a qualquer momento, como se se houvesse um reset por meio do pina de Master Clear. Isto fara com que a execugdo recomece no endereco do vetor de reset (0x00) A RAM, entretanto, nao é afetada, Esse reset pode ser executado pela tecla Fé ou pelo menu “Debug/Run/Reset”. O MPLab possibilita ainda um Power-on-reset, para simular as condigées de energizacio do sistema. Isto pode ser conseguido pelo menu “Debug/Power-on- reset”, PARANDO NOS PONTOS CERTOS (BRAKEPOINTS E RUN TO HERE) Com 9 passar do tempo € a aquisi¢go de experiéncia na utilizagao do simulador, vocé verd que somente certas partes do cédigo devem ser checadas ¢ testadas, sendo que muitas outras podem ser desprezadas pela certeza de estarem corretas. A inicializago do PIC pode ser um exemplo disso, O simulador possui entao ferramentas para que o programa seja executado diretamente até um determinado ponte e depois paralisado. A maneira mais répida de conseguir isso € por meio do comanda “Run to Here”, acessivel pelo botdo direito do mouse Ao entrar nesse comanda, o programa serd executado até a linha em que se encontrava © ponteiro do mouse, Outra maneira de conseguir o mesmo resultado & por intermédio da insercéo de um break point. Ele também é acessivel pelo botao direito do mouse, ¢ quando € introduzido, a linha em questao muda de cor, Sempre que um break point € encontrado, a execucio é paralisada (tanto em modo Run quanto em Animate). A grande vantagem do break Point € que podemos introduzir varios no mesmo codigo. Para eliminar © break point, basta repetir o comando na mesma linha. Os break paints podem ser controlados também por uma tela acessada pelo menu “Debug/Break Settings”. Logo vocé verificard que existem situagdes ainda mais especificas para querermds paralisar um programa durante a debugagdo. O MPLab 4.0 possui um novo recurso que possibilita paradas muito mais precisas. Trata-se da parada condicional, que pode ser configurada por meio do menu “Debug/ Execute/Condicional Break...". A tela seguinte mostra as opgSes desse comando: Sai Bulle ase. Figura 13.3 - Configuragda de Peradas Condicionais. Com este recurso podemos, por exemplo, parar a execugao quando um registrador atingir um determinado valor (podem ser feitas ainda comparagdes come maior, menor, maior e igual, etc.). CONTROLANDO AS PASSAGENS (TRACE POINTS) Outro recurso muito poderoso para a debugagio sio os trace points. Tratase de marcagdes que vocé introduz nas linhas de programa, de forma similar aos break points, s6 que em vez de paralisar a execucgao, simplesmente registram a passagem. Acessando a tela de memorizacao des trace points (menu “Window/Trace Memory"), vocé poder verificar quantas vezes, ¢ quando, as linhas marcadas foram executadas. Um trace point pode ser intraduzido com um elique no botao direito do mouse ou par meio da tela acessada pelo menu “Debug/Trace Settings” OUTROS RECURSOS Pte] E possivel ainda alterarmos diretamente 0 niimero da linha de programa (PC) que sera executada em seguida. Isto é muito dti] quando queremos pular um pedaco do cédigo ou testar uma rotina especifica, Para alterarmos © program counter, basta acessarmos o menu “Debug/Runv/Change Progam Counter". Em outros Casas, precisamos executar uma instrugdio que niio existe no programa, evitando assim termos de recompilar e reiniciar a simulacao (muitas vezes isso exige um longo tempo). Isto € possivel pelo comando do menu “Debug/Execute/Execute An Upcode”. Vale lembré-lo que como este codigo sera executado diretamente sem passar pelo compilador, nao podem ser utilizades recursos de diretrizes, coma a definigao de nomes por intermédio de defines e equates Simulando e “Debuganda” a Sistema 137 VISUALIZANDO A MEMORIA Até agora vocé aprendeu os recursos para executar 0 programa implementado, e também paralisé-lo quando necessdrio, mas ¢ quanto ao monitoramento dos registradores? Para podermos realmente saber se a légiea de operacao esta funcionanda corretamente, é preciso verificarmos 9 estado de diversos registradores (SFRs ou varidveis) durante a execucdo. MAPA DA MEMORIA | Podemos visualizar, por exemplo, um mapa total da meméria, isto é, o valor armazenacdo em cada byte da RAM. Esta tela mostra a RAM total ¢ pode ser utilizada para monitorar tanta os SFRs quanto as varidveis da sistema, A maneira como os dados sio mostrados pode ser alterada pelo menu da janela. Esta tela pode ser acessada pelo menu “Wiindow/File Registers”. OF 82 OF £9 S7 18 00 00 OD -- 00 00 G0 8 00 06 08 00 09 G0 8d 08 00 08 OD 00 00 GE OO 00 Ho OO Oo R110 M0 00 2 14 O3 FA 10 FF 8 On Ng 3a Bo 88 AG MM 86 00 BH GB OO OO HE GO OO ON OB Oo 01 G1 O2 G2 03 G3 G4 Bh UO GO A0 09 OB AB Oo Figura 13.4 ~ Visualizegdio da RAM. REGISTROS ESPECIAIS (SFRS, Nem sempre precisamos visualizar a meméria inteira, certo? O MPLab possui entao uma tela para visualizagao somente dos SFRs, o que, em muitos casos, € mais que suficiente. Os SFRs podem ser manitorados pelo menu “Window/Special Function Registers". PILHA (STACK) A situag3o atual da pilha pode ser visualizada por intermédio do menu “Window/Stack”. REGISTROS DIVERSOS (WATCHS) A maneira mais poderosa de monitorarmos a RAM é por meio de uma janela de Watchs. Nessa janela, podemos escolher ¢ configurar exatamente o que queremas visualizar, descartando os registradores desnecessarios, Outra vantagem da janela Watch é que ela pode ser gravada na forma de um arquivo. 138 Desbravando @ PIC Desta mancira, nosso projeto pode possuir varias janelas Watchs diferentes, sendo uma para cada tipo de simulac’io. Essas janelas podem ser criadas pelo menu “WindowNew Watch Window", senda necessdrio escolher quais os registradores que serdo acrescentados. Durante a criagio de uma nova jancla, © botSo “Propriets” pode alterar as propriedades de visualizago do registrador, como, por exemplo, a formatagdo (Hex, decimal, bindrio, ASCII, etc.). Uma vez criada a janela, insergdes, eliminagSes ou alteragSes nas propriedades dos registradores podem ser efetuadas pelo menu da janela, Nesse menu, existe também um comande para salvar a configuracae atual em um arquivo. Uma janela j4 salva pode ser reaberta pelo menu “Window/Load Watch Window”. Clicando duas vezes sobre o enderego do registradar, temos acesso 4 tela de modificac3o, na qual é possivel alterarmos diretamente o valor do registrador em questo. Isto é extremamente dtil para acelerarmos contadores, por exemplo. Figura 13.5 — Visualizagdo Especifica da RAM, Figura 13.6 ~Alteragdio do Valor de Registradores. CONTROLANDO AS ENTRADAS A janela de modificagao de registradores é muito itil, mas ela possui uma limitagdo: nado podemos alterar os pinos configurados como entradas, Mas como podemos entio tornar a nossa simula¢do real sem afetarmos as entradas do sistema? Na verdade, essas entradas terao de ser alteradas, mas por intermédio de um outro recurso: os estimulos. ESTIMULOS DIRETOS No simulador do MPLab, podemos associar botdes aos pinos de entrada do PIC, podendo afetar diretamente o estado desses pinos com um simples “clique” do mouse, Para isso, entre no menu “Debug/Simulader Stimulus/Asyachronous Stimulus...". Esta agao ira abrir a janela “Asynchronous Stimulus Dialog” que possibilita a configuracao de até 12 bordes. Simulando e "Debuganda” o Sistema 139 Saree Figura 13.7 - Estinutlos para as Entradas. Para associar um pino.a um botdo é muito simples: clique sobre um dos botdes disponiveis com 0 botao direita do mouse, Isso ird acessar um menu ripido. A primeira opcao “Assing Pin...” mostrara a lista de todos os pinos que podem ser associados. Observe que, além das portas, esto disponiveis também os pinos de Mastrer Clear e TOCKI. O nome do pino associado é entao mostrade no respectivo borao. A letra entre parénteses (ao lado do nome do pino) mostra o tipo de sinal que sera estimulado quando o botao for pressionado. Existem quatro tipos de estimulos que podem ser alterados por intermédio do menu rapido: Pulse (P): Estimulo de somente um pulso, invertendo momentaneamente o estado atual do pino. A duragio do pulso é de somente um ciclo de maquina, por isso nem sempre é facil utilizar esse tipo de estimulo. High (Hf): Forga o estado do pino para nivel alco (1). Low(L): Forga 0 estado do pino para nivel baixo (0). Toggle (T): Inverte o estado do pino a cada toque. Esse tipo de estimulo é 0 mais utilizado. Valem algumas observacdes muito importantes sobre a tela de estimulos: * Quando ela esté aberta, a execugéo do programe fica muito mais lenta, Por isso, se ndo estiver utilizando os estimulos, feche-a. * Somente wm botdo pode ser pressionado de cada vez, isto ¢, entre um estimulo ¢ outro, voce deve executar pelo menos uiia instrugéo da seu cédigo. " Ndo se esqueca que, ao clicar ent tin dos botées de estimulos, essa tela passa a ser a ative. Para poder voltar a executar 0 programa, pela tecla F7, por exemplo, ser necessdrio antes clicar na tela do cédigo fonte para torné-la ativa novamente. No modo Run ou Animate, vocé pode clicar diretamente nos botées de estimulas e ver o que acontece com seu programa, * Para salvar a configuragdo das botées, salve o projeto com essa tela aberta, ESTIMULOS PREDEFINIDOS Outro tipo de estimulo sd0 os automaticos, isto €, aqueles que devem acontecer sem que vocé tenha de ficar tomando algum tipo de atitude. Para issa, estao disponiveis mais trés tipos de estimulos: * Estinwulos periédicos; = Estimulos de pinos; e * Estinulos de registradores. 140 Desbravando 0 PIC ESTIMULOS PERIODICOS Sao os que podem ser programados para acontecerem periodicamente de acordo com o clock da maquina. Por meio do menu “Debug/Simulador Stimulus/Clock Stimulus...” vac€ teré acesso 4 tela “Clocked Stimulus Dialog". Na qual podera associar estimulos a diversos pinas ao mesmo tempo. Basta escolher o pino e informar o tempo de duragdo do estado alto (1) ¢ do estado baixo (0), e vocé estaré criando uma freqiiéncia no pino escolhido. Lembre-se que os valores introduzidos sao relativos a ciclos de maquina, e nao a tempo propriamente dito. Colocando somente © valor para o campo “High” ¢ clicando no quadro “Invert, vocé criard uma onda quadrada, Essa janela possibilita ainda que a configuracao de estimulos seja gravada e posteriormente recuperada, ESTIMULOS DE PINOS Vocé pode criar um arquivo de texto para gerar estimulos automéaticos nos pinos do microcontralador. Trata-se de um arquivo com uma sintaxe especial que deve ser gravado com a extensao “.STI". O proprio editor do MPLab pode ser utilizado para a criagdo desse arquive. Para o controle dos estimulos, serao criadas varias colunas; a primeira informando 0 niimero do ciclo de maquina em que acontecerd uma mudanga e as demais informando 0 estado de cada pino apos a mudan¢a. Veja um exermplo de um arquivo de estimulo para pinos: CYCLE RBI RBO 20 ° 9 42 1 0 ; Comentérios 52 0 as 55 1 1 60 0 0 Comentarios podem ser acrescentados ao arquivo por meio de ponto-e virgula. Para ligar os estimulos de pinos, associando o arquivo criado, basta entrar no menu “Debug/Simulator Stimulus/Pin Stimulus/Enable...". Simulando ¢ “Debugande" o Sistema 141 ESTIMULOS DE REGISTRADORES Muitas vezes queremas afetar ndo s6 os pines da maquina, mas também seus registradores, ou 0 PORTB inteiro de uma sé vez. Para isso, pode ser criado um outro tipo de arquivo com cada valor que serd associado ao registrador em uma linha, como, por exemplo: 60 15 TE 45 78 Este arquivo devera entao ser gravado com a extensdo “.REG". Depois, basta entrar no menu “Debug/Simulator Stimulus/Register Stimulus/Enable..." para ter acesso a tela ao lado. Por meio do botao “Browse...” vocé podera = associar 0 arquivo criado. Figura 13.9 - Estimulos de Registradores. No campo “Register Address”, vocé informard qual registrador receberd os dados contidos no arquivo, e no campo “Program Memory Address" deve ser informada a pasicae do programa em que acontecerao as trocas de valores, isto &, tada vez qué a execu¢ao passar por esse ponto do programa, o prdéximo valor de estimulo sera colocado no registrador escolhido. CONTANDO O TEMPO CORRETAMENTE Acalibragao de tempo dentro das rotinas do seu sistema pode ser muito importante, € também muito trabalhosa, & por isso que o MPLab possui uma ferramenta para auxiliélo nesta tarefa, © Stopwatch é um contador de ciclas de maquina que calcula © tempo baseado na freqiiéncia do oscilador que vocé configurou. Desta forma, para sabermos exatamente quanto tempo est4 sendo perdido em uma rotina de delay, por exemplo, podemos executar o programa até a linha que chama a rotina, zeramos 0 cronémetro (botao “Zero”) e depois pressionamos F& para que a rotina seja executada de uma s6 vez. Quando o delay acabar, a execucdo sera paralisada e a tela “Stopwatch” mostrard ¢xatamente quanto tempo durou esta tarefa, Simples, nio? Figura 13.10 — Cronémetro, Para acessar este relégio, entre no menu “Window/Stopwatch...". 142 Desbravando 0 PIC PROJETOS PROPOSTOS Pronto, agora que vocé ja conhece toda a programacio do PIC, esta na hora de fazer seu préprio projeto. O mais indicade é elaborar um sistema e executé-lo do inicio até © fim. Acontece que a grande maiaria, quando chega neste ponto, ainda nao tem uma idéia bem-definida do que poderia fazer como um primeiro Projeto completo, Por isso, tomamos a liberdade de sugerir dois sistemas que podem ser implementados no hardware proposto no apéndice F. Os projetos seguintes serao somente especificados, sendo que as solugdes devem ser totalmente implementadas por vacé. Os exemplos dados no decorrer do capitulo 11 ajudarao mi nesta tarefa. As informagées dos apéndices também podem contribuir muito no desenvolvimento dos seus conhecimentos e solugao de dividas, ¢ por isso devem ser estudados paralelamente & implementaco do seu primeiro projeto com PIC. De agora em diante é uma questo de criatividade e muito treino. Mios a obra e boa sorte! TIMER Depois do exemplo voltado ao timer, € légico que nao poderiamos deixar de sugerir a implementa¢ao de um timer completo. O mais indicado € vocé criat um timer para controlar uma safda, que no exemplo 5 era um led. Essa saida pode ser, por exemplo, um relé que controlaré um sistema externo qualquer. Programe dois botées para incrementar e decrementar o tempo inicial do timer, como no case do contador do exemple 4. Vocé pode ainda utilizar os recursos de meméria do exemplo 6 para ndo perder o valor ajustado. Continue utilizando dois botées para o controle, sé que com as seguintes alteracdes: o botdo 1 deve disparar € paralisar o timer, ¢ botao 2 deve reseté-lo, desligando a saida e valtande ao tempo inicial. Futuramente, vocé pode ainda implementar uma outra saida para acionar um buzzer ao término do tempo. DIMMER Um dimmer também & um projeto bem interessante. Vocé pode, por exemplo, utilizar o sistema do contador para manipular uma variavel interna que servira de referéncia para o seu ajuste de intensidade, Inicialmente comece com um dimmer para tensdes DC, que pode ser aplicado a uma lampada no hardware proposto pelo apéndice F (saida PWM). Com a interrupcao de TMRO vocé pode criar uma saida PWM, controlando o tamanho do pulso com base no valor ajustado na variavel interna. Continue utilizando dois botdes para incrementar e decrementar 0 ajuste, que pode ir de 0 a 100%, com 16 steps. Como sé existe um display, represente © nimero de forma hexadecimal, conforme o exemplo 4. Um terceiro botao pode ser utilizado para ligar e desligar a limpada, no ajuste atual. Quando a lampada estiver desligada, o display deve ser apagado, bloqueando o ajuste de intensidade. O projeto pode ser depois aperfeigoado para controlar uma tensao AC. Neste caso, a saida deve disparar um TRIAC, ajustando o Angulo de disparo em relacao 4 sendide. Para tal, serd necessario um sincronismo com a rede elétri que pode ser conseguido injetando uma amostra da sendide no pino RA4 {j existe um conector para isso no hardware). Por meio das interrupgdes de mudanga de estado, serd possivel sincronizar o inicio de cada um dos semiciclos. Basta entéo contar um tempo proporcional ao ajuste da intensidade e disparar o TRIAC. Recomendames que este disparo seja feito, pelo menos inicialmente, com o auxilio de um MOC, isolando assim a parte de poténcia da parte de controle Desbravando o PIC BIBLICTECA MOURA LAU tiue SET DE INSTRUCOES COMPLETO SOMA UMA LITERAL AO W ADDLW sk Deserigao: O valor da literal passada no argumento k & somado ao valor de We o resultado é armazenado no préprio W. Limites: Osks 255 Operagao: = (W) + (kK > 0) Status afet: GDCZ Encoding: [11 | tix | kkkk | kkkk Palavras: 1 Ciclos: 1 Exemplo: ADDLW 0x15 Antes da instruga Oxi0 Apdés a instrucao: 0x25 ADDWE SOMA ENTRE WE Q REGISTRADOR F Sintaxe: ADDWF fd Descrigdo: valor de W é somado ao valor do registrador F e © resultado é armazenado no lugar definido por d. Limites: O (dp Status afet.: Encoding: oo [oi | dar Palavras: 1 Ciclos: 1 Exemplo: ADDWF FSR,W Antes da instrugao: Wo = OxI7 FSR = OxC2 Apésainstrugao: W = OxD9 FSR = OxC2 Set de lastrucaes Completa OPERACAO “E” ENTRE UMA LITERAL E We ANDLW k Executa um Iégico entre o valor da literal passado no argumento k e a valor de W. © resultado é armazenado no prdprio W. Limites: Osk= 255 Operagio: (W) .AND. (Kk) > (W) Status afet: Z Encoding: Palavras: Ciclos: 1 Exempla: ANDLW OxSF Antes da instrugdo: W= OxA3 Apds a instrugia: W= 0x03 ANDWF __OPERACAO “E” ENTRE WE F Sintaxe: ANDWE fd Descrigao: Executa um “E" I6gico entre o valor de We 0 valor do registrador F. O resultado € armazenado no lugar definido por d, Limites: Osfs127 d=0 (W) ou d=1 (6) Operagao: (W) AND. (8 > (d) Status afet.: Encoding: | oir | ant Palavras: 1 Giclos: 1 Exemplo: ANDWF —FSR,F Antes da instrugiio: Ws = 0x17 FSR= OxC2 Apés a instrucao: W= 0x17 FSR= 0x02 Desbravando @ PIC BCF LIMPA UM BIT DO REGISTRADOR F Sintaxe: BCF f.b Descrigao: © bit de ntimero b do registradar f serd zerado (clear), Limites: O=fs127 O=bs7 Operaca 0 (fb) Status afet.: Nenhum Encoding: [a1 | oobb | bar | amr | Palavras: 1 Ciclos: 1 Exemplo: BCF FLAG,5 Antes da instrucao: FLAG= BIIT11111° Apés a instrugao: FLAG= B'11011111" BIFSC TESTA O BIT DE F, PULA SE ZERO Sintaxe: BIFSC fb Descrigao: Se o bit b do registrador f for 1, entio a proxima linha serd executada. Caso ele seja 0, a préxima linha sera pulada. Neste caso, a instrucio leva dois ciclos. Limites: Osfs127 Osbs7 Operagao: pula se (fb) = 0 Status afet: — Nenhum encoding: [01106 [wae [a] Palavras: 1 : Ciclos: Tou2 Exemplo: BTFSC LED Set de instrugées Completo GOTO APAGA_LED GOTO ACENDE_LED Antes da instrucdo: PC=— Linha 1 Apés a instrugao: Se LED =1 PC = Linha 2 Se LED =0 PC = Linha 3 BSF SETA UM BIT DO REGISTRADOR F Sintaxe: BSF fb Descrigio: O bit de niimero b do registrador f sera setaclo (set). Limites: Osfs127 Osbs7 Operagaio: 1 (fb) Status afet: © Nenhum Encoding: [01 | o1bb | bf | ai Palavras: 1 Ciclos: 1 Exemplo: BSF FLAG,S: Antes da instrugao: FLAG= B'00000000" Apés a instrugio: FLAG= B'00100000' BIFSS TESTA O BIT DE F, PULA SE UM. Sintaxe: BTFSS fb Descrigdo: Se o bit b do registrador f for 0, entao a préxima linha sera executada. Caso ele seja 1, a préxima linha sera pulada. Neste caso, a instrugdo leva dois ciclos. Limites: Osfs127 O£bs7 Operagio: pula se (fb) = 1 Status afet: Nenhum Palavras: 1 Ciclos; Tou2 Exemplo: BTFSS LED GOTO ACENDE_LED GOTO APAGA_LED Antes da instrugao; = Linha 1 Apés a instrugao: $e LED = 0 PC=— Linha2 SeLED=1 PC=— Linha3 CALL CHAMA UMA SUB-ROTINA Sintaxe: CALL k Descrigio: Chama a sub-rotina representada por k, que € um enderega da meméria de programagado, mas normalmente é representado por um nome (label). Antes do desvio, a endereco de retorno (PC+1) & armazenado na pilha. Limites: O=ks 2047 Operagdo: (PC) + 13 TOS (k) > (PC,10:0) (PCLATH,4:3) > (PC,12:11) Status afet.: Nenhum Encoding: 10 | Okeke [ikki [kek | Palavras: 1 Ciclos: 2 Exemplo: CALL DELAY Antes da instrugaa: PC= Linha1 Apés a instrucdo: PC= DELAY CLRF LIMPA O REGISTRADOR F Sintaxe: CLRF f Descrigio: —_Limpa o valor do registrador Fe o bit Zé setado. Limites: O=fsi27 Operagao: O23 () 19Z Status afer: Z Encoding: Palavras: Ciclos: 1 Exempla: CLRF FLAG Antes da instrucdo: FLAG= BYITT11111" Apds a instrugao: FLAG= B'00000000° z= 1 Set de instrucdes Completo Limites: Operacao: Status afet.: LIMPA O REGISTRADOR We CLRW Limpa o valor do registrador We 0 bit Z é setado, Nenhum o> (Ww) 132 Encoding: 0011 Palavras: Ciclos: 1 Exemplo: CLRW Antes da instrugdo: Buin Apés a instrucdo: W= — B'on000000" z= 1 CLRWDT EIMPA 0 WATCHDOG TIMER Sintaxe: CLRWDT Descrigaa: Limpa o valor do contador WDT, resetando o valor do contador de prescaler. Os bits /TO ¢ /PD sao setados. Limites: Nenhum Operacio: 0. (WDT) 0 > WOT prescaler 13/10 13D Status afet.: TO, /PD Encoding: [00 | 0000 i0 | 0100 Palavras: 4 Ciclos: 1 Exemplo: CLRWDT Antes da instrugdo: WDT cont.= ? WDTps= ? Apés a instrugao: WoT cont= 0 WDTps= 0 TO= 1 1 PD= Desbravando o PIC COMF COMPLEMENTO DEF Sintaxe: COMF fd Descrigdo: Calcula o complemento do registrador f. O resultado é armazenado no lugar definido por d. Limites: Osfs127 d=0 (Wy ou d=1 (F) Operacio: (> (d) Status afet: Z Encoding: [00 | 1001 [ cnr | fir Palavras: 1 Ciclos: 1 Exemplo: COMF REGLF Antes da instrugéo: REGI= Ox13 Apos a instrugao: REG1= OxEC DECF DECREMENTA O REGISTRADOR F itaxe: DECF fd Descrigao: Decrementa uma unidade do valor do registrador F. O resultado é armazenado no lugar definido per d Limites: Osfs127 d=0 (W) ou d=1 (F) Operacao: ()-1> (a) Status afet,; Z Encoding: [00 | oo11 [ame | air Palavras: 1 Ciclos: 1 Exemplo: DECF CNTF Antes da instrugio: CNT= 0x01 z= 0 Apés a instrugio: CNT= 0x00 i= 1 Set de Instrugdes Completo DECFSZ DECREMENTA F, PULANDO SE ZERO Sintaxe: DECFSZ fd Descricao: Decrementa uma unidade do valor de registrador F. 0 resultado € armazenado no lugar definido por d. Se o resultado da operagao for zero, a linha seguinte é pulada. Quande isto acontece, a instrugdo ocupa dois ciclos Limites: Osfs127 d=0 (W) ou d=1 (F) Operagao: (h- 1 (d) Pula a préxima linha se resultar em 0 Status afet.: — Nenhum Encodin oo | to | am | ar] Palavras; 1 Ciclos: Tou2 Exempla: DECFSZ CNTF GOTO CONTINUA GOTO ACABOU Antes da instrugao: PC= — Linha 1 Apés a instrucio; Se CNT-1 40 PC = Linha 2 Se CNT-1 =0 PC = Linha3 CNT = CNT-1 GoTo DESVIA PARA UM OUTRO ENDERECO Sintaxe: GoTo k Descrigéo: —Desvia para um outro ponto representado por k, que ¢ um endereco da meméria de programacio, mas normalmente é Fepresentado por um nome (label). Limites: Ok = 2047 Operagio: (Kk) > (PC,10-0) {PCLATH,4:3) > (PC,12:11) Nenhum 10 kkk kkk Palavras: 1 Ciclos: 2 Exemplo: GOTO CONTINUA 152 Antes da instrugao: PC= Linha 1 Apés ainstruggo: = PC= CONTINUA Desbravando a PIC INCE INCREMENTA 0 REGISTRADOR F Sintaxe: INCF fd Descrigaa: Incrementa uma unidade no valor do registrador F. O resultado é armazenado no lugar definido por d. Limites: Osfsit7 d=0(W) ou d=1(F) Operagao: = (f) + 19 (@) Status afet: Zz Encoding: — [_00 J 1010 [aay] fir Palavras: 1 Ciclos: 1 Exemplo: INCF CNTF Antes da instrugdo: CNT= OxFF z= 0 Apos a instrugdo: CNT= 0x00 FSR= 1 INCFSZ INCREMENTA F, PULANDO SE ZERO Sintaxe: INCFSZ fd Descrigao: Incrementa uma unidade no valor do registrador F. O resultado ¢ armazenado no lugar definido por d. Se o resultado da operacao for zero, a linha seguinte é pulada. Quando isto acontece, a instrucao ocupa dois ciclos. Limites: Osf= 127 d=0 (W) ou d=1 (F} Operagio: (+ 1>(d) Pula a préxima linha se resultar em 0. Status afet.: Nenhum ‘. Encoding: 00 ni |_ at | mr Palavras: 1 Ciclos: louz Exemplo: Set de Instrugdes Completo INCFSZ CNTF GOTO CONTINUA GOTO ACABOU Antes da instrugia: PC=— Linha | Apés a instrucio: Se CNT#140 PC = Linha 2 Se CNT+1=0 PC = Linha3 CNT = CNT+1 TORLW OPERACAQ “OU" ENTRE UMA LITERAL E W Sintaxe: TORLW k Descrigao: Executa um “OU" Idgico entre o valor da literal passado no argumento k e o valor de W. O resultado é armazenado no préprio W, Limites: Osk=255 ‘Operacao: (W) OR. (k) > (W) Status afet.: Encoding: Palavras: Ciclos: 1 Exemplo: IORLW Ox35 Antes da instrugao: W= — Ox9A, Apdés a instrucao: W= OxBF IORWE OPERACAQ “OU” ENTRE W EF Sintaxe: IORWF fd Descri¢ao: Executa um "OU" Iégico entre o valor de We o valor do registrador F, 0 resultado € armazenado no lugar definido por d. Limites: Osfs5127 d=0 (W) ou d=1 (F) Operagao: (WOR. (f) > (d) Status afet: Zz Encoding. [00 | 0100 | af [aif] Palavras: 1 Ciclos: 1 Exemplo: IORWF REG,W Antes da instrugao; REG= 0x13 W= 0x91 Apds a instrugio: REG= 0x13 W= 0x93. Desbravando 0 PIC MOVLW MOVE UMA LITERAL PARA Wo _ Sintaxe: MOVLW ok Descric¢ao: Mave o valor de uma literal para o registrador W. Limites: Osk= 255 Operagao: (> (Wy Status afet.: = Nenhum Encoding. [HI aoxx | kek [kkk | Palavras: 1 Ciclos: 1 Exemplo: MOVLW OXSA ‘Antes da instrugao: W= 7? Apés a instrugdo: W= — Ox5A MOVF MOVE 0 VALOR DE F PARA DESTINO D: Sintaxe: MOVF fd Deseri Move (copia) o valor do registrador F para o local determinado pelo destino d. Limites: O=fs 127 d=0 (W) ou d=1 (F) Operacéa: (> (d) Status afet.: Z Encoding: oo | tooo [ air | mr Palavras: 1 Ciclos: 1 Exemplo: MOVF FSR,W Set de instrugaes Com Antes da instrugao: W= ? FSR= 0x23 Apés a instrucao: W= 0x23 FSR= 0x23 eee MOvWwE MOVE O VALOR DEW PARA F _ Sintaxe: MOVWE f Descricao: Move (copia) o valor do registrador W para o registrador f. Limites: O=f= 127 Operacao: (wy > Status afet: Nenhum Encoding: 00 000 | fir Palavras: 1 Ciclos: 1 Exemplo: MOVWF — OPTION Antes da instrucdo: OPTION= OxFF We Ox4F Apés a instrugao: ‘OPTION= Ox4F We ‘Ox4E NOP NAO EXECUTA NADA Sintaxe: NOP Descrigao: Esta instrugio € usada somente para perder tempo, pois ela nao Status afet.: Encoding: Palavras: Ciclos: Exemplo: [_00 T0000 [oxo | 0000 1 executa operacao nenhuma. Nenhum Nenhuma Nenhum T NOP RETFIE Sintaxe: Deserigao: Limites: ‘Operagao: Status afet.: Encoding: Palavras: Ciclos: Exemplo: RETLW Sintaxe: Descrigao: Limites: Operacao: Status afet.: Encoding: Palavras: Ciclos: Exemplo: RETORNA DA INTERRUPCAO RETFIE Retorna da interrupcao, recuperando o dltimo enderego da pilha e setando 0 bit GIE. Nenhum TOS + (PC) 19GIE Nenhum 00 | co00 | 0000 | 1007 | - 2 RETFIE Apés a instrugdo: PC=TOS GIE= 1 RETORNA COM UMA LITERAL EM W RETLW k Retorna de uma sub-rotina, recuperando o dkimo enderego da pilha e colocando o valor passado por k em W. Osk=<255 (k) > (WY) TOS > (PC) Nenhum Oixx | kkkk 1 2 RETLW 0x50: Apés a instrucio: PC= TOS 0x50 RETURN: Sintaxe: Deserigao: Limites: Operagio: ‘Status afet.: Encoding: Palavras: Ciclos: Exemplo: Descrigao: Limites: Operacao: Status afet.: Encoding: Palavras: Ciclos: Exemplo: 158 RETORNA DE UMA SUB-ROTINA RETURN Retorna de uma sub-rotina, recuperando o tltimo enderecgo da pilha, Nenhum TOS ~ (PC) Nenhum [| eon [00 [000 1 2 RETURN Apés a instrugao: Pc= TOS ROTACIONA F UM BIT PARA A ESQUERDA RLF fd Rotaciona o registrador F um bit para a esquerda. O valor de carry € colocado no bit 0, e depois 0 valor do bit 7 é colocado em carry. O resultado € armazenado no lugar definido por d. Osfs127 d=0 (W) ou d=1 (PF) Conforme descricao (vide figura 11.3). RLF REGIF Antes da instrucao: c= oO REGT= B11 100110" Apés a instrucao: C= 1 REG1 = B'11001100° Desbravando 0 PIC Limites: Operacao: ROTACIONA F UM BIT PARA A DI RLF fd Rotaciona o registrador F um bit para a direita. O valor de carry é colocado no bit 7, ¢ depois o valor do bit 0 € colocado em carry. O resultado é armazenado no lugar definido por d. O=f=127 d=0 (W) ou d=1(F) Conforme descrigio (vide figura 11.4). Status afet: C Encoding: co | 1100 | afr far | Palavras: 1 Ciclos: 1 Exemplo: RRF REGI,F Antes da instrugdo: c= oa REG1= B'11100110' Apés a instruciio: C= oO REGI= B'011 10011" SLEEP ENTRA EM MODO SLEEP Sintaxe: SLEEP Descrigdo: Coloca o microcontrolador em modo sleep Limites: Nenhum Operagao: 02> WOT 0 > WOT prescaler 13/70 o3"D Status afer; /TO, /PD Encoding: Palavras: Ciclos: Exempla: 00 | 0000 | a1i0 | oom SLEEP Set de Instrugées Completo 159 SUBLW SUBTRAI O VALOR DE W DE UMA LITERAL Sintaxe: SUBLW k Descri¢ao: Subtrai o valor de W da constante passada por k. O resultado é armazenado no préprio W. Limites: O (W) Status afet: C.DC,Z Encoding: 1 | 110: Palavras: 1 Ciclos: 1 Exemplol: SUBLW ‘0x02 Antes da instrugdo: We 1 c= 7 Apds a instrugao: W= 1 c= 1 (positive) Exemplo2: — SUBLW = Ox02 Antes da instrugao: W= 2 C= ? Apés a instrucao: W= oO C= 1 (zero) Exemplo3: SUBLW ‘0x02 Antes da instrugao: We 3 c= ? Apés a instrugao: W= 255 C= 0 (negative) Desbravando o PIC SWAPF _ INVERSAO DO REGISTRADOR F J Sintaxe: SWAPF fd Desericao: Inverte a parte alta (bits de 4 a 7) com a parte baixa (bits de 0a 3) do registrador F. O resultado é€ armazenado no lugar definido pord. Limites: Osfs 127 d=0 (W) ou d=1(F) Operacao: —_(F,3:0) > (47:4) (£24) > (d,3:0) Status afet.: © Nenhum Encoding: Palavras: Ciclos: 1 Exemplot: SWAPF ——REG,F Antes da instrugio: REG= OxAS Apos a instrugao: REG= Ox5A XORLW OPERAGAO “OU EXCLUSIVO™ ENTRE UMA LITERAL E W' Sintaxe: XORLW k Descrigao: Executa um “OU" ldgico exclusivo entre o valor da literal pasado. no argumento k e o valor de W. O resultado é armazenado no préprio W. Limites: Osk=255 Operacao: (W) -XOR. (kj 2 (W) Status afet.: Z Palavras: 1 Ciclos: 1 Exemplo: XORLW OxAF Antes da instrugao: W= — OxBS Apés a instrugdo: W= OxlA XORWF OPERACAQ “OU EXCLUSIVO" ENTRE WE F Sintaxe: XORWF fd Deserigao: Execura um “OQU" légico exclusive entre o valor de W ¢ 0 valor do registrador F. O resultado é armazenado no lugar definide por d. Limites: O=fs 127 d=0 (W) ou d=1 (F) Operagao: (W).XOR. (f) > (dy Status afet.: 2 Encoding: [00 [| oro [| amr | i Palavras: 1 Ciclos: 1 Exemplo: XORWF —REG,F Antes da instrucio: W= — OxBS REG= OxAF Apds a instrucao: W= — OxB5 REG= OxlA s Completa Desbravando o PIC bien RIZES DA LINGUAGEM MPASM © _BADRAM - CONFIGURA REGIOES DA RAM NAO DISPONIVEIS Sintaxe __BADRAM (-[,-[]]] Descrigéo Determina blocos de meméria RAM que nao podem ser utilizados pelo microcontrolador. Os valores de devem estar sempre dentro do limite imposto pela diretriz __MAxRaM, Caso 9 programa tente utilizar um endereca englobado por esses limites, uma mensagem de erro seré gerada, O programador também nao precisa se preocupar com esta diretriz, pois ela estd definida nos arquivos de INCLUDE fornecides pela Microchip. Exempla Veja exemple de __MAXRAM Veja também __MAXRAM BANKISEL - GERA CODIGO PARA ACERTAR BANCO DE MEMORIA (ACESSO INDIRETO) Sintaxe BANKISEL Descri¢ao Esta diretriz é utilizada para acertar automaticamente o banco de memdria para acesso indireto. Na verdade, o compilador ird gerar 0 codigo necessério para acertar © banco. Para PICs de 14 bits, serao utilizadas instrucdes para setar ou limpar o bit IRP do registrador de STATUS. Ja para os PICs de 16 bits, as instrugSes. MOVLB ¢ MOVLR serao implementadas. © argumento Diretrizes da Linguagem _ 165, representa a varidvel com a qual se trabalhard ¢ que deve servir de referéncia para a sclecio do banco. Exemplo MOVLW VARI MOVWF FSR BANKISEL VARI HOVWE IND Veja Também PAGESEL, BANKSEL BANKSEL - GERA CODIGO PARA ACERTAR BANCO DE MEMORIA (ACESSO DIRETO) Sintaxe BANKSEL — Deserigéio Esta diretriz € utilizada para acertar automaticamente 6 banco de meméria para acesso direto. Na verdade, 0 compilador ird gerar 0 cédigo necessario para acertar o banco. Para PICs de 12 bits, as instrugdes para acertar os bits do FSR serdo inseridas no cddigo. Para PICs de 14 bits, serao utilizadas instrugdes para setar ou limpar os bits RPO e RPI do registrador de STATUS. Ja para os PICs de 16 bits, as instrugées MOVLB ¢ MOVLR serao implementadas. Entretanto, se 0 PIC em uso contém somente um banco de RAM, nenhuma instrugdo adcional é gerada, O argumento representa a varidvel com a qual se trabalhard ¢ que deve servir de referéncia para a selegaio do banco. Exemplo MOV 10 BANKSEL = -VARL MOVWF VARL Veja também PAGESEL, BANKISEL CBLOCK - DEFINE UM BLOCO DE CONSTANTES Sintaxe BLOCK I] snomer [:} [, [: é associado ao valor de . JA o segundo é associado ao valor seguinte ¢ assim sucessivamente. Caso nao seja determinado 0 valor de , a préxima constante recebera o valor imediatamente seguinte, isto é, incremento unitério. Caso contrario, a proxima constante receberd o valor da constante anterior mais o , A definicao de constantes deve ser terminada pela diretriz ENDC. Exemplo CBLOCk 0x20 W_TEMP ;W_TEMP=0x20 STATUS_TEMP STATUS_tEMP=0x21 TEMP1, TEMP2 TEMP1=0X22, TEMP2=023 END: 0, END_H,END_L 7END=0X%24, END_H=OX24, ENDL! CODIGO:2 ;CODIGO=02x26 CONTA F;CONTAS=OX28 enpe Veja também ENDC CODE - DECLARA INICIO DE UM BLOCO DE PROGRAMA Sintaxe [cnomel>} CODE [] Descrigaio Usado para objetos. Serve para declarar 0 inicio de um blaco de programa. Caso © argumento nao seja definido, o bloco sera chamado CODE. O enderego inicial é passado pelo argumento . Se este nao for especificado, o compilador assume o enderego zero. Exempla RESET CODE GOTO Veja também IDATA, UDATA, UDATA_OVR, UDATA_SHR, EXTERN, GLOBAL Diretrizes da Linguagem MPAS aR * Dr __CONFIG - CONFIGURA OS DADOS PARA GRAVACAO DQ MICROCONTROLADOR Sintaxe CONFIG Descrigao ; Utilizado para configurar previamente os dados para a gravagdo do PIC. Para facilitar a vida do programador, a Microchip ja definiu uma série de simbolos para essas opgdes nos arquivos de INCLUDE de cada modelo de PIC, Basta dar uma conferida nesses arquives para saber quais os simbolos pertinentes ao tipo de oscilador, WDT, etc, A deve ser montada pela jungao destes simbolos por meio do operador & Exemplo: CONFIG _WDT_ON & _XT_OSC & _CP_OFF Veja tanibém LIST, PROCESSOR, __IDLOCS (CONSTANT - DEFINE UMA GONSTANTE Sintaxe CONSTANT = [, = ] Deserigao Define uma constante para ser utilizada nas expressdes que serdo interpretadas pelo compilador. Como o préprio nome diz, o valor determinado por € associado de maneira definitiva ao , nao podendo mais ser alterado no decorrer do programa. Exemplo CONSTANT TAM_NOME = 10 , TAM_CODIGO = 5 CONSTANT ‘TAM_TOTAL = TAM_NOME + TAM_CODIGO Veja também SET. VARIABLE 168 . Desbravando o PIC ees DATA - PREENCHE A MEMORIA COM NUMEROS OU TEXTOS Sintaxe DATA, cexpr> (,cexprs....,] DATA texto" [, "texte", ...."texten] Descrigao Preenche a meméria com o valor determinado por ou “texto", comegando na pasicio atual ¢ avangando a quantidade de posigdes necessdrias para caber o dado. As expressdes ou caracteres unitarios séo colocados um em cada posigao de memoria. JA os textos ASCII sdo arquivados com 2 caracteres para cada posicaéo da Meméria, sendo o primeiro no byte mais significativo. Se o texto possui um ntimero impar de caracteres, tim zero € escrito no Giltima byte. Exemplo DATA 1,2,CONTA DATA ow DATA “TEXTO DE EXEMPLO" Veja tambéin DW, DB, DE, OT DB - PREENCHE A MEMORIA BYTE A BYTE Sintoxe DB [,,...,] Descrigao Preenche a meméria com o valor determinado por , comecando na posiggo atual ¢ guardando os dados a cada byte, avangando a quantidade de posigdes necessdrias para caber todas as . Exemplo DB 1, "T+, Ox0£, CONTA, '3" Veja também DATA, DW, DE, DT Diretrizes da Linguagem MPASM 169 DE ~ PREENCHE A MEMORIA EEPROM BYTE A BYTE Sintaxe De (.] DE “texte"[, “texto* srexto*] Descrigda Preenche a memédria FEPROM com o valor determinado por ou “texto”, comegando na pasicio atual e guardando os dados a cada byte, avangando a quantidade de posiqdes necessarias para caber todas as . No- caso do “texto”, cada caractere sera gravada em um byte. Caso essa diretriz seja_utilizada para gravar dados na area de programagdio, os bits mais significativos (acima do 7) serao zeradas. Exemplo ors H’2100/ dapenta para o inicio da FEPROM DE “Exemplo, vio" Veja tamrbért DATA, DW, DB, DT # DEFINE - DEFINE UMA SUBSTITUICAO DE TEXTO. Sintaxe WDEPINE = [] Descrigéo Esta diretriz define uma substituicao de texto. Sempre que o compilador encontrar , ele seri substituida pelo associado a ele. Ao contrério da diretriz EQU, que sé pode associar valores, esta diretriz pode assaciar qualquer coisa ao nome, inclusive um comande ou o enderego de um bit. Simbolos criados desta maneita nao podem ser monitorados pelas ferramentas do MPLab {simulador), Definindo um nome sem um associado, ele podera ser usado com a diretriz IFDEF. Exemplo 4DEFINE LED PORTA, 0 WDEFINE LED ON BSF LED {DEFINE = LEDLOFF ace LED Veja também IFDEF, IFNDEF, #UNDEFINE DT'- PREENCHE A MEMORIA COM UMA TABELA Sintaxe DT ou caractere do “texto”, comegando na posicas atual e avangando a quantidade de posigdes necessarias para caber todas as instrugGes. Exemplo pr “MOSAICO" ad VALOR] , VALOR2 , VALOR3 Veja também DATA, DE, DB, DW DW - PREENCHE A MEMORIA PALAVRA A PALAVRA Sintaxe DW {,"texto",-..,] Descrigao Preenche a meméria com o valor determinado por ou "texto", comegando na posicao atual € avancando a quantidade de posigdes necessarias para caber todos os dados. As expressdes ou caracteres unitarios sao colocados um em cada posigio de memaéria. Ja os textos ASCII sdo arquivados com 2 caracteres para cada posigao, sendo © primeiro no byte mais significative. Se © texto possui um numero impar de caracteres, um Zero é escrito no ultimo byte. Exemplo bu 39, *MOSAICO” Veja também DATA, DE, DB, DT ELSE - BLOCO ALTERNATIVO PARA TESTE CONDICIONAL Sintaxe ELSE Descrigéo Usado em conjunto com as diretrizes IF, IFDEF e IFNDEF para executar um bloco especifico no caso do teste condicianal apresentar um resultado. negativo. Exemplo Veja a exemplo de IF, Veja também IF, IFDEF, IFNDEF, ENDIF END - FIM DO PROGRAMA Sintaxe END Descrigao Usado para determinar o fim do programa. Esta diretriz & obrigatéria na ultima linha do eédigo fonte. Exemplo rnrero. (corpe do programa) END ENDC - FINALIZA UM BLOCO DE CONSTANTES Sintaxe ENDC Deserigao Finaliza 0 bloco de constantes iniciado por CBLOCK. Exempla Veja © exemple de CBLOCK. Veja tambérn CBLOCK al 72 Desbravanda a PIC “tee ENDIF - FIM DOS BLOCOS DE TESTE CONDICIONAL Sintaxe ENDIF Descrigao Usado em conjunto com as diretrizes IF, IFDEF, IFNDEF e ELSE para finalizar os blocas de cédigos que serao executados de acorda com os testes condicionais. Exemplo Veja o exemplo de IF. Veja também IF, IFDEF, IFNDE! LSE ENDM - FINALIZA O BLOCO DE UMA MACRO Sintaxe END Descrigao Finaliza o bloco de uma macro. Exemplo Veja o exemplo de MACRO. Veja também EXITM, MACRO ENDW - FIM DO BLOCO DE LOOP Sintaxe ENDOW Deserigao Usado em conjunto com a diretriz WHILE para finalizar o bloco de cédigos que sera repetido enquanto o teste de WHILE for verdadeiro. Exemplo veja © exemple de WHILE Veja também WHILE Diretrizes do Linguag EQU - DEFINE UMA SUBSTITUICAO Sintaxe EQU Descrigéio ‘© serd substituide pelo valor determinado Por sempre que for encontrado, Este canceito é totalmente similar ao de constantes. Exemplo TEMPO Bou 4 Veja também SET, CONSTANT ERROR - GERA UMA MENSAGEM DE ERRO Sintaxe ERROR “ctextos* Descrigao Gera uma mensagem de erro, que serd mostrada como um erro no relatério Serado durante a compilacdo. O texto pode ter até 80 caracteres. Exempla IFNDEF —PICI6P84 ERROR “ATENCAO: o PIC escolhide nado é © 16F84* ENDIF Veja também MESSG ERRORLEVEL - DETERMINA Q NIVEL DE GERACAO DAS MENSAGENS Sintaxe ERRORLEVEL 0/1/2/+/- Descrigtio Determina que tipo de mensagens deve ser mostrado durante a compilagao: 174 lesbravande o PIC Nivel __Ogite sera’ mostrado a Mensagens, alertas e erros (tudo) 1 Alertas e erros. 2 Somente erros. #smsg_num> | Habilita a mensagem de ntimero . “ | {nibe a mensagem de nimero . 8 Dica: Os niimeros das mensegens, alertas e erros podem ser encontrados no. apéndice C do manual do compilador MPASM. Nas versdes mais novas do MPLab, esta diretriz pode ter seu afvel acertado e gravado no arquivo de projeto. Exemplo ERRORLEVEL 1, =202 Veja também LIST EXITM - FORCA A SAIDA DE UMA MACRO Sintaxe EXIT Descrigéto Forga a saida de uma macro, Seus efeitos sao similares aos da diretriz ENDM. Exempla Veja o exemplo de MACRO. Veja também ENDM, MACRO EXPAND - EXPANDE 0 CODIGO DAS MACROS Sintaxe EXPAND Descrigéio Determina que todas as macros encontradas apés esta diretriz serao expandidas ha listagem do programa (Absolut List — Arquivo .LST). Veja também UST, NOEXPAND, MACRO EXTERN - DECLARA SIMBOLOS DEFINIDOS EXTERNAMENTE Sintaxe EXTERN [, ] Descrigao Usado para objetos. Declara simbolos que serio definidos no codigo corrente, mas que sao definidos como GLOBAL em outros médulos. Esta diretriz deve ser aplicada antes dos simbolos serem utilizados no cddigo corrente. Mais de um simbolo pode ser definido na mesma linha, por meio dos argumentos . Exemplo EXTERN ‘TESTE CALL TESTE Veja também TEXT, IDATA, UDATA, UDATA_OVR, UDATA_SHR, GLOBAL FILL - PREENCHE A MEMORIA COM UM VALOR OU INSTRUCAO Sittaxe PILL expr? Descrigéio Preenche a memoria com o valor determinado por , comecando na posi¢ée atual ¢ avangando posigdes. A pode também ser uma instrugao do Assembler, mas neste caso deve ser colocada entre parénteses. Exemplo FIUL 0x1009,5 ;Preenche 5 posigdes com o valor 0x1009 PILL (NOP},CONTA — ; Preenche CONTA posicdes com a instr. NOP Veja também ORG, DATA, DW GLOBAL - DECLARA SIMBOLOS QUE PODEM SER USADOS EXTERNAMENTE Sintaxe GLOBAL = [, ] eer Descrigao Usado com objetas. Declara os simbolos que serao definidos no médulo corrente mas que poderao ser exportados para outros médulos. Esta diretriz pode ser utilizada antes ou apés a definicdo do simbolo, Mais de um simbolo pode ser declarado na mesma linha por meio dos argumentos . Exempla UDATA vaRL RES 6 VAR RES 1 GLOBAL VAR1, VAR2 cope SOMATRES GLOBAL SOMATRES ADDL 4 RETURN Veja também TEXT, IDATA, UDATA, UDATA_OVR, UDATA_SHR, EXTERN. IDATA - DECLARA UMA SECAO DE DADOS JA INICIALIZADOS Sintaxe I] DATA [] Descrigao Usado com objetes. Declara o inicio de uma secgao de daclos inicializados. Se 0 argumenta nao for especificado, a segdo sera chamada de IDATA. 0 endereco inicial para os dados é definido por , ou sera adotado o valor zero caso esse argumento nao seja especificado, Nenhum cédigo sera gerado nesta secao. O linker ira gerar uma tabela de entrada para cada byte especificado. O usuario deverd entao definir a inicializagéo apropriada. Esta diretriz nao esta disponivel para PICs de 12 bits. Exempla IDATA LIMITEL Dw -0 LIMITEH DW 300 GANHO ow 8 FLAGS Dw .0 TEXTO DB *MOSATCO" Veja também TEXT, UDATA, UDATA_OVR, UDATA_SHR, EXTERN, GLOBAL __IDLOCS - ESPECIFICA 0S DADOS PARA. GRAVACAO Do ID Sintaxe _IDLOcS | Descrigao Utilizado para especificar previamente os dados que serao gravados nas quatro posicdes de 1D. Exempla —IpLocs 4H'1234" Veja também UST, PROCESSOR, _ CONFIG IF - TESTE CONDICIONAL DE UMA EXPRESSAO. Sintaxe IP Deserigao Testa sea expresso definida por 6 verdadeira ou falsa. Caso cla scja verdadeira, entao o cédigo existente entre esta dire! e a ENDIF sera executada. Caso contrario, ele sera pulado, podendo ainda ser executado o bloco relacionado 4 diretriz ELSE, caso ela exista. Exemplo CONTA = 5 ir conta > 3 (rotina especifica para CONTA > 3) ELSE (rotina especifica para CONTA S 3) ENDIF : Veja tarbéun ENDIF, ELSE 178 Desbravando 0 PIC Sule IFDEF - TESTE CONDICIONAL DE EXISTENCIA DE UM SIMBOLO Sintaxe IFDEF snome> Descrictio Testa se 0 simbolo especificado por ja foi definido (diretriz #DEFINE, sem © argumento ). Caso o simbolo ja tenha sido definido, entio o codigo existente entre esta diretriz e a ENDIF sera executado. Caso contraria, ele seré pulado, padendo ser executado 0 blaco associada a diretriz ELSE, caso cla exista. Exemplo #DEFINE TESTE IFDEF TESTE (wotina que serd executada para teste) ENDIF Veja tanrbém IFNDEF, #DEFINE, #UNDEFINE, ENDIF, ELSE JFNDEF - TESTE CONDICIONAL DE NAO-EXISTENCIA DE UM SiMBOLO Sintaxe IENDEF = Descri¢ao Testa se 0 simbalo especificado por HINCLUDE “nome_do_arquive” Descrigdo Usado geralmente no inicio do programa, para incluir definigdes especificadas em arquivos auxiliares. Esses arquivos, com mesma formatagao dos codigos fonte, possuem, no entanta, somente definigdes, varidveis, constantes ¢ similares, para facilitar a vida do programador. Junto com o MPLab, a Microchip fornece varios desses arquivos com a extensao .INC, um para cada tipo de PIC. Se o path for especificado em nome_do_arquive, entdo 0 arquivo sera procurado somente nesse diretério. Caso contrario, a ordem de procura sera a seguinte: diretério atual, diretério dos arquivos de cddigo fonte e diretério do MPASM. Exemplo #INCLUDE © “C; \MOSAICO\MOSAICO.INC™ #INCLUDE LIST - OPCOES PARA A LISTAGEM DO PROGRAMA Sintaxe LISt [xepeior, ] Descrigaa Configura uma série de opgdes que sera utilizada para a criacao da listagem de programa (arquivo com extensdo LST). As opgdes possiveis encontram-se na tabela seguinte: [oppo | Padrao, i Descrigio bennn 8 __| Espacos para tabulagées. c=nnn 132 Quantidade de colunas. Focformato> | inixam | Fo'mato do arquivo de selda, Pode ser INHX22, INHKEM ou INHX8S, free fixed _ | Utiliza formato livre. fixed fixed __| Utiliza formato fixa. mm=ON/OFF On Mastra o mapa da meméria no arquivo de listagem, 60 | Namero de linhas por pagina, 180 Opeio Padrio Descrigao pa Hex Radix utilizado: HEX, DEC ou OCT. St=ON/OFF On Mostra a tabela de simbolos no arquivo de listagem. t=ON/OFF on Trunca linhas muito grandes, we0/1/2 0 Escolhe © nivel de mensagens (vide ERRORLEVEL). x=ON/OFF On Expande ou nio as macros no arquivo de listagem. = Dica: Os vaiores destas opcées so representados sempre em decimal. Exemplo List p=PICL6F84, ¥=DEC, c#80 Veja também NOLIST, PROCESSOR, RADIX, ERRORLEVEL, EXPAND, NOEXPAND LOCAL - DEFINE UMA VARIAVEL LOCAL PARA UMA MACRO Sintaxe LOCAL , [] Descrigéio Declara variaveis que serao utilizadas somente dentro da MACRO. Mesmo que essa variivel possua o mesmo de uma outra ja definida no corpo do programa, ela ser tratada como uma variavel totalmente nova, nao afetando o valor da outra anteriormente definida. Exemplo come ser 10 LARG SET 20 TESTE MACRO TAMANHO LOCAL, COMP, LARG FAS VARIAVEIS LOCATS NAO GERAM CONFLITOS comp SET _LARG ENDM :COMP=10 E LARG=20 Veja também ENDM, MACRO Diretrizes da Linguagem MPASM 181, MACRO - DEFINE'UMA MACRO Sintaxe MACRO [, ..., ] Descrigaio Uma macro € uma seqiiéncia de instrugdes que pode ser inserida no seu codigo com uma simples referéncia ao nome dela. Por isso, normalmente as macros sao utilizadas para economizar digitagio de funcées muito utilizadas, e podem ser definidas em arquives do tipo INCLUDE. Uma macro pode chamar outra macro de dentro dela. Os argumentos passados a macro serao substituidos no corpo do eédigo. Para terminar uma macro, & necessaria a diretriz ENDM. No entanto, ela pode ser finalizada quando é encontrada a diretriz EXITM. Variaveis utilizadas somente dentro das macros podem ser definidas como LOCAL, Maiores informagdes sobre este poderoso recurso podem ser obtidas no capitulo 4 do manual do MPASM, Exempla 1 (Definigao) TESTE MACRO REG = REG == 1 EXITM ELSE ERRO *REGISTRADOR ERRADO ENDIF ENDM #(Utilizagc&o) TESTE TEMP Veja tambem ENDM, EXITM, LOCAL, IF, ELSE, ENDIF, WHILE, ENDW __MAXRAM - CONFIGURA OQ TAMANHO MAXIMO DA RAM Sintaxe —NAXRAM = Descrigéio Utilizado para configurar o tamanho maximo da meméria para 0 PIC que esta sendo utilizado. A determina o ultimo enderego de meméria disponivel. © programador nao precisa se preocupar com esta diretriz, pois ela esta definida nos arquivos de INCLUDE fornecides pela Microchip. Desbravando 0 PIC én Exemplo (para PIC 16F84) __MAXRAM H'CE! —BADRAM H'O7', H'SO*-H°7F+, H+8T: Veja também __BADRAM MESSG - GERA UMA MENSAGEM DEFINIDA PELO USUARIO Siataxe MESSG “texto” Descrigao Gera uma mensagem que sera mostrada no relatdria gerado durante a compilagiio. O texto pede ter até 80 caracteres, Exemplo EFNDEF —___pIciered MESSG “ATENCKO; 0 PIC escolhido nao é 6 16raa* ENDIF Veja também ERROR NOEXPAND - NAO EXPANDE O CODIGO DAS MACROS Sintaxe NOEXPAND Descrigao Determina que todas as macros encontradas apés esta diretriz nao serao expandidas na listagem do programa (.LST), Veja também UST, EXPAND, MACRO NOLIST - DESLIGA A GERACAO DO ARQUIVO DE LISTAGEM Sintaxe NOLIST Descrigéo Inibe a geracao automatica do arquivo de listagem (Absolut List — Arquivo LST). Veja também LIST ORG - ACERTA PONTO DA MEMORIA DE PROGRAMACAO Sintaxe {enome>} RG eexpr> Descrigao Usado para determinar o ponto da memGria de programacgao em que a préxima instrugao sera escrita. Se nenhuma diretriz ORG for colocada no programa, entao ele comegard a ser escrito na posig¢ao Ox00. Caso seja especificado, entao 0 valor de serd associado a ele. Exempla END_1 ORG 0x10 END_2 ORG -END_1 + 0x10 PAGE - INSERE UMA QUEBRA DE PAGINA Sintaxe PAGE. Descrigtio Insere uma quebra de pagina na geracio do arquivo de listagem do programa (LST). Veja também UST, TITLE, SUBTITLE, SPACE PAGESEL - SELECIONA A PAGINA DE PROGRAMACAQ Sintaxe PAGESEL — Descrigéa Esta diretriz 6 utilizada para acertar automaticamente a pagina de meméria de programagao. Na verdade, o compilador ira gerar o codigo necessdrio para acertar a pagina. Para PICs de 12 bits, as instrucées para acertar os bits do STATUS serao inseridas no codigo. Para PICs de 14 e 16 bits, serdo utilizadas as instrugdes MOVLW e MOVWF para acertar 0 valor de PCLATH. Entretanto, se 0 PIC em uso contém somente uma pagina de programagao, nenhuma instrugao adicional é gerada. O argumento representa a rotina com a qual se trabalhard, ¢ deve ser definida antes do uso desta diretriz. 184 Desbravando o PIC Exemplo PAGESEL © GOTODEST sora GOTODEST Veja também BANKSEL, BANKISEL PROCESSOR - DETERMINA O TIPO DE PIC UTILIZADO Sintaxe PROCESSOR Descrigéo Determina o tipo de PIC que sera utilizado. Nas verses mais novas do MPLab, esta diretriz nao é mais necessaria, pois este valor é acertado ¢ gravado no arquivo de projeto. Exemplo PROCESSOR prclered Veja também LST RADIX - DETERMINA Q RADIX PADRAO Sintaxe RADIX Descrigtia Determina o tipo padrao a ser considerado a todos os ntimeros encontradas no programa, quando n§o devidamente especificados. O valor de pode ser: HEX, DEC ou OCT. Lembre-se que, independentemente do RADIX padrao, qualquer ntimere pode ser acertado por meio das predefinigdes: Radix Formato 1 Formato 2 Decimal Dixx! x Hexadecimal Hix" OXxx Octadecimal O'xx' Binario BUXXXRXXXX' LASCIL Ars’ : = &® Dica: Recomendamos que as predefinigdes apresentadas acima sejam sempre utilizadas, para evitar problemas caso alguém altere o valor do radix eat seus programas, ‘Nas versées mais novas do MPLab, esta diretriz ndo é mais necesséria, pois este valor é acertado ¢ gravado no arquivo de projeto. Exempla RADIX pec Veja também ust RES - RESERVA MEMORIA Sintaxe (} RES = Descrigtio Reserva memoria de programacdo para uso posterior. © bloco iré comecar na posicio atual ¢ tera o tamanho especificado pelo argumento . A definigao de poderd ser usada para referenciar-se ao inicio do bloco. Exemplo BUFFER RES 64 Reserva 64 palavras Veja também ORG, FILL SET - DEFINE UMA VARIAVEL Siataxe SET Descrig¢do Define uma variével para ser utilizada nas expressdes que sera interpretadas pelo compilador. Como © préprio nome diz, o valor determinado por serd associado a0 , podendo ser alterado no decorrer do programa. Exemplo comp SET .10 LARG SET .20 ALTURA «SET. .15 AREA SET comp * LARG VOL SET AREA * ALTURA Veja também EQU, VARIABLE Desbravando 0 PIC SPACE - INSERE LINHAS EM BRANCO Sintaxe SPACE sexpr> Descrigio Insere ntimero de linhas em branco na geragdo do arquivo de listagem do programa (.LST), Exempla SPACE 3 ingere 3 linhas em branco Veja também LIST, TITLE, SUBTITLE, SPACE, PACE SUBTITLE - DETERMINA 0 SUBTITULO DO PROGRAMA Sintaxe SUBTITLE “* Descrigéio © pode ter até 60 caracteres e sera utilizado no cabecalho de toda pagina no arquivo de listagem do programa (.LST). Exempla TITLE "Programa de exemplo™ Veja também LUST, SUBTITLE Diretrizes da Linguagern MPASM UDATA - DECLARA 0 INICIO DE UMA SECAO DE DADOS NAO INICIALIZADOS Sintaxe {cnome>} UDATA [] Descrigéio Usado com objetos, Declara o inicio de uma seco de dados nao inicializados. Se 0 argumento nao for especificado, a segdo sera chamada de UDATA, O endereco inicial para os dados ¢ definide por , ou seri adotado 0 valor zero caso este argumento nio seja especificado. Nenhum cédigo sera gerado hesta secao, A diretriz RES deve ser usada para reservar espaco para os dados. Exemplo UDATA. WARL RES al DOUBLE RES 2 Veja também TEXT, IDATA, UDATA_OVR, UDATA_SHR, EXTERN, GLOBAL UDATA_OVR - DECLARA 0 INICIO DE UMA SECAO DE DADOS SOBRECARREGADOS Sintaxe i] UDATA_OVR: [sRAM endere¢o>] Descri¢ao Usaclo com objetas. Declara 0 inicio de uma segao de dados nao inicializacos. Se o argumento nao for especificado, a segao sera chamada de UDATA_OVR. O endereco inicial para os dados é definido por , ou sera adotado © valor zero caso este argumento nao seja especificaco. O espago declarado nesta segdo pode ser sobrecarregado por outras seces desse tipo que possuam o mesmo nome. Isto é ideal para declarar varidveis tempordrias que devem ocupar 0 Mesmo espago na memédria. Nenhum cédigo sera gerado nesta secdo. A diretriz RES deve ser usada para reservar espaco para os dados, Exemplo ‘TEMPS UDATA_ovR TEMP RES 41 TEMP2 RES. TEMP2 ae | TEMPS ‘UDATA_OVR LONGTEMP1] RES .2 LONGTEMP2 RES = .2 Veja tambénn TEXT, IDATA, UDATA, EXTERN, GLOBAL, UDATA_SHR 188 __Desbravando o PE UDATA_SHR - DECLARA O- INICIO DE UMA SECAO DE DADOS COMPARTILHADOS: Sintaxe [] UDATA_SHR [} Descrigéio Usado com objetos. Declara 0 inicio de uma secao de dados compartilhados ¢ nao inicializados, Se o argumento no for especificado, a segdo sera chamada de UDATA_OVR. O endereso inicial para os dados é definide por , ou serd adotado o valor zero caso este argumento nao seja especificado, Os dados declarados nesta secao podem ser acessados de qualquer banco da RAM. Isto é ideal para declarar varidveis que sao utilizadas em rotinas que trabalham com mais de um banco, Nenhum cédigo serd gerado nesta secao. A diretriz RES deve ser usada para reservar espaco para os dados. Exemplo ‘TEMPS: UDATA_OVR ‘TEMP1 RES a1 TEMP2 RES a1 TEMP2 RES vt Veja também TEXT, IDATA, UDATA, EXTERN, GLOBAL, UDATA_OVR #UNDEFINE - ELIMINA UMA SUBSTITUICAO DE TEXTO Sintaxe UNDEF INE snome> Descrigaio Elimina definicao anteriormente criada pela ditetriz #DEFINE. Exempla DEFINE LED PORTA, FUNDEFINE LED Veja tambenr IFDEF, IDEF, # DEFINE VARIABLE - DEFINE UMA VARIAVEL Sintaxe VARIABLE [= , = ] Descrigaio Define uma variavel para ser utilizada nas expressGes que serao interpretadas pelo compilador. Esta di € similar 4 diretriz SET, com a diferenca de que a varidvel nao precisa ser izada no momento da sua definiczo. Como o préprio nome diz, o valor determinado por serd associado a0 , podendo ser alterado no decorrer do programa. Exemplo VARIABLE I, CONTA = 5 1=0 WHILE I < CONTA Teel ENDW Veja também SET, CONSTANT WHILE - LOOP ENQUANTO A EXPRESSAO FOR VERDADEIRA Sintaxe ‘WHILE sexpr> BND Descrigao Enquanto 0 teste da resultar em verdadeiro, o bloco definido entre esta diretriz € a ENDW sera executada, Caso contrario, ele sera pulado, Lembre-se que o valor 0 (zero) sera considerado falso, enquanto qualquer outro numero sera considerado: verdadeiro, 0 bloco padera ter no maximo 100 linhas e poderd ser repetido até 256. ‘vezes. Exemplo VARIABLE I CONSTANT CONTA = 5 r=0 WHILE I < conra (bleco que serd repetide $ vere) Lek ‘ENDe Veja também ENDW Desbiavahdo o PIC INSTRUGOES ESPECIAIS Atabela seguinte mostra varias instrugdes especiais aceitas pelo compilador para facilitar a digitagao do programa. Estas instrugdes nao fazem parte do set de instrugGes, pois na verdade o compilador ira substitui-las pelas instrugdes equivalentes. Entretanto, muitos programadores utilizam-se delas na hora de escrever seus programas, e por isso é bom conhecé-las para possibilitar o entendimento € manutengao de sistemas escritos por terceiros. A tabela mostra ainda os bits de STATUS afetados pela operacao. Instrugio. /Descrigio Instrug6es Equivalentes: | Status appcr f.4 [Se heuve cary, incrementa o|[BTFsc — sTaTUS.C Zz registrador f, guardando o resultado] INCF =f, 4 em d. ADDDCF £,4 |Se houve digit carry, incrementa 0} BTFSC STATUS, DC Z registrador f, guardando o resultado} INCF =f, em d. B | Pula (branch) para a posigio definida|GOTO pork. 5c |e (branch) para a posigao definida|BTFSC — STATUS.C por k, caso tenha ocorrido um carry. | SOTO k ‘BDC * | Pula (branch) para a posigao definida| BTFSC = STATUS, DC per k, caso tenha ocorrida um digit|GOTO =k carry. BNC ‘| Pula (branch) para a posigao definida| BTFSS = STATUS. C par k, caso nae tenha ocorride um|SoTO —& carry. BNDC k | Pula (branch) para a posic3o definida| BTFSS = STATUS, DC por k, caso nae tenha ocorrido um | GoTo k it carry. BNZ | Pula (branch) para a posig’e definida|BTFSS STATUS. z por k, caso nao tenha ocorrido um| GoTo k zero. Instrupdes Especiais 191 _Instrucao e ‘__Desericio Instrugdes Equivalentes | Status a 4 Pula (branch) para a pasiciia definida|BTPsc STATUS,2 pork, caso tenha ocorrido um zero. |GoTO cLaC Limpa o bit de carry, ECF STATUS, ¢ € cLRDc Limpa o bit de digit carry, ‘BCF svarus.nc | DC CLR Limpa o bit de zero, BCF STATUS, @ Zz Chamada de rotina (k) distante. BCF/BSF PCLATH, 3 LCALL Acerta o PCLATH (bits 3 e 4)|BCP/BSF pcLaTH,4 automaticamente. CALL Desvio de programa (kj distante, BCE/BSF PCLATH,3 Leora k Acerta o PCLATH (bits 3 e 4)|BCE/ESF PCLATH.4 _|iestacecsenes . GOTO k prevent £ _|Move o valor do registradorf para W. [HOVE Zw z 2 wecr £,q__|Acerta.o valor do resultado negativo|come _£,F 2 “| de uma conta, INcF fd SETC _[Setao bit de carry. BSF STATUS, € c SETDC Seta o bit de digit carry. BSF srarus,pc_ | DC SETZ Seta o bit de zero, BSF STATUS, 2 Zz Sears Pula a préxima linha se houve um|ocse gnatys.e carry. eee Pula 2 proxima linha se howe um| isos seaqus, pe digit carry. Serna Pula a préxima linha se nda howe um | ooece gnamys, carry, cane Pula a préxima linha se nfo howe wh| ones. cpanus, ne digit carry. meee Pala a préxima linha se ndo houwe = eee SRL sie Pula a préxima linha se howe um| oes spanus,2 zero. Se houve cary, decrementa o 4, f BIFSC STATUS, C SUBCF £,d |registrador f, guardando o resultado Zz DECF fd emd. Se houve digie cary, decrementa o| soncc gnarus, pe Supper £.4 | registrador f. guardando o resultado | Cre Pn z Le em d, woe ioe © registrador f para saber se ae Descricao andoo PIC Nimero da atual linha de programa (PC). GoTo $+ 3 Abertura de parénteses. L+ (R* 4) Fechamento de parénteses. (COMPR + 1) * 256 NAO légico. IF ! (A — B) Negativo. -1 * COMPR =~ [Complemento. FLAGS = —FLAGS high | Byte alto de um simbolo de dois bytes. MOVLW high CTR_TABELA low | Byte baixo de um simbolo de dois bytes, | MOVLW low CTR_TABELA upper __| Byte superior de um simbole de trés bytes. | MOVLW upper CTR_TABELA = Multiplicag3o. Azatc f Divisio. ASB; C x Resto da divisio, COMPR = TOTAL % 16 + [Soma. TOTAL = VALOR * 8 + 1 Subtracso. TOTAL = VALOR - 10 << __ | Rotacao para a esquerda, VALOR = FLAGS << 1 >> [Rotagio para a direita. VALOR = FLAGS >> 2 >= _ | Maior ou igual, Ie INDICE >= NiRt Maior que, IF INDICE > NUM < Menor que. IF INDICE < NUM ‘Menor ou igual. IF INDICE <= NUM igual a, IF INDICE NUM Diferente de (NAO igual). IF INDICE != NUM Operacio E (AND) bit a bit, FLAGS = FLAGS & MASCARA ey Operagao OU exclusive (XOR) bit a bit. FLAGS = FLAGS * MASCARA l Operagao OU inclusive (IOR) bit a bit, FLAGS = FLAGS | MASCARA && | Elégico (AND). IF (COMPR =» 10) && (A > @) | I|__ [OUR gico (OR), IF (COMPR == 10) [| (A i= B) = _|Varidvel = valor. INDICE = 0 A Operadores do MPASM 193 INDICE INDICE pelo valor. Variavel = ela mesma rotacionada.&-esquerda. Variivel = ela mesma * valor. INDICE *= TOTAL Variavel = ela mesma / valor. INDICE /= TOTAL gm |Variivel = resto da divisio dela mesma| oon ge 16 Variivel = cla mesma rotacionada adireita, | INDICE &= | Variivel = ela mesma AND valor INDICE &= =__ | Variivel = ela mesma [OR valor INDICE “= _|Variével = ela mesma XOR valor INDICE 194 ++ - Varidvel = ela mesma - 1 (decremento) Variivel = ela mesma + 1 (increment) INDICE INDICE Desbravanda 0 PIC e fF 5 h Desbravando 0 PIC U ¥v Ww x E F G Ht [les x & 5 2 g ¢ 3 1 DCI pC2 Dc bea o ta STX Ex EOT ENQ | NAK ACK BELL BS HT uF VT FE cR so SL SYN ETB CAN EM. UB st Fs GS RS us i oO 1 2 3 4 5 6 7 [rs 2 fae B Cc D Valores em HEX significativo Digito menos 0 0 1 1 2 2 48 3 64 4 4 80 3 5 36} 6 6 2 7 7 128 3 | 8 9 144 9 9 A 160 A 10 B 176 & u 192 € 2 208 D B za |e Po 240 F 15 decimal. Para usar esta tabela, some o valor decimal correspondente a cada digito do mimero hexadecimal. Por exemplo, o ntimero HEX A38F eqiiivale a 41871 em 40960 + 768 +128 _HEX (digito 4) | “HEX (digito 3)" | HEX (digit 2) HEX (digito 1) Resultado A 3 8 F ABBE +15 = 41871 Desbravande o Pie Desbravanide © Pic Sugerimos aqui um hardware para a realizacio dos treinamentos ¢ projetos presentes neste livre. Com o esquema elétrica anexo, é possivel a montagem de um circuito capaz de realizar um grande mimero de experiéncias com o PIC 1GF84 (ou outro de 18 pinos). Para facilits seguem algumas dicas sobre o esquema em questao: * Ao PORTE estéo ligados 8 leds (LI a L&) identificados com os mesmos names dos pinos. Eles sd muito titeis para experimentos com bytes par meio da representacao bindri. * Ag PORTE esté ligado também um display de 7 segmentos, euja tabela de relacionaiento é a seguince: Pino Segmento RBO G RBI E RB2 A Rea B | kb4 | Ponto RBS ¢ RBG D RB7 E Esta relacao foi escothide para facilitar o layout da placa, mas pade ser alterada sem maiores problemas, desde que os exemplos sejain acertados. * O jumper JP2 serve para selecianar com qual saida (leds ou display) 0 PORTS ird operar. Observe que a selecdo € exclusiva, para evitarmos sobrecargas mos pinas do PIC, " Para diminuir os custos, utilizamos um ressoador cerdmica de 4MH2, que é facitmente encontrado no mercado, Hardware Proposto 197 * latroduziinos um botéo de RESET (8T1), diretamente ligado ao (MCRL, para possibilitar reseis externos, 0 pina RAQ foi deixade come uma saida de controle, que pode acionar o led L9 ou a lampéda LPI. A lémpada é utilizada para testes de PWM, como no dimmer. O jumper JP seleciona entre a controte da témpada ou do led, Trés leds (L10 a L12) foram colocados nos pinos RAI, RA? ¢ RAB para sinalizagdes diversas. Néio colecamos led para o pino RA4 por ele ser “open colector". Quatro botées (BT2 a BTS) foram ligados aos pinos RAT, RA2, RAZ € RAF para controles diversas. Observe que os pintos RAT, RAZ e RAI possuem ligacées para botées e leds, Com 0 hardware proposto, é possivel operarmos com o led quando o pino é configurado para saida, e com 0 botéo quando o pino estd configurado como entrada, Unt conector adicional (CN1) foi deixade para experiéncias que utilizem interrupgées (R80 € RB4) € contagem de pulsos externos (TOCKI). A esses pinos (RBO, RB4 ¢ RA@) ndo estd ligado nenhum pull-up ou pulldown. Por isso, quando for utilizé-tos como entrada, os dois niveis devem ser garantidas. A placa deve ser alimentada com 5Vdc. Sugerimos a utilizagao de lampada de lanterna (6V). No caso de utilizagao de lampada automotiva, pode-se alterar o esqueiia para alimenté-la com 12Vde, dg T fs) Psy z NO 199 no Toei 1] varmnaona aonesan fre be i feeurn| "seg | ooouvanavI worl L No BAND TIN = ATES, = PRISE Old zn ONS = Hardware Proposto CONJUNTO DE INSTRUGOES SEE BEET pa T CARTAO DE CONSULTA &} MicrocHip @ Zeta Tht do Watch Dog [Desa pera labalk [OR ent Ws k FazW =i Rotama st da toupee KOR ene Wok CONVENGOES: ] Aus etn 06127137) See | | fe gees | PIC 16F84 PIC 16F84A, PINAGEM vwreupt old OPTION_REG - Regis de opgbes Meméria de Programa Espoo emia ave I § de estados do PIC | Te Bagisto de sonia FOr ‘OUTROS REGISTROS 1 Meméria de Dados nite nite cosas are—tem Sha =e tact | ge

You might also like