Páginas: [1] 2 3 ... 6   Ir para o fundo
  Imprimir  
Autor Tópico: [PIC] Microchip, MPLAB e PIC's  (Lida 7403 vezes)
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« em: Junho 20, 2007, 21:54:01 »

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, que se encontra no link ai por baixo.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

Neste momento vai na versão "MPLAB IDE v7.61a Interim Release Zipped Installation".

O melhor PIC para o pessoal começar (para mim) é o 16F84A, Para isso é ir ver este link:

http://www.mikroe.com/pt/product/books/picbook/00.htm

Há um erro no desenho que tem a ver com os portos, mas o texto está correcto.

« Última modificação: Novembro 11, 2007, 01:47:44 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
bettencourt
Moderador Global
Chip
*****
Offline Offline

Mensagens: 583



« Responder #1 em: Junho 20, 2007, 22:26:19 »

boas esse ultimo link, é um livro sobre o pic eu sakei isso do emule se quizerem posso desponibilizar


ja instalei o MPLAB, agora o que faço estudo o livro, ou tas a pensar em dar tipo de uma aula ao ppl, para sabermos orientar


P.S- continua com o trabalho eu estou ctg Wink
Registado
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #2 em: Junho 20, 2007, 23:15:48 »

Pretendo tentar trabalhar com os dois.
1º falar sobre o PIC 16F84A, depois do pessoal entender o seu funcionamento, passar então para o MPLAB.
2º fazer um ou dois pequenos programas em assembler para o mesmo PIC, fazer a  simulação do programa e ver o que acontece.
3º descarregar outro programa que trabalha com o MPLAB só que em linguagem C, o que se traduz em programas mais pequenos, e de mais fácil compreender.
Isto é a minha ideia geral, e vou ver se consigo cumpri-la.
Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
bettencourt
Moderador Global
Chip
*****
Offline Offline

Mensagens: 583



« Responder #3 em: Junho 20, 2007, 23:27:49 »

olha visto que ja aprendi C n seri mais facil para mim utilizar esse programa que te referes no 3 ?
ou sera que devo aprender como descreveste?
obrigado pela desponibilizaçao
Registado
rualcosi
Transistor
**
Offline Offline

Mensagens: 40


« Responder #4 em: Junho 21, 2007, 09:03:47 »

Ora aqui está uma bela ideia....pelo menos parar o ppl como eu, que não pesca nada de programação, ehehehe.
Acho que me vou perder por aqui para aprender a programar em C.... nem se quer sei o que seja, mas deve ser porreiro.
Continua com o bom trabalho.
Registado

Electronica rules
Sorridente  Wink
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #5 em: Junho 21, 2007, 09:32:19 »

Convém sempre saber Assembler pois o "C" vai criar um ficheiro de formato Assembler.
O que em certos casos torna-se muito útil.
Nota: Continuo a dizer que eu não passo de curioso e autodidacta nesta matéria, tal como na linguagem "C", possivelmente quem perceber do assunto conseguirá fazer programas bem mais pequenos que eu.


« Última modificação: Junho 21, 2007, 09:35:28 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #6 em: Junho 21, 2007, 09:58:35 »

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. Esta informação encontra-se em:

http://www.mikroe.com/pt/product/books/picbook/capitulo1.htm

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

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #7 em: Junho 22, 2007, 12:21:55 »

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.

« Última modificação: Junho 23, 2007, 20:14:02 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #8 em: Junho 22, 2007, 17:38:36 »

CU CU, cá estou eu de novo...
Estive parado uns tempos ma hoje parece que estou bruto!!!

Bem, vou me deixar de brincadeiras e 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.

« Última modificação: Junho 22, 2007, 20:14:55 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #9 em: Junho 22, 2007, 20:45:35 »

Antes de continuar saquem o datasheet do 16F84A que se encontra em baixo.

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.






[attachment deleted by admin]
« Última modificação: Junho 23, 2007, 00:34:54 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #10 em: Junho 23, 2007, 19:33:06 »

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"
« Última modificação: Junho 23, 2007, 21:32:22 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #11 em: Junho 27, 2007, 15:21:05 »

Bem, para mais detalhes sobre a família PIC "PICmicro™ Mid-Range MCU Family Reference Manual", e sobre o seu set de instruções (neste caso muito mais detalhado e com exemplos), fica aqui por baixo um ficheiro em PDF para o pessoal interessado.
A próxima citação já irei entrar no mundo MPLAB.

[attachment deleted by admin]
Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
jonaspaulo
Socket
**
Offline Offline

Mensagens: 135



« Responder #12 em: Julho 02, 2007, 13:24:59 »

ta porreiro ja aprendi algumas coisas, bom trabalho
Registado

Teach to be teached
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #13 em: Julho 05, 2007, 18:31:42 »

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.

NOTA: em anexo encontra-se um pdf, que ensina a trabalhar mais ou menos com MPLAB.



[attachment deleted by admin]
« Última modificação: Julho 05, 2007, 19:42:47 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #14 em: Julho 05, 2007, 19:37:02 »

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.




[attachment deleted by admin]
Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
Páginas: [1] 2 3 ... 6   Ir para o topo
  Imprimir  
 
Ir para: