Beruflich Dokumente
Kultur Dokumente
Programa PIC16F84A
Forever Login Login with username, password and session length Top answ ers for Program a PIC16F84A
www.Answered-Questions.com
News: Search Se pre te nde r re gistar-se no frum , por favor e nviar e -m ail para ze 63 @ hotm ail.com . Te m m uito spam re gistando no frum , por isso a tom ada de sta m e
HO ME H E LP S E A RC H LO G IN RE G IS TE R
Frum de Electrnica - OzFlor > Electrnica > Cursos e tutoriais de electrnica > Tutoriais PIC > Microchip MPLAB IDE PIC16F84A
previous next
Pages: [1] Go Down Author Topic: Microchip MPLAB IDE - PIC16F84A (Read 1934 times)
P RIN T
Curtir
[justify]Matria publicada com autorizao do autor resinba a quem eu fica muito grato. Leia tambm: Tutorial Microchip micro-controlador PIC - PIC16F84A, PISCA LED Jos Flor Bem vamos l tentar comear este tutorial sobre PIC's, mais precisamente sobre o MPLAB. Par comear, temos que sacar o ficheiro de instalao no site da Microchip
momento vai na verso MPLAB IDE v8.3. Para baixar o programa clique aqui
O melhor PIC para o pessoal comear (para mim) o 16F84A. Uma coisa temos que levar em linha de conta, muito importante, se se conseguir-se entender ento j meio caminho andado, que a seguinte: -O funcionamento do micro-controlador no tem nada a ver com o funcionamento do microprocessador! Ento o que se se passa? bem, a primeira diferena que o micro-processador precisa de uma panplia de componentes h sua volta para poder trabalhar, coisa que o micro-controlador no, pois este j tem tudo dentro dele. Outra grande diferena est no funcionamento interno. Num PC quando queremos activar um programa, o uP d a ordem ao disco-rgido (caso o programa esteja l instalado) para este descarregar o programa na memoria, o que no acontece com o micro-controlador, este por sua vez tem (podemos dizer desta maneira) pelo menos dois bancos de memoria distintos, um (O maior) onde alojado o programa outro muito pequeno onde se encontram registos especiais, e onde o programador pode usar variveis. Isto que acabei de dizer doutrina, convm o pessoal compreender esta matria, por isso irei parar por aqui para ver se h duvidas. Como tinha dito anteriormente, antes de comear a falar da MPLAB, convm falar da famlia PIC, para podermos compreender todas as potencialidades da MPLAB. A famlia PIC hoje em dia extremamente vasta, havendo desde a famlia 12Cxxx, os 16xxxxx, a famlia 18XXXXX). A diante, eu vou-me debruar sobre os 16Fxxxx, pois a sua memoria de programa do tipo flash (o que excelente). Aqui est a sua imagem fsica. Comearemos pelo 16F84A. Este micro controlador composto por 18 patas, internamente relativamente simples, tem um Timer de 8 bit, que se pode transformar num watchdog timer, tem dois tipos externos de Interrupts,para alem disso composto por dois Portos (porto A e porto B), em que os pinos destes portos podem ser configurados como entrada ou sada em qualquer altura do programa.
ozflor.com/electroforum/index.php?topic=83.0
1/28
26/04/12
Comearemos pelo 16F84A. Este micro controlador composto por 18 patas, internamente relativamente simples, tem um Timer de 8 bit, que se pode transformar num watchdog timer, tem dois tipos externos de Interrupts,para alem disso composto por dois Portos (porto A e porto B), em que os pinos destes portos podem ser configurados como entrada ou sada em qualquer altura do programa. Assim a estrutura interna do 16F84A.
ozflor.com/electroforum/index.php?topic=83.0
2/28
26/04/12
Olhando para este esquema, irei falar das partes mais importantes para ns, assim irei comear do exterior para o interior. Os pinos de INPUT/OUTPUT so chamados PORTOS, o 16F84A tem 2 Portos que so o Porto A, composto por 5 in/out (RA0 a RA4) e o porto B, composto por 8 in/out (RB0, RB7). - RA4/T0CKI, Este pino tanto pode ser uma entrada/sada normal, como tambm pode ser uma entrada directa para o Timer (contador temporizado). - RB0/INT, tal como o anterior este pino para alem de ser in/out, tambm uma entrada de interrupt, Neste caso interrup por alterao do flanco do estado da entrada. - RB4 a RB7, estes pinos tambm podem ser configurados como interrupt's, neste caso d-se o interrupt com a alterao do estado da entrada. Mdulos internos do chip. - Flash Program Memory, esta memoria onde se encontra o programa em si, composto por 1024 posies de memoria, cada posio composta por 14bits (1K X 14). - RAM, esta memoria onde se encontram os registos especiais do chip, e os registos necessrios ao programador para colocar as suas variveis. - EEprom Data Memory, esta memoria tem como funo a guarda de variveis importantes ao bom funcionamento do programa, esta memoria acedida por software e tem que ser o programado a definir quando deve ser acedida tanto para leitura como para escrita. - TIMER, este modulo tem como funo contar impulsos de clock, seja eles vindos do exterior (RA4/t0CKI), como do interior. o seu registo interno de 8 bit's suporta contagens at 255 (FF HEX), em que pode avisar o sistema por overflow interrupt, ou no. - Watchdog Timer, este modulo funciona com o registo interno do Timer, assim, s um deles pode ser activado de cada vez. A principal caracterstica do Watchdog Timer este provocar um RESET ao sistema obrigando o microcontrolador a reiniciar o programa sempre que este detectar um overflow no registo, sendo por isso necessrio uma sub rotina para ir "limpando" o registo garantindo assim que no haja RESET no sistema, este modulo o ideal para programas que tenham tendncias a bloquear, ou programas que entrem em LOOPs infinitos. CLOCK: - Este chip ao contrario de muitos outros da sua familia tem um defeito, que o seguinte: - este integrado no suporta um gerador de clock interno (normalmente formado por uma malha RC interna), assim temos sempre que lhe fornecer um clock externo, seja ele vindo de um gerador externo (exp. outro microcontrolador), seja ele uma malha RC, um Cristal ou um cristal cermico. - Outra coisa muito importante que o clock interno dele sempre 1/4 do clock de entrada, isto DOUTRINA, e aplica-se a qualquer PIC da famlia 12XXXX e 16XXXX. Um exemplo pratico, imaginemos que pomos o 16F84A a trabalhar com um cristal de 4MHz, 256ns de perodo, mas como internamente ele divide o clock por quatro, teremos ento um clock de 1MHz o que faz um perodo de 1us, ou seja ele leva (neste caso) 1us a fazer uma instruo normal. Vou ento falar de mais uma matria muito importante, neste caso vou-me debruar sobre a memoria e tudo o que tem a ver com ela.
ozflor.com/electroforum/index.php?topic=83.0
3/28
26/04/12
Nesta imagem, vemos a disposio das duas memorias principais do chip, comeando de cima temos o PC, ou melhor program counter, o modulo que vai gerando posies de memoria, sejam elas para a principal ou a RAM, e sejam elas geradas pelo sistema ou a pedido do programador com instrues do tipo "goto" ou "call". Por baixo, temos a RAM, com os SFR. Por fim temos a Memoria principal, onde se encontra o programa em si. Agora, se repararem, nesta memoria tem duas posies de memoria muito importantes que so: - RESET Vector (0000H), nesta posio que o programa tem comeo depois de um RESET, seja ele quando alimentado ou quando forado (watchdog). - Peripheral Interrupt Vector, nesta posio de memoria que o PC salta sempre que houver um interrupt, seja ele interno ou seja ele externo ao chip. Por isso, sempre que programamos este chip com um ou mais interrupts, convm levar em linha de conta, que este ira saltar para a linha 0004H logo que sinta o interrupt. Um exemplo qe garanta que no tenhamos esse problema o seguinte: org 0000Hex 0000H; call CONFIG 0001H; call CLEAR_MEMORY 0002H; goto MAIN 0003H; 0004H;movf STATUS,W (Inicio do vector interrupt) . . . CONFIG clrf PORTA E chega, mais para a frente aprofundaremos isto. Agora, a RAM, bem esta senhora deveras muito importante pelo menos levando em conta o seu tamanho...
ozflor.com/electroforum/index.php?topic=83.0
4/28
26/04/12
Se repararem, esta coisa a que lhe chamamos RAM, composta por dois bancos de 8 bits cada, outra coisa que as primeiras 12 posies de memoria de cada banco tm determinadas referencias, bem, estas posies de memoria correspondem aos "special function registers" (SFR) ou em TUGA "registos especiais", nestes registos que ns ou programamos o chip ou sabemos o que l se passa. Agora, da posio 0Ch, h posio 4Fh, do banco 0 correspondem a posies de memoria que o programador pode usar para as suas variveis (sinceramente nunca usei o banco1).
Aqui esto os famosos registos (FSR), no se assustem pois destes registos todos e em condies normais s usamos o OPTION, o STATUS, o TRIS(A/B), o PORT(A/B), agora se quisermos usar os interrupts ento teremos que usar o INTCON, para o timer TMR0 e por ai fora. Antes de continuar saquem o datasheet do 16F84A.[/justify] Continuando... Agora os registos mais importantes, mas antes vou tentar sintonizar o pessoal, na citao anterior descrevi um pouco de um possvel programa, na instruo "call CONFIG", o que se pretende "salta" para uma subrotina onde iremos configurar o chip, para que ele faa o que queremos. Nessa subrotina iremos invocar uns quantos SFR para que possa-mos por o chip a fazer o que queremos. Imaginemos que pretendemos que um led acenda quando o pino RB0 for primido e fique apagado quando o RB1 for premido, ah o led esta no RB2. Assim, temos RB0 e RB1 como entradas e RB2 como sada. Ento teremos de usar os registos; STATUS, OPTION, PORT e TRIS. E por qu???
ozflor.com/electroforum/index.php?topic=83.0
5/28
26/04/12
Bem, primeiro temos que invocar o registo de STATUS, para podermos ir para o banco 1 e assim fazermos outras configuraes.Mas antes, as caractersticas deste registo: - Bit7 e bit6 IRP e RP1 respectivamente, estes dois bits no so usados, o valor deles "0". - Bit 5 RP0, se colocarmos este bit a "1", ento passamos a aceder ao banco1. - Todos os restantes bit deste registo, so do tipo "flag bit", ou seja servem para nos indicar que algo aconteceu, ou no. Por exemplo, se fizermos uma conta de subtrair e o resultado der zero ento a flag-zero colocada a nivel "1". Nota: Convm colocar as flag Z,DC e C a zero, antes de se efectuarem aces do tipo calculo, ou logica, pois graas a estas flag que iremos saber o que aconteceu.
Neste caso vamos s activar os BIT 7(por a "1"), que para por pull-up (internas) nas entradas RB0 e RB1, e garantir que o bit 3 PSA est a "0", os restantes bits no tem interesse para este caso. os restantes bits so: - Bit 6 INTEDG, este bit serve para indicar se o inerrupt vindo por RB0/INT, no flanco ascendente (bit a "1"), ou no descendente (bit a"0"). - Bit 5 T0CS, aqui definimos se o Timer funciona a partir do RA4/T0CKI (bit a "1"), ou a partir do clock interno (bit a "0"). - Bit 4 T0SE, com este bit a "1" definimos que o Timer incrementa no flanco descendente, e a "0" incrementa no flanco ascendente. - Bit 3 PSA, aqui podemos definir se queremos o watchdog (bit a "1"), ou o Timer (bit a "0") - Bit 2 a bit 0, estes 3 bits servem para definir o valor do "prescaler", em tuga divisor. Com estes 3 ltimos bits podemos definir a velocidade a que o contador funciona (dependendo de certos valores). NOTA: Sempre que no se pretende usar o WDT (watchdog timer), CONVM por o bit 3 PSA a "0".
ozflor.com/electroforum/index.php?topic=83.0
6/28
26/04/12
No caso do INTCON, s temos que garantir que tudo esteja a zero pois no vamos usar nenhum interrupt. Mas vamos ver os seus bits em maior profundidade: - Bit 7 GIE, este o bit que d a autorizao (quando est a "1")a todos os possiveis interrupts para ficarem activos, ou no (quando est a "0") - Bit 6 EEIE, se activarmos este bit (coloca-lo a "1") , sempre que a EEPROM acabe de ser escrita eta faz intrrupt (isto porque esta memoria muito lenta, e esta uma maneira para ela garantir que informa o programador que j esta escrita). Se este bit ficar a zero no iremos ter interrupt, assim teremos que fazer uma subrotina de espera, para a EEPROM acabar o se trabalho. - BIT 5 T0IE, Se estiver a "1" o timer provoca interrupt sempre que entrar em "overflow", a zero este nada far. - Bit 4 INTE, a "1" o pino RB0 Fica como pino de interrupt, a zero nada se passar. - Bit 3 RBIE, este bit a "1" os pinos RB4, RB5, RB6 e RB7, iram passar a pinos de interrup, mas com caractersticas diferentes do RB0. Se etiver a zero nada se passar. Os restantes bits deste registo so flag-bits, que deveram ser limpas sempre que necessrio, e so as seguintes: - Bit 2 T0IF, se estivera "1", ocorreu um overflow do timer, a zero nada se passou. - Bit 1 INTF, a "1" ocorreu interrup no pino RB0, a "0" nada se passou. - Bit 0 RBIF, a "1" um dos pinos (de RB4 a RB7), provocou Interrupt, a "0" nada se passou. Na prxima citao mostrarei como ficar ento este bocado de programa. Bem, ontem tinha alevantado um pouco o vu, sobre o codigo assembler para estes meninos, o codigo era o seguinte: org 0000Hex interea call CONFIG call CLEAR_MEMORY goto MAIN movf STATUS,W . . . CONFIG clrf PORTA clrf PORTB bsf STATUS,5 movlw b'10000000' movwf OPTION movlw b'00000011' movwf TRISB clrf INTCON bcf STATUS,5 return ; O ";" serve para podermos por comentarios, ou seja o compilador no se ; com o que est a seguir ao ";"
;Inicio do vector interrupt ;Isto no valido, como j calcularam ;Isto uma label ;continuando a partir deste ponto ; esta instruo manda limpar o registo PORTB ; Neste caso vamos activar "1" o bit 5 do STATUS register ; Neste caso vamos carregar o registo W com o 128 em binrio ; Esse valor agora carregado no registo OPTION, ;para activarmos as pull-ups ; Aqui, vamos carregar o valor 3 em binrio par o registo TRISB ; Este registo serve para definir quais pinos so sadas (nvel ; lgico "0"), e os que so entradas (nivel logico "1") ; Neste caso limpamos o registo INTCON (no ir haver interrupts) ; Aqui colocamos o bit 5 do StATUS novamente a "0" (banco 0). ; Samos da instruo call e vamos para a proxima linha de instruo ; ou seja saltamos para a instruo "call CLEAR_MEMORYY"
ozflor.com/electroforum/index.php?topic=83.0
7/28
26/04/12
Shot at 2007-07-05 No coloquei o pinout, pois o datasheet deste chip j foi colocado anteriormente. MPLAB Vamos ento a este senhor, para comear h que arrancar com o programa. - Em seguida h que definir qual o chip que vamos usar (configure - select divice).
ozflor.com/electroforum/index.php?topic=83.0
8/28
26/04/12
- Basta para isso preencher estes campos ( da maneira que acharem melhor)
- Agora grava-lo com o nome que acharem melhor, eu normalmente dou-lhe o nome do projecto.
ozflor.com/electroforum/index.php?topic=83.0
9/28
26/04/12
- Da seguinte maneira.
- Bem, a partir de agora s tem que baixar o ficheiro em que se encontra em baixo, e copia-lo para dentro do vosso ficheiro nome.asm.
ozflor.com/electroforum/index.php?topic=83.0
10/28
26/04/12
- Agora, h que configurar o clock do projecto para 4MHz. Para isso h que ir a ; Debugger>Setings e...
- E agora h que ver o que se passa dentro do chip quando este est a trabalhar, mas, para isso necessrio activar a janela watch...
ozflor.com/electroforum/index.php?topic=83.0
11/28
26/04/12
- A janela watch esta coisa aqui em baixo, agora temos que lhe indicar quais os registos que queremos ver, estas registos sero aqueles que vamos usar no programa. Neste caso sero os seguintes registos: OPTION_REG, STATUS, TRISB e PORTB, como registos especiais do chip (SFR), e flag, var_1 e var_2, como registos criados por ns. Para activarmos os registos em questo h que escolher os SFR do topo lado esquerdo da janela, e os restantes registos do topo do lado direito da janela. Mas, aqui est a janela.
E aqui.
ozflor.com/electroforum/index.php?topic=83.0
12/28
26/04/12
- Outra coisa muito importante, principalmente quando se trabalha com "timing's", a janela de stopwatch para isso h que ir a: Debugger>StopWatch e...
- Pronto, est a quase tudo pronto para podermos testar o projecto, mas para isso h que se poder injectar sinais como de botes de presso se trata-se (para este caso, claro). Para isso temos que activar a janela de Stimulus, da seguinte maneira:
ozflor.com/electroforum/index.php?topic=83.0
13/28
26/04/12
- Bem, se tudo correu bem ento podemos organizar o nosso ambiente de trabalho como por exemplo este.
- Por fim usar este grupo de incons em que os mais importantes esto diferenciados por mim. para alem disso, coloquei mais dois incons que funcionam dentro do programa em s, assim , a seta indica a posio actual em que o programa vai, e a bolinha a vermelho um breekpoint, qual a sua funo bem j vo ver.
ozflor.com/electroforum/index.php?topic=83.0
14/28
26/04/12
a funo simples, para colocar tanto o RB0 como o RB1 a nvel lgico 1 e assim quer dizer que os botes de presso no foram premidos. Se premirmos no incon animado, a seta comea-se a mexer sozinha, a sua velocidade pode ser controlada em Debugger>Setings. Iram reparar que o programa se manter num loop continuo nesta zona: MAIN ;Lable btfss PORTB,0 ;Testa o bit 0 (RB0) do porto B (boto de presso para ligar o led) bsf flag,0 ;Activamos o bit 0 do registo flag btfss PORTB,1 ;Testa o bit 1 (RB1) do registo B (boto de presso para desligar o led) bsf flag,0 ;activa o bit 0 do registo "flag" btfss flag,0 ;aqui est a funo deste bit e deste registo "flag", na realidade no passa de 8 flag para o programador poder utilizar goto MAIN ;Se (flag0) for ZERO, salta pra a posio MAIN, caso seja UM... Agora, primam em pausa, o incon entre o run e o animado, e em seguida comeem a usar a tecla "F7" ( o mesmo que premirem em passo a passo), para sermos ns a controlar o que se vai passar a seguir. Vamos ento provocar alguma aco a esta coisa, para isso carregarem no "Fire do RB0, no Stimulus, algo ir acontecer de diferente, ou seja a subrotina DELAY ir ser invocada, ptimo, mal esta seja invocada, carreguem no boto ZERO do StopWatch (para azarar o contador de tempo), j colocaram o breakpoint como eu tinha dito anteriormente, ptimo, carregem em RUN, o que aconteceu? Bem, na janela StopWatch ira indicar que a subrotina DELAY levou cerca de 15.44ms para chegar ao fim, mais que tempo para o problema do "bouncing", usando novamente "F7" continuaremos a correr o programa e iremos ver que o programa ir saltar para LED_ON e ir executar a instruo "bsf PORTB,2" quando isso acontecer iram reparar que na janela de Watch e na linha do PORTB, este ficou vermelho e passou a ter a seguinte indicao na coluna dos "Binary" 00000110, e o que isto quer dizer? Bem da direita para a esquerda, temos 0 para o RB0 (ou seja segundo o esquema fornecido anteriormente, ete boto de presso est premido colocando a massa neste ponto), a seguir temos um 1 pois o poto de presso do RB1 no foi premido, por fim temos novamente um 1 pois o led encontra-se aceso. Agora, para apagar o led temos que: 1- premir em fire RB0 para dizermos que j no estamos a premir para ligar o led. 2 - premir em fire RB1 para dizermos agora ao sistema que queremos o led apagado.
ozflor.com/electroforum/index.php?topic=83.0
15/28
26/04/12
Bem, os configuration bits servem para poderes fazeres certas configuraes ao chip. Assim ele por defeito ir colocar este registo todo a 1's, que far a seguinte situao: - CP_OFF (CODE PROTECTION, Proteco do programa) - DP_OFF (CODE PROTECTION, proteco da memoria) NOTA: estes bits servem para proteco do nosso trabalho quando instalado no chip. ______ - PWRTE_OFF (POWER-UP TIMER ENABLE BIT, Quando activo este bit ir fazer um delay de 72ms a quando do aparecimento da alimentao) - WDTE_ON (WATCHDOG TIMER ENABLE BIT, O watchtdog fica activo) - OSC_RC (OSCILATOR SELECTION BITS, Fica activo para uma malha RC) Estas so as caractersticas default, para este chip, e tu que ters de decidir quais queres, para mim um bom partido o seguinte: -PWRTE_ON -CP_OFF (pelo menos inicialmente par ver se tudo est a bulir como de ser) -WDTE_OFF (normalmente no use o watchdog) -OSC_HS (normalmente uso um cristal de 4MHz, ou um oscilador cermico) Mas se sacares o datasheet vers no capitulo 8 essa informao mais detalhada. Outra coisa, tanto podes fazer a configurao de bit naquela janela, como no programa que ests a escrever, tens que colocar a seguinte directiva primeiro, seguido dos bits que achas importastes alterares: __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
Bem... este programa era extremamente simples, quer dizer queimamos demasiadas pestanas para pura e simplesmente ligar e desligar um simples LED, chia que um interruptor bastava!!! Bem para complicar um pouco vamos alterar o cdigo de maneira tal que, se carregarmos nos dois botes ao mesmo tempo o led ir se acender e se voltarmos a carregar nos botes o led ir apagarse, e porqu? Bem ,assim com os botes e usando-os individualmente podemos aumentar ou diminuir o brilho do led, ou ento faremos com que o led fique a piscar mais ou menos rpido, fica ao vosso critrio, escolham um destes dois casos: 1 - boto "A" + boto "B" liga, ou desliga o led depende como este estava antes, boto "A" aumenta o brilho ao led, boto "B" diminui o brilho ao led. 2 - boto "A" + boto "B" liga, ou desliga o led depende como este estava antes, boto "A" aumenta a velocidade das piscadelas do led, boto "B" diminui a velocidade das piscadelas do led. Agora escolham, qual delas ser. Tenho a indicar que no decorrer desta semana vou apresentar o cdigo para a segunda possibilidade, com um se no; no h a necessidade de premir os dois botes para ligar ou desligar o circuito, assim basta premir o boto "A" por mais de 1s para o led ficar permanentemente aceso, ou premir o boto "B" para o led ficar permanentemente apagado. Toques nos botes em perodos de tempo inferiores a 8ms no sero validados, toques superiores a 8ms e inferiores a 1s estaro dependentes de qual boto est a ser premido, fazendo desta maneira o aumento ou a diminuio do tempo que o led se encontra ligado/desligado. Desculpem l o atraso, mas no tenho tido tempo para desenvolver o programa. O porqu do registo "flag" Antes de avanar com o cdigo referido, vou falar de um ponto que acho de mais valia, trata-se do uso de registos criados por ns programadores que servem pura e simplesmente de "auxiliares de memoria" tanto para ns como parra o programa, normalmente chamo a esse(s) registo(s) por "flag". Como j tinha referido anteriormente, cada registo (posio de memoria) composto por oito bits, o que para o caso de um registo tipo "flag" podemos colocar oito flags (bandeiras) de informao ou aviso. Neste programa iro ver muita vez um registo chamado "flag", deste registo so usados uns quantos bits, cinco para ser mais preciso, claro que poderiam ser mais mas neste caso no houve necessidade para tal. Esses bits so os seguintes; - _timer, na posio do bit0 (no usado) - _on, na posio do bit1 (indica ao sistema se o led est aceso (nvel 1) ou apagado (nvel 0)) - _power, na posio do bit2 (indica se o sistema est a "on" ou a "off", na realidade o sistema est sempre ligado, o led pode estar a trabalhar ou no) - _rb0, na posio do bit6 ( indica ao sistema se o boto "A" foi premido ou no) - _rb1, na posio do bit 7 (indica ao sistema se o boto "B" foi premido ou no) Espero ter me feito entender....
A definio de variaveis.
ozflor.com/electroforum/index.php?topic=83.0
16/28
26/04/12
Para alem disso, houve a necessidade de atribuir a labels de determinados bits a sua posio no registo rb0 rb1 rb2 z c w f EQU 0 EQU 1 EQU 2 EQU 2 EQU 0 EQU 0 EQU 1
O mesmo se passou com os bits do registo "flag". _timer EQU 0 _on EQU 1 _power EQU 2 _rb0 EQU 6 _rb1 EQU 7 Aqui esto ento as definies das variaveis. A rotina "PIC_CONFIG". Em relao ao cdigo anterior, esta rotina tem algumas alteraes que passarei a enunciar mais h frente, mas vou tentar explicar esta rotina por passos, assim... clrf clrf clrf clrf clrf PORTA PORTB flag contador variador_1
Aqui, pura e simplesmente limpei os principais registos do sistema. A seguir forcei a entrada no banco 1 (com a instruo bsf STATUS,5) para poder configurar tanto o OPTION_REG fazendo com que active as "pull-up", e que o clock para o timer seja dividido por 128, como se active o interrupt do timer. bsf STATUS,5 movlw b'10000110' movwf OPTION_REG movlw b'10000011' movwf TRISB clrf INTCON bsf INTCON,5 bcf STATUS,5 return Aqui termina esta rotina. Rotina de INTERRUPT Sobre o inicio do programa nada h referir, pois a primeira uma chamada do tipo call, neste caso para a rotina de configurao do chip, e a segunda para a rotina principal do programa. Mas, logo a seguir entra uma rotina muito importante, que a de interrupt, neste caso esta rotina ir controlar o "timing" em que o led est aceso ou apagado. Esse "timing"ir ser de aproximadamente 256X128Xvariador_1, que ir dar valores entre os 8192ms e os 163,84ms, estes "timings " so aplicveis tanto para o ciclo a on como o ciclo a off do led. Explicando melhor cada um dos valores anteriores. - 256 o numero de contagens que o registo do timer tem que fazer para provocar um interrupt. - 128 o valor em que o clock para a contagem do timer foi dividido, como cada instruo (em condies normais), tem a durao de 1us (para um cristal de 4MHz), assim o timer s consegu fazer uma contagem Entrada no banco 1
Activao do interrupt pelo timer Saindo do banco 1 e entrando no banco 0 saida da rotina "PIC_CONFIG"
ozflor.com/electroforum/index.php?topic=83.0
17/28
26/04/12
Aqui limpa-se a flag T0IF que se encontra no registo INTCON, que nos indica que o interrupt que houve foi dado pelo timer Aqui activa-se os interrupts Nesta parte do codigo, volta-se a restabelecer os valores originais que se encontravam nosregistos W e STATUS antes do interupt Com esta instruo, saimos definitivamente do ciclo interrupt
O pedao que se segue vai fazer a multiplicao do atraso criado pelo cdigo anterior. decfsz tempo,f Quando o registo tempo for zero a rotina DELAY acaba, saltando o pc goto DELAY para a posio seguinte da dada pela instruo "call DELAY" na rotina MAIN return Rotina LED_ON_OFF e no s. Esta rotina tem como funo, controlar o estado do led quando um dos botes premido por mais de 1s, ou seja ligar ou desligar o led permanentemente. Pois o led s ir piscar se um dos botes for premido por um perodo de tempo compreendido entre os 8ms e os 999ms, mas vamos l explicar esta coisa. Esta primeira parte tem comom funo azarar as flags _rb1 e _rb0. bcf flag,_rb1
ozflor.com/electroforum/index.php?topic=83.0
18/28
26/04/12
bcf flag,_rb0
Agora o programa vai "apalpar" a flag _on para saber se o led est aceso ou apagado, se esta flag estiver a 1 quer dizer que o led j se encontra aceso, indo por isso o programa apagar o led, caso esteja a 0 chamada a rotina de goto LED_ON, que por sua vez ir apagar o led. btfss flag,_on goto LED_ON bcf PORTB, rb2 bcf flag,_on goto LED_ON_OFF_1 LED_ON bsf PORTB,rb2 bsf flag,_on Depois de a rotina ter decidido o que fazer com o led ela invoca uma rotina que tem como funo pura e simplesmente ver se o operador j largou ou no a tecla (no esquecer que este bocado de cdigo s valido para o circuito ligar ou desligar permanentemente o led, boto premido mais de 1s). Este o resto da rotina LED_ON_OFF call TESTA_TECLAS goto MAIN E agora vem a rotina que v se a tecla j foi solta ou no pelo operador btfss PORTB,rb0 goto TESTA_TECLAS btfss PORTB,rb1 goto TESTA_TECLAS return Assim, podem ver que enquanto uma tecla estiver premida o programa no sai desta rotina. Rotina MAIN Esta parte do programa, a que podemos considerar como o crebro do programa, nesta rotina que o programa detecta se alguma tecla foi premida, qual o tempo que esta esteve premida, e onde define se para acender ou apagar o led, o ainda se para por o led a piscar e a que velocidade. Mas adiante... Neste pedao de codigo, pura e simplesmente azara-se duas flags e um registo. bcf flag,_rb0 bcf flag,_rb1 clrf contador Aqui, onde o programa "apalpa" os botes, para saber qual foi premido, e activa a respectiva flag btfsc PORTB,rb0 goto MAIN_1 bsf flag,_rb0 goto MAIN_2 MAIN_1 btfsc PORTB,rb1 goto MAIN bsf flag,_rb1 Eis onde o programa que controla o tempo.... MAIN_2 movlw d'4'; O tempo que se pretende em ms movwf tempo call DELAY movf PORTB,w incf contador,f Aqui, e depois da contagem de tempo feita v se a tecla continua premida, se continuar manda fazer outra contagem de tempo (no esquecer que cada incremento do registo "contador" equivale a 4ms. btfss PORTB,rb0 goto MAIN_2 btfss PORTB,rb1 goto MAIN_2 Agora, que a tecla se encontra solta a rotina vai saber quanto tempo ela esteve premida, assim subtrai-se ao "contador" um literal, primeiro o "1" e testa-se a flag carry (c) do registo STATUS, se esta estiver a nvel 1, indica-nos duas possibilidades, ou o resultado positivo (o boto esteve premido menos de 4ms), ou o resultado zero (o boto esteve premido por 4ms). Mas o que nos interessa que o resultado seja negativo, s assim poderemos avanar para o prximo caso... sera
ozflor.com/electroforum/index.php?topic=83.0
19/28
26/04/12
ozflor.com/electroforum/index.php?topic=83.0
20/28
26/04/12
movwf variador goto MAIN
A sub-rotina de DECREMENTO, ira fazer exactamente o inverso da sub-rotina de INCREMENTO, ou seja esta ir decrementar o registo "variador" mas com o cuidado deste nunca baixar a baixo do valor 5. DECREMENTO bcf flag,_rb1 decf variador,f movf variador,w sublw d'5' btfsc STATUS,c goto MAIN movlw d'5' movwf variador goto MAIN Programar em C. Como eu j tinha referido anteriormente, tambm h a possibilidade de programar os referidos chips em outras linguagens, das que eu andei a indagar e que tivessem mais contrapartidas para ns... programadores curiosos e com falta de aquilo que se compram os meles Bem, dessas linguagens a que eu achei mais completa foi a CC5X, o programa tem poucas restries, oura vejamos; - pode-se programar at 1024 palavras por modulo. - h limitaes nas bibliotecas de matemtica... mas eis as bibliotecas de matematica que ele aceita. math library support math16.h math16m.h math24f.h math24lb.h : 8-16 bit math library, signed and unsigned : 8-16 bit multiply, speed, signed and unsigned : 24 bit floating point basic math operations : 24 bit floating point library
Bem neste link encontra-se o PDF deste programa http://www.bknd.com/doc/cc5x-33.pdf O programa em si encontra-se aqui neste ponto. http://www.bknd.com/cc5x/downl-stud.shtml#cooliris Usar o MPLAB com programao C. Levando em conta que o pessoal interessado j foi h pagina oficial do CC5X, e sacou o ficheiro de instalao para o seu computas... ento devem ter um incon assim parecido com este.
Bem, agora executar esse incon e em princpio ficaro com uma coisa parecida com esta...
ozflor.com/electroforum/index.php?topic=83.0
21/28
26/04/12
Como claro prime-se no install, depois seguir as indicaes De preferncia deixem que seja o programa a escolher o local para onde ele se instala, pois pode dar problemas depois... seguindo quando chegarem a este ponto s carregar em finish.
Pronto o programa dever estar instalado... Agora, abre-se o MPLAB e abre-se um New Project...
Na janela do New PRoject, escreve-se em cima o nome do projecto e em baixo onde que ele fica.
ozflor.com/electroforum/index.php?topic=83.0
22/28
26/04/12
Depois seleccionamos que queremos o modulo de simulao (pelo menos d muito jeito).
Agora vem a "pice de resistance" (ganda NUNO MARKL), agora onde escolhemos qual o compilador a usar, mas primeiro, h que ver se o nosso amigo MPLAB sabe ao certo onde para o nosso outro amigo o CC5X, o mais que provvel no saber, por isso mesmo nos como bons escuteiros que somos (hehehehe) vamos lhe indicar o caminho.
ozflor.com/electroforum/index.php?topic=83.0
23/28
26/04/12
Agora ir a Project > Select language toolsuite, e escolher o CC5X. Depois disto tudo estamos praticamente no fim... s faltam 4 passos... 1 - criar o ficheiro com extenso em C, muito importante... devem dar o nome do ficheiro pretendido mais a extenso que querem, neste caso ser "nome.c", como podem ver a seguir...
ozflor.com/electroforum/index.php?topic=83.0
24/28
26/04/12
3 - Agora, h que indicar o "Include Serch Path", a partir deste ponto que o MPLAB consegue fazer o link entre o CC5X e o prprio MPLAB, portanto algo muito importante, pois sem esta parte o sistema no consegue abrir as varias bibliotecas necessrias, e isto processa-se da seguinte forma... a) Ir a "Bild Options".
ozflor.com/electroforum/index.php?topic=83.0
25/28
26/04/12
d) da seguinte forma...
ozflor.com/electroforum/index.php?topic=83.0
26/28
26/04/12
e) agora s carregar em "aplicar" e em "OK", pronto estamos prontos para ir para o 4 passo...
4 - comear a trabalhar no ficheiro de trabalho, se levarmos em conta que vamos trabalhar com o PIC16F84A, ento comea assim... #pragma chip PIC16F84A #pragma config WDTE=off, FOSC=HS #pragma config PWRTE=on /* Agora entram as bibliotecas (caso sejam precisas) */ /* por falar nisso os smbolos "/" e "*" no inicio e no fim com a sequncia que eu pus para dar informaes ao programador, o compilador no quer saber de nada o que se encontra dentro destes smbolos */ // ora ento uma biblioteca neste caso a dos interrupts, outra coisa se usarem "//" //d praticamente o mesmo resultado que "/*...*/" #include "int16cxx.h" /* VARIAVEIS */ uns8 var_0, var_1, var_2, var_3, flag,temp_asm, count; Pronto espero ter conseguido dar umas luzes sobre o MPLAB. Penso que agora e para continuar com a sequncia de trabalho talvez se pode-se fazer um pequeno trabalho para sintonizar o pessoal. Poderamos fazer uma parte do veiculo autnomo, eu diria mesmo gerar o PWM para os motores e fazer a sequncia de fuga a quando este detecta obstculos, mas para isso agradecia uma ajuda pelos experts em C, para fazerem partes do cdigo e ajudarem-me a corrigir algum cdigo... Que dizem???
Bem, aqui est um exemplo de um programa em C para ser aplicado no veiculo autnomo.
Code:
ozflor.com/electroforum/index.php?topic=83.0
27/28
26/04/12
#rgabtmtreqed_rne @PRB7 pam i oo_surofet OT. #rgabtmtreqed_neso@PRB6 pam i oo_suroivra OT. #rgabtmtrdriofet pam i oo_iet_rne @PRB5 OT. #rgabtmtrdrioivra @PRB4 pam i oo_iet_neso OT. #rgabtsno_suro@PRA0 pam i esreqed OT. #rgabtsno_iet @PRA1 pam i esrdrio OT. #rgabtfa_n pam i lgit @lg7 fa. #rgabtfa_n_ pam i lgit1 @lg6 fa. # r g a b possvel cdigou r o f a . p a m i l g s n o _ s funcional 5 Com este t f a _ e s r e q e d @ l g podemos por um veiculo a #rgabtfa_esrdrio fa. pam i ligeiramente l g s n o _ i e t e@ l g 4 superior a 50%, com uma frequncia perto dos #rgabtfa_lre pam i lgaam @lg3 fa.
Desta * * * * / dou por finalizado este tutorial sobre o MPLAB e afins. / * * maneira *******
/ ITRUT* * NERP / /******/ ******* #rgaoii 4 pam rgn itrutitsre(od nerp n_evrvi) { itsv_eitr; n_aergses f August 1 1 l g i t 31, ; Last Edit: a _ n _ =2009, 03:46:48 PM by joseflor i (lgit=0) f fa_n = Happy solde ring! { TR=5-a_;/vr1Tmqevra ete7 e20/ M025vr1 *a_ e u air nr 5 5* Jos Flor - O zFlor C om pone nte s e le ctrnica fa_n=; lgit1 Trabalhos e le ctrnica } es le { TR=a_; M0vr1 lgit0 Searching for programa f a _ n = ; PIC16F84A?
Logge d
Pages: [1] Go Up
} Programa PIC16F84A Programa PIC16F84A near TI =0 0F ; Top answ ers for Program a Get local answ ers for Program a GPIC16F84A I =1 E ; PIC16F84A near Program a itrsoergses n_etr_eitr PIC16F84A, Bariri } www.Answered-Questions.com www.Answered-Questions.com vi mtrs(od od ooe vi) { i (fa_lre=0 f lgaam =) { i (lgit= 1 f fa_n = ) { mtrdrioivra =0 oo_iet_neso ; mtreqed_neso=0 oo_suroivra ; mtrdriofet =1 oo_iet_rne ; mtreqed_rne=1 oo_surofet ; } Jum p to: ===> Tutoriais PIC i (lgit= 0 f fa_n = ) { mtrdriofet =0 oo_iet_rne ; mtreqed_rne=0 oo_surofet ; Advertise Here mtrdrioivra =0 oo_iet_neso ; mtreqed_neso=0 oo_suroivra ; } }
Logge d
P RIN T
previous next
go
wie(lgaam =1 hl fa_lre =) { fr(a_ =0 vr4<20 vr4+ o vr4 ; a_ 5; a_+) { fr(a_ =0 vr3<20 vr3+ o vr3 ; a_ 5; a_+) { v Sim = 7 ; a_ Powe re d by SMF 1.1.16 | SMF 2006-2009, r 1ple1 0 Machine s i fa_n = ) f SMFAds for Free Forums ( l g i t = 1 { mtrdriofet =0 oo_iet_rne ; mtreqed_rne=0 oo_surofet ; mtrdrioivra =1 oo_iet_neso ; mtreqed_neso=1 oo_suroivra ; }
es le { mtrdriofet =0 oo_iet_rne ; mtreqed_rne=0 oo_surofet ; mtrdrioivra =0 oo_iet_neso ; mtreqed_neso=0 oo_suroivra ; } } } fr(a_ =0 vr4<20 vr4+ o vr4 ; a_ 5; a_+) { fr(a_ =0 vr3<25 vr3+ o vr3 ; a_ 5; a_+) { i (lgsno_suro= 1 f fa_esreqed = ) {
ozflor.com/electroforum/index.php?topic=83.0
28/28