Sie sind auf Seite 1von 28

26/04/12

Microchip MPLAB IDE - PIC16F84A

Frum de Electrnica - OzFlor


April 26, 2012, 08:38:51 PM

Welcome, Guest. Please login or register.

Searching for programa PIC16F84A?

Programa PIC16F84A
Forever Login Login with username, password and session length Top answ ers for Program a PIC16F84A
www.Answered-Questions.com

Programa PIC16F84A near


Get local answ ers for Program a PIC16F84A near Program a PIC16F84A, Bariri
www.Answered-Questions.com

Searching for Programa PIC16F84A


Discover 100+ 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

Jos Flor OzFlor


Jos Flor Adm inistrator

Microchip MPLAB IDE - PIC16F84A


on: August 31, 2009, 03:38:07 PM

Curtir

N. de LEDs ganhos: 10 O ffline Ge nde r: Posts: 406

Cadastrese para ver do que seus amigos

[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

Neste www.ozflor.com /e le trok it/

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

Microchip MPLAB IDE - PIC16F84A


Assim a estrutura interna do 16F84A. 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. Como ningum reporta, assumo que est tudo sintonizado. Seguindo... 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. Assim a estrutura interna do 16F84A.

ozflor.com/electroforum/index.php?topic=83.0

2/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A


Bem, levando em conta que o pessoal est sintonizado, e pelo que parece eu tenho um tempinho disponvel, vou ento voltar h carga com esta matria, mas, antes de tudo temos que levar em linha de conta que o pessoal interessado j baixou o MPLAB e j o instalou. Agora, lembram-se do led pisca-pisca, ele era composto por 2 botes de presso, em que um servia para ligar o led e o outro para desligar, bem para melhor compreenso aqui fica um esquema (funcional) do dito circuito.

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).

- De seguida selecciona-se o chip que queremos (PIC16F84A).

- Agora h que configurar os bits

ozflor.com/electroforum/index.php?topic=83.0

8/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

- s por como est aqui.

- Agora h que criar o projecto, da seguinte maneira.

- Basta para isso preencher estes campos ( da maneira que acharem melhor)

- Pronto, agora vamos criar o nosso ficheiro de trabalho (*.asm)

- Agora grava-lo com o nome que acharem melhor, eu normalmente dou-lhe o nome do projecto.

- como neste caso...

- Agora, h que adicionar o ficheiro (no meu caso) pisca_pisca.asm ao projecto.

ozflor.com/electroforum/index.php?topic=83.0

9/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

- 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

Microchip MPLAB IDE - PIC16F84A


OUTRA GRANDE FERRAMENTA, SIM Bem, at agora aprendemos como fazer um projecto em assembler para um dado PIC, agora vamos tentar testa-lo sem a necessidade de montar o circuito pratico. Para isso h que: - Seleccionar, Debugger>Select tool>3 MPLAB SIM:

- 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

Microchip MPLAB IDE - PIC16F84A

- 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

Microchip MPLAB IDE - PIC16F84A

- 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:

- E configura-la como est em baixo.

- Agora correr o projecto para ver se h erros ou no.

ozflor.com/electroforum/index.php?topic=83.0

13/28

26/04/12

Microchip MPLAB IDE - PIC16F84A


- Se no houver erros, a barra de evoluo manter-se-a sempre verde como a que se encontra em baixo, mas se houver problemas ela passa a vermelho, mas isso j eu explico.

- 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.

Na parte do codigo que diz:

ozflor.com/electroforum/index.php?topic=83.0

14/28

26/04/12

Microchip MPLAB IDE - PIC16F84A


DELLAY ;Isto uma lable, neste caso indicanos uma subrotina movlw d'255' ; Carrega o registo "W" (um dos registos mais importantes, pois est logo a seguir h "ALU"), com o valor de 255 em decimal movwf var_1 ; O valor do registo "W" inviado par o registo "var_1" movlw d'20' ; 20 em decimal para o registo "W" movwf var_2 ; O valor do registo "W" inviado par o registo "var_2" DELLAY_1 ;Lable decfsz var_1,f ;decrementa o registo "var_1", sobre s mesmo, se o resultado no for ZERO goto DELLAY_1 ; salta para aqui, e daqui salta para asubrotina "DELLAY_1" decf var_2,1 ;mas, se for ZERO salta para aqui, e decrementa o registo "var_2" movf var_2,1 ;move-se o registo "var_2" sobre ele mesmo, e se for ZERO afecta a flag ZERO de registo "STATUS" btfss STATUS,Z ;Testa-se a flag ZERO do registo "STATUS".Se esta (A FLAG)for ZERO... goto DELLAY_1 ;salta para aqui, e daqui para a subrotina DELLAY_1 return Faz-se duplo clic sobre a instruo "return", e h esquerda dessa instruo ir ento aparecer a bola vermelha. A sua funo fazer uma paragem no programa, quando este est a correr ou em animado ou em RUN, para assim podermos ver o que se passou. No nosso caso ir ver quanto tempo leva a subrotina DELAY a correr. OK, agora que sabemos o necessrio, vamos ento correr o programa. Depois de termos feito o BildAll e tudo fiou bem. Vamos agora carregar no reset, depois vamos usar o incon de passo a passo, iremos ver ento a seta a movimentar-se. Na janela watch iremos ver zonas a ficar vermelhas de vez em quando (so as que esto a ser alteradas), a janela StopWatch tambem esta em permanente alterao, mas basta ler o que cada campo desta janela. NOTA: Quando a seta chegar h posio: bcf STATUS,5 ; Aqui colocamos o bit 5 do StATUS novamente a "0" (banco 0). return devemos carregar nos locais que se encontram assinalados por mim, aqui em baixo, mas no esquecer de o fazer antes de chegar ao return.

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A


Neste programa so usadas nove posies de memorias para as nossas variaveis. Que so as seguintes. variador contador flag tempo sav_w sav_status var_1 var_2 variador_1 EQU 0x0C EQU 0x0D EQU 0x0E EQU 0x0F EQU 0x10 EQU 0x11 EQU 0x12 EQU 0x13 EQU 0x14

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

Microchip MPLAB IDE - PIC16F84A


a cada 128us, ora como o seu registo para ficar cheio tem que fazer 256 contagens isso perfaz um timing de 32768us - variador_1, esta a nica varivel em que o operador pode afectar (sempre que prime um boto por um perodo de tempo superior a 8ms e inferior a 1s) . Mas aqui est ento a rotina de interrupt. movwf sav_w swapf STATUS,w movwf sav_status movf variador_1,f a btfss STATUS,z goto LOOP_1 movf variador,w movwf variador_1 saber seguir. btfss flag,_on goto LOOP bcf PORTB,rb2 bsf flag,_on goto LOOP_1 LOOP bsf PORTB,rb2 bcf flag,_on LOOP_1 decf variador_1,f bcf INTCON,T0IF bsf flag,_timer bsf INTCON,GIE swapf sav_status,w movwf STATUS swapf sav_w,f swapf sav_w,w retfie Rotina de DELAY Bem esta rotina tem certas parecenas com a de interrupt. Mas, com a diferena que, enquanto esta rotina estiver a correr s um interrupt a pode afectar, caso no aja nenhum interrupt o programa estar limitado ao loop formado por este pedao de cdigo, que obriga o chip a estar em loop durante um perodo de tempo mnimo de 1ms e a um perodo de tempo mximo de 256ms, que definido pela varivel "tempo" que neste caso ter um valor fixo de 4ms dados na rotina MAIN. Mas, vamos l ento ver o cdigo. DELAY movlw d'75' movwf var_1 movlw d'2' movwf var_2 DELAY_1 decfsz var_1,f goto DELAY_1 decfsz var_2,f goto DELAY_1 Todo este pedao de cdigo tem com funo Este grupo de instrues serve para salvar tanto o registo W como o registo STATUS, pois possivelmente o interrupt foi interromper uma operao qualquer que o programa estava a fazer Nesta poro de cdigo o sistema v se o registo variador_1 maior ou igual zero. Se for maior que zero, ele decrementa o registo vriador_1 e no faz mais nada. Mas, se o valor que se encontra em variador_1 for zero, ento lhe carregado o valor que se encontra em vriador, para alem disso a flag(_on) testada para se o led est aceso ou apagado, indo ser invertida a sua situao a

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

fazer um delay de aproximadamente 1ms

o cdigo seguinte multiplica esse valor

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A


que a tecla esteve premida por mais ou por menos de 1s, novamente iremos subtrair um literal (250) ao registo "contador", ora testando novamente a flag carry do registo STATUS poderemos saber se a ordem para variar as piscadelas do led ou se para acender/apagar o mesmo. movf contador,w sublw d'1' btfsc STATUS,c goto MAIN movf contador,w sublw d'250' btfsc STATUS,c goto VARIADOR A partir deste ponto entramos na parte do programa que define se o led para acender ou para apagar, para isso e para no haver problemas os interrupts so desactivados pela instruo "bcf INTCON,GIE", assim j podemos seguir em frente... agora, h que saber se o circuito est "modo" de trabalho ou de repouso, para isso h que ver se a flag _power esta a nvel 1 ( o circuito esta me "modo" de trabalho) ou a nvel 0 ( o circuito est em "modo" de repouso). Assim se essa flag estiver a zero o programa s ira fazer algo se o boto A foi o premido, se no foi nada ir acontecer... mas, se a flag estiver a nvel 1 duas coisas so possveis; ou foi premido o boto A e o led fica permanentemente aceso, ou o boto B foi premido, ai o led ir apagar-se e s poder acender novamente quando o boto A for premido por um perodo de tempo de 1s. bcf INTCON,GIE btfss flag,_power goto MAIN_3 btfss flag,_rb1 goto MAIN_4 bsf flag,_on bcf flag,_power goto LED_ON_OFF MAIN_3 btfsc flag,_rb1 goto MAIN nop MAIN_4 movlw d'250' movwf variador bsf flag,_power bcf flag,_on goto LED_ON_OFF Aqui termina a rotina MAIN, assim s falta mais uma rotina para o projecto estar terminado..... Rotina variador Bem eu sei que estou para aqui a dar uma real seca... mas a nica maneira que eu achei para explicar o programa.... mas animo est a quase no fim... Indo ao que interessa... a partir desta rotina que o led comea a piscar, com tambm aqui que se altera o perodo de funcionamento do led (ON/OFF). E como que isso acontece??? Bem, para comear, a rotina tenta saber se o circuito est em modo de trabalho ou no (no v o diabo tece-las), assim ela s avana se estiver em modo de trabalho (grande avaria!!!), a seguir vai ver se os interrupts esto activos, se no estiverem ento activa-os, s a partir deste ponto o led pode comear a piscar. btfss flag,_power goto MAIN btfss INTCON,GIE bsf INTCON,GIE Agora h que saber se vamos incrementar ou decrementar, ou melhor vamos saber se vamos aumentar ou diminuir o perodo das piscadelas0. btfsc flag,_rb0 goto INCREMENTO goto DECREMENTO Na sub-rotina INCREMENTO, vamos ento incrementar o valor do registo "variador", mas com o quidado de este nunca passar dos 250 INCREMENTO bcf flag,_rb0 incf variador,f movf variador,w sublw d'250' btfss STATUS,c goto MAIN movlw d'250'

ozflor.com/electroforum/index.php?topic=83.0

20/28

26/04/12
movwf variador goto MAIN

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A

Depois h que escolher o chip, e fazer-se as configuraes dos bits.

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

Microchip MPLAB IDE - PIC16F84A

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...

2 - temos que adicionar o ficheiro de trabalho ao projecto.

ozflor.com/electroforum/index.php?topic=83.0

24/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

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".

b) Agora selecciona-se o campo "Include Search Path".

ozflor.com/electroforum/index.php?topic=83.0

25/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

c) Premi-se em "New" e depois indica-se o caminho...

d) da seguinte forma...

ozflor.com/electroforum/index.php?topic=83.0

26/28

26/04/12

Microchip MPLAB IDE - PIC16F84A

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

Microchip MPLAB IDE - PIC16F84A


[oo=le#rgaci PC68A clrbu]pam hp I1F4 #rga cni | 03F pam ofg = xF2 #nld "n1cxh icue it6x." / VRAES* * AIVI / us vr0 vr1 vr2 vr3 vr4 fa; n8 a_, a_, a_, a_, a_, lg /et vlrcrepneaC=f,OCH,D=f,PRMo* *se ao orsod Pof S=SWTof WT=n/ /Pr u PC1F4* *aa m I 68A/

#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.

bulir , o PWM tem um duty cycle 2KHz.

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

Frum de Electrnica OzFlor

/vr1Tmqevra ete7 e20/ *a_ e u air nr 5 5*

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

Searching for Programa PIC16F84A


Discover 100+ answ ers for Program a PIC16F84A
www.Answered-Questions.com

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

Das könnte Ihnen auch gefallen