Você está na página 1de 6

PRATICA I - Acender e Piscar LEDs utilizando Assembly

Criando um novo projeto no MPLAB X:

- File -> New project


-Microchip Embedded -> Standalone Project ->Next
- Selecionar a família PIC24 e modelo PIC24EP512GU810 ->Next
- Marcar "Simulator" ->Next
- Selecionar XC16 -> Next
- nome do projeto: pratica1
- Finish

Inclusão dos arquivos que irão compor o projeto:

-Botão direito na pasta source file -> new -> assembly file

- Criar o arquivo p1.s

- Incluir o arquivo "p24EP512GU810.gld" na pasta "linker files". Este arquivo está em


C:\Program Files (x86)\Microchip\XC16\V1.26\SUPPORT\PIC24E\gld

 Para incluir: Botão direito na pasta linker file ->add existing item (procurar arquivo no
diretório acima)
 Se não incluir ele acusará a falta deste arquivo na hora de montar o código.

- Incluir as definições do PIC: Escrever dentro de p1.s os comandos abaixo.

#include "p24EP512GU810.inc"

(p24EP512GU810.inc inclui as definições deste modelo do PIC. Lá estão,principalmente,

as definições dos nomes dos SFRs).

.global __reset ; Diretiva indicando que o vetor de reset será global.

__reset: Vetor de Reset (Pág 181 manual do assembler XC16)

- A partir daí será inserido o código em assembly.

- Para saber quais instruções você poderá utilizar e suas respectivas sintaxes, é muito importante
consultar o arquivo: 16-bit MCU and DSC Programmer’s Reference Manual.pdf. Este
arquivo foi renomeado para "Detalhes Instruções PIC24.pdf". A sessão 5 é a de principal
interesse.

Parte 1: Acender LEDs


- Na primeira parte da prática iremos fazer os LEDs da porta B acender. Abaixo é dado o passo
a passo de uma das formas como podemos fazer isso. Para cada linha descrita abaixo, haverá
uma instrução correspondente. Pesquise em "Detalhes Instruções PIC24.pdf" para identificar
quais serão estas instruções.

- Assim como no SAP e no 8085, faremos a manipulação de dados por meio de registradores.
Em algumas instruções você verá que será necessário informar o nome do registrador que
receberá tais dados. Nas definições do PIC, os registradores recebem os nomes W0,W1,...,W15.
Dica: É possível escrever todo o código utilizando dois registradores. Para padronizarmos os
códigos da turma, vamos utilizar o W1 e W2.

- Neste programa basicamente precisamos configurar alguns registradores de função especial


(SFR).

- Primeiro devemos forçar que os pinos da porta B sejam digitais. Qual SFR é responsável por
isso? Consulte o datasheet do PIC24EP512GU810 no cap11 (págs 207 e 209).

- Depois devemos configurar os pinos da porta B como saídas digitais. Qual SFR é responsável
por isso? Consulte o datasheet do PIC24EP512GU810 no cap11(págs 207 e 209).

*Os bits que serão definidos como saída dependerão de quais LEDs da porta B você deseja
ligar. Vamos manipular todos os LEDs. Assim vamos manipular 16 bits de uma só vez.

- Por fim, vamos acender (ou manter apagados) os LEDs da porta B. O estado aceso (ou
apagado) é controlado também em um SFR. Que SFR é esse? Consulte o datasheet do
PIC24EP512GU810 no cap11(págs 207 e 209).

- Após consultar o datasheet no cap11 você constatará a necessidade de atribuir 0's e 1's aos
SFR's consultados anteriormente. Contudo o comando TRISB=0, por exemplo, não será aceito
pois o operador de atribuição "=" não é reconhecido pelo assembler. Para carregarmos o SFR
TRISB com 0's, precisaremos recorrer às instruções reconhecidas pela CPU do PIC que de
alguma forma irão carregar os 16bits de TRISB com 0's.

- Procure no arquivo "Detalhes Instruções PIC24.pdf" as instruções que irão viabilizar essas
manipulações nos SFRs. Consulte a tabela 3.1 (Pág 38) para ter acesso às tabelas 3-2 a 3-11,
que contêm uma breve descrição de todas as instruções reconhecidas pela CPU do PIC. Para
maiores detalhes de uma determinada instrução, acesse a página indicada na última coluna da
tabela onde ela está descrita. Veja o exemplo abaixo para a instrução ADD:
- Veja que no exemplo da instrução ADD, a sintaxe é apresentada da seguinte forma:

Ou seja, para realizar esta instrução você deverá passar as informações apresentadas acima.
Aquelas que estão entre "{}" são opcionais e, nesta aula, não iremos utilizá-las. Na descrição
detalhada de cada instrução é informado o que cada campo opcional (e obrigatório)
representam. Assim, neste exemplo esta instrução de soma ficaria: ADD f
É importante você observar que f representa um endereço da memória de dados e que nesta
memória há espaços para armazenamento de dados de modo geral e espaços dedicados para os
SFRs. Veja a figura 4-6 (pág 53) do datasheet do PIC24EP512GU810 para identificar esta
divisão da memória. Desta forma, se você quiser realizar a soma entre WREG (um dos
operandos fixos relacionados a instrução ADD dada neste exemplo) e o conteúdo de um SFR,
você deveria passar o endereço deste registrador. Se, por exemplo este registrador fosse o
TRISB, então a instrução ficaria "ADD 0x0E10" pois o endereço (f) do registrador TRISB é
0xE10 (veja a figura abaixo)

Contudo, para facilitar nosso trabalho, o arquivo p24EP512GU810.inc, que incluímos no início
deste projeto, possui uma série de definições que associam o nome dos SFRs aos endereços que
eles ocupam na memória de dados. Isso permite então que, ao invés de termos que informar o
endereço do SRF ao passar o operando f, podemos passar o nome do registrador. Desta forma,
para o exemplo dado, a instrução que antes deveria ser passada como "ADD 0x0E10" poderá ser
passada como ADD TRISB. Dica: Utilize sempre letras maiúsculas para informar o nome do
SFR, ou seja, "TRISB" ao invés de "trisb".

- Para esta primeira parte da prática, podemos utilizar apenas a instrução "MOV" para carregar
0's e 1's nos devidos SFRs e com isso, atingirmos o objetivo de acender os LEDs da porta B.

- Consultando as tabelas mencionadas anteriormente, você constatará que existem diversas


variações da instrução MOV. Consulte os detalhes de cada uma para descobrir quais
viabilizarão a realização desta primeira parte da prática.

- Para auxiliá-lo na escolha das instruções, segue abaixo os passos que devem ser executados
para acender os LEDs da porta B:

 Carregar o registrador W1 com 0's, ou seja, mover 0's para W1.


 Carregar (ou mover) o valor de W1 no SFR responsável por configurar a porta
B como digital.
 Carregar o valor de W1 no SFR responsável por configurar os pinos da porta B
como saída digital.
 Vamos definir quais LEDs ficarão acesos ou apagados. Essa informação deverá
ser carregada no registrador W2. Poderíamos fazer isso utilizando somente W1,
porém vamos utilizar outro registrador para praticar. Uma sugestão seria
acender um LED e apagar o seguinte, de forma alternada, ou seja
1010101010101010.
 Vamos carregar esse padrão de acendimento no SFR responsável por enviar os
níveis lógicos "0" ou "1" para os LEDs.
- Após a inserção das instruções, seguiremos para a etapa de "montagem" do projeto. Para isso,
pressione o ícone conforme apresentado abaixo:

- Caso não haja erros no seu projeto, o MPLAB apresentará a seguinte mensagem:

- O próximo passo consiste em gravar o projeto no PIC. Para isso, abra o MikroProg, selecione
a família PIC24E/dsPIC33E e selecione o modelo do PIC (ver chip na placa). Em seguida,
pressione o botão "LOAD". Neste instante, abrirá uma janela para que você localize o arquivo
".HEX" (arquivo gerado a partir do seu código e que será carregado dentro do PIC). O caminho
para localizar este arquivo é C:\Users\nome_do
_usuário\MPLABXProjects\pratica1.X\dist\default\production.

Em seguida, você deve mandar o MikroProg carregar o arquivo .HEX no PIC. Para isso
pressione o botão "WRITE".

- Verifique na placa se as chaves (SW15) que ligam/desligam os LEDs estão na posição ON.

- Veja se os LEDs da porta B acenderam.

Parte 2: Piscar LEDs

 Esta segunda parte da prática tem o objetivo de fazer os LEDs da porta B piscarem.
Contudo, o código escrito na primeira parte deverá ser mantido pois ele é necessário
para viabilizar este segundo objetivo.
 A lógica é a seguinte:
o Vamos carregar um registrador com 1s. Em seguida utilizaremos uma instrução
para decrementar este registrador e outra para verificar se o valor deste
registrador é zero. Se o valor após o decréscimo não for zero, ele vai voltar para
a instrução anterior e fará isso até que o registrador fique zero. Isso servirá para
dar um delay antes de mudar o estado do led. Caso contrário, não seremos
capazes de perceber os LEDs piscando.
o Para verificar se é o registrador é zero ou não, utilizaremos a instrução BRA NZ
(Branch if not zero). Consulte os detalhes desta instrução na página 145 de
"Detalhes Instruções PIC24.pdf".
o Depois que der o delay, vamos inverter o status do LED. Isso é feito usando a
instrução de complemento. Procure por essa instrução no datasheet de
instruções.
o Depois vamos mover este novo valor para o SFR de saída ligados aos leds
(LATB).
o Depois que inverter, vamos começar tudo novamente.
 Abaixo, segue a estrutura do código que poderá ser utilizada para atingir este objetivo:

L1: MOV ?a , ?b
L2: DEC ?x , ?x
BRA NZ, ?c;
COM ?y , ?y
MOV W2, LATB
GOTO ?d

 Consulte o arquivo "Detalhes Instruções PIC24.pdf" para compreender o que cada


instrução é responsável por fazer e quais operandos você deverá inserir onde há ?a; ?b;
?c; ?d; ?x ?y.
 Grave o projeto no PIC e verifique o funcionamento.

Você também pode gostar