Fórum de Electrónica - projectos, cursos, tutoriais, compra e venda, etc. em electrónica
Este fórum migrou para aqui. Se quiser visitar o novo fórum, deverá clicar nesta frase.

Para serviços neste fórum use os botões em baixo.
Últimos assuntos
» Ajuda para mesa de mistura BEHRINGER Eurorack 2442Fx-Pro
Seg 27 Abr 2015 - 13:24 por Jose Manuel Borges

» Microchip MPLAB IDE - PIC16F84A
Sex 8 Ago 2014 - 19:29 por Electromonkeys

» Ajuda sobre curso de electronica
Seg 4 Ago 2014 - 13:57 por Nunes Pereira

» Procuro: Programdores em C, elaborar circuitos electrónicos. Trabalho remunerado
Qua 11 Jun 2014 - 14:07 por ricardo costa1986

» PORTA NOT
Dom 2 Mar 2014 - 13:40 por yoda

» Ajuda com Monitor Philips190tws
Qui 28 Nov 2013 - 1:28 por kagareu

» Estação de Retrabalho não derrete a solda
Sab 12 Out 2013 - 17:10 por itacipri

» Plataforma para cálculo de tempo de voo
Sab 27 Jul 2013 - 4:06 por diogofsousa92

» Prestação serviços projeto eletronica""
Sex 26 Jul 2013 - 15:24 por Mega_Migas

» l7812cv
Seg 15 Jul 2013 - 13:06 por boleiro

Quem está conectado
2 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 2 Visitantes

Nenhum

[ Ver toda a lista ]


O recorde de usuários online foi de 66 em Qui 6 Jan 2011 - 0:00
Buscar
 
 

Resultados por:
 


Rechercher Busca avançada


Microchip MPLAB IDE - PIC16F84A

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Sex 19 Jun 2009 - 14:40

Matéria publicada com autorização do autor resinba a quem eu fica muito grato.
Leia também: Tutorial Microchip micro-controlador PIC - PIC16F84A, PISCA LED
José Flor

Bem vamos lá tentar começar este tutorial sobre PIC's, mais precisamente sobre o MPLAB.
Par começar, temos que sacar o ficheiro de instalação no site da Microchip

Neste momento vai na versão MPLAB IDE v8.3. Para baixar o programa clique aqui

O melhor PIC para o pessoal começar (para mim) é o 16F84A.

Uma coisa temos que levar em linha de conta, é muito importante, se se conseguir-se entender então já é meio caminho andado, que é a seguinte:
-O funcionamento do micro-controlador não tem nada a ver com o funcionamento do micro-processador!
Então o que se se passa?
bem, a primeira diferença é que o micro-processador precisa de uma panóplia de componentes há sua volta para poder trabalhar, coisa que o micro-controlador não, pois este já tem tudo dentro dele.
Outra grande diferença está no funcionamento interno. Num PC quando queremos activar um programa, o uP dá a ordem ao disco-rígido (caso o programa esteja lá instalado) para este descarregar o programa na memoria, o que não 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 variáveis.
Isto que acabei de dizer é doutrina, convém o pessoal compreender esta matéria, por isso irei parar por aqui para ver se há duvidas.
Como tinha dito anteriormente, antes de começar a falar da MPLAB, convém falar da família PIC, para podermos compreender todas as potencialidades da MPLAB. A família PIC hoje em dia é extremamente vasta, havendo desde a família 12Cxxx, os 16xxxxx, a família 18XXXXX).
A diante, eu vou-me debruçar sobre os 16Fxxxx, pois a sua memoria de programa é do tipo flash (o que é excelente).

Aqui está a sua imagem física.


Começaremos 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 saída em qualquer altura do programa.

Assim é a estrutura interna do 16F84A.


Olhando para este esquema, irei falar das partes mais importantes para nós, assim irei começar do exterior para o interior.

Os pinos de INPUT/OUTPUT são chamados PORTOS, o 16F84A tem 2 Portos que são 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/saída normal, como também pode ser uma entrada directa para o Timer (contador temporizado).
- RB0/INT, tal como o anterior este pino para alem de ser in/out, também é uma entrada de interrupt, Neste caso interrup por alteração do flanco do estado da entrada.
- RB4 a RB7, estes pinos também podem ser configurados como interrupt's, neste caso dá-se o interrupt com a alteração do estado da entrada.

Módulos internos do chip.
- Flash Program Memory, esta memoria é onde se encontra o programa em si, é composto por 1024 posições de memoria, cada posição é composta por 14bits (1K X 14).
- RAM, esta memoria é onde se encontram os registos especiais do chip, e os registos necessários ao programador para colocar as suas variáveis.
- EEprom Data Memory, esta memoria tem como função a guarda de variáveis 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 função 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 não.
- Watchdog Timer, este modulo funciona com o registo interno do Timer, assim, só um deles pode ser activado de cada vez. A principal característica 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 necessário uma sub rotina para ir "limpando" o registo garantindo assim que não haja RESET no sistema, este modulo é o ideal para programas que tenham tendências 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 não 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 cerâmico.
- 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 família 12XXXX e 16XXXX. Um exemplo pratico, imaginemos que pomos o 16F84A a trabalhar com um cristal de 4MHz, 256ns de período, mas como internamente ele divide o clock por quatro, teremos então um clock de 1MHz o que faz um período de 1us, ou seja ele leva (neste caso) 1us a fazer uma instrução normal.
Como ninguém reporta, assumo que está tudo sintonizado.
Seguindo...
Como tinha dito anteriormente, antes de começar a falar da MPLAB, convém falar da família PIC, para podermos compreender todas as potencialidades da MPLAB. A família PIC hoje em dia é extremamente vasta, havendo desde a família 12Cxxx, os 16xxxxx, a família 18XXXXX).
A diante, eu vou-me debruçar sobre os 16Fxxxx, pois a sua memoria de programa é do tipo flash (o que é excelente).

Aqui está a sua imagem física.


Começaremos 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 saída em qualquer altura do programa.

Assim é a estrutura interna do 16F84A.


Olhando para este esquema, irei falar das partes mais importantes para nós, assim irei começar do exterior para o interior.

Os pinos de INPUT/OUTPUT são chamados PORTOS, o 16F84A tem 2 Portos que são 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/saída normal, como também pode ser uma entrada directa para o Timer (contador temporizado).
- RB0/INT, tal como o anterior este pino para alem de ser in/out, também é uma entrada de interrupt, Neste caso interrup por alteração do flanco do estado da entrada.
- RB4 a RB7, estes pinos também podem ser configurados como interrupt's, neste caso dá-se o interrupt com a alteração do estado da entrada.

Módulos internos do chip.
- Flash Program Memory, esta memoria é onde se encontra o programa em si, é composto por 1024 posições de memoria, cada posição é composta por 14bits (1K X 14).
- RAM, esta memoria é onde se encontram os registos especiais do chip, e os registos necessários ao programador para colocar as suas variáveis.
- EEprom Data Memory, esta memoria tem como função a guarda de variáveis 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 função 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 não.
- Watchdog Timer, este modulo funciona com o registo interno do Timer, assim, só um deles pode ser activado de cada vez. A principal característica 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 necessário uma sub rotina para ir "limpando" o registo garantindo assim que não haja RESET no sistema, este modulo é o ideal para programas que tenham tendências 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 não 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 cerâmico.
- 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 família 12XXXX e 16XXXX. Um exemplo pratico, imaginemos que pomos o 16F84A a trabalhar com um cristal de 4MHz, 256ns de período, mas como internamente ele divide o clock por quatro, teremos então um clock de 1MHz o que faz um período de 1us, ou seja ele leva (neste caso) 1us a fazer uma instrução normal.
Vou então falar de mais uma matéria muito importante, neste caso vou-me debruçar sobre a memoria e tudo o que tem a ver com ela.



Nesta imagem, vemos a disposição das duas memorias principais do chip, começando de cima temos o PC, ou melhor program counter, é o modulo que vai gerando posições de memoria, sejam elas para a principal ou a RAM, e sejam elas geradas pelo sistema ou a pedido do programador com instruções 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 têem duas posições de memoria muito importantes que são:
- RESET Vector (0000H), é nesta posição que o programa tem começo depois de um RESET, seja ele quando é alimentado ou quando é forçado (watchdog).
- Peripheral Interrupt Vector, É nesta posição 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, convém levar em linha de conta, que este ira saltar para a linha 0004H logo que sinta o interrupt. Um exemplo qe garanta que não 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...


Se repararem, esta coisa a que lhe chamamos RAM, é composta por dois bancos de 8 bits cada, outra coisa é que as primeiras 12 posições de memoria de cada banco têm determinadas referencias, bem, estas posições de memoria correspondem aos "special function registers" (SFR) ou em TUGA "registos especiais", é nestes registos que nós ou programamos o chip ou sabemos o que lá se passa. Agora, da posição 0Ch, há posição 4Fh, do banco 0 correspondem a posições de memoria que o programador pode usar para as suas variáveis (sinceramente nunca usei o banco1).


Aqui estão os famosos registos (FSR), não se assustem pois destes registos todos e em condições normais só usamos o OPTION, o STATUS, o TRIS(A/B), o PORT(A/B), agora se quisermos usar os interrupts então teremos que usar o INTCON, para o timer TMR0 e por ai fora.

Antes de continuar saquem o datasheet do 16F84A.


Última edição por joseflor em Seg 22 Jun 2009 - 13:06, editado 2 vez(es)
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Seg 22 Jun 2009 - 11:30

Continuando... Agora os registos mais importantes, mas antes vou tentar sintonizar o pessoal, na citação anterior descrevi um pouco de um possível programa, na instrução "call CONFIG", o que se pretende é "salta" para uma subrotina onde iremos configurar o chip, para que ele faça 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 saída.
Então teremos de usar os registos; STATUS, OPTION, PORT e TRIS.
E por quê???


Bem, primeiro temos que invocar o registo de STATUS, para podermos ir para o banco 1 e assim fazermos outras configurações.Mas antes, as características deste registo:
- Bit7 e bit6 IRP e RP1 respectivamente, estes dois bits não são usados, o valor deles é "0".
- Bit 5 RP0, se colocarmos este bit a "1", então passamos a aceder ao banco1.
- Todos os restantes bit deste registo, são do tipo "flag bit", ou seja servem para nos indicar que algo aconteceu, ou não.
Por exemplo, se fizermos uma conta de subtrair e o resultado der zero então a flag-zero é colocada a nivel "1".
Nota: Convém colocar as flag Z,DC e C a zero, antes de se efectuarem acções do tipo calculo, ou logica, pois é graças 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 não tem interesse para este caso.
os restantes bits são:
- 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 não se pretende usar o WDT (watchdog timer), CONVÉM por o bit 3 PSA a "0".


No caso do INTCON, só temos que garantir que tudo esteja a zero pois não vamos usar nenhum interrupt.
Mas vamos ver os seus bits em maior profundidade:
- Bit 7 GIE, este é o bit que dá a autorização (quando está a "1")a todos os possiveis interrupts para ficarem activos, ou não (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 não 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 características diferentes do RB0. Se etiver a zero nada se passará.

Os restantes bits deste registo são flag-bits, que deveram ser limpas sempre que necessário, e são 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 próxima citação mostrarei como ficará então este bocado de programa.

Bem, ontem tinha alevantado um pouco o véu, sobre o codigo assembler para estes meninos, o codigo era o seguinte:

org 0000Hex ; O ";" serve para podermos por comentarios, ou seja o compilador não se intereça
call CONFIG ; com o que está a seguir ao ";"
call CLEAR_MEMORY
goto MAIN

movf STATUS,W ;Inicio do vector interrupt
. ;Isto não é valido, como já calcularam
.
.
CONFIG ;Isto é uma label
clrf PORTA ;continuando a partir deste ponto

clrf PORTB ; esta instrução manda limpar o registo PORTB
bsf STATUS,5 ; Neste caso vamos activar "1" o bit 5 do STATUS register
movlw b'10000000' ; Neste caso vamos carregar o registo W com o 128 em binário
movwf OPTION ; Esse valor é agora carregado no registo OPTION,
;para activarmos as pull-ups
movlw b'00000011' ; Aqui, vamos carregar o valor 3 em binário par o registo TRISB
movwf TRISB ; Este registo serve para definir quais pinos são saídas (nível
; lógico "0"), e os que são entradas (nivel logico "1")
clrf INTCON ; Neste caso limpamos o registo INTCON (não irá haver interrupts)
bcf STATUS,5 ; Aqui colocamos o bit 5 do StATUS novamente a "0" (banco 0).
return ; Saímos da instrução call e vamos para a proxima linha de instrução
; ou seja saltamos para a instrução "call CLEAR_MEMORYY"

Bem, levando em conta que o pessoal está sintonizado, e pelo que parece eu tenho um tempinho disponível, vou então voltar há carga com esta matéria, 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 botões de pressão, em que um servia para ligar o led e o outro para desligar, bem para melhor compreensão aqui fica um esquema (funcional) do dito circuito.


Shot at 2007-07-05
Não coloquei o pinout, pois o datasheet deste chip já foi colocado anteriormente.


MPLAB

Vamos então a este senhor, para começar 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


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


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

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Seg 22 Jun 2009 - 11:34

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 é necessário activar a janela watch...


- A janela watch é esta coisa aqui em baixo, agora temos que lhe indicar quais os registos que queremos ver, estas registos serão aqueles que vamos usar no programa. Neste caso serão 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 nós.
Para activarmos os registos em questão 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.


- 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 botões de pressão 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 não.


- Se não houver erros, a barra de evolução 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 então podemos organizar o nosso ambiente de trabalho como por exemplo este.


- Por fim é usar este grupo de incons em que os mais importantes estão diferenciados por mim.
para alem disso, coloquei mais dois incons que funcionam dentro do programa em sí, assim , a seta indica a posição actual em que o programa vai, e a bolinha a vermelho é um breekpoint, qual a sua função bem já vão ver.


Na parte do codigo que diz:

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 não 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 instrução "return", e há esquerda dessa instrução irá então aparecer a bola vermelha.
A sua função é 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 necessário, vamos então 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 então a seta a movimentar-se. Na janela watch iremos ver zonas a ficar vermelhas de vez em quando (são as que estão a ser alteradas), a janela StopWatch tambem esta em permanente alteração, mas basta ler o que é cada campo desta janela.

NOTA: Quando a seta chegar há posição:
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 não esquecer de o fazer antes de chegar ao return.


a função é simples, é para colocar tanto o RB0 como o RB1 a nível lógico 1 e assim quer dizer que os botões de pressão não foram premidos.
Se premirmos no incon animado, a seta começa-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 (botão de pressão 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 (botão de pressão para desligar o led)
bsf flag,0 ;activa o bit 0 do registo "flag"
btfss flag,0 ;aqui está a função deste bit e deste registo "flag", na realidade não passa de 8 flag para o programador poder utilizar
goto MAIN ;Se (flag0) for ZERO, salta pra a posição MAIN, caso seja UM...

Agora, primam em pausa, é o incon entre o run e o animado, e em seguida começem a usar a tecla "F7" (é o mesmo que premirem em passo a passo), para sermos nós a controlar o que se vai passar a seguir.
Vamos então provocar alguma acção 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 botão 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 instrução "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 indicação 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 botão de pressão está premido colocando a massa neste ponto), a seguir temos um 1 pois o potão de pressão do RB1 não 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á não estamos a premir para ligar o led.
2º - premir em fire RB1 para dizermos agora ao sistema que queremos o led apagado.


Bem, os configuration bits servem para poderes fazeres certas configurações ao chip. Assim ele por defeito irá colocar este registo todo a 1's, que fará a seguinte situação:
- CP_OFF (CODE PROTECTION, Protecção do programa)
- DP_OFF (CODE PROTECTION, protecção da memoria)
NOTA: estes bits servem para protecção 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 alimentação)
- WDTE_ON (WATCHDOG TIMER ENABLE BIT, O watchtdog fica activo)
- OSC_RC (OSCILATOR SELECTION BITS, Fica activo para uma malha RC)

Estas são as características default, para este chip, e tu é que terás 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 não use o watchdog)
-OSC_HS (normalmente uso um cristal de 4MHz, ou um oscilador cerâmico)

Mas se sacares o datasheet verás no capitulo 8 essa informação mais detalhada.
Outra coisa, tanto podes fazer a configuração de bit naquela janela, como no programa que estás 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, chiça que um interruptor bastava!!!
Bem para complicar um pouco vamos alterar o código de maneira tal que, se carregarmos nos dois botões ao mesmo tempo o led irá se acender e se voltarmos a carregar nos botões o led irá apagar-se, e porquê?
Bem ,assim com os botões e usando-os individualmente podemos aumentar ou diminuir o brilho do led, ou então faremos com que o led fique a piscar mais ou menos rápido, fica ao vosso critério, escolham um destes dois casos:

1º - botão "A" + botão "B" liga, ou desliga o led depende como este estava antes, botão "A" aumenta o brilho ao led, botão "B" diminui o brilho ao led.

2º - botão "A" + botão "B" liga, ou desliga o led depende como este estava antes, botão "A" aumenta a velocidade das piscadelas do led, botão "B" diminui a velocidade das piscadelas do led.

Agora escolham, qual delas será.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Seg 22 Jun 2009 - 11:42

Tenho a indicar que no decorrer desta semana vou apresentar o código para a segunda possibilidade, com um se não; não há a necessidade de premir os dois botões para ligar ou desligar o circuito, assim basta premir o botão "A" por mais de 1s para o led ficar permanentemente aceso, ou premir o botão "B" para o led ficar permanentemente apagado. Toques nos botões em períodos de tempo inferiores a 8ms não serão validados, toques superiores a 8ms e inferiores a 1s estarão dependentes de qual botão está a ser premido, fazendo desta maneira o aumento ou a diminuição do tempo que o led se encontra ligado/desligado.
Desculpem lá o atraso, mas não tenho tido tempo para desenvolver o programa.


O porquê do registo "flag"

Antes de avançar com o código referido, vou falar de um ponto que acho de mais valia, trata-se do uso de registos criados por nós programadores que servem pura e simplesmente de "auxiliares de memoria" tanto para nós como parra o programa, normalmente chamo a esse(s) registo(s) por "flag". Como já tinha referido anteriormente, cada registo (posição de memoria) é composto por oito bits, o que para o caso de um registo tipo "flag" podemos colocar oito flags (bandeiras) de informação ou aviso.

Neste programa irão ver muita vez um registo chamado "flag", deste registo são usados uns quantos bits, cinco para ser mais preciso, claro que poderiam ser mais mas neste caso não houve necessidade para tal.
Esses bits são os seguintes;
- _timer, na posição do bit0 (não é usado)
- _on, na posição do bit1 (indica ao sistema se o led está aceso (nível 1) ou apagado (nível 0))
- _power, na posição 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 não)
- _rb0, na posição do bit6 ( indica ao sistema se o botão "A" foi premido ou não)
- _rb1, na posição do bit 7 (indica ao sistema se o botão "B" foi premido ou não)

Espero ter me feito entender....



A definição de variaveis.

Neste programa são usadas nove posições de memorias para as nossas variaveis.
Que são as seguintes.

variador EQU 0x0C
contador EQU 0x0D
flag EQU 0x0E
tempo EQU 0x0F
sav_w EQU 0x10
sav_status EQU 0x11
var_1 EQU 0x12
var_2 EQU 0x13
variador_1 EQU 0x14

Para alem disso, houve a necessidade de atribuir a labels de determinados bits a sua posição no registo

rb0 EQU 0
rb1 EQU 1
rb2 EQU 2
z EQU 2
c EQU 0
w EQU 0
f 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 estão então as definições das variaveis.


A rotina "PIC_CONFIG".

Em relação ao código anterior, esta rotina tem algumas alterações que passarei a enunciar mais há frente, mas vou tentar explicar esta rotina por passos, assim...

clrf PORTA
clrf PORTB
clrf flag
clrf contador
clrf variador_1

Aqui, pura e simplesmente limpei os principais registos do sistema.
A seguir forcei a entrada no banco 1 (com a instrução 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 Entrada no banco 1
movlw b'10000110'
movwf OPTION_REG
movlw b'10000011'
movwf TRISB
clrf INTCON
bsf INTCON,5 Activação do interrupt pelo timer
bcf STATUS,5 Saindo do banco 1 e entrando no banco 0
return saida da rotina "PIC_CONFIG"

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 configuração 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 " são aplicáveis 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 instrução (em condições
normais), tem a duração de 1us (para um cristal de 4MHz), assim o timer só consegu fazer uma contagem
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 variável em que o operador pode afectar (sempre que prime um botão por um período de tempo superior a 8ms e inferior a 1s) .

Mas aqui está então a rotina de interrupt.

movwf sav_w Este grupo de instruções serve para salvar tanto o registo W como o registo
swapf STATUS,w STATUS, pois possivelmente o interrupt foi interromper uma operação qualquer
movwf sav_status que o programa estava a fazer


movf variador_1,f Nesta porção de código o sistema vê se o registo variador_1 é maior ou igual a
btfss STATUS,z zero.
goto LOOP_1 Se for maior que zero, ele decrementa o registo vriador_1 e não faz mais nada.
movf variador,w Mas, se o valor que se encontra em variador_1 for zero, então é lhe carregado o
movwf variador_1 valor que se encontra em vriador, para alem disso a flag(_on) é testada para saber
se o led está aceso ou apagado, indo ser invertida a sua situação a 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 Aqui limpa-se a flag T0IF que se encontra no registo INTCON, que nos indica
bsf flag,_timer que o interrupt que houve foi dado pelo timer
bsf INTCON,GIE Aqui activa-se os interrupts

swapf sav_status,w Nesta parte do codigo, volta-se a restabelecer os valores originais que se
movwf STATUS encontravam nosregistos W e STATUS antes do interupt
swapf sav_w,f
swapf sav_w,w
retfie Com esta instrução, saimos definitivamente do ciclo interrupt


Rotina de DELAY

Bem esta rotina tem certas parecenças com a de interrupt. Mas, com a diferença que, enquanto esta rotina estiver a correr só um interrupt a pode afectar, caso não aja nenhum interrupt o programa estará limitado ao loop formado por este pedaço de código, que obriga o chip a estar em loop durante um período de tempo mínimo de 1ms e a um período de tempo máximo de 256ms, que é definido pela variável "tempo" que neste caso terá um valor fixo de 4ms dados na rotina MAIN.
Mas, vamos lá então ver o código.

DELAY
movlw d'75' Todo este pedaço de código tem com função
movwf var_1
movlw d'2'
movwf var_2
DELAY_1 fazer um delay de aproximadamente 1ms
decfsz var_1,f
goto DELAY_1
decfsz var_2,f
goto DELAY_1 o código seguinte multiplica esse valor

O pedaço que se segue vai fazer a multiplicação do atraso criado pelo código anterior.

decfsz tempo,f Quando o registo tempo for zero a rotina DELAY acaba, saltando o pc
goto DELAY para a posição seguinte da dada pela instrução "call DELAY" na rotina MAIN
return
Rotina LED_ON_OFF e não só.

Esta rotina tem como função, controlar o estado do led quando um dos botões é premido por mais de 1s, ou seja ligar ou desligar o led permanentemente. Pois o led só irá piscar se um dos botões for premido por um período de tempo compreendido entre os 8ms e os 999ms, mas vamos lá explicar esta coisa.

Esta primeira parte tem comom função azarar as flags _rb1 e _rb0.

bcf flag,_rb1
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 função pura e simplesmente ver se o operador já largou ou não a tecla (não esquecer que este bocado de código só é valido para o circuito ligar ou desligar permanentemente o led, botão 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 não 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 não sai desta rotina.

Rotina MAIN

Esta parte do programa, é a que podemos considerar como o cérebro 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 pedaço 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 botões, 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 (não 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 nível 1, indica-nos duas possibilidades, ou o resultado é positivo (o botão esteve premido menos de 4ms), ou o resultado é zero (o botão esteve premido por 4ms). Mas o que nos interessa é que o resultado seja negativo, só assim poderemos avançar para o próximo caso... sera 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 não haver problemas os interrupts são desactivados pela instrução "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 nível 1 ( o circuito esta me "modo" de trabalho) ou a nível 0 ( o circuito está em "modo" de repouso). Assim se essa flag estiver a zero o programa só ira fazer algo se o botão A foi o premido, se não foi nada irá acontecer... mas, se a flag estiver a nível 1 duas coisas são possíveis; ou foi premido o botão A e o led fica permanentemente aceso, ou o botão B foi premido, ai o led irá apagar-se e só poderá acender novamente quando o botão A for premido por um período 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.....

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Seg 22 Jun 2009 - 11:46

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 começa a piscar, com é também aqui que se altera o período de funcionamento do led (ON/OFF). E como é que isso acontece???

Bem, para começar, a rotina tenta saber se o circuito está em modo de trabalho ou não (não vá o diabo tece-las), assim ela só avança se estiver em modo de trabalho (grande avaria!!!), a seguir vai ver se os interrupts estão activos, se não estiverem então activa-os, só a partir deste ponto o led pode começar 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 período das piscadelas0.

btfsc flag,_rb0
goto INCREMENTO
goto DECREMENTO

Na sub-rotina INCREMENTO, vamos então 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'
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, também há a possibilidade de programar os referidos chips em outras linguagens, das que eu andei a indagar e que tivessem mais contrapartidas para nós... programadores curiosos e com falta de aquilo que se compram os melões Bem, dessas linguagens a que eu achei mais completa foi a CC5X, o programa tem poucas restrições, oura vejamos;

- pode-se programar até 1024 palavras por modulo.
- há é limitações nas bibliotecas de matemática... mas eis as bibliotecas de matematica que ele aceita.

math library support

math16.h : 8-16 bit math library, signed and unsigned
math16m.h : 8-16 bit multiply, speed, signed and unsigned
math24f.h : 24 bit floating point basic math operations
math24lb.h : 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 programação C.

Levando em conta que o pessoal interessado já foi há pagina oficial do CC5X, e sacou o ficheiro de instalação para o seu computas... então devem ter um incon assim parecido com este.



Bem, agora é executar esse incon e em princípio ficarão com uma coisa parecida com esta...



Como é claro prime-se no install, depois é seguir as indicações De preferência 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.



Depois há que escolher o chip, e fazer-se as configurações dos bits.





Depois seleccionamos que queremos o modulo de simulação (pelo menos dá muito jeito).



Agora vem a "pièce 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 provável é não saber, por isso mesmo nos como bons escuteiros que somos (hehehehe) vamos lhe indicar o caminho.





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 extensão em C, muito importante... devem dar o nome do ficheiro pretendido mais a extensão que querem, neste caso será "nome.c", como podem ver a seguir...







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





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 próprio MPLAB, portanto é algo muito importante, pois sem esta parte o sistema não consegue abrir as varias bibliotecas necessárias, e isto processa-se da seguinte forma...

a) Ir a "Bild Options".


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


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


d) da seguinte forma...


e) agora é só carregar em "aplicar" e em "OK", pronto estamos prontos para ir para o 4º passo...


4º - começar a trabalhar no ficheiro de trabalho, se levarmos em conta que vamos trabalhar com o PIC16F84A, então começa 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 símbolos "/" e "*" no inicio e no fim com a sequência que eu pus é para dar informações ao programador, o compilador não quer saber de nada o que se encontra dentro destes símbolos */
// ora então 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 sequência de trabalho talvez se pode-se fazer um pequeno trabalho para sintonizar o pessoal.

Poderíamos fazer uma parte do veiculo autónomo, eu diria mesmo gerar o PWM para os motores e fazer a sequência de fuga a quando este detecta obstáculos, mas para isso agradecia uma ajuda pelos experts em C, para fazerem partes do código e ajudarem-me a corrigir algum código...
Que dizem???
;D ;D Wink Wink

Bem, aqui está um exemplo de um programa em C para ser aplicado no veiculo autónomo.

#pragma chip PIC16F84A

#pragma config |= 0x3FF2 /*este valor corresponde a CP=off, OSC=HS,WDT=off, PWRTM=on*/
/*Para um PIC 16F84A*/
#include "int16cxx.h"

/* VARIAVEIS */
uns8 var_0, var_1, var_2, var_3, var_4, flag;


#pragma bit motor_esquerdo_frente @ PORTB.7
#pragma bit motor_esquerdo_inversao @ PORTB.6
#pragma bit motor_direito_frente @ PORTB.5
#pragma bit motor_direito_inversao @ PORTB.4

#pragma bit sensor_esquerdo @ PORTA.0
#pragma bit sensor_direito @ PORTA.1

#pragma bit flag_int @flag.7
#pragma bit flag_int_1 @flag.6
#pragma bit flag_sensor_esquerdo @flag.5
#pragma bit flag_sensor_direito @flag.4
#pragma bit flag_alarme @flag.3

/*************/
/* INTERRUPT */
/*************/
#pragma origin 4
interrupt int_server(void)
{
int_save_registers;
flag_int_1 = 1;
if (flag_int ==0 )
{
TMR0=255-var_1; /*var_1 Tem que variar entre 75 e 250*/

flag_int=1;
}
else
{
TMR0=var_1; /*var_1 Tem que variar entre 75 e 250*/

flag_int=0;
}
T0IF = 0;
GIE = 1;
int_restore_registers
}
void motores (void)
{
if ( flag_alarme ==0)
{
if (flag_int == 1)
{
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
motor_direito_frente = 1;
motor_esquerdo_frente = 1;
}

if (flag_int == 0)
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
}
}

while (flag_alarme ==1)
{
for (var_4 = 0; var_4 < 250; var_4++)
{
for (var_3 = 0; var_3 < 250; var_3++)
{
var_1 = 170;
if (flag_int == 1)
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 1;
motor_esquerdo_inversao = 1;
}


else
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
}
}
}
for (var_4 = 0; var_4 < 250; var_4++)
{
for (var_3 = 0; var_3 < 255; var_3++)
{
if (flag_sensor_esquerdo == 1)
{
motor_esquerdo_frente=0;
motor_esquerdo_inversao =0;
motor_direito_frente=1;
motor_direito_inversao=0;
}
else
{
motor_esquerdo_frente=1;
motor_esquerdo_inversao =0;
motor_direito_frente=0;
motor_direito_inversao=0;
}
}
}
flag_alarme = 0;
}
}
void testa_int (void)
{
while (flag_int_1 == 1)
{
motores();
flag_int_1 = 0;
}
}




void main (void)
{
uns8 temp;
PORTA=0;
TRISA= 0B11111111; //colocar todas como entradas
PORTB =0;
TRISB= 0b00000000; // colocar todas comom saidas
OPTION=0b01000000;
INTCON=0b00100000;

var_0 = 0;
var_1 = 0;
var_2 = 0;
flag = 0;
GIE =1;

while (var_0 == 0 )
{
if (sensor_esquerdo == 0 && sensor_direito == 0)
{
testa_int();
var_1 = 80;

testa_int();
}
else
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
flag_alarme =1;

if (sensor_esquerdo == 1)
{
flag_sensor_esquerdo = 1;

}
else
{
flag_sensor_direito = 1;

}
motores();
}




}

}


Com este possível código funcional podemos por um veiculo a bulir , o PWM tem um duty cycle ligeiramente superior a 50%, e com uma frequência perto dos 2KHz.

Desta maneira dou por finalizado este tutorial sobre o MPLAB e afins.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Seg 22 Jun 2009 - 11:59

Bem, aqui está um exemplo de um programa em C para ser aplicado no veiculo autónomo.

#pragma chip PIC16F84A

#pragma config |= 0x3FF2 /*este valor corresponde a CP=off, OSC=HS,WDT=off, PWRTM=on*/
/*Para um PIC 16F84A*/
#include "int16cxx.h"

/* VARIAVEIS */
uns8 var_0, var_1, var_2, var_3, var_4, flag;


#pragma bit motor_esquerdo_frente @ PORTB.7
#pragma bit motor_esquerdo_inversao @ PORTB.6
#pragma bit motor_direito_frente @ PORTB.5
#pragma bit motor_direito_inversao @ PORTB.4

#pragma bit sensor_esquerdo @ PORTA.0
#pragma bit sensor_direito @ PORTA.1

#pragma bit flag_int @flag.7
#pragma bit flag_int_1 @flag.6
#pragma bit flag_sensor_esquerdo @flag.5
#pragma bit flag_sensor_direito @flag.4
#pragma bit flag_alarme @flag.3

/*************/
/* INTERRUPT */
/*************/
#pragma origin 4
interrupt int_server(void)
{
int_save_registers;
flag_int_1 = 1;
if (flag_int ==0 )
{
TMR0=255-var_1; /*var_1 Tem que variar entre 75 e 250*/

flag_int=1;
}
else
{
TMR0=var_1; /*var_1 Tem que variar entre 75 e 250*/

flag_int=0;
}
T0IF = 0;
GIE = 1;
int_restore_registers
}
void motores (void)
{
if ( flag_alarme ==0)
{
if (flag_int == 1)
{
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
motor_direito_frente = 1;
motor_esquerdo_frente = 1;
}

if (flag_int == 0)
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
}
}

while (flag_alarme ==1)
{
for (var_4 = 0; var_4 < 250; var_4++)
{
for (var_3 = 0; var_3 < 250; var_3++)
{
var_1 = 170;
if (flag_int == 1)
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 1;
motor_esquerdo_inversao = 1;
}


else
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
}
}
}
for (var_4 = 0; var_4 < 250; var_4++)
{
for (var_3 = 0; var_3 < 255; var_3++)
{
if (flag_sensor_esquerdo == 1)
{
motor_esquerdo_frente=0;
motor_esquerdo_inversao =0;
motor_direito_frente=1;
motor_direito_inversao=0;
}
else
{
motor_esquerdo_frente=1;
motor_esquerdo_inversao =0;
motor_direito_frente=0;
motor_direito_inversao=0;
}
}
}
flag_alarme = 0;
}
}
void testa_int (void)
{
while (flag_int_1 == 1)
{
motores();
flag_int_1 = 0;
}
}




void main (void)
{
uns8 temp;
PORTA=0;
TRISA= 0B11111111; //colocar todas como entradas
PORTB =0;
TRISB= 0b00000000; // colocar todas comom saidas
OPTION=0b01000000;
INTCON=0b00100000;

var_0 = 0;
var_1 = 0;
var_2 = 0;
flag = 0;
GIE =1;

while (var_0 == 0 )
{
if (sensor_esquerdo == 0 && sensor_direito == 0)
{
testa_int();
var_1 = 80;

testa_int();
}
else
{
motor_direito_frente = 0;
motor_esquerdo_frente = 0;
motor_direito_inversao = 0;
motor_esquerdo_inversao = 0;
flag_alarme =1;

if (sensor_esquerdo == 1)
{
flag_sensor_esquerdo = 1;

}
else
{
flag_sensor_direito = 1;

}
motores();
}




}

}


Com este possível código funcional podemos por um veiculo a bulir , o PWM tem um duty cycle ligeiramente superior a 50%, e com uma frequência perto dos 2KHz.

Desta maneira dou por finalizado este tutorial sobre o MPLAB e afins.


pre-scale é um nome dado genericamente a "mudança de escala", normalmente aplicado a divisão de frequências, antes de entrar num bloco ou dispositivo onde irá ser usado. A utilização tipica é por exemplo: um oscilador gera um sinal de 1MHz; este sinal passa por um "prescale" e sai um sinal co muma frequência menor, por exemplo 100KHz. Neste exemplo podemos dizer que o prescale é de 10 (10MHz / 100KHz = 10). O dispositivo que efectua o prescale é o prescaler.

duty cycle é o "ciclo activo". Imagina uma onda quadrada. Esta onda está uma certa percentagem de tempo do seu periodo a um nível alto, e a restante percentagem está ao nível baixo. O ciclo activo é a percentagem do perído da onda em que o sinal está ao nível alto. Por exemplo, uma onda com 50% de ciclo activo é uma onda simétrica, em que o sinal está ao nível baixo o mesmo tempo em que está ao nível alto. Já uma onda com um ciclo activo de 1% está quase sempre ao nível baixo durante todo o seu periodo.
Código:

  ____      ____
_|    |____|    |____  50% de ciclo activo
  __        __
_|  |______|  |______  25% de ciclo activo

 |---------|  <- este é o periodo da onda, o tempo de duração de 1 ciclo

postscale não costumo ver usado, mas por analogia com o prescale, o postscale será uma divisão (ou mudança de escala) de um sinal após... qualquer coisa, à posteriori.

E quanto ao tópico em si está muito bom, bom detalhe e em português... só mesmo por carolice Smile. Parabéns e continuação de bom trabalho resinba.

Para uma situação simples dessas, podes procurar por ::

# JDM http://www.jdm.homepage.dk/newpic.htm
# Ludipipo http://www.kallesen.com/ELMP/ludipipo.htm

Pode usar o ICPROG ou WinPic800 no PC.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Não consigo utilizar o MPLAB 8

Mensagem  icaro costa em Sex 14 Ago 2009 - 22:56

Olá, o mplab 8.0 tem a mesma interface do 7.61, estava seguindo o tutorial acima, mas tem muitas figuras que não aparecem, ficam com um X vermelho. Então n tive como seguir esses passos. Alguem pode me ajudar????

icaro costa
Nível 0
Nível 0

Mensagens : 5
Pontos : 2818
Reputação : 0
Data de inscrição : 14/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Sab 15 Ago 2009 - 13:00

icaro costa escreveu:Olá, o mplab 8.0 tem a mesma interface do 7.61, estava seguindo o tutorial acima, mas tem muitas figuras que não aparecem, ficam com um X vermelho. Então n tive como seguir esses passos. Alguem pode me ajudar????

Boas Icaro,

Esse é o problema em informática. Mudam os softwares e tudo fica diferente e difícil de seguir de seguir os tutoriais.

Sugiro instalar a versão do tutorial em questão para facilitar a coisa. Ou então com muito custo tente fazer isso com a versão que tem instalado.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  icaro costa em Sab 15 Ago 2009 - 20:04

O problema é que to seguindo o tutorial acima, só que nem todas as imagens postadas ai aparecem aqui no site, muitas aparecem somente um X vermelho, ai n tem como seguir todo o tutorial, sempre paro na metade sem saber como passar meu programa em assembly pro mplab pra eu usar no proteus.

icaro costa
Nível 0
Nível 0

Mensagens : 5
Pontos : 2818
Reputação : 0
Data de inscrição : 14/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  icaro costa em Sab 15 Ago 2009 - 20:08

As imagens que não aparecem são as tres de como criar um ficheiro (.asm)

icaro costa
Nível 0
Nível 0

Mensagens : 5
Pontos : 2818
Reputação : 0
Data de inscrição : 14/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Dom 16 Ago 2009 - 11:42

icaro costa escreveu:As imagens que não aparecem são as tres de como criar um ficheiro (.asm)
Podes especificar?

É a imagem"Guardar como" que fica neste texto
2º - temos que adicionar o ficheiro de trabalho ao projecto.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  icaro costa em Dom 16 Ago 2009 - 16:18

São seguintes imagens do primeiro tópico:

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

Ou então se pudar me ajudar com um passo a passo como faço pra colocar o codigo assembly no Mplab para depois passa-lo pro proteus, seria otimo...

icaro costa
Nível 0
Nível 0

Mensagens : 5
Pontos : 2818
Reputação : 0
Data de inscrição : 14/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  Admin em Dom 16 Ago 2009 - 16:23

Já reparei nas imagens a faltar. Essas imagens devem ter sido apagadas do servidor de alojamento onde estavam.
Eu estou ocupado a criar um fórum e a repassar iste material para lá. fIca aqui http://ozflor.com/electroforum/index.php
Com tempo vou ver se arranjo as imagens e depois informo.

_________________
Admin

Admin
Nível 0
Nível 0

Mensagens : 10
Pontos : 3121
Reputação : 0
Data de inscrição : 06/11/2008

Ver perfil do usuário http://electronicapt.do-forum.com

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Dom 16 Ago 2009 - 16:31

Vou procurar nos meus materiais de casa se acho as imagens para postar aqui.


Later edit:
As imagens umas vezes aparecem outras não. Iso tem a ver com o local onde estão armazenadas. Tente fazer o refresh do navegado de internet o atalho é F5 para ver se aparecem. Assim que aparecerem grave elas para não perder mais.

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  icaro costa em Dom 16 Ago 2009 - 17:00

No aguardo..
Obrigado

icaro costa
Nível 0
Nível 0

Mensagens : 5
Pontos : 2818
Reputação : 0
Data de inscrição : 14/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Compiladores

Mensagem  kaka em Ter 12 Jan 2010 - 22:11

Você disse que dos compiladores para linguagem C o mais completo foi o CC5X, ele é melhor que o MCC18 da Microchip? Ou você está falando somente do aspecto de compiladores com versões para estudante, ou você está falando das otimizações de código gerado? Gostaria de saber sua opinião a respeito do MCC18. Com CC5X preciso usar o arquivo “.lkr” para lincar o meu projeto ao respectivo micro controlador? Caso você fosse usar um compilador para um projeto relativamente grande, qual desses compiladores usaria: CC5X, MCC18 ou o HI-TECH. São várias as indagações e se você puder enumerá-las ao responder ficaria muito agradecido.

kaka
Postador

Mensagens : 1
Pontos : 2663
Reputação : 0
Data de inscrição : 12/01/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  joseflor em Qui 14 Jan 2010 - 11:46

Boas,
Esse material não é meu, mas tenho autorização para o publicar.
O auto pelo conhecimento que tenho usa programas gratuitos no PC dele. Possivelmente é nesse sentido que ele se refere.


PS. Kaka, está activado no http://ozflor.com/electroforum/index.php

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  viniciusvmv@gmail.com em Qua 15 Set 2010 - 3:37

- 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.[/quote]

na onde eu abaixo, nao ahei

viniciusvmv@gmail.com
Postador

Mensagens : 1
Pontos : 2418
Reputação : 0
Data de inscrição : 15/09/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

RE:

Mensagem  joseflor em Qua 15 Set 2010 - 4:24

É tanta coisa que a gente não lembra mais.
Creio que esse código é o que está escrito ai mais em cima. Este é o link directo http://electronicapt.do-forum.com/cursos-e-tutoriais-de-electronica-f1/microchip-mplab-ide-pic16f84a-t119.htm#273

Procura por este mesmo assunto neste link que lá poderá estar mais organizado, não sei ao certo pois não lembro
www.ozflor.com/electroforum/

_________________
Happy soldering!
José Flor - OzFlor
Venda de componentes de electrónica
Loja EBR (Eletrônica BRasil)
Fórum oficial de electrónica de José Flor - OzFlor
avatar
joseflor
Nível 3
Nível 3

Mensagens : 273
Pontos : 3302
Reputação : 7
Data de inscrição : 08/11/2008
Idade : 53
Localização : Mangerton, NSW, Austrália

Ver perfil do usuário http://www.ozflor.com/eletrokit/

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  Electromonkeys em Sex 8 Ago 2014 - 19:29



A Electromonkeys é uma loja online de distribuição electrónica, da marca "Arduino".
Fazemos a distribuição da marca, assim como workshops para demonstração da marca.
Estamos disponíveis para receber vídeos tutoriais, para criação de kits.

Desafiamos-te a fazer este projeto louco.
Piano Arduino

Electromonkeys
Postador

Mensagens : 1
Pontos : 994
Reputação : 0
Data de inscrição : 08/08/2014

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Microchip MPLAB IDE - PIC16F84A

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum