Você está na página 1de 151

Lies

Glossario
Diretivas
Instrues
Register

Indice das lies


1
Introduo ao PIC
O que o PIC ? 1.
Realizando um simples lampejador com led 2.
Escrita e compilao de um programa em assembler 3.
Analisando um codigo assembler 4.
Compilando um codigo assembler 5.
Programando o PIC 6.
2
Arquitetura interna do PIC
A rea de programa e o registrador de arquivo 1.
A ALU e o registro W 2.
O Programa Counter e o Stack 3.
Realisando o "Luzes em sequncia" 4.
3
Introduo aos perifricos
A porta A e B 1.
Estado de saida da linha de I/O 2.
Entrada de teclado 3.
4
Ocontador TMR0 e o PRESCALER
O registro contador TMR0 1.
O Prescaler 2.
5
As interrupes
Interrupes 1.
Exemplo prtico de controle de uma interrupo 2.
Exemplo prtico de controle de mais de uma interrupo 3.
6
O Power Down Mode (Sleep)
Funcionamnto do Power Down Mode 1.
Primeiro exemplo sobre o Power Down Mode 2.
7
Interfaceamento com o mundo externo
Manuseio de um display LCD 1.
A interface RS232 2.
Um outro exemplo com interface RS232 3.
Pic by example (Portugus)
http://www.tanzilli.com/pbe/brasiliano/ [27/5/2003 12:57:15]
Indice das lies
1
Introduo ao PIC
O que o PIC ? 1.
Realizando um simples lampejador com led 2.
Escrita e compilao de um programa em assembler 3.
Analisando um codigo assembler 4.
Compilando um codigo assembler 5.
Programando o PIC 6.
2
Arquitetura interna do PIC
A rea de programa e o registrador de arquivo 1.
A ALU e o registro W 2.
O Programa Counter e o Stack 3.
Realisando o "Luzes em sequncia" 4.
3
Introduo aos perifricos
A porta A e B 1.
Estado de saida da linha de I/O 2.
Entrada de teclado 3.
4
Ocontador TMR0 e o PRESCALER
O registro contador TMR0 1.
O Prescaler 2.
5
As interrupes
Interrupes 1.
Exemplo prtico de controle de uma interrupo 2.
Exemplo prtico de controle de mais de uma interrupo 3.
6
O Power Down Mode (Sleep)
Funcionamnto do Power Down Mode 1.
Primeiro exemplo sobre o Power Down Mode 2.
7
Interfaceamento com o mundo externo
Manuseio de um display LCD 1.
A interface RS232 2.
Um outro exemplo com interface RS232 3.
Indice das lies
http://www.tanzilli.com/pbe/brasiliano/lezioni.htm (1 of 2) [27/5/2003 12:57:18]
Indice das lies
http://www.tanzilli.com/pbe/brasiliano/lezioni.htm (2 of 2) [27/5/2003 12:57:18]
Lio 1 Introduo
Introduo ao PIC
Al termino desta lio saiba:
O que um PIC. G
Como realizar um simples circuito de prova. G
Como escrever e compilar um programa em assembler. G
Como programar um PIC. G
Conteudo da lio 1
O Que um PIC 1.
Realisando um simples lampejador com led 2.
Escrita e compilao de um programa em assembler 3.
Analisando um codigo em assembler 4.
Compilando um codigo em assembler 5.
Programando o PIC 6.

Lio 1
http://www.tanzilli.com/pbe/brasiliano/less1/intro.htm [27/5/2003 12:57:20]
Lio 1 Passo 1/6
O que o PIC?
O PIC um circuito integrado produzido pela Microchip Technology Inc., que pertence da categoria dos
microcontroladores, ou seja um componente integrado que em um unico dispositivo contem todos os circuitos
necessarios para realizar um completo sistema digital programavel.
Como se pode ver na figura,
o PIC (neste caso um PIC16C84) pode ser visto externamente como um circuito integrado TTL ou CMOS normal, mas
internamente dispe de todos os dispositivos tipicos de um sistema microprocessado, ou seja:
Uma CPU (Central Processor Unit ou seja Unidade de Processamento Central) e sua finalidade interpretar as
instrues de programa.
G
Uma memoria PROM (Programmable Read Only Memory ou Memria Programavel Somente para Leitura) na
qual ira memorizar de maneira permanente as instrues do programa.
G
Uma memoria RAM (Random Access Memory ou Memoria de Accesso Aleatrio) utilizada para memorizar as
variaveis utilizadas pelo programa.
G
Uma serie de LINHAS de I/O para controlar dispositivos externos ou receber pulsos de sensores, chaves, etc. G
Uma serie de dispositivos auxiliares ao funcionamento, ou seja gerador de clock, bus, contador, etc. G
A presena de todos estes dispositivos em um espao extremamente pequeno, da ao projetista ampla gama de trabalho e
enorme vantagem em usar um sistema microprocessado, onde em pouco tempo e com poucos componentes externos
podemos fazer o que seria oneroso fazer com circuitos tradicionais.
O PICesta disponivel em uma ampla gama de modelos para melhor adaptar-se as exigencias de projetos especificos,
diferenciando-se pelo numero de linha de I/O e pelo conteudo do dispositivo. Inicia-se com modelo pequeno
identificado pela sigla PIC12Cxx dotado de 8 pinos, at chegar a modelos maiores com sigla PIC17Cxx dotados de 40
pinos.
Uma descrio detalhada da tipologia do PIC disponivel no site da Microchip acessavel via , onde conseguimos
encontrar grandes e variadas quantidades de informaes tecnicas, software de apoio, exemplos de aplicaes e
atualizaes disponiveis.
Para o nosso curso usaremos um modelo intermediario de PIC o PIC16C84. Este dotado de 18 pinos sendo 13
disponiveis para o 'I/O ou seja para serem ligados ao nosso circuito e de algumas caracteristicas que o tornam um
circuito que melhor atendera as exigncias do nosso curso.
Em particular o PIC16C84 dispe de uma memoria para armazenar o programa, do tipo EEPROM ou seja Electrical
Erasable Programmable Read Only Memory, que pode ser rescrita quantas vezes quisermos e que ideal para o nosso
experimento tornando a coneco para a programao on-board, ou seja podemos colocar o programa dentro do chip
sem ter que remove-lo do circuito de prova.
Lio 1 passo 1
http://www.tanzilli.com/pbe/brasiliano/less1/passo1.htm (1 of 2) [27/5/2003 12:57:22]
Tal caracteristica plenamente aproveitada em nosso programador YAPP! descrito neste curso e fornecido a qualquer
um que queira adiquirir o nosso kit completo PicTech. Em alternativa possivel utilizar um programador produzido
pela Microchip ou outro programador produzido por terceiros.
Se no tiver adiquirido o nosso kit mas tem conhecimento para construir o programador YAPP! poder encontrar neste
curso toda a documentao necessaria para realiza-lo sozinho
E agora chegou o momento de dar uma olhada no PIC16C84. Vejamos na figura a reproduo da pinagem e
nomenclatura de seus respsctivos pinos:.
Como possivel ver, o PIC16C84 dotado de um total de 18 pinos dispstos em duas fileiras paralela de 9 pinos cada
uma(dual in line). Os pinos contrastados em AZUL representam as linhas de I/O disponiveis para a nossa aplicao, o
pino em VERMELHO e o PRETO so os pinos de alimentao, e os em VERDE so reservados ao funcionamento do
PIC (MCLR para o reset e OSC1-2 para o clock).
Clicando sobre a inicial de cada pino possivel visualizar uma breve descrio de seu respectivo funcionamento.
No proximo passo veremos como fazer a ligao desses pinos ao nosso primeiro circuito experimental para verificar
imediatamente o seu funcionamento.
Lio 1 passo 1
http://www.tanzilli.com/pbe/brasiliano/less1/passo1.htm (2 of 2) [27/5/2003 12:57:22]
Lio 1 Passo 2/6
Realizando um simples lampejador com LED
Apos termos visto brevemente o que e como feito um PIC, faremos agora uma simples aplicao pratica.
Iremos fazer um circuito muito simples e seu propsito fazer lampejar um diodo led. Vejamos como se escreve um
programa em assembler, como se compila e como se transfere para o interior da EEPROM do PIC o programa e assim
faze-lo funcionar.
O circuito a ser realizado esta representado no seguinte arquivo no formato Acrobat Reader (9Kb): example1.pdf.
Como descrito anteriormente o pino Vdd (pino 14) e Vss (pino 5) servem para fornecer alimentao para o chip e so
ligados respectivamente ao positivo e a massa.
O pino MCLR (pino 4) serve para resetar o chip quando este estiver na condio logica zero. No nosso circuito
conectado diretamente ao positivo do programador YAPP!.
O pino OSC1/CLKIN (pino 16) e OSC2/CLKOUT (pino 15) so conectados internamente ao circuito para gerar a
frequencia de clock utilizada para temporizar todo o ciclo de funcionamento interno do chip. Desta frequencia depende a
maior parte das operaes interna e em particular a velocidade com que o PIC processa as instrues do programa. No
caso do PIC16C84-04/P tal frequencia pode chegar a um maximo de 4Mhz da qual se obtem uma velocidade de
execuo das instrues par de 1 milho de instrues por segundo. No nosso caso para o oscilador de clok usaremos
um cristal de quartzo de 4 MHz e dois capacitores de 22pF.
O pino RB0 (pino 6) uma das linhas de I/O disponivel no PIC. Neste caso esta linha esta conectada a um led por
intermdio de uma resitor de limitao de corrente.
Uma vez terminada a apresentao do circuito passemos ao proximo passo para aprender como escrever o programa que
o PIC devera executar.
Lio 1 passo 2
http://www.tanzilli.com/pbe/brasiliano/less1/passo2.htm [27/5/2003 12:57:22]
Lio 1 Passo 3/6
Escrita e compilao de um programa em assembler
Como em qualquer sistema microprocessado, no PIC tambem necessrio preparar um programa que o faa
desenvolver seu trabalho.
Um programa constituido por um conjunto de instrues em sequncia, onde cada uma identificara precisamente a
funo bsica que o PIC ira executar. Onde a instruo representada por um cdigo operativo (do ingles operation
code ou abreviadamente opcode) podemos memorizar 14 bits em cada locao da memria EEPROM. Esta memria no
PIC16C84 dispes de 1024 locaes e cada uma devera conter uma s instruo. Um exemplo de opcode em notao
binaria esta escrito a seguir :
00 0001 0000 0000B
mais provavel que um opcode venha representado na notao exadecimal ou seja:
0100H
que representa exatamente o mesmo valor mas numa forma reduzida. La letra H, escrita no final do valor 0100, indica o
tipo de notao (Hexadecimal). O mesmo valor pode ser representado em assembler com a notao 0x100 que
derivado da linguagem C ou H'0100'.
Este codigo, completamente sem sentido para ns humanos, o que o PIC esta preparado para entender. Para facilitar a
compreeno ao programador, se recorre a um instrumento e conveno para tornar a instruo mais compreensivel.
A primeira coveno a que associa o opcode (um total de 35 para o PIC16C84) a uma sigla mnemonica, ou seja uma
inicial que seja facil de recordar o significado da instruo
Voltando ao nosso exemplo o opcode 0100H corresponde a instruo mnemonica CLRW que a forma abreviada da
instruo CLEAR W REGISTER, ou seja zere o registro W (veremos posteriormente o que significa).
Outra conveno consiste na definio, da variavel, da costanti, do label(rtulo) de referencia ao endereo de memoria,
etc. O propsito desta conveno de facilitar a escrita de um programa para o PIC e chamada linguagem assembler.
Um programa escrito em linguagem assembler pode ser escrito em qualquer PC utilizando-se qualquer processador de
texto que possa gerar arquivos ASCII(Word,Notpad etc).Um arquivo de texto que contenha um programa em assembler
denominado de source ou codigo assembler.
Uma vez preparado o nosso codigo assembler (veremos mais adiante), iremos precisar de um programa para traduzir as
instrues mnemonicas e todas as outras formas convencionais com que escrevemos o nosso codigo em uma serie de
numeros (o opcode) reconhecivel diretamente pelo PIC. Este programa se chama compilador assembler ou
assemblador.
Na figura seguinte esta esquematizado o fluxograma de operaes e arquivos que devera ser realizado para passar um
um codigo assembler a um PIC a ser programado.
Lio 1 passo 3
http://www.tanzilli.com/pbe/brasiliano/less1/passo3.htm (1 of 3) [27/5/2003 12:57:24]
Como j foi dito a primeira operao a ser efetuada a escrita do codigo assembler e a sua gravao em um arquivo de
texto com a exteno .ASM. Para fazer isto aviamos dito para recorrer a um editor ASCII, ou seja um programa de
escrita por exemplo o NOTEPAD.EXE do Windows 3.1 ou Windows 95 ou o EDIT.EXE do MS/DOS.
possivel gerar este arquivo com programas mais sofisticados como o Word ou Wordperfect tendo somente que
tomar o cuidado de muda-los para o formato texto e no em seu formato nativo. Isto para evitar que venhamos
memorizar antes o caractere de controle de formatao de testo que o compilador assembler no esta preparado para
reconhecer.
Na nossa primeira experincia pratica utilizaremos o arquivo de nome LED.ASM.
O proximo passo a compilao do codigo, ou seja a transformao em opcode do codigo mnemonico ou instrues
assembler deste conteudo.
Lio 1 passo 3
http://www.tanzilli.com/pbe/brasiliano/less1/passo3.htm (2 of 3) [27/5/2003 12:57:24]
O compilador assembler que utilizaremos o MPASMWIN.EXE produto da Microchip e disponivel no site internet;
possivel tambm conseguir uma cpia nas paginas de downloads.
Como possivel ver adiante, alem do nosso codigo com exteno .ASM necessario fornecer ao compilador um
segundo arquivo produto da Microchip com extenso .INC diferente do tipo que estamos utilizando. No nosso caso o
arquivo o P16F84.INC. Este codigo contem algumas definies da qual dependi o tipo de chip utilizado e que veremos
mais adiante.
Durante a compilao do codigo, o compilador assembler gera uma serie de arquivos com nome identico ao codigo mas
com extenses diferentes:
.HEX o arquivo que contem o codigo de operao o qual sera enviado ao PIC via programador. G
.LST um arquivo de texto na qual vem reportado por inteiro o codigo assembler e a correspondente traduo
em opcode. No utilizavel pela programao do PIC mas extremamente util para verificar o processo de
compilao que o compilador fez.
G
.ERR contem uma lista de erro de compilao que mostra o numero da linha do codigo na qual esta com erro no
codigo assembler.
G
O arquivo .LST, .ERR utilizado somente para controle da compilao. Somente o arquivo .HEX sera utilizado
realmente para programar o PIC. Vejamos como.
O arquivo.HEX no um arquivo no formato binario e no reflete diretamante o conteudo que devera ter a EEPROM
do PIC. Mas os formatos refletiro diretamente quando forem transferidos ao PIC em uma forma legivel e com algumas
instrues a mais.
Sem entrar em detalhes util saber que tal formato diretamente riconhecido pelo programador do PIC que promovera
durante a programao a convero em binario e contem, outro opcode outras informaes que sero adcionadas aos
endereos na qual vamos transferir o opcode.
No proximo passo analisaremos o nosso primeiro codigo assembler e veremos um boa parte da conveno utilizada na
linguagem assembler.

Lio 1 passo 3
http://www.tanzilli.com/pbe/brasiliano/less1/passo3.htm (3 of 3) [27/5/2003 12:57:24]
Lio 1 Passo 4/6
Analisando um codigo assembler
Analisaremos agora linha por linha o conteudo do nosso codigo LED.ASM. Se voce dispe de uma impressora util
efetuar uma copia do codigo para poder seguir melhor a nossa explicao. Em alternativa preferivel que voce visualize
o codigo em uma janla separada de maneira a poder seguir simultaneamente o codigo e a relativa explicao.
Partiremos da primeira linha de codigo:
PROCESSOR 16F84
PROCESSOR uma diretiva do compilador assembler que indica a definio de qual microprocessador esta escrito o
nosso codigo. A diretiva no uma instruo mnemonica que o compilador traduz no respectivo opcode, mas sim uma
simples indicao enviada ao compilador para determinar o funcionamento durante a compilao. E neste caso
informamos ao compilador que a instruo que acabamos de colocar no nosso codigo relativa a de um PIC16C84.
RADIX DEC
A diretiva RADIX serve para informar o compilador que o numero sem a notao, sera entendido como numero
decimal. Ou seja se quisermos especificar, por exemplo o numero hexadecimal 10 (16 decimal) no podemos escrever
somente 10 porque ele sera interpretado como 10 decimal, neste caso ecrevemos10h ou 0x10 ou H'10'.
INCLUDE "P16F84.INC"
Veja uma outra diretiva. Desta vez indicamos ao compilador a nossa inteno de incluir no codigo um segundo arquivo
denominado P16C84.INC. O compilador se limitar a substituir a linha contendo a diretiva INCLUDE com o conteudo
do arquivo indicado e vai efetuar a compilao como se fosse ante disso parte do nosso codigo.
LED EQU 0
Mais diretiva ! Mas quando veremos as instrues? Calma tenha um pouco de pacincia.
A diretiva EQU muito importante quando si trata de definir com ela uma costanti simbolica dentro do nosso codigo.
Em particular a palavra LED da qui em diante no codigo sera equivalente ao valor 0. O ponto principal da existncia da
diretiva EQU se no tornar o codigo mais legivel e podermos colocar um valor costanti em um unico ponto do codigo
importante notar que a palavra LED no identifica uma variavel mas semplesmente um nome simbolico valido
durante a compilao. No ser nunca possivel inserir instrues do tipo LED = 3 dentro do codigo quando a
determinao dinamica de um valor e de uma variavel uma operao que recebe a interveno da CPU do PIC e que
sempre deve ser expressa com instruo e no diretiva.
A diretiva faz sentido somente durante a compilao do codigo depois o PIC no podera mais seguir uma diretiva.
Vejamos agora a linha seguinte:
ORG 0CH
ORG tambem uma diretiva que permite definir-mos o endereo na qual queremos que o compilador inicie a alocar o
dado ou a instruo seguinte. E neste caso estamos definindo uma area de dados dentro do PIC ou seja uma area em que
memorizaremos variavel e contador durante a execuo do nosso programa. Esta area coincide exatamente com a area
de RAM do PIC definida pela Micrchip como FILE REGISTER.
O registrador de arquivo nada mais do que uma locao na RAM disponivel que comea a partir do endereo 0CH.
Este endero fixo e no pode ser modificado enquanto a locao anterior for usada para outro registro especial de uso
interno.
Count RES 2
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (1 of 6) [27/5/2003 12:57:25]
Nesta linha encontramos um label(rotulo): Count e uma diretiva: RES.
A diretiva RES indica ao compilador que queremos reservar um certo numero de bytes no meio do regsitrador de
arquivos(file register) dentro da area de dados; e neste caso 2 bytes. O label Count, onde Count um nome para ns,
um marcador que no resto do codigo assumir o valor do endereo em que esta colocado. Dado este que anteriormente
aviamos definido o endereo de partida em 0CH com a diretiva ORG, Count ir a 0CH. Se nesse exemplo inserir-mos
um label aps a linha sucessiva essa ir a 0CH + 2 (dois so os bytes que aviamos reservado) ou seja 0EH. O nome do
label pode ser qualquer nome com exeo da palavra reservada ao compilador as quais so as instrues mnemonicas e
diretivas)
Una label si distingue da una costante simbolica perch il suo valore viene calcolato in fase di compilazione e non
assegnato da noi staticamente.
ORG 00H
Esta segunda diretiva ORG faz referencia a um endereo na area da (EEPROM) antes da area de dados. Deste ponto em
diante colocaremos de fato a instruo mnemonica que o compilador devera converter no respectivo opcode do PIC.
O primeiro opcode visto pelo PIC aps o reset aquele memorizado na locao 0, e dai o valor 00H inserido na ORG.
bsf STATUS,RP0
E finalmente a primeira instruo mnemonica de parametro, completa. O PIC tem uma CPU interna do tipo RISC onde
a instruo ocupa una s locao de memoria, opcode e parametro incluso. E neste caso a instruo mnemonica bsf que
dizer BIT SET FILE REGISTER ou seja coloque em um (condio logica alta) um dos bit contido na locao de
memria ram especificada.
O parametro STATUS esta definido no arquivo P16F84.INC e o passa atravz de uma diretiva EQU. O valor colocado
neste arquivo 03H e corresponde a um registrador de arquivo (ou seja uma locao na ram na area de dados)
reservado.
O proximo parametro RP0 esta definido tambem no arquivo P16C84.INC com valor 05H e corresponde ao numero do
bit que se quer colocar em um. este registrador de arquivo tem 8 bits e coma pelo numero 0 (bit menos significativo) e
vai at o numero 7 (bit mais significativo)
Esta instruo na pratica coloca em 1 o quinto bit do registrador de arquivo STATUS. Esta operao necessaria, como
veremos na proxima lio, para acessar o registrador de arquivo TRISA e TRISB.
movlw 00011111B
Esta instruo significa: MOVE LITERAL TO W REGISTER (passar o literal para W) ou seja mover um valor
constante para o acumulador W. Como haveremos de ver mais adiante, o acumulador, um registro particular utilizado
pela CPU em todas as cituaes em virmos efetuar uma operao entre dois valores ou em operaes de deslocamento
entre locaes da memria. Na pratica um registro de apoio utilizado pela CPU para memorizar temporariamente um
byte toda vez que houvr necessidade.
O valor costante para memorizar no 'accumulador 00011111B ou seja um valor binario de 8 bits onde o bit mais da
direita representa o bit 0 ou o bit menos significativo.
Na proxima instruo temos:
movwf TRISA
o valor 00011111 esta memorizado no registro TRISA (como para o registro STATUS o TRISA tambem definido
atravz de uma diretiva EQU) a sua funo seno a de definir o funcionamento da linha de I/O do PORTA. Este bit
em particular um bit do registro TRISA e determina em leitura(entrada) sua rispectiva linha do portA , se estivesse em 0
determinaria em escrita(saida).
Na tabela seguente esta descrito configurao que assumiro os pinios do PIC quando executar esta instruo:
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (2 of 6) [27/5/2003 12:57:25]
N.bit registro TRISB Linha porta A N.Pino Valor Estado
0 RA0 17 1 Entrada
1 RA1 18 1 Entrada
2 RA2 1 1 Entrada
3 RA3 2 1 Entrada
4 RA4 3 1 Entrada
5 - - 0 -
6 - - 0 -
7 - - 0 -
Como possivel se ver o bit 5, 6 e 7 no correspondem a nenhuma linha de I/O e seus valores nada influenciam.
As duas proximas instrues indicam o funcionamento do portB do PIC:
movlw B'11111110'
movwf TRISB
e neste caso a definio da linha sera a seguinte:
N.bit registro TRISB Linha porta B N.Pino Valor Estado
0 RB0 6 0 Saida
1 RB1 7 1 Entrada
2 RB2 8 1 Entrada
3 RB3 9 1 Entrada
4 RB4 10 1 Entrada
5 RB5 11 1 Entrada
6 RB6 12 1 Entrada
7 RB7 13 1 Entrada
Notou como o valor 0 no bit 0 do registro TRISB determina a configurao em escrita(saida) da respetiva linha do PIC.
Na nossa aplicao esta enfatisado que esta linha sera usada para controlar o LED e faze-lo lampejar.
Aviamos visto que a instruo movwf TRISB transferia o valor contido no acumulador(inicializado anteriormente com
a instruo movlw 11111110B) no registro TRISB. O significado de movwf MOVE W TO FILE REGISTER ( passe
o valor de W para o registrador de arquivo).
bcf STATUS,RP0
sta instruo similar a bsf vista anteriormente, com a diferena de coloca-lo em zero. E(bcf) significa neste caso BIT
CLEAR FILE REGISTER.
Do ponto de vista funcional esta instruo permite o acesso ao registro interno do banco 0 ou seja da qual faz parte o
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (3 of 6) [27/5/2003 12:57:25]
portA e portB, e banco 1 da qual faz parte TRISA e TRISB. Uma descrio mais detalhada veremos mais a frente neste
curso.
bsf PORTB,LED
Com esta instruo sera efetuada a primeira operao na qual veremos o resultado do lado de fora do PIC.
Particularmente ira acender o led conectado a linha RB0. PORTB uma constante definida no P16C84.INC e faz
referencia ao registrador de arquivo correspondente a linha de I/O do portB onde LED o numero da linha que ira a 1.
Se bem recordas, no inicio do codigo a constante LED esta definida em 0, quando a linha que interessa sera RB0.
MainLoop
Esta linha contem um label ou seja uma referencia simbolica a um endereo de memria. O valor do label, como dito
anteriormente, vem calculado na fase de compilao com base no numero de instruo, a diretiva ORG e a outra
instruo alocam espao na memria do PIC. E neste caso, se tinhamos a instruo colocada a partir da ultima diretiva
ORG podemos colocar o valor que vira seguido a MainLoop ou seja 07H.
Na realidade o valor que assumi o label no tem muita importancia e o seu propsito justamente o de indicar a posio
presisa do opcode na memria do PIC , ou seja um modo de referenciar uma determinada locao de memria.
E neste caso o label MainLoop sera utulisado como ponto de entrada num ciclo (do ingles Loop) de ecender e apagar o
led, ou seja uma parte do codigo que colocara o mesmo num ciclo infinito. Encontraremos mais a frente uma referencia
a este label.
call Delay
Esta instruo determina uma chamada (do ingles call) a uma subrotina que inicia em correspondencia com o label
Delay.
A sub rotina parte especial de um programa que efetua uma funo especifica. onde a qualquer momento esta funo
pode ser chamada com uma s instruo,vejamos todas as instrues necessaarias para efetuala. Onde neste caso a
subrotina incere um retardo para o tempo de acender e apagar o led.
A instruo que compe a subrotina Delay foi inserida como se segue no codigo .
btfsc PORTB,LED
O significado desta instruo BIT TEST FLAG, SKIP IF CLEAR ou seja controla o stado de um bit dentro de um
registro e pula a proxima instruo se o valor de tal bit zero. O bit que sera controlado corresponde a linha de saida na
qual esta conectado o led, fazendo este teste podemos determinar se o led esta aceso ou apagado, e ento agir sobre ele,
ou seja se o led estiver aceso ns o apagaremos e se estiver apagado ns o ecenderemos.
goto SetToZero
Esta instruo determina um salto incondicionado (do ingles GO TO, va para) para o label SetToZero onde teremos a
instruo para apagar o led. Esta instruo sera pulada para instruo seguinte se o led esta apagado.
bsf PORTB,LED
goto MainLoop
Esta duas instrues simplesmente acendem o led e retornam o programa ao inicio do ciclo de lampejamento.
SetToZero
bcf PORTB,LED
goto MainLoop
Estas duas instrues simplesmente apagam o led e retornam o programa a inicio do ciclo de lampejamento.
A subrotina Delay
Como descrito anteriormente esta subrotina coloca um retardo de cerca de um segundo e pode ser chamada atravz do
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (4 of 6) [27/5/2003 12:57:25]
programa com instruo call Delay.
Vejamos como funciona:
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
retlw 0
END
Delay e DelayLoop so dois label. Delay identifica o indereo de inicio da subrotina e sera utilizado pela chamada
atraves do corpo do programa principal. DelayLoop sera chamado internamente pela subroutina e serve como ponto de
entrada para o cilclo(do ingles loop) de retardo.
Na pratica o retardo conseguido executando-se milhares de instrues que no fazem nada !
Este tipo de retardo se chama retardo software ou retardo de programa. o tipo de retardo mais simples de implementar
e pode ser utilizado quando no se deseja que o PIC faa-o.
clrf Count
clrf Count+1
CLEAR FILE REGISTER zeramento de duas locao da ram reservada anteriormente com a instruo:
Count RES 2
Esta duas locaes so adjacentes a partir do endereo referenciado pelo label Count.
decfsz Count,1
A instruo DECREMENT FILE REGISTER, SKIP IF ZERO ou seja decremente o conteudo do registro e pule a
proxima instruo se for zero(e neste caso Count pula a proxima instruo se o valor devolvido for zero). Se o valor
devolvido for diferente de zero executara a proxima instruo:
goto DelayLoop
Que manda a execuo ao cilclo de retardo. Uma vez zero o contador Count ira a proxima instruo:
decfsz Count+1,1
goto DelayLoop
Que decrementara o registro seguinte at que este chegue a zero. O registro Count+1 em particular sera decrementado
de um at 256 decrementos de Count.
Quando ento Count+1 chegar ao valor zero a instruo
return
que significa RETURN FROM SUBROUTINE determinara a saida da rotina de retardo e retornara a execuo da
instruo imediatamente aps call Delay.
E por fim a diretiva END que indica ao compilador o final do codigo assembler.
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (5 of 6) [27/5/2003 12:57:25]
No proximo passo compilaremos o codigo LED_1.ASM e programaremos o PIC com o codigo gerado pelo compilador
assembler.
Lio 1 passo 4
http://www.tanzilli.com/pbe/brasiliano/less1/passo4.htm (6 of 6) [27/5/2003 12:57:25]
Lio 1 Passo 5/6
Compilando um codigo assembler
Vejamos agora como possivel efetuar na pratica a compilao de um codigo assembler.
Primeiramente crie em seu disco rigido um diretrio de trabalho que de agora em diante ficara armazenado todos os
programas do curso. Escolhe-se um nome por exemplo:
C:\PICPRG
(Qualquer outro nome valido de diretrio ou drive, obviamente valido. Bastar substituir no resto do curso todo o
referimento a C:\PICPRG pelo nome do drive e diretrio escolhido).
Copiemos agra no nosso diretrio de trabalho C:\PICPRG ou aquele que voce escolheu o arquivo LED.ASM e
P16F84.INC. Para fazer isto basta clicar com o mouse sobre o nome do arquivo que se quer salvar em nosso diretrio
de trabalho,repetindo a operao para ambos os arquivos.
Instalemos agra o software necessario para compilar o nosso programa.
A Microchip coloca disponivel no site web o proprio assembler MPASM em dupla verso para sistemas operacionais
Microsoft Windows 3.1 / 95 e para ambiente MS/DOS. Em seguida faremos referncia a verso MS/DOS que
igualmente se pode trabalhar com o prompt MS/DOS do Microsoft Windows.
Seguiremos a instruo fornecida na pagina da Microchip MPASM.EXE que contem o seguinte para MS/DOS do
assembler. Copiemos ento este arquivo para o nosso diretrio de trabalho C:\PICPRG.
Ateno ! O MPASM um produto de propriedade da Microchip Technology inc., lembre-se ento de ler
atentamente as condies de uso indicadas durante a fase de instalao.
Compilaremos o nosso codigo LED.ASM colocando na frente do prompt do DOS a instruo:
MPASM LED.ASM
O resultado que deveremos obter no video o seguinte:
Pressionamos uma tecla como requisita o MPASM e vamos ver que arquivo nos foi gerado. Se tudo deu certo
Lio 1 passo 5
http://www.tanzilli.com/pbe/brasiliano/less1/passo5.htm (1 of 2) [27/5/2003 12:57:28]
deveremos ver os seguintes novos arquivos:
LED.HEX
LED.LST
LED.ERR
LED.COD
O conteudo dos arquivos j foi visto no passo 3 ento prosseguiremos com programao do PIC utilizando um s
arquivo o LED.HEX que contem o arquivo compilado no formato Intel Hex 8.

Lio 1 passo 5
http://www.tanzilli.com/pbe/brasiliano/less1/passo5.htm (2 of 2) [27/5/2003 12:57:28]
Lio 1 Passo 6/6
Programemos o PIC
Para programar o PIC nessa lio faremos referencia ao programador YAPP A documentao do software para
realizao do YAPP! esta descrita em nossa pagina hardware (Italian only) de suporte ao curso.
Para a programao do chip com outro tipo de programador deve-se ver a relativa documentao.
Copiamos no nosso diretrio de trabalho C:\PICPRG o arquivo YAPP.EXE, e comeamos a execuo do YAPP com o
seguinte comando no prompt do DOS:
YAPP LED.HEX /COM2 /XT
com qual enviamos ao YAPP (conectado, por exemplo, na porta serial COM2) o arquivoLED.HEX contendo nosso
programa compilado e programaremos o PIC para funcionar com um cristal de quartzo externo.
Para maior informao sobre a sintaxe do programa YAPP.EXE veja a ducumentao relativa.
Se a placa PicTech esta corretamente conectada deveremos ver aparecer o opcode hexadecimal das intrues sem
nenhum erro.
Terminada a programao deveremos ver o LED 1 lampejar na placa PicTech, como escrito no programa.

Lio 1 passo 6
http://www.tanzilli.com/pbe/brasiliano/less1/passo6.htm [27/5/2003 12:57:28]
Lio 2 Introduo
Arquitetura interna do PIC
Ao termino desta lio saiba:
Onde memorizado o programa G
Onde so memorizados os dados G
O que uma ALU, Um Acumulador, o Program Counter, o Stack e o Register File. G
Conteudo da lio 2
A area de programa e o registrador de arquivo 1.
A ALU e o registro W 2.
O Program Counter e o Stack 3.
Realizando "Luzes em sequencia" 4.
Lio 2
http://www.tanzilli.com/pbe/brasiliano/less2/intro.htm [27/5/2003 12:57:29]
Lio 2 Passso 1/4
A rea de programa e o Registrador de arquivo
Depois de ter visto um pouco de pratica, passemos agra a teoria. Iniciaremos agra vendo como feito um PIC, quais
dispositivos ele contem e como interagir entre eles.
Na figura seguinte esta ilustrado o esquema de blocos simplificado da arquitetura interna do PIC16F84 que nos ajudara
a entender o que sera explicado. As partes evidenciada em amarelo, a componente que iremos analisar.
Iniciemos com a memria EEPROM e o REGISTER FILE.
A EEPROM uma memria especial, cancelavel eltricamente, utilisada no PIC para memorizar o programa a ser
executado.
A sua capacidade de memorizao de 1024 locaes e que podero conter somente um opcode a 14 bit ou seja uma
instruo basica do PIC. Um programa mais complexo que podemos realisar no podera ter mais do que 1024
Lio 2 passo 1
http://www.tanzilli.com/pbe/brasiliano/less2/passo1.htm (1 of 4) [27/5/2003 12:57:32]
instrues.
Os endereos reservados para EEPROM comeam em 0000H at 03FFH. O PIC pode somente executar instrues
memorizadas nestas locaes. No se pode de maneira nenhuma ler,escrever ou cancelar dados nesses endereos.
Par escrever, ler e cancelar estas locaes necessario um dispositivo externo cahmado programador. Um exemplo de
programador o nosso YAPP! ou o PICSTART-16+ produto da Microchip ou pode ser outro qualquer disponivel no
comercio.
A primeira locao de memria, o endereo 0000H, deve conter a primeira instruo que o PIC devera executar aps o
reset e por isso denominada Reset Vector.
Como devemos lembrar, no codigo LED.ASM aprsentado na primeira lio onde esta inserida a primeira diretiva:
ORG 00H
para indicar o inicio do programa. Esta dirtiva idica de fato que a execuo do programa aps o reset deve iniciar no
endero 0000H da area de programa.
A instruo que vem logo aps a diretiva ORG 00H:
bsf STATUS,RP0
sera ento a primeira instruo a ser executada.
O REGISTER FILE uma parte da locao de memria RAM denominada REGISTRO. Diferente da memria
EEPROM destinada a conter o programa, a area de memria RAM diretamante visivel pelo resto do programa
igualmente.
Onde podemos escrever, ler, ou modificar tranquilamente qualquer endero do REGISTER FILE no nosso programa a
qualquer momento em que for necessario.
A unica limitao consiste de que alguns desses registros desenvolvem funes especiais pelo PIC e no podem ser
utilizados para outra coisa a no ser para aquilo a qual eles esto reservados. Estes registro encontram-se nas locaes
base da area de memria RAM segundo o que esta ilustrado em seguida.
A locaco de memria presente no
REGISTER FILE so inderessadas
diretamente em um espao de memria que
vai de 00H a 2FH um total de 48 bytes,
denominada pagina 0. um segundo espao de
endereamento deniminado pagina 1 vai de
80H a AFH. Para acessar esse segundo espa,o
necessario recorrer a dois bits auxiliares
RP0 e RP1 segundo a modalidade que iremos
explicar mais adiante.
As primeiras 12 locaes da pagina 0 (de 00H
a 0BH) e da pagina 1 (de 80H a 8BH) so
aquelas reservadas as funces especiais para o
funcionamento do PIC e, como j dito, no
podem ser utilizadas para outra coisa.
As 36 locaes na pagina 0 pode ser
inderessada de 0CH a 2FH podemos aqui
utilisar livremente pelo nosso programa para
memorisar variaveis,contadores, etc.
Lio 2 passo 1
http://www.tanzilli.com/pbe/brasiliano/less2/passo1.htm (2 of 4) [27/5/2003 12:57:32]
No nosso exemplo LED.ASMa diretiva:
ORG 0CH
indica o endereo de inicio da area de dados
utilizada pelo nosso programa.
A diretiva que segue:
Count RES 2
reserva um espao de duas locaes, que o
programa utulizar para momorizar o
contador de retardo da subrotina Delay.
Os registros especiais do PIC sero utilizados com muita frequencia nos programas.
Por exemplo, se fizermos a cpia dos registros especiais TRISA e TRISB, para definir qual linha de I/O sera entrada e
qual sera saida. O mesmo estado lgico da linha de I/O depende do valor de dois registros PORTA e PORTB.
Alguns registros reportaro o estado de funcionamento do dispositivo interno do PIC ou o resultado de operaes
Lio 2 passo 1
http://www.tanzilli.com/pbe/brasiliano/less2/passo1.htm (3 of 4) [27/5/2003 12:57:32]
aritimticas e logica.
necessario conhecer portanto exatamente qual funo desenvolve, cada um dos registros especiais e qual efeito se
obetem ao manipular seus conteudos.
Para facilitar as oprees de seus registros especiais, no arquivo P16F84.INC (que como recordamos estava incluido no
codigo LED.ASM com a diretiva INCLUDE) a Microchip inseriu uma lista de nomes que indentificam univocalmente
qualquer registro especial e a qual esta associado o endereo corespondente na area do REGISTER FILE.
Se, por exemplo, quiesermos definir toda a linha do PORTB do PIC em escrita agindo sobre o TRISB, podemos
escolher e referenciar diretamente o registro com o seu endereo:
movlw B'00000000'
movwf 06H
ou ento, refernciar o mesmo registro com o seu nome simblico:
movlw B'00000000'
movwf TRISB
tendo que ter a certeza de ter incerido a diretiva INCLUDE "P16C84.INC" no nosso codigo.
Na proxima lio veremos um outro componente interno do PIC denominado de ALU e o registro W conhecido
anteriormente com o nome de accumulador.

Lio 2 passo 1
http://www.tanzilli.com/pbe/brasiliano/less2/passo1.htm (4 of 4) [27/5/2003 12:57:32]
Lio 2 Passo 2/4
A ALU e o registro W
Iremos agora ilustrar outros dois componentes fundamentais na arquitetura do PIC, a ALU e o registro W ou
acumulador.
A ALU (siglas de Arithmetic and Logic Unit ou seja unidade aritimetica e lgica) a componente mais complexa do
PIC por conter todos os circuitos destinados a desenvolver as funes de calculo e manipulao de dados durante a
execuo de um programa.
A ALU uma componente presente em todos os microprocessadores e dessa depende diretamente a capacidade de
calculo do micro em si.
A ALU do PIC16F84 esta preparada para operar com 8 bits, ou seja valor numerico no maior do que 255. Existem
processadores com ALU de 16, 32, 64 bits e mais. A familia Intel 80386, 486 e Pentium por exemplo dispe de
uma ALU de 32 bits. A capacidade de calculo presente nesses micros so notavelmente superior em detrimento da
Lio 2 passo 2
http://www.tanzilli.com/pbe/brasiliano/less2/passo2.htm (1 of 2) [27/5/2003 12:57:33]
complexidade dos circuitos internos de acessoria e consequentemente do espao ocupado.
Diretamente conheo a ALU como registro W denominado antes de acumulador. Este registro consiste de uma
locao de memria destinada a conter um s valor de 8 bits.
A diferena entre o registro W e outras locaes de memria consiste no fato de que, por refernciar o registro W, a ALU
no pode fornecer nenhum endereo mas podemos acessa-los diretamente.
O registro W sera utilizado especificamente no programa pelo PIC.
Faamos um exemplo pratico. Suponhamos querer colocar na locao de memria 0CH do REGISTER FILE o valor
01H. Procurando entre as instrues do PIC veremos rapido que no existe uma unica instruo capaz de efetuar esta
operao mas deveremos necessariamente recorrer ao aculador e usar duas instrues em sequencia.
Vejamos porque:
Como dissemos anteriormente, o opcode de uma instruo no pode exeder aos 14 bits e assim teremos:
8 bits para especificar o valor que queremos colocar na locao de memria,
7 bits para especificar em qual locao de memria queremoss inserir o nosso valor,
6 bits para especificar qual instruo queremos usar.
teremos um total de 8 + 7 + 6 = 21 bits.
Devemos ento recorrer a duas instrues, ou seja:
movlw 01H
movwf 0CH
que a primeira colocar no registro W o valor 01H com a instruo MOVe Literal to W e depois "moveremos" para
locao 0CH com a instruo MOVe W para F.
No proximo passo encontraremos o Program Counter e o Stack que facilitara a entender como funciona a instruo de
salto do PIC.

Lio 2 passo 2
http://www.tanzilli.com/pbe/brasiliano/less2/passo2.htm (2 of 2) [27/5/2003 12:57:33]
Lio 2 Passo 3/4
O contador de programa e o Stack
Nesta lio analizaremos o funcionamento do Program Counter e do Stack dois componentes importantes para a
compreenso da instruo de salto e chamada a subrotina.
Como visto na lio anterior, o PIC16F84 inicia a execuo do programa a partir do Reset Vector ou seja da locao de
memria 0000H. Depois de ter executado esta instruo passa para a proxima instruo memorizada na locao 0001H
e assim por diante. Se no existisse instruo capaz de influenciar a execuo progressiva do programa, o PIC chegaria
at o final na ultima instruo memorizada na ultima locao e no saberia mais como continuar.
Sabemos obviamente que no bem assim e qualquer sistema a microprocessador ou linguagem de programao dispe
de instruo de desvio, ou seja instrues capaz de modificar o fluxo de execuo do programa.
Uma destas instrues o goto (do ingls go to, va para). Quando o PIC encontra um goto no segue mais a instruo
imediatamente aps, mas desvia-se diretamante para a locao de memria especicada na instruo.
Lio 2 passo 3
http://www.tanzilli.com/pbe/brasiliano/less2/passo3.htm (1 of 3) [27/5/2003 12:57:35]
Faamos um exemplo :
ORG 00H
Point1
movlw 10
goto Point1
No reset o PIC seguira a instruo movlw 10 memorizada na locao 0000H que colocara no acomulador o valor
decimal 10. Onde ento passara executar a proxima goto Point1. Esta instruo determinar um desvio
incondicionado para locao de memria especificada pelo label Point1 ou seja de novo para locao 0000H.
O programa no f'ar outra coisa se no a de executar um cilco infinito seguindo continuamente as instrues
especificadas.
Durante este ciclo, para determinar qual a proxima instruo a ser seguida, o PIC utiliza um registro especial
denominado Program Counter ou seja contador de programa. Este tera sempre o endero da proxima instruo a ser
executada. No reset este estar sempre zerado, determinando o inicio da execuo no endereo 0000H, e cada instruo
tera um incremento de um para poder passar para proxima instruo.
A instruo goto permite a colocao de um novo valor no Program Counter e consequentemente desvia-a a uma
locao qualquer da area de programa do PIC.
Uma outra instruo muito interessante o call ou seja a chamada a subrotina.
Esta instruo funciona de maneira muito similar ao goto com a unica diferena que, a primeira, desvia para uma
locao de memria especificada e continua a execuo do programa, enquanto o call desviara o programa para uma
subrotina especificada e executara a mesma, e retornara a execuo da instruo imediatamente aps a chamada call, o
valor imediatamente aps a chamada call sera armazenado em uma area particular da memria denominada Stack.
Vejamos melhor com um exemplo:
ORG 00H
Point1
movlw 10
call Point2
goto Point1
Point2
movlw 11
return
Neste caso o PIC, aps ter executado movlw 10 passa a executar o call Point2. Antes de desviar memoriza no Stack o
endereo 0002H, ou seja a proxima locao ao call. Passa ento a executar a instruo movlw 11, memorizada em
correspondencia ao label Point2. E neste ponto encontra uma nova instruo o return que, como podemos deduzir de
seu nome, permite o "RETORNO", ou seja retorne a execuo da instruo imediatamente aps o call.
Esta operao denominada de: "chamada a subrotina", ou seja uma interrupo momentanea do fluxo normal do
programa para "chamar" a execuo de uma serie de instrues, para depois retornar a execuo normal do programa.
Para poder retornar para onde havia interrompido, o PIC utiliza o ultimo valor armazenado no Stack e o coloca de novo
no Program Counter.
A palavra stack em ingls significa "catasta" e por esse fato possivel acascatar um endereo sobre o outro para ser
Lio 2 passo 3
http://www.tanzilli.com/pbe/brasiliano/less2/passo3.htm (2 of 3) [27/5/2003 12:57:35]
recuperado quando necessario. Este tipo de memorizao era antes denominado de LIFO do ingls Last In First Out,
em que o ultimo elemento armazenado(last in) deve necessariamente ser o primeniro a sair (last out).
Graas ao Stack possivel efetuar varios call, um dentro do outro e manter sempre o retorno ao fluxo do programa
quando se encontra uma instro return.
Vejamos um outro exemplo:
ORG 00H
Point1
movlw 10
call Point2
goto Point1
Point2
movlw 11
call Point3
return
Point3
movlw 12
return
No exemplo acima a rotina principal Point1 promove a chamada do primeiro call para subrotina Point2, a subrotina
Point2 chama outra subrotina no caso Point3, este ultimo por sua vez, encontra um returm e retorna para Point2 que
encontra o outro return e retorna para a execuo da rotina Point1 que no caso a principal.
Os endereos a serem memorizados no stack so dois e quando vir a encontrar um segundo call procurara pelo return
correspondente ao primeiro e assim por diante. Se diz ento que o call "nidificate" ou seja um dentro do outro.
O PIC16F84 dispe de um stack de 8 niveis, ou seja um Stack que consegue armazenar no maximo 8 chamadas
subrotina.
importante assegurar-se, durante a formulao de um programa que, se tenha sempre uma instruo returm em
correspondencia a um call para evitar o perigo de desalinhamento do stack que em execuo pode gerar erros que
dificilmente encontraremos.
Na proximo passo modificaremos o nosso codigo LED.ASM para entender melhor o que foi dito at aqui.
Lio 2 passo 3
http://www.tanzilli.com/pbe/brasiliano/less2/passo3.htm (3 of 3) [27/5/2003 12:57:35]
Lio 2 Passo 4/4
Realisando as "Luzes em sequncia"
Faremos agra uma reelaborao do codigo LED.ASM apresentado na primeira lio fazendo-o realizar um lampejador
de quatro led's. E o novo codigo modificado se chamar SEQ.ASM.
O circuito a ser realizado esta representado no seguinte arquivo no formato Acrobat Reader (10Kb): example2.pdf
substancialmente equivalente ao circuito apresentado na primeira lio, com a unica diferena que agra a quantidade de
led's conectados sero quatro antes ra um.
As linha de I/O utilizadas sero RB0 para o prmeiro led, RB1 para o segundo, RB2 para o terceiro RB3 para o quarto.
Vamos configurar todas em escrita no inicio do programa trocando as instrues:
movlw 11111110B
movwf TRISB
para
movlw 11110000B
movwf TRISB
em que os quatro bits menos significativos, corresponde a linha RB0,1,2,3 foram colocados a zero para definir esta linha
em escrita.
Na area de memria do REGISTER FILE (que no codigo inicia com a diretiva ORG 0CH) alem dos dois bytes
referenciados pelo label Count, reservaremos mais um byte com o label Shift que utilizaremos para determinar a
sequencia de funcionamento dos led's. A diretiva a ser inserida :
Shift RES 1
Antes de iniciar o ciclo principal(label MainLoop) vamos inicializar um novo registro Shift a 00000001B com a
seguinte instruo:
movlw 00000001B
movwf Shift
Neste ponto, no ciclo principal do nosso programa, vamos tratar de transferir o valor memorizado no registro Shift para
o PortB obtendo ento o inicio de funcionamento do primeiro led, a instruo sera a seguinte:
movf Shift,W
movwf PORTB
que ento efetuara o giro para esquerda do valor contido no Shift de um bit, com a seguinte instruo:
bcf STATUS,S
rlf Shift,F
A primeira instruo serve para zerar o bit CARRY do REGISTRO DE STATUS que vamos analisar na proxima lio.
RLF Rotate Left F through Carry (rotaciona para esquerda o bit do carry) desloca um bit para esquerda o valor
memorizado no registro Shift inserindo na posio ocupada pelo bit 0 o valor do bit do Carry(que como dissemos
veremos em seguida). Para fazer com que este bit seja sempre zero tera que ser executada antes da RLF a instruo
BCF STATUS,C para zerar este bit.
Neste ponto o registro Shift sera 00000010B, onde, no proximo ciclo, uma vez transaferido esse valor para o PortB se
obtera o apagamento do LED1 e o acendimento do LED2 e assim por diante nos ciclos sucessivos.
Lio 2 passo 4
http://www.tanzilli.com/pbe/brasiliano/less2/passo4.htm (1 of 2) [27/5/2003 12:57:35]
Quando o bit 4 do Shift for a 1, ento todos os quatro leds estiveram acesos pelo menos uma vez e tornara a iniciar do
led 1. Na instruo seguinte veremos este tipo de controle:
btfsc Shift,4
swapf Shift,F
A instruo btfsc Shift,4 controla exatamente at que o bit 4 do registro Shift vale 1. Depois executa a proxima
instruo swapf Shift,F, e continua.
A instruo swap (do ingles "troca") na pratica troca o quarto bit mais sigficativo contido no registro Shift, pelo quarto
bit menos significativo. Do valor inicial do registro Shift igual a 00010000 obtido atravs do ciclo de repetio
MainLoop se obtem o valor 0000001 que na pratica faz acender o primeiro led.

Lio 2 passo 4
http://www.tanzilli.com/pbe/brasiliano/less2/passo4.htm (2 of 2) [27/5/2003 12:57:35]
Lio 3 Introduo
Introduo aos perifricos
Ao termino desta lio saiba:
Como funciona e como se programa a linha de I/O G
Conteudo da Lio 3
A porta A e B 1.
Estado de saida da linha de I/O 2.
Entrada de teclas 3.

Lio 3
http://www.tanzilli.com/pbe/brasiliano/less3/intro.htm [27/5/2003 12:57:36]
Lio 3 Passo 1/3
A porta A e B
O PIC16C84 dispes de um total de 13 linhas de I/O organizadas em duas potas denominadas de PORTA A e PORTA
B. A PORTA A dispe de 5 linhas configuraveis tanto em entrada como em saida identificadas pelas siglas RA0, RA1,
RA2, RA3 e RA4. A PORTA B dispe de 8 linhas tambem configuraveis seja em entrada ou em saida identificadas
pelas siglas RB0, RB1, RB2, RB3, RB4, RB5, RB6 e RB7.
A subdiviso da linha em duas portas diferentes devido ao tipo de arquitetura interna do PIC16C84 que preve um
controle de dados de no maximo 8 bits.
Para o controle da linha de I/O do programa, o PIC dispe de dois registros internos que controlam as portas e so
chamados de TRISA e PORTA para a porta A e TRISB e PORTB para a porta B.
Os registros TRIS A e B , determinaro o funcionamento em entrada ou em saida da mesma linha, e o registro PORT A
Lio 3 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less3/passo1.htm (1 of 2) [27/5/2003 12:57:39]
e B determinaro o status da linha en saida ou reportaro o status da linha em entrada.
Todos os bits contidos nos registros mencionados correspondem univocalmente a uma linha de I/O.
Por exemplo o bit 0 do registro PORTA e do registo TRIS A corespondem a linha RA0 , o bit 1 a linha RA1 e assim
por diante.
Se o bit 0 do registro TRISA for colocado em zero, a linha RA0 estara configurada como linha de saida, por isso o
valor a que ira o bit 0 do registro PORTA detrminara o stado logico de tal linha (0 = 0volts, 1 = 5 volts).
Sel il bit 0 de registro TRISA viene messo a uno, la linea RA0 verr configurata come linea in ingresso, quindi lo stato
logico in cui verr posta dalla circuiteria esterna la linea RA0 si rifletter sullo stato del bit 0 del registro PORTA.
Fassamos um exemplo pratico, imaginemos querer conectar um led sobre a linha RB0 e uma chave sobre a linha RB4, o
codigo a se escrever ser o seguinte:
movlw 00010000B
tris B
onde aqui ser colocado a 0 o bit 0(linha RB0 em escrita(saida), e a 1 o bit 4 (linha RB4) em entrada. recorde-se de tal
propsito que na notao binaria do assembler o bit mais a direita corresponde com o bit menos significativo por isso o
bit 0.
Para acender o led devemos escrever o seguinte codigo:
bsf PORTB,0
Para apaga-lo:
bcf PORTB,0
Para ler-mos o estado da chave conectada a linha RB4, o codigo ser:
btfss PORTB,4
goto SwitchAMassa
goto SwitchAlPositivo
No proximo passo analizaremos o estado que controlara a linha de I/O.
Lio 3 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less3/passo1.htm (2 of 2) [27/5/2003 12:57:39]
Lio 3 Passo 2/3
Estado de escrita da linha de I/O
Por ser o PIC mais maleavel as diversas exigncias de utilizao, a Microchip tem implementado diverssas tipologia de
status de escrita para a linha de I/O. Tendo ento dois grupos de pinos a qual o comportamento ligeiramente
diferenciado do outro grupo. Conhecendo melhor o funcionamento dos diversos status de escrita podemos desfrutar
melhor das caracteristicas e otimizar melhor o nosso projto.
Estado de escrita das linhas RA0, RA1, RA2 e RA3
Iniciaremos do grupo da linha RA0, RA1, RA2 e RA3 na qual representamos, na figura seguinte, o esquema do estado
de escrita extraido do data sheet da Microchip:
Como dito no passo anterior, a configurao de uma linha como entrada ou saida depende do estado do bit no registro
TRIS(TRISA para o PORTA e TRISB para o PORTB).
Lio 3 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less3/passo2.htm (1 of 5) [27/5/2003 12:57:41]
Pegaremos como exemplo a linha RA0 e analizaremos o funcionamento do estado de saida seja quando a mesma
funciona em entrada ou quando em saida.
Funcionamnto em entrada
Para configurar a linha RA0 em entrada, devemos colocar em 1 o bit 0 do registro TRISA com a instruo:
bsf TRISA,0
Esta instruo determinara uma comutao a 1 do estado logico do flip-flop do D-latch indicado no bloco com o nome
TRIS latch. Para outra linha linha de I/O existe um destes flip-flop e o estado logico em que se trava depende
extritamamente do estado logico do relativo bit no registro TRIS(ou melhor disendo todos o bit's do registro TRIS
fisicamente implementato com um TRIS latch).
A saida Q do TRIS latch conectada a entrada de uma porta lgica do tipo OR. Isto significa que, independente do
valor presente a outra entrada, a saida da porta OR estara sempre em 1 em quanto uma de suas entradas vale 1(veja na
tabela verdade). E nesta condio o transistor P no conduz e mantem a linha RA0 desconetada do positivo da
alimentao.
Do mesmo modo a saida negativa Q do TRIS latch e conectada a entrada de uma porta AND onde a saida desta estara
sempre em 0 em quanto uma de suas entradas vale 0 (veja tabela verdade). E nesta condio em que o transistor N no
conduz mantendo a linha RA0 desconectada da massa. O estado logico da linha RA0 depender exclusivamente do
circuito externo a que o conetar-mos.
Aplicando 0 ou 5 volts ao pino RA0, sera possivel ler-mos o estado presente no circuito externo a entrada do bloco
representado por TTl input buffer e do latch de entrada.
Funcionamento em saida
Para configurar a linha de RA0 em saida, devemos colocar em 0 o bit 0 do registro TRISA com a instruo:
bcf TRISA,0
Esta deterimina a comutao para 0 da saida Q do TRIS latch ( e para 1 a saida Q negativa). E neste estado o valor da
saida da porta OR e AND depende exclusivamente do estado de saida do Q negativo do Data Latch. Como para oTRIS
latch, em que o Data Latch depende do estado de um bit em um registro, particularmente do registro PORTA. A sua
saida negativa sera enviada para entrada das duas portas logicas OR e AND e que esto diretamente sobre a base do
transistor P e N.
Se colocar-mos em 0 o bit 0 do registro PORTA com a instruo:
bcf PORTA,0
obtremos a conduo do transistor N e portanto ir a 0 a linha RA0. Se ao invs colocar-mos em 1 o bit 0 com a
instruo:
bsf PORTA,0
obteremos a conduo do transistor P e portanto ira a +5 volts a linha RA0. Nesta condio sera sempre possivel rever
o valor enviado sobre a linha atravs do circuito de entrada.
Estado de saida da linha RA4
Analizaremos agra o funcionamento do estado de saida da linha RA4 que diferente de todas as outras linhas de I/O
enquanto compartilha o mesmo pino do PIC16c84 com o TOCKI o qual iremos analizar no proximo passo.
Na figura seguinte esta descrito o esquema de blocos do estado de saida extraido do data sheet Microchip:
Lio 3 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less3/passo2.htm (2 of 5) [27/5/2003 12:57:41]
A logica de comutao substancialmente identica ao grupo das linha RA0 a 3 com excesso da auxencia da porta OR
e do transistor P, ou seja de todos os circuitos que permitem a ligao ao positivo, da linha RA4. Isto significa em
termos praticos, que quando a linha RA4 esta programada em saida podera assumir um nivel que dependera do circuito
externo pois na realidade no esta conectada ao positivo e sim desconectada. Este tipo de circuito de saida chama-se
"coletor aberto" e util para aplicaes em que necessario compartilhar uma mesma ligao com mais pinos de saida
ou que se tenha a necessidade de colocar em alta impedancia uma linha de saida e podendo assim reprograma-la como
linha de entrada.
Se quisermos tornar seguro que a linha RA4 v a 1 devemos conectar externamente um rsistor de pull-up, ou seja um
resistor conctado ao positivo da alimentao.
Veremos em seguida a utilizao da linha indicada no eaquema acima TMR0 clock input.
Estado de saida das linhas RB0, RB1, RB2 e RB3
Onde que para este grupo de linhas permanece substancialmente invariada a lgica de comutao. Estas dispe de um
circuito a mais, o weak pull-up ativavel quando a linha for programada em entrada.
A entrada de fato, como explicado anteriormente, a linha vem completamante desligada do PIC. O estado da linha
depende ento exclusivamente do circuito externo. Se o circuito do tipo de coletor aberto ou simplismente
constituido de uma simples chave que, quando precionada, conecta a massa a linha de I\O, necessario inserir um
resistor de pull-up vinda do positivo para tornar seguro quando a chave for solta o nivel voltar a uma condio lgica
1estavel sobre a linha de entrada. O circuito de weak pull-up permite evitar o uso do resistor de pull-up e possivel de
Lio 3 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less3/passo2.htm (3 of 5) [27/5/2003 12:57:41]
ser ativado agindo sobre o bit RBPU do registro OPTION.
Na figura seguinte esta representado o esquema de blocos do estado de sida extrido do data sheet Microchip:
Alem disso a linha RB0 sozinha, apresenta uma caracteristica muito particular. Esta , quando for configurada como
linha de entrada, pode gerar, em correspondencia a uma troca de estado lgico, uma interrupt, ou seja uma interrupo
imediata do programa em execuo e uma chamada a uma subrotina espeial denominada interrupt handler. Mas disso
falaremos em seguida.
Estado de saida das linhas RB4, RB5, RB6 e RB7
O circuito de comutao deste grupo de linhas identico ao grupo RB0 a 3. Esta linha dispe tambem de um circuito de
weak pull-up. E mais, com respeito a linha RB0 - 3 tem a vantagem de poder revelar variaes de estado sobre qualquer
linha e gerar uma interrupo da qual falaremos na proxima lio.
Na figura seguinte esta reproduzido o esquema de blocos do estado de saida extraido do data sheet Micrchip.
Lio 3 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less3/passo2.htm (4 of 5) [27/5/2003 12:57:41]
Lio 3 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less3/passo2.htm (5 of 5) [27/5/2003 12:57:41]
Lio 3 Passo 3/3
Entrada de teclado
Depois de termos realizado, no exemplo anterior, as luzes em sequencia mostrando as linhas de RB0 a RB3 como linhas
de saida, vejamos agora como podemos realizar uma entrada de teclado configurando as linhas de RB4 a RB7 como
linhas de entrada.
Para fazer-mos isto ampliaremos o circuito apresentado na lio 2 com quatro teclas denominadas SW1, SW2, SW3,
SW4 e liga-las segundo o esquema eltrico: exemplo3.pdf (formato Acrobat Reader 12Kb).
Nenhuma destas teclas conecta a massa, as linhas de entrada normalmente mantidas a + 5 volts atravs dos resistores (de
R6 a R9). Pegando, por exemplo, o pino 10 do PIC 16F84, esta linha ser mantida em + 5 volts at que no seja
pressionada a tecla SW1 que promover a mudana da linha para 0 volts.
Realizemos um programa de exemplo que acenda qualquer um dos led's D1, D2, D3 e D4 em correspondecia ao
pressionamento de uma das teclas SW1, SW2, SW3 e SW4.
O cdigo do exemplo esta representado no arquivo INPUT.ASM.
A parte inicial do programa executa a mesma funo efetuada no exemplo anterior e uma instruo a mais:
movlw 11110000B
movwf TRISB
configurando as linhas de RB0 a RB3 em saida para a coneco com os led's e as linhas de RB4 a RB7 em entrada para
a coneco com as quatro chaves(teclas) ao resto do programa.
A instruo:
bcf STATUS,RP0
Efetua uma troca sobre o banco do registro 0 de modo que possamos acessar diretamente o status da linhas de I/O.
MainLoop
clrf PORTB
Esta instruo apaga todos os led's conectados sobre a PORTA B em qualquer ciclo do loop de modo que possam ser
acesos com base no status das teclas.
btfss PORTB,SW1
bsf PORTB,LED1
Estas duas instrues sero executadas por qualquer linha conectada a uma tecla para verificar se a tecla foi pressionada
e ento acender o led correspondente.
na prtica:
btfss PORTB,SW1
pula a proxima:
bsf PORTB,LED1
s se a tecla SW1 for solta. Caso contrario continuar acendendo o led. Esta cpia de instruo sera executada por
Lezione 3 Passo 3
http://www.tanzilli.com/pbe/brasiliano/less3/passo3.htm (1 of 2) [27/5/2003 12:57:42]
qualquer outra tecla.
E tudo executado dentro de um simples loop atravz da instruo:
goto MainLoop

Lezione 3 Passo 3
http://www.tanzilli.com/pbe/brasiliano/less3/passo3.htm (2 of 2) [27/5/2003 12:57:42]
Lio 4 Introduo
O contador TMR0 e o PRESCALER
Ao termino desta lio saiba:
Qual a utilidade do contador TMR0 G
Para que serve e como se programa o PRESCALER G
Conteudo da lio 4
O registro contador TMR0 1.
O Prescaler 2.

Lio 4
http://www.tanzilli.com/pbe/brasiliano/less4/intro.htm [27/5/2003 12:57:42]
Lio 4 Passo 1/2
O registro contador TMR0
Vejamos agra o que e como funciona o registro TMR0.
O registro TMR0 um contador, ou seja um registro particular, na qual, seu conteudo ve-se incrementado com cadencia
regular e programada diretamente pelo hardware do PIC. Na pratica, a diferena de outro registro, que o TMR0 no
mantem inalterado o valor que memorizado, mas o incrementa continuamente, se por exemplo escrevermos nele o
valor 10 com a instruo:
movlw 10
movwf TMR0
Aps um tempo par de quatro ciclos de maquina, o conteudo do registro comea a ser incrementado em +1 ou seja 11,
12, 13 e assim por diante com a cadencia constante e independente da execuo do resto do programa.
Lio 4 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less4/passo1.htm (1 of 4) [27/5/2003 12:57:44]
Se por exemplo, aps ter colocado um valor no registro TMR0, executar-mos um loop infinito
movlw 10
movwf TMR0
loop
goto loop
o registro TMR0 sera incrementado pelo hardware interno do PIC durante a execuo do loop.
Uma vez atingido o valor 255 o registro TMR0 sera zerado automaticamente retornando ento a contagem, mas no do
valor originalmente imposto mas do zero.
A frequencia diretamente proporcional a frequencia de clock aplicada ao chip e pode ser modificada programando-se
oportunamente os seus bits de configurao.
Na figura seguinte esta representada a cadeia de blocos interno do PIC que determina o funcionamnto do registro
TMR0.
O bloco Fosc/4 e T0CKI representados em azul representam as duas possiveis fontes de sinal para o contador TMR0.
Fosc/4 um sinal gerado internamnte no PIC pelo circuito de clock e par na frequencia de clock dividida por quatro.
T0CKI um sinal gerado de um evetual circuito externo e aplicado ao pino T0CKI correspondente ao pino 3 no PIC
16C84.
O blocos T0CS e PSA descritos em verde so dois comutadores de sinal na qual esto representando um dos dois tipos
de sinal de entrada com base no valor dos bits TOCS e PSA do do registro OPTION.
O bloco PRESCALER um divisor programavel e que seu funcionamento sera explicado na proximo passo.
Vejamos na pratica como possivel agir sobre este bloco para obter diferentes modalidades de contagem pelo registro
TMR0.
Iniciaremos programando o bit T0CS em 0 e PSA em 1. A configurao de funcionamento que obteremos a
representada na figura abaixo:
Lio 4 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less4/passo1.htm (2 of 4) [27/5/2003 12:57:44]
A parte em vermelho mostra-nos o percurso que efetua o sinal antes de chegar ao contador TMR0.
Como j aviamos dito anteriormente, a frequencia Fosc/4 par e de um quarto da frequencia de colck. Utilizando-se um
cristal de quartzo de 4Mhz teremos uma frequencia par de 1 MHz. Tal frequencia sera enviada diretamente ao registro
TMR0 sem aver nenhuma modificao. A cadencia de contagem que se obtem e ento par e de 1 milho de incrementos
por segundo do valor presente no TMR0.
Imaginemos agra modificar o status do bit T0CS de 0 para 1 a configurao que obteremos seguinte:
Desta vez ser o sinal aplicado ao pino TOCKI do PIC a ser enviado diretamente ao contador TMR0 determinando a
frequencia de contagem. Aplicando-se por exemplo a este pino uma frequencia par de 100Hz obteremos uma de
contagem par de cem encrementos por segundo.
A presena da porta lgica XOR(execlusive OR) na entrada TOCKI do PIC permite determinar o caminho do bit TOSE
do registro OPTION se o contador TMR0 deve ser incrementado na decida do pulso(TOSE=1) ou na subida do
pulso(TOSE=0) do sinal externo aplicado.
Na figura seguinte esta representada a correspondencia entre a cadencia do sianal externo e o valor que assume o
contador TMR0 :
Lio 4 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less4/passo1.htm (3 of 4) [27/5/2003 12:57:44]
Na proximo passo veremos como possivel dividir interiormente a frequencia de contagem, interna ou exeterna,
ativando o PRESCALER.

Lio 4 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less4/passo1.htm (4 of 4) [27/5/2003 12:57:44]
Lio 4 Passo 2/2
O PRESCALER
O ultimo bloco a ser analizado para poder utilizar completamente o registro TMR0 o PRESCALER.
Se configurar-mos o bit PSA do registro OPTION em 0 enviamos ao registro TMR0 o sinal de saida do PRESCALER
como visivel na figura abaixo:
O PRESCALER consiste na pratica de um divisor programavel de 8 bits utilizado no caso pela frequencia de contagem
enviada ao contador TMR0 que demasiada alta para nossos propositos.
No exemplo descrito na lio anterior aviamos visto que utilizando um cristal de 4Mhz obtinhamos uma frequencia de
contagem par de 1 Mhz que para muitas aplicaes podera ser muito elevada.
Com o uso do PRESCALER podemos dividir interiormente a frequencia Fosc/4 configurando desta forma os bits PS0,
PS1, PS2 do registro OPTION segundo a tabla abaixo:
PS2 PS1 PS0 Divisor Frequencia de saida do prescaler (Hz)
0 0 0 2 500.000
0 0 1 4 250.000
0 1 0 8 125.000
0 1 1 16 62.500
1 0 0 32 31.250
1 0 1 64 15.625
1 1 0 128 7.813
1 1 1 256 3.906
Iremos agra efetuar um experimento sobre o que foi visto at aqui para exercitar-mos o aprendisado.
Na lio 2 aviamos realizado um lampejador de quatro led's onde a sequencia de lampejo era determinada por uma
subrotina software, ou seja um retardo baseado no tempo de execuo de um ciclo continuo da instruo.
Iremos agra rescrever a mesma subrotina para introduzir um retardo par de um segundo utilizando o registro TMR0.
Lio 4 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less4/passo2.htm (1 of 2) [27/5/2003 12:57:45]
A modificao esta descrita no arquivo SEQTMR0.ASM.
Devemos antes de tudo programar o PRESCALER para obter uma frequencia de contagem colocando a seguinte
instruo no endereo do programa:
movlw 00000100B
movwf OPTION_REG
Na pratica iremos programar o bit TOCS em 0 para selecionar como fonte de contagem o clock do PIC, o bit PSA em 0
para levar o PRESCALER ao registro TMR0 ao invz do Watch Dog(o qual veremos em seguida) e o bit de
configurao do PRESCALER em 100 para obter uma frequencia de diviso par de 1:32.
A frequencia de contagem que obteremos sobre TMR0 que ser par :
Fosc = 1Mhz / 32 = 31.250 Hz
A subrotina Delay dever utilizar oportunamente o registro TMR0 para obter um retardo par de um segundo. Vejamos
como. As primeiras instrues que viro em seguida no Delay sero:
movlw 6
movwf TMR0
e
movlw 125
movwf Count
A duas primeira memorizam no TMR0 o valor 6 de modo que o registro TMR0 chegar a zero depois de 250
contagens(256 - 6 = 250) obtendo assim uma frequencia de passgem pelo zero do TMR0 par de:
31.250 / 250 = 125 Hz
A instruo seguinte memorizara em um registro de 8 bits(Count) o valor 125 de tal modo que, decrementara este
registro de um a cada passagem pelo zero do TMR0, at que se obtenha uma frequencia de passagem pelo zero do
registro Count par de:
125/125 = 1Hz
A instruo inserida no loop DelayLoop se encarregara ento de controlar se o TMR0 j chegou a zero, quando ento
reinicializara em 6 e decrementara o valor contido em Count. Quando Count alcanar antes desse o zero ai tera
transcorrido um segundo e a subrotina poder retornar ao programa que a chamou.

Lio 4 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less4/passo2.htm (2 of 2) [27/5/2003 12:57:45]
Lio 5 Introduo
As interrupes
Ao termino desta lio saiba:
O que e como controlar as interrupes no PIC G
Como se deve escrever uma interrupit handler G
Quais o tipos de eventos controlaveis do PICF84 G
Come controlar mais interrupes contemporaneamente G
Conteudo da lio 5
Interrupo 1.
Exemplo de controle de uma interrupo 2.
Exemplo prtico de controle de mais de uma interrupo 3.
Lio 5
http://www.tanzilli.com/pbe/brasiliano/less5/intro.htm [27/5/2003 12:57:46]
Lio 5 Passo 1/3
Interrupo
A interrupo uma tcnica particular do PIC que permite interceptar eventos externos ao programa em execuo,
interrompe momentaneamente a operao do programa em andamento, controla o evento com uma subrotina apropriada
e retorna para a execuo do programa.
Seja para fazer um paragrafo mais ou menos explicativo, podemos dizer que a interupo para o PIC, se no,o que
para ns representaria uma cahamada telefonica.
Para receber-mos um telefonema no precisamos nos preocupar em ficar levantando continuamente o monofone do
gancho para ver se tem alguem querendo falar com ns, mas podemos tranquilamente aguardar pelo toque da
campanhinha quando alguem nos chama. Quando ento apenas levatamos o monofone do gancho e interronpemos
momentaneamente o sistema de chamada, respondemos ao telefone e , uma vez terminada a conversasso, retornamos o
monofone no gancho ou seja, do ponto onde aviamos interrompido.
Appena sentiamo lo squillo, possiamo decidere di interrompere momentaneamente le nostre faccende, rispondere al
telefono e, una volta terminata la conversazione, riprendere dal punto in cui avevamo interrotto.
Transportando o termo deste paragrafo ao PIC veremos que::
O nosso telefone corresponde ao programa em execuo; G
a chamada de alguem corresponde ao evento de controle; G
o monofone corresponde a requisio de interrupo; G
a nossa reposta ao telefone corresponmde a subrotina de controle da interrupo. G
evidente que assim como extremamente mais eficaz se ter uma campnhinha conectada ao telefone extremamente
mais eficaz controlar nosso evento com uma interrupo ao invs de diretamente pelo programa.
Tipos de eventos e bit's de abilitao
O PIC16C84 esta preparado para controlar intrrupes ao final de quatro eventos diferentes,vejamos quais so:
1.
A troca de estado sobre a linha RB0 (External interrupt RB0/INT pin). 2.
Ao final da contagem do registro TMR0 (TMR0 overflow interrupt). 3.
A troca de estado sobre uma das linhas de RB4 a RB7 (PORTB change interrupts). 4.
Ao final da escrita sobre um endereo da EEPROM (EEPROM write complete interrupt). 5.
A interrupo de qualquer um destes evenbtos pode ser conseguido abilitando ou desabilitando independentemente uns
dos outros, agindo sobre os seguintes bit's do registro INTCON:
G
INTE (bit 4) se este bit estiver em 1 abilitara a interrupo de troca de estado sobre a linha RB0 G
T0IE (bit 5) se este bit estiver em 1 abilitara a interrupo de final de contagem do registro TMR0 G
RBIE (bit 3) se este bit estiver em 1 abilitara a interrupo de traca de estado sobre uma das linhas de RB4 a
RB7
G
EEIE (bit 6) se este bit estiuver em 1 abilitara a interrupo de final de escrita sobre um endereo da EEPROM G
Existe um outro bit de abilitao geral de interrupo que deve ser setado antes destes ou seja o bit GIE (Global
Interrupt Enable bit) e este o bit 7 do registro INTCON.
Lio 5 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less5/passo1.htm (1 of 2) [27/5/2003 12:57:47]
Vetor de Interrupo e Controle de Interrupo
(Interrupt vector e Interrupt handler)
Qualquer que seja o evento abilitado, ao se manifestar, o PIC interrompe a execuo do programa em andamento,
memoriza automaticamente no STACK o valor corrente do PROGRAM COUNTER e pula para a instruo presente
no endereo de memria 0004H denominada Interrupt vector(vetor de interrupo).
Deste ponto em diante devemos colocar a nossa subrotina de controle denominada Interrupt Handler (controle de
interrupo).
Pode-se habilitar mais interrupes e, a primeira providencia da interrupt handler e a de verificar qual o evento abilitado
fez gerar a interrupo e a execuo da parte do programa relativo
Este contole pode ser ser efetuado utilizando a Interrupt flag.
Interrupt flag(sinalizador de interrupo)
Dado que qualquer interrupo gera uma chamada do endereo 04H, no registro INTCON esta presente o flag que
indica qual o evento que gerou a interrupo vejamos:
G
INTF (bit 1) Se vale 1 a interrupo um estado gerado na troca de estado subre a linha RB0. G
T0IF (bit 2) Se vale 1 a interrupo um estado gerado no termino da contagem do timer TMR0. G
RBIF (bit 0) Se vale 1 a interrupo um estado gferado da troca de estado de uma das linhas de RB4 a RB7. G
Como se pode ver a interrupo de final de escrita na EEPROM no tem previsto nenhum flag de sinalizao para que a
interrup handler deva considerar que a interupo um estado gerado deste evento quando todos os tres flags supra
citados iro a 0.
Importante: Uma vez conhecido qual o flag esta ativo, a interrupt handler deve zera-lo, ou ento no mais gerara
interrupo correspondente.
Retorno de uma interrupt handler
Quando for gerada uma interrupo o PIC desbilita automatimamente o bit GIE(global Interrupt Enable) do registro
INTECON de modo a desbilitar todas as interrupes restantes. Para poder retornar ao programa principal e reinicializar
em 1este bit deve-se utilisar a instruo :
RETFIE
No proximo passo veremos um exemplo pratico do uso das interrupes.
Lio 5 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less5/passo1.htm (2 of 2) [27/5/2003 12:57:47]
Lio 5 Passo 2/3
Exemplo prtico de controle de interrupo
Vejamos agra um exemplo pratico de controle de intrerrupo. Pegaremos como base partida o codiogo LED.ASM
usado na lio 1 para realisar um lampejador a led.
Como recordamos este programa faz lampejar o LED1 simplesmente, presente sobre a placa PicTech, num ciclo
continuo utilizando um retardo software introduzido da subrotina Delay
Vejamos agra como possivel fazer precionando uma tecla acender o LED2 temporariamente com a execuo do
programa principal.
O codigo de exemplo que iremos analizar esta disponivel no INTRB.ASM
O circuito a ser realizado esta representado no seguinte arquivo no formato Acrobat Reader (12Kb): example3.pdf.
Uma vez carregado o programa INTRB.ASM na placa PicTech notaremos que o LED D1 lampejar exatamente como
aviamos colocado o programa LED.ASM.Devemos agra precionar as teclas de SW1 a SW4. Veremos que o LED D2
se acende imediatamente e permanece aceso por um tempoo par de 3 lampejops do LED 1.
Na pratica entre o loop principal, derivado do codigo LED.ASM, continua a faser lampejar o LED D1 utilisando um
retardo software introduzido da subrotina Delay, o PIC fara com que ao precionar-mos uma tecla, sinalizara
imediatamente sobre o LED 2 sem influenciar de maneira evidente a frequencia de lampejo.
Primeiro analisaremos o codigo INTRB.ASM vejamos a diferena de comporatamento com o outro codigo que faz a
mesma operao sem trer que recorrer a interrupo.
Para este propsito compilaremos e colocaremos na placa Pictech o programa NOINTRB.ASM. Notaremos que a
acensso do led 2 em correspondencia com o precinamento de uma tecla ligeiramente retardado em quanto a leitura do
estado da linha RB4-7 no sera efetuada pelo hardware de controle de interrupo mas diretamente do programa
principal a cada ciclo do loop. O rapido retardo ento devolvido a presena da subrotina Delay dentro do loop
principal.
Analisaremos agra o codigo INTRB.ASM.
Partindo da diretiva ORG 00H que, como vimos serve para posicionar o nosso programa a partir da posio de reset, ou
seja da locao 0.
Notamos subtamente que a primeira instruo que o PIC encontra um desvio incondicionado para o label Start:
ORG 00H
goto Start
seguido de uma nova diretiva:
ORG 04H
e ento do codigo da subrotina de controle da interupo:
bsf PORTB,LED2
movlw 3
movwf nTick
Lio 5 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less5/passo2.htm (1 of 2) [27/5/2003 12:57:47]
bcf INTCON,RBIF
retfie
Como haviamos dito na lio anterior, a interrupt Handler alocar necessariamente a partir do endereo 04H, para evitar
que seja executada logo aps o reset devemos pula-la com uma intruo de salto incondicional.
O codigo da interrupt handler, neste casso, muito simples e se limita a acender o LED D2, que inseri no registro
existente nTick o numero de lampejos at chegar a LED D2, devera apagar-se e zerar o flag RBIF para permitir ao
circuito a gerao de nova interrupo.
A instruo RETFIE permite ao PIC retornar a executar o programa do ponto que foi interrompido pela interrupo.
Mas porque gerado uma interrupo quando precionamos uma tecla qualquer ?
Pois a primeira intruo que o PIC executa aps o reset a seguinte:
movlw 10001000B
movwf INTCON
onde na pratica foi colocado a um o bit GIE(bit 7) que a abilitao global das interrupes e onde o bit RBIF (bit 3)
que abilita, particularmente, a interrupo sobre troca de estado da linha RB4-7.
Na pratica, avendo conctado as cheves SW1,SW2, SW3 e SW4 sobre a linha de I/O RB4, RB5, RB6 e RB7, com um
precionar de qualquer uma das teclas ha uma traca de estado que gera uma interrupo
No llop principal, alem da operao de acender e apagar do LED 1, sera decrementado o contador nTich at chegar a
zero. Em correspondncia com este sera apagado o LED 2.

Lio 5 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less5/passo2.htm (2 of 2) [27/5/2003 12:57:47]
Lio 5 Passo 3/3
Exemplo prtico de controle de mais interrupes
Vejamos agra como controlar mais interrupes contemporaneamente.
Utilizando sempre como base o codigo anterior INTRB.ASM poderemos controlar at mesmo uma interupo sobre a
fina contagem do registro TMR0. Ou seja faamos lampejar o LED D3 em correspondencia com a contagem de TMR0.
O cdigo a se utilizar DBLINT.ASM.
Compile e descarregue o programa DBLINT.ASM na placa PicTech e vermos que alem do LED D1 que lampeja com a
frequencia anterior, e o LED D3 com uma frequencia mais elevada.
Precionado-se uma tecla qualquer, obtemos a costumeira aceno por tres ciclos do LED D2. O efeito final que obtemos
a execuo de tres tarefas a uma velociade tal que se assemelha com uma execuo paralela.
Analizando agra o codigo DBLINT.ASM.
Ao modificar o anterior observe a interrupt handler no inicio do qual esta efetuado um controlle sobre qual evento havia
gerado a interrupo. Com a instruo:
btfsc INTCON,T0IF
goto IntT0IF
btfsc INTCON,RBIF
goto IntRBIF
sera controlado o flag T0IF e RBIF para ver respectivamente se o evento que provocou a interrupo provem do
registro TMR0 ou da porta RB4-RB7. E seguida sera posta em execuo a relativa subrotina de controle a partir do
label intT0IF e intRBIF.
Antes de devolver o controle ao programa principal devemos zerar o flag T0IF e RBIF para assegurar que o proximo
evento possa gerar interrupo.
Lio 5 Passo 3
http://www.tanzilli.com/pbe/brasiliano/less5/passo3.htm [27/5/2003 12:57:48]
Lio 6 Introduo
O Power Down Mode e o Watch Dog Timer
Ao termino di desta lio saiba:
Como colocar o PICmicro em Power Down Mode e como desperta-lo G
Como funciona o Watch Dog Timer G
Conteudo da lio 6
Funcionamento do Power Down Mode 1.
Funcionamento do Watch dog timer 2.

Lio 6
http://www.tanzilli.com/pbe/brasiliano/less6/intro.htm [27/5/2003 12:57:49]
Lio 6 Passo 1/2
Funcionamento do Power Down Mode
O Power Down Mode e Sleep Mode um estado particular de funcionamento do PICmicro utilizado para reduzir o
consumo de corrente no memento em que o PICmicro no utilizado e aguarda um evento externo.
Se pegar-mos como exemplo um controle remoto para TV veremos que na maior parte do tempo o PICmicro permanece
aguardando que alguem precione uma tecla. Apenas quando precionamos o PICmicro efetua uma breve transmisso e
se coloca de novo a espera de um novo precionar de tecla.
O tempo de utilizao efetivo da CPU do PICmicro ento limitado a poucos milisegundos necessario para efetuar a
transmisso ao passo que para outros no preciso nenhuma elaborao particular.
Para evitar o consumo inutil frente a limitada energia da bateria possivel desligar boa parte do circuito de
funcionamento do PICmicro e reaviva-lo somente quando um evento externo ocorrer.
Vejamos como.
A instruo SLEEP
A instruo SLEEP sera utilizada para colocar o PICmicro em Power Down Mode e reduzir consequentemente a
corrente absorvida que passara de cerca dos 2mA(a 5 volts com clock de 4Mhz) para cerca dos 2uA, ou seja 1000 vezes
menos !
Para entrar em Power Down Mode basta inserir-mos esta instruo em um ponto qualquer do nosso programa:
SLEEP
Qualquer instruo presente depois de SLLEP no sera executada pelo PICmicro que terminara neste ponto sua
execuo, desligar todos os circuitos internos, menos aqueles necessarios a manter o estado da linha de I/O (estado
logico alto,baixo ou de alta impedancia) para informar a condio de "reaviva-lo" o qual veremos em seguida.
Para reduzir o consumo de corrente neste estado, no devemos fazer obviamente um circuito que conectado a linha de
escrita do PIC consuma corrente exessiva. O melhor circuito que podemos projetar aquele que absorver o minimo de
corrente na condio de Power Down. Um outro truque recomendado pela Microchip conectar ao posivo(Vdd) ou ao
negativo(vss) da alimentao todas a linhas em alta impedncia no utilizadas, como a linha RA4/T0CKI (pin 3).
O "despertar" do PICmicro
Para despertar o PICmicro do seu sono podemos utilizar diverssas tcnicas:
Reset do PICmicro colocando em 0 o pino MCLR (pino 4) 1.
Timeout do timer do Watchdog (se abilitado) 2.
Verificao de uma situao de interrupo (interrupo do pino RB0/INT, troca de estado sobre a porta B,
termino da operao de escrita na EEPROM)
3.
No caso 1 e 2 o PICmicro sera resetado e a execuo comear da posio 0.
No caso 3 o PICmicro se comporta como no atendimento de uma interrupo ir para a primeira interrup handler e ento
retornar para execuo aps a instruo SLLEP. Para que o PICmicro possa retornar de uma interrrupo devemos
abilitar o flag do registro INTCON.
Exemplo do Power Down mode
Lio 6 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less6/passo1.htm (1 of 2) [27/5/2003 12:57:50]
Veremos agora um simples exemplo de utilizao do Power Down Mode e da modalidade de "despertar" do PICmicro.
O modo utilizado sera a interrupo sobre o fronte de descida aplicado ao pino RB0/INT utilizando-se uma chave de
presso. O codigo utilizado o PDM.ASM.
O esquema para reliza-lo esta disponivel no arquivo exemplo4.pdf (formato Acrobat Reader 10Kb).
Na prtica o LED D1 conectado a linha RB2 lampejar para indicar a execusso do programa em andamento.
Prescionando-se a tecla SW2 o programa executr a instruo :
SLEEP
colocando o PICmicro em Power Down Mode. O LED D1 se manter aceso at o momento em que prescionarmos
SW2.
Para fazer a saida do Power Down Mode do PICmicro, s apertar SW1 para gerar uma interrupo e retornar para
execuo do programa.

Lio 6 Passo 1
http://www.tanzilli.com/pbe/brasiliano/less6/passo1.htm (2 of 2) [27/5/2003 12:57:50]
Lio 6 Passo 2/2
O watch dog timer (WDT)
Nesta lio analizaremos o funcionamento do Watch Dog Timer (que traduzindo em Portugus significa Co de
Guarda) e sua finalidade a de melhorar o funcionamento do nosso circuito baseado no PICmicro.
O Wtch Dog Timer na prtica um oscilador interno do PICmicro, mas completamente independente do resto do
circuito, cuja finalidade informar eventuais bloqueios da CPU do micro e resetar o PICmicro para poder retornar a
execuo normal do ProgramaI.
Para poder informar um eventual bloqueio da CPU durante a execuo do programa principal, sera colocada dentro
deste, uma instruo especial, ou seja:
CLRWDT (CLeaR Watch Dog Timer)
a qual zerara em intervalos regulares o Watch Dog Timer e assim no permitindo o mesmo, terminar sua contagem. Se a
CPU no executa esta intruo antes de terminar a contagem sera entendido como um bloqueio de programa por motivo
qualquer, e sera efetuado o Reset da CPU.
O periodo minimo para que a CPU seja resetada de cerca de 18ms (isso dependera da temperatura e da tenso de
alimentao). Porem possivel progrmar o PRESCALER do Watch Dog Timer para obter um tempo de retardo maior
com cerca de 2 a 3 segundos.
Para abilitar o Watch Dog Timer devemos abilitar na fase de programao o flag WDTE do byte de configurao. O
meio de ativao deste flag depende do programador que esteja sendo usado. No caso do YAPP! versso 2.5 possivel
abilitar o Watch Dog Timer com o comando:
[2] - Watch Dog Timer
Ajuste do PRESCALER ao WDT
Agindo sobre o bit PSA do registro OPTION_REG possivel ajustar o prescaler do Watch Dog Timer para obtermos
tempo de retardo maiores. O bit PSA sera setado em um com a instruo:
BSF OPTION_REG,PSA
Caso contrario o prescaler estara ligado ao TIMER 0. Obviamente ajustando o prescaler ao WTD no sera possivel
ajusta-lo completamente para TIMER 0 e viceversa.
Intervindo sobre o valor do bit PS0, PS1 e PS2 do mesmo registro OPTION_REG podemos obter diverssos intervalos
de retardo. A setagem correta dever ser feita tendo em conta o maximo retardo que podemos obter dentro do nosso
programa entre a execuo de duas instrues CLRWD sucessivas.
Na tabela seguinte esta representada a correspondncia entre os valores destes bit's e os intervalos que obteremos.
PS2 PS1 PS0 Divisor Periodo de retardo do WDT
0 0 0 1 18ms
0 0 1 2 36ms
0 1 0 4 72ms
0 1 1 8 144ms
1 0 0 16 288ms
1 0 1 32 576ms
1 1 0 64 1.152s
Lio 6 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less6/passo2.htm (1 of 2) [27/5/2003 12:57:51]
1 1 1 128 2.304s
Exemplo prtico de uso do Watch Dog Timer
Vejamos agra, como sempre, um exemplo prtico de uso do Watch Dog Timer. Usaremos o mesmo esquema usado no
exemplo anterior e visto no arquivo exemplo4.pdf (formato Acrobat Reader 10K), o codigo esta representado no arquivo
WDT.ASM.
Na prtica este exemplo no diferencia-se muito do exemplo usado pelo Power Down Mode.
Na prtica apenas o programa entrara em execusso e veremos o LED 1 lampejar. Durante o lampejo sera executada
continuamente a instruo CLRWD para evitar que a CPU possa ser resetada( para tal propsito no se esquea de
programar o PICmicro com a opo WDTE abilitada).
S quando prescionamos a tecla SW2 a CPU entra em um loop infinito(StopLoop) sem executar o CLRWD.
Transcorridos cerca de 2 ou 3 segundos, o Watch Dog Timer efetua o reset da CPU e o led comea a lampejar
novamente
Devemos agra reprogramar o PIC16F84 com o mesmo programador. Note-se que prescionando a tecla SW2 o lampejo
bloaqueado e no se desbloqueia mais.
Maiores informaes sobre o funcionamento do Watch Dog Timer podem ser extraidos do datasheet Microchip do
PIC16F84(documento DS30430C na pagina 50)

Lio 6 Passo 2
http://www.tanzilli.com/pbe/brasiliano/less6/passo2.htm (2 of 2) [27/5/2003 12:57:51]
A A
B B
C C
D D
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
VER: OF: PAGES: DATE:
ENGINEER:
NOTE:
PROJECT:
2 NOV 1998
PIC BY EXAMPLE
1 1 1.0
EXAMPLE N.4
SERGIO TANZILLI
WWW.PICPOINT.COM
GND GND
C3
22PF
C2
22PF
X1
4
M
H
Z
+5
6
RB0
7
RB1
8
RB2
9
RB3
10
RB4
11
RB5
12
RB6
13
RB7
17
RA0
18
RA1
1
RA2
2
RA3
3
RTCC/RA4 4
MCLR
16
OSC1/CLKIN
15
OSC2/CLKOUT
5
VSS
14
VDD
U1
PIC16F84
1
IN
2
GND
3
OUT
U2
7805
C6
1
0
0
K
P
F
C5
1
0
0
K
P
F
C7
4
7
U
F
C4
1
0
0
U
F
GND
+5 +12
+12VCC
GND
1
2
3
4
5
6
J1
DIN_6
C
1
1
0
0
K
P
F
R
1
1
0
K
GND
R2
470
C A
D1
LED
1 2
SW1
1 2
SW2
GND
+5
R
3
R
4
Y
A
P
P
!
2 X 10K
;**************************************************
; Pic by example
; WDT.ASM
; Watch Dog Timer example
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of chip flags
;Enable watch dog timer
;Enable power up timer
;XT oscillator
;Disable code protect
__CONFIG 3FF5H
SWITCH1 EQU 0
SWITCH2 EQU 1
LED1 EQU 2
ORG 0CH
;16 bit counter used in the delay subroutine
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 00H
;Jump to main body of program.
goto Start
;**********************************************************************
; Interrupt vector
; Start point for every interrupt handler
;**********************************************************************
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
bcf INTCON,INTF ;Reset INTF flag
retfie ;Return to the main body
;**********************************************************************
; Main body
;**********************************************************************
Start:
bsf STATUS,RP0 ;Swap to data bank 1
http://www.tanzilli.com/pbe/examples/wdt.asm
http://www.tanzilli.com/pbe/examples/wdt.asm (1 of 3) [27/5/2003 12:57:53]
;I/O lines definition on port A (0=output, 1=input)
movlw 00011111B ;Definition of port a
movwf TRISA & 0x7F
;I/O lines definition on port B (0=output, 1=input)
bsf TRISB & 0x7F,SWITCH1 ;Switch 1
bsf TRISB & 0x7F,SWITCH2 ;Switch 2
bcf TRISB & 0x7F,LED1 ;Led 1
;Set to 0 the INTEDG bit on OPTION register
;to have an interrupt on the falling edge of RB0/INT
bcf OPTION_REG & 0x7F,INTEDG
;Assign the PRESCALER to Watch dog timer
bsf OPTION_REG & 0x7F,PSA
;Set the PRESCALER to 1:128
bsf OPTION_REG & 0x7F,PS0
bsf OPTION_REG & 0x7F,PS1
bsf OPTION_REG & 0x7F,PS2
bcf STATUS,RP0 ;Swap to data bank 0
bsf INTCON,GIE ;Enables interrupts
bsf INTCON,INTE ;Enables RB0/INT interrupt
bcf PORTB,LED1 ;Turn off LED1
;**********************************************************************
; Main loop
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;If switch2 is down enter in
StopLoop
goto StopLoop ;Stops CPU
clrwdt ;Clear wtahc dog timer
call Delay ;Software delay
;If LED1 in on then turn it off and viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, turn it on
goto TurnOffLed1 ;Yes, turn it off
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
http://www.tanzilli.com/pbe/examples/wdt.asm
http://www.tanzilli.com/pbe/examples/wdt.asm (2 of 3) [27/5/2003 12:57:53]
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Software delay
;**********************************************************************
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/wdt.asm
http://www.tanzilli.com/pbe/examples/wdt.asm (3 of 3) [27/5/2003 12:57:53]
;**************************************************
; Pic by example
;
; PDM.ASM
; Power Down Mode example
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Set chip configuration
;Disable watch dog timer
;Enable power up timer
;XT oscillator
;Disable code protect
__CONFIG 3FF1H
SWITCH1 EQU 0
SWITCH2 EQU 1
LED1 EQU 2
ORG 0CH
;16 bit counter used in the delay subroutine
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 00H
;Jump to main body of program.
goto Start
;**********************************************************************
; Interrupt vector
; Start point for every interrupt handler
;**********************************************************************
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
bcf INTCON,INTF ;Reset INTF flag
retfie ;Return to the main body
;**********************************************************************
; Main body
;**********************************************************************
Start:
http://www.tanzilli.com/pbe/examples/pdm.asm
http://www.tanzilli.com/pbe/examples/pdm.asm (1 of 3) [27/5/2003 12:57:53]
bsf STATUS,RP0 ;Swap to data bank 1
;I/O lines definition on port A (0=output, 1=input)
movlw 00011111B ;Definition of port a
movwf TRISA & 0x7F
;I/O lines definition on port B (0=output, 1=input)
bsf TRISB & 0x7F,SWITCH1 ;Switch 1
bsf TRISB & 0x7F,SWITCH2 ;Switch 2
bcf TRISB & 0x7F,LED1 ;Led 1
;Set to 0 the INTEDG bit on OPTION register
;to have an interrupt on the falling edge of RB0/INT
bcf OPTION_REG & 0x7F,INTEDG
bcf STATUS,RP0 ;Swap to data bank 0
bsf INTCON,GIE ;Enables interrupts
bsf INTCON,INTE ;Enables RB0/INT interrupt
bcf PORTB,LED1 ;Turn off LED1
;**********************************************************************
; Main loop
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;If switch2 is down enter in
sleep ;Power Down Mode
call Delay ;Software delay
;If LED1 in on then turn it off and viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, turn it on
goto TurnOffLed1 ;Yes, turn it off
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Software delay
;**********************************************************************
Delay
clrf Count
clrf Count+1
http://www.tanzilli.com/pbe/examples/pdm.asm
http://www.tanzilli.com/pbe/examples/pdm.asm (2 of 3) [27/5/2003 12:57:53]
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/pdm.asm
http://www.tanzilli.com/pbe/examples/pdm.asm (3 of 3) [27/5/2003 12:57:53]
;**************************************************
; Pic by example
; INTRB.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1 ;Registro utilizzato per contare il numero di
;lampeggi del LED 1
;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
;Salta al corpo principale del programma. Questo jump necessario
;per evitare tutta la parte di codice per la gestione degli
;interrupt.
goto Start
;Interrupt vector
;Punto di inizio per tutte le subroutine di gestione degli interrupt
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
;Accende il led 2 per segnalare che c'e' stato un interrupt
bsf PORTB,LED2
;Inizializza il contatore di lampeggi del LED1
movlw 3
movwf nTick
;Azzera nuovamente il flag RBIF per consentire all'interrupt di
;ripetersi
http://www.tanzilli.com/pbe/examples/intrb.asm
http://www.tanzilli.com/pbe/examples/intrb.asm (1 of 3) [27/5/2003 12:57:55]
bcf INTCON,RBIF
;Ritorna al programma principale
retfie
;**********************************************************************
; Programma principale
;**********************************************************************
Start:
;Commuta sul secondo banco dei registri per accedere ai registri TRISA e TRISB
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
;Definizione della porta A
movlw 00011111B
movwf TRISA & 7FH
;Definizione della porta B
;Le linee da RB0 a RB3 vengono programmate in uscita per essere collegate ai
quattro led
;Le linee da RB4 a RB7 vengono programmate in ingresso per essere collegate ai
quattro pulsanti
movlw 11110000B
movwf TRISB & 7FH
;Commuta sul primo banco dei registri
bcf STATUS,RP0
;Spegne tutti i led collegati sulla porta B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Abilita l'interrupt sul cambiamento di stato delle linee RB4,5,6,7
movlw 10001000B
movwf INTCON
;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
call Delay ;Ritardo software
btfss PORTB,LED1 ;Led acceso ?
goto TurnOnLed1 ;No, lo accende
goto TurnOffLed1 ;Si, lo spegne
;Accensione led e decremento del contatore di lampeggi
TurnOnLed1
bsf PORTB,LED1
;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso.
;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di
http://www.tanzilli.com/pbe/examples/intrb.asm
http://www.tanzilli.com/pbe/examples/intrb.asm (2 of 3) [27/5/2003 12:57:55]
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 acceso ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare
;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Spegne LED 1
goto MainLoop ;Continua a lampeggiare
;**********************************************************************
; Subroutine
;**********************************************************************
;Subroutine di ritardo software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/intrb.asm
http://www.tanzilli.com/pbe/examples/intrb.asm (3 of 3) [27/5/2003 12:57:55]
;**************************************************
; Pic by example
; DBLINT.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1
;Reset Vector
;Starting point at CPU reset
ORG 00H
;Jump to the main body of program to avoid the interrupt handler
;code.
goto Start
;Interrupt vector
;Starting point at CPU interrupts
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
;Check the interrupt event
btfsc INTCON,T0IF
goto IntT0IF
btfsc INTCON,RBIF
goto IntRBIF
;Reset the T0IF and RBIF flags to re-enable the interrupts
End_ih
bcf INTCON,T0IF
http://www.tanzilli.com/pbe/examples/dblint.asm
http://www.tanzilli.com/pbe/examples/dblint.asm (1 of 4) [27/5/2003 12:57:55]
bcf INTCON,RBIF
;Go back to the main program
retfie
;**********************************************************************
; TMR0 Interrupt handler
;**********************************************************************
IntT0IF
;Turn on LED3 if it's off
btfsc PORTB,LED3
goto LED3_off
bsf PORTB,LED3
goto End_ih
LED3_off
bcf PORTB,LED3
goto End_ih
;**********************************************************************
; RB4-RB7 interrupt handler
;**********************************************************************
IntRBIF
;Turn on LED 2
bsf PORTB,LED2
;Starts the LED1 blink counter

movlw 3
movwf nTick
goto End_ih
;**********************************************************************
; Main body
;**********************************************************************
Start:
;Commuta sul secondo banco dei registri per accedere ai registri TRISA e TRISB
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
;Definizione della porta A
movlw 00011111B
movwf TRISA & 7FH
;Definizione della porta B
;Le linee da RB0 a RB3 vengono programmate in uscita per essere collegate ai
quattro led
;Le linee da RB4 a RB7 vengono programmate in ingresso per essere collegate ai
quattro pulsanti
movlw 11110000B
movwf TRISB & 7FH
;Assegna il PRESCALER a TMR0 e lo configura a 1:256
http://www.tanzilli.com/pbe/examples/dblint.asm
http://www.tanzilli.com/pbe/examples/dblint.asm (2 of 4) [27/5/2003 12:57:55]
movlw 00000111B
movwf OPTION_REG & 7FH
;Commuta sul primo banco dei registri
bcf STATUS,RP0
;Spegne tutti i led collegati sulla porta B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Abilita l'interrupt sul TMR0 e sul cambiamento di stato delle linee RB4,5,6,7
movlw 10101000B
movwf INTCON
;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
call Delay ;Ritardo software
btfss PORTB,LED1 ;Led acceso ?
goto TurnOnLed1 ;No, lo accende
goto TurnOffLed1 ;Si, lo spegne
;Accensione led e decremento del contatore di lampeggi
TurnOnLed1
bsf PORTB,LED1
;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso.
;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 acceso ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare
;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Spegne LED 1
goto MainLoop ;Continua a lampeggiare
;**********************************************************************
http://www.tanzilli.com/pbe/examples/dblint.asm
http://www.tanzilli.com/pbe/examples/dblint.asm (3 of 4) [27/5/2003 12:57:55]
; Subroutine
;**********************************************************************
;Subroutine di ritardo software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/dblint.asm
http://www.tanzilli.com/pbe/examples/dblint.asm (4 of 4) [27/5/2003 12:57:55]
;**************************************************
; Pic by example
; LED.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
LED EQU 0
ORG 0x0C
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11111110'
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED
MainLoop
call Delay
btfsc PORTB,LED
goto SetToZero
bsf PORTB,LED
goto MainLoop
SetToZero
bcf PORTB,LED
goto MainLoop
http://www.tanzilli.com/pbe/examples/led.asm
http://www.tanzilli.com/pbe/examples/led.asm (1 of 2) [27/5/2003 12:57:56]
;Subroutines
;Software delay
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/led.asm
http://www.tanzilli.com/pbe/examples/led.asm (2 of 2) [27/5/2003 12:57:56]
A A
B B
C C
D D
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
VER: OF: PAGES: DATE:
ENGINEER:
NOTE:
PROJECT:
2 NOV 1998
PIC BY EXAMPLE
1 1 1.0
EXAMPLE N.3
SERGIO TANZILLI
WWW.PICPOINT.COM
GND GND
C3
22PF
C2
22PF
X1
4
M
H
Z
+5
6
RB0
7
RB1
8
RB2
9
RB3
10
RB4
11
RB5
12
RB6
13
RB7
17
RA0
18
RA1
1
RA2
2
RA3
3
RTCC/RA4 4
MCLR
16
OSC1/CLKIN
15
OSC2/CLKOUT
5
VSS
14
VDD
U1
PIC16C84
1
IN
2
GND
3
OUT
U2
7805
C6
1
0
0
K
P
F
C5
1
0
0
K
P
F
C7
4
7
U
F
C4
1
0
0
U
F
GND
+5 +12
+12VCC
GND
1
2
3
4
5
6
J1
DIN_6
Y
A
P
P
!
C
1
1
0
0
K
P
F
R
1
1
0
K
GND
C A
D4
LED
R5
470
C A
D3
LED
R4
470
C A
D2
LED
R3
470
R2
470
C A
D1
LED
1 2
SW1
1 2
SW2
1 2
SW3
1 2
SW4
GND
R
6
R
7
R
8
R
9
4 X 10K
+5
;**************************************************
; Pic by example
; NOINTRB.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1 ;Registro utilizzato per contare il numero di
;lampeggi del LED 1
;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
;**********************************************************************
; Programma principale
;**********************************************************************
Start:
;Commuta sul secondo banco dei registri per accedere ai registri TRISA e TRISB
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
;Definizione della porta A
movlw 00011111B
movwf TRISA & 7FH
;Definizione della porta B
;Le linee da RB0 a RB3 vengono programmate in uscita per essere collegate ai
quattro led
;Le linee da RB4 a RB7 vengono programmate in ingresso per essere collegate ai
quattro pulsanti
movlw 11110000B
movwf TRISB & 7FH
;Commuta sul primo banco dei registri
http://www.tanzilli.com/pbe/examples/nointrb.asm
http://www.tanzilli.com/pbe/examples/nointrb.asm (1 of 3) [27/5/2003 12:57:58]
bcf STATUS,RP0
;Spegne tutti i led collegati sulla porta B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
KeyCheck
btfsc PORTB,LED2
goto _KeyCheck
comf PORTB,W
andlw 0F0H
btfsc STATUS,Z
goto _KeyCheck
bsf PORTB,LED2
movlw 3
movwf nTick
_KeyCheck
call Delay ;Ritardo software
btfss PORTB,LED1 ;Led acceso ?
goto TurnOnLed1 ;No, lo accende
goto TurnOffLed1 ;Si, lo spegne
;Accensione led e decremento del contatore di lampeggi
TurnOnLed1
bsf PORTB,LED1
;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso.
;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 acceso ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare
;Spegnimento led
TurnOffLed1
http://www.tanzilli.com/pbe/examples/nointrb.asm
http://www.tanzilli.com/pbe/examples/nointrb.asm (2 of 3) [27/5/2003 12:57:58]
bcf PORTB,LED1 ;Spegne LED 1
goto MainLoop ;Continua a lampeggiare
;**********************************************************************
; Subroutine
;**********************************************************************
;Subroutine di ritardo software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/nointrb.asm
http://www.tanzilli.com/pbe/examples/nointrb.asm (3 of 3) [27/5/2003 12:57:58]
;**************************************************
; Pic by example
; SEQTMR0.ASM
; Luci sequenziali con temporizzazione via TIMER 0
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
ORG 0CH
Count RES 1
Shift RES 1
;Reset Vector - Punto di inizio del programma al reset della CPU
ORG 00H
;Commuta sul secondo banco dei registri
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
movlw 00011111B
movwf TRISA & 7FH
movlw 11110000B
movwf TRISB & 7FH
;Assegna il PRESCALER a TMR0 e lo configura a 1:32
;Vedi subroutine Delay per maggiori chiarimenti
movlw 00000100B
movwf OPTION_REG & 0x7F
;Commuta sul primo banco dei registri
bcf STATUS,RP0
;Il registro Shift viene utilizzato per rappresentare internamente
;lo stato delle linee di uscita della porta B dove sono collegati i led.
;Il bit 0 del registro Shift viene settato ad uno per iniziare il ciclo
;dal primo led.
movlw 00000001B
movwf Shift
http://www.tanzilli.com/pbe/examples/seqtmr0.asm
http://www.tanzilli.com/pbe/examples/seqtmr0.asm (1 of 3) [27/5/2003 12:57:59]
;Loop di scorrimento
MainLoop
;Invia sulla porta B il registro Shift cosi che ogni bit settato ad uno in Shift
;fara' accendere il led relativo
movf Shift,W
movwf PORTB
;Per ruotare le luci usa l'istruzione rlf che effettua lo shift a sinistra dei
bit
;contenuti nel registro ed inserisce nel bit 0 lo stato del bit di carry. Per
;questo motivo prima di effettuare l'istruzione rlf azzera il bit di carry con
l'istruzione
;bcf STATUS,C.
bcf STATUS,C
rlf Shift,F
;Quando lo shift raggiunge il bit 4 vengono invertiti i primi quattro bit del
registro
;Shift con i secondi quattro bit in modo da ricominciare il ciclo dal bit 0.
;
; Ecco cosa succede ai bit del registro Shift durante l'esecuzione di questo
loop:
;
; 00000001 <--- Valore iniziale (primo led acceso)
; 00000010 rlf
; 00000100 rlf
; 00001000 rlf
; 00010000 rlf a questo punto viene eseguita l'istruzione swapf ottenendo:
; 00000001 ...e cosi' via
btfsc Shift,4
swapf Shift,F
;Inserisce un ritardo tra una accensione e l'altra
call Delay
;Torna ad eseguire nuovamente il loop
goto MainLoop
;**************
; Subroutines
;**************
; Inserimento di un ritardo pari ad un secondo
; utilizzando il registro TMR0
;
; Il ritardo viene ottenuto dalla frequenza in uscita al PRESCALER pari a:
; 4Mhz / 4 / 32 = 31.250 Hz
; ... divisa per 250 dal TMR0 32.250 / 250 = 125 Hz
; ... e per 125 dal contatore Count 125 / 125 = 1Hz
http://www.tanzilli.com/pbe/examples/seqtmr0.asm
http://www.tanzilli.com/pbe/examples/seqtmr0.asm (2 of 3) [27/5/2003 12:57:59]
Delay
; Inizializza TMR0 per ottenere 250 conteggi prima di arrivare a zero.
; Il registro TMR0 e' un registro ad 8 bit quindi se viene incrementato
; nuovamentre quando arriva a 255 ricomincia a contare da zero.
; Se lo si inizializza a 6 dovra' essere incrementato 256 - 6 = 250 volte
; prima passare per lo zero.
movlw 6
movwf TMR0
; Il registro Count viene inizializzato a 125 in quanto il suo scopo e' far
; uscire il loop
movlw 125
movwf Count
;Loop di conteggio
DelayLoop
;TMR0 vale 0 ?
movf TMR0,W
btfss STATUS,Z
goto DelayLoop ;No, aspetta...
movlw 6 ;Si, reimposta TMR0 e controlla se
movwf TMR0 ;e' passato per 125 volte per lo zero
decfsz Count,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/seqtmr0.asm
http://www.tanzilli.com/pbe/examples/seqtmr0.asm (3 of 3) [27/5/2003 12:57:59]
;**************************************************
; Pic by example
; INPUT.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
SW1 EQU 4
SW2 EQU 5
SW3 EQU 6
SW4 EQU 7
ORG 0CH
;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
;Commuta sul secondo banco dei registri per accedere ai registri TRISA e TRISB
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
;Definizione della porta A
movlw 00011111B
movwf TRISA & 7FH
;Definizione della porta B
;Le linee da RB0 a RB3 vengono programmate in uscita per essere collegate ai
quattro led
;Le linee da RB4 a RB7 vengono programmate in ingresso per essere collegate ai
quattro pulsanti
movlw 11110000B
movwf TRISB & 7FH
;Commuta sul primo banco dei registri
bcf STATUS,RP0
http://www.tanzilli.com/pbe/examples/input.asm
http://www.tanzilli.com/pbe/examples/input.asm (1 of 2) [27/5/2003 12:57:59]
MainLoop
;Spegne tutti i led
clrf PORTB
;Se e' premuto il pulsante SW1 accende il LED1
btfss PORTB,SW1
bsf PORTB,LED1
;Se e' premuto il pulsante SW2 accende il LED2
btfss PORTB,SW2
bsf PORTB,LED2
;Se e' premuto il pulsante SW3 accende il LED3
btfss PORTB,SW3
bsf PORTB,LED3
;Se e' premuto il pulsante SW4 accende il LED4
btfss PORTB,SW4
bsf PORTB,LED4
goto MainLoop
END
http://www.tanzilli.com/pbe/examples/input.asm
http://www.tanzilli.com/pbe/examples/input.asm (2 of 2) [27/5/2003 12:57:59]
MOVLW MOVe Literal to W
D a W um valor constante
Sintaxi:
movlw k
Operao equivalente:
W = k
Descrio:
Passa ao acumulador W um valor constante k.
Esemplo:
org 00H
start
movlw 20
...
Aps ter executado este programa o acumulador W ir a 20.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo MOVLW
http://www.tanzilli.com/pbe/brasiliano/istruzioni/movlw.htm [27/5/2003 12:57:59]
MOVWF MOVe W to F
Move o conteudo do registro W para o registro F
Sintaxi:
movwf f
Operazo equivalente:
f = W
Descrio:
Esta instruo copia o conteudo do registro W no registro de paramnetro f.
Esemplo:
Caso queiramos escrever o valor 10H (esadecimale) no registro TMR0. A instruo a se executar sera a
seguinte:
movlw 10H ;Escreve no registro W o valor 10H
movwf 01H ;e o memoriza no registro TMR0
Para o registro utilizado pelo PIC para a funo especifica, solidademente no sera inserido diretamente o
endereo mas o relativo nome simblico definido no arquivo P16F84.INC. O codigo torna-se ento o
seguinte:
movlw 10H ;Escreva no registro W o valor 10H
movwf TMR0 ;e o memoriza no registro TMR0
Nota:
A execuo do MOVWF no influencia nenhum bit de status.

instruo MOVWF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/movwf.htm [27/5/2003 12:58:01]
LIST
; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc.
NOLIST
; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F84 microcontroller. These names are taken to match
; the data sheets as closely as possible.
; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:
; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F84
; 2. LIST directive in the source file
; LIST P=PIC16F84
; 3. Processor Type entry in the MPASM full-screen interface
;==========================================================================
;
; Revision History
;
;==========================================================================
;Rev: Date: Reason:
;2.00 07/24/96 Renamed to reflect the name change to PIC16F84.
;1.01 05/17/96 Corrected BADRAM map
;1.00 10/31/95 Initial Release
;==========================================================================
;
; Verify Processor
;
;==========================================================================
IFNDEF __16F84
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;==========================================================================
;
; Register Definitions
;
;==========================================================================
W EQU H'0000'
F EQU H'0001'
;----- Register Files------------------------------------------------------
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
http://www.tanzilli.com/pbe/examples/p16f84.inc
http://www.tanzilli.com/pbe/examples/p16f84.inc (1 of 3) [27/5/2003 12:58:02]
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'
;----- STATUS Bits --------------------------------------------------------
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
;----- INTCON Bits --------------------------------------------------------
GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
;----- OPTION Bits --------------------------------------------------------
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'
;----- EECON1 Bits --------------------------------------------------------
EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'
;==========================================================================
;
; RAM Definition
;
;==========================================================================
__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'
;==========================================================================
;
; Configuration Bits
;
http://www.tanzilli.com/pbe/examples/p16f84.inc
http://www.tanzilli.com/pbe/examples/p16f84.inc (2 of 3) [27/5/2003 12:58:02]
;==========================================================================
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
LIST
http://www.tanzilli.com/pbe/examples/p16f84.inc
http://www.tanzilli.com/pbe/examples/p16f84.inc (3 of 3) [27/5/2003 12:58:02]
BCF Bit Clear F
Azzera un bit nel registro F
Sintaxi:
bcf f,b
Operao equivalente:
f(b) = 0
Descrio:
Esta instruo zera o bit b do registro no endereo f .
Exemplo:
parm1 equ 0CH
org 00H

movlw 11111111B ;Valore inicial
movwf parm1
bcf parm1,0 ;D0=0
Ao termino do programa o registro parm1 sera 11111111B.
Nota:
Esta operao no influencia nenhum bit de status.

instruo BCF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/bcf.htm [27/5/2003 12:58:03]
CLRF CLeaR F register
Zera o registro F
Sintaxi:
clrf f
Operao equivalente:
f = 0
Descrio:
Esta instruao zera o valor contido no registro enderado do paramentro f.
Esemplo:
Uma ipotese, se quisermos zerar o registro TMR0 no qual o endereo 01H exadecimal, a instruo a se
executar ser:
clrf 01H
Ou, se incluirmos no endereo do nosso codigo o arquivo P16F84.INC, poderemos utilizar o nome
simbolico do registro TMR0.
clrf TMR0
Aps a execuo desta instruo o bit Z do registro STATUS sera colocado em 1.

instruo CLRF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/clrf.htm [27/5/2003 12:58:04]
BTFSS Bit Test F, Skip if Set
Pula a proxima instruo se um bit no registro F for 1
Sintaxi:
btfss f,b
Operao equivalente:
f(b) = 1 ? Se , pule uma instruo
Descrio:
Testa o bit b contido no registro do endereo f e pula a instuo seguinte se este for 1.
Esemplo:
parm1 equ 0CH
org 00H

movlw 11111111B ;Valor inicial
movwf parm1
loop
btfss parm1,0 ;D0 = 1 ? Se,
goto loop ;No, executa o loop
Este programa executa um loop infinito o mesmo programa no executar o loop se substituirmos a
instruo:
movlw 11111111B ;Valor inicial
con l'istruzione:
movlw 11111110B ;Valor inicial
Nota:
Esta instruo no influncia nenhum bit de status.

instruo BTFSS
http://www.tanzilli.com/pbe/brasiliano/istruzioni/btfss.htm [27/5/2003 12:58:06]
GOTO GO TO address
Desvia a execuo do programa para o endeo especificado k
Sintaxi:
goto k
Descrio:
Determina o desvio do programa em execuo para o endereo k. O parametro k pode ser especificado
utilizando-se diretamente um valor numerico do endereo ou ento o relativo label.
Esemplo:
org 00H
loop
goto loop
Este programa executa um cilclo (loop) infinito.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo GOTO
http://www.tanzilli.com/pbe/brasiliano/istruzioni/goto.htm [27/5/2003 12:58:07]
BSF Bit Set F
Coloca em um o bit no registro F
Sintaxi:
bsf f,b
Operao equivalente:
f(b) = 1
Descrio:
Esta instruo coloca em um o bit b do registro no endereo f.
Exemplo:
parm1 equ 0CH
org 00H

movlw 00000000B ;Valore inicial
movwf parm1
bsf parm1,0 ;D0=1
Ao terminar o programa o registro parm1 ser 00000001B.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo BSF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/bsf.htm [27/5/2003 12:58:09]
Descrico dos pinos do PIC16F84

1
RA2
uma linha de I/O programavel em entrada ou saida da unidade.
Corresponde ao BIT 2 da PORTA A.
2
RA3
uma linha de I/O programavel em entrada ou saida da unidade.
Corresponde ao BIT 3 da PORTA A.
3
RA4 / RTCC
um pino multi funco que pode ser programado como uma linha normal de I/O ou como linha
de clock para entrada em sentido ao contador RTCC.
Se programada como linha de I/O corresponde ao BIT 4 da PORTA A ao contrario de outra linha
de I/O, quando esta linha funciona como saida, trabalha em coletor aberto.
4
MCLR / VPP
Em condico normal de funcionamento desenvolve a a funco de Master CLeaR ou seja Reset
estara ativo a nivel 0. Pode ser conectado a um circuito de reset externo ou simplesmente
conectando-o ao positivo da alimentaco.
Quando o PICl PICvier posto em Program Mode sera utilizado como entrada para a tenso de
programaco Vpp.
5
VSS
o pino que vai conectado ao negativo da tenso de alimentaco.
6
RB0
uma linha de I/O programavel em entrada ou em saida.
Corrisponde ao BIT 0 da PORTA B e pode ser programada para gerar interrupco.
7
RB1
uma linha de I/O programavel em entrada ou em saida.
Corresponde ao BIT 1 da PORTA B.
8
RB2
uma linha de I/O programavel em entrada ou em saida.
Corresponde ao BIT 2 da PORTA B.
Descrizione dei pin del PIC1F84
http://www.tanzilli.com/pbe/brasiliano/gloss/pin.htm (1 of 2) [27/5/2003 12:58:14]
9
RB3 uma linha de I/O programavel em entrada ou em saida.
Corresponde ao BIT 3 da PORTA B.
10
RB4 uma linha de I/O programavel em entrada ou em saida.
Corresponde ao BIT 4 da PORTA B.
11
RB5 uma linha de I/O programavel em entrada ou em saida.
Corresponde ao BIT 5 da PORTA B.
12
RB6 uma linha de I/O programavel em entrada ou saida.
Corresponde ao BIT 6 da PORTA B.
13
RB7 uma linha de I/O programavel em entrada ou saida.
Corresponde ao BIT 7 da PORTA B.
14
VDD
o terminal positivo de alimentaco do PIC.
em todas as tres verses disponiveis do PIC16F84 (comercial, industrial e automotiva) a tenso
pode assumir um valor que vai de um minimo de 2.0 volts a um maximo de 6.0 volts.
15
OSC2 / CLKOUT
um pino de conecco no caso de se utilizar um cristal de quartzo para gerar o clock. E como
saida de clock caso for aplicado um oscilador RC externo.
16
OSC1 / CLKIN
um pino de conecco para o caso de se utilisar um cristal de quartzo ou um circuito RC para
gerar o clock. E tamabem como entrada caso utilizemos um oscilador externo.
17
RA0
uma linha de I/O programavel em entrada ou saida.
Corresponde ao BIT 0 da PORTA A.
18
RA1
uma linha de I/O programavel em entrada ou saida.
Corresponde ao BIT 1 da PORTA A.

Descrizione dei pin del PIC1F84


http://www.tanzilli.com/pbe/brasiliano/gloss/pin.htm (2 of 2) [27/5/2003 12:58:14]
Glossario de termos utilizados
RESET
O termo reset representa o zeramento do software em funcionamento como tambm do hardwarese ou seja todos os
dispositivos internos do PIC so zerados.
O reset pode ser obtido ligando-se ou desligando-se o PIC ou conctando a massa o pino MCLR.
No reset o programa em execuo sera imediatamente interrompido, todos os registradores de arquivos internos
reinicializados e o programa reativado do inicio ou seja do Reset Vector, ou ento da instruo memorizada na locao
0x0000(no PIC 16F84).

Glossario (reset)
http://www.tanzilli.com/pbe/brasiliano/gloss/reset.htm [27/5/2003 12:58:15]
Glossario de termos utilizados
SUBROTINA
um fraguimento de instruo chamado mais de uma vez dentro um programa. Tipicamente uma subrotina ser
colocada em um programa seja para separar logicamente a funo do resto do codigo ou seja para economizar espao de
memoria ecrevendo-se uma s vez o grupo de instrues necessaria.
A extrutura de base de uma subrotina e a seguinte:
Label
istruzione 1
istruzione 2
...
istruzione n
return
Label um nome da subrotina que poder ser utilizado dentro do codigo para rechamar atravz de uma instruo
CALL. Se por exemplo escrever-mos uma subrotina que soma dois numeros, podemos colocar no lugar da palavra
Label a palavra Somma e ento rechamar a subrotina quando for necessario fazer uma soma com a instruo.
call Somma
A instruo retlw seve ser sempre colocada no fim de uma subrotina de modo tal que a CPU possa rechamar a execuo
do programa da proxima instruo ao call.

Glossario (subroutine)
http://www.tanzilli.com/pbe/brasiliano/gloss/subr.htm [27/5/2003 12:58:17]
RETURN RETURN from subroutine
Retorna de uma subrotina
Sintaxi:
return
Descrio:
Esta instruo deve ser inserida no termino de cada subrotina para retornar a execuo do programa
principal.
Esemplo:
org 00H

call mySub1
....
mySub1
nop
return
Nota:
No PIC16F84 podemos fazer apenas 8 chamadas a subrotinas, do tipo:
org 00H

call mySub1
....
mySub1
call mySub2
return
mySub2
call mySub3
return
mySub3
return
Nota:
Esta instruo no influencia nenhum bit de status.
Veja antes a instruo RETLW.
instruo RETURN
http://www.tanzilli.com/pbe/brasiliano/istruzioni/return.htm (1 of 2) [27/5/2003 12:58:19]

instruo RETURN
http://www.tanzilli.com/pbe/brasiliano/istruzioni/return.htm (2 of 2) [27/5/2003 12:58:19]
CALL Subrotina CALL
Chamada a uma subrotina
Sintaxi:
call k
Descrio:
Rechama em execuo uma subroutine memorizada no endereo k. O paramentro k pode ser
especificado utilizando-se diretamante o valor numerico do endereo ou ento o relativo label.
Esemplo:
org 00H

call ledOn
...
;Subroutine di accensione di un led
ledOn
bsf PORTB,LED1
return
Quando a CPU do PIC encontra uma instruo CALL, memoriza no STACK o valor do registro PC+1 de
modo a poder retornar para instruo aps o CALL, em seguida escreve no PC o endereo da subrotina
pulando a execuo desta ultima.
O valor original do PC sera recuperado pela subrotina com a execuo da instruo de retorno RETURN
ou RETLW.
No PIC16F84 esto disponiveis 8 niveis de stack, para qual o numero maximo de CALL 8, ou seja a
instruo CALL dentro de uma subrotina pode ter no maximo 8 cahamadas ou 8 niveis.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo CALL
http://www.tanzilli.com/pbe/brasiliano/istruzioni/call.htm [27/5/2003 12:58:21]
RETLW RETurn Literal to W
Retorna de uma subrotina com uma constante em W
Sintaxi:
retlw k
Descrio:
Esta instruo retorna o controle de uma subrotina ao programa principal. A diferna da instruo
RETURN que permite passar, atravez do acumulador W, o valor k ao programa principal.
Esemplo:
rtc equ 0CH
org 00H

call mySub1
movwf rtc
...
mySub1
nop
retlw 10
Uma vez executado esse programa ele memorizar no registro rtc o valor 10 passado pela subrotina
mySub1.
Nota:
Esta instruo no influencia nenhum bit de ststus.
Veja antes a instruo RETURN.

instruo RETLW
http://www.tanzilli.com/pbe/brasiliano/istruzioni/retlw.htm [27/5/2003 12:58:26]
NOP No OPeration
Nenhuma operao
Sintaxi:
nop
Descrio:
Esta instruo no executa nenhuma operao mas util para inserir retardo par de um ciclo de maquina.
Esemplo:
Utilizando um cristal de quartzo de 4MHz podemos obter um retardo par de 1s para cada instruo
NOP colocada no nosso codigo.
nop ;Executa um retardo par de 1s
Nota:
NOP no influencia nehum bit de status.

instruo NOP
http://www.tanzilli.com/pbe/brasiliano/istruzioni/nop.htm [27/5/2003 12:58:27]
;**************************************************
; Pic by example
; SEQ.ASM
;
; (c) 2001, Sergio Tanzilli
; http://www.tanzilli.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
ORG 0x0C
Count RES 2
Shift RES 1
;Reset Vector
;Program start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11110000'
movwf TRISB
bcf STATUS,RP0
movlw B'00000001'
movwf Shift
MainLoop
movf Shift,W
movwf PORTB
bcf STATUS,C
rlf Shift,F
btfsc Shift,4
swapf Shift,F
call Delay
goto MainLoop
; Subroutines
http://www.tanzilli.com/pbe/examples/seq.asm
http://www.tanzilli.com/pbe/examples/seq.asm (1 of 2) [27/5/2003 12:58:28]
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END
http://www.tanzilli.com/pbe/examples/seq.asm
http://www.tanzilli.com/pbe/examples/seq.asm (2 of 2) [27/5/2003 12:58:28]
A A
B B
C C
D D
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
VER: OF: PAGES: DATE:
ENGINEER:
NOTE:
PROJECT:
2 NOV 1998
PIC BY EXAMPLE
1 1 1.0
EXAMPLE N.2
SERGIO TANZILLI
WWW.PICPOINT.COM
GND GND
C3
22PF
C2
22PF
X1
4
M
H
Z
+5
6
RB0
7
RB1
8
RB2
9
RB3
10
RB4
11
RB5
12
RB6
13
RB7
17
RA0
18
RA1
1
RA2
2
RA3
3
RTCC/RA4 4
MCLR
16
OSC1/CLKIN
15
OSC2/CLKOUT
5
VSS
14
VDD
U1
PIC16C84
1
IN
2
GND
3
OUT
U2
7805
C6
1
0
0
K
P
F
C5
1
0
0
K
P
F
C7
4
7
U
F
C4
1
0
0
U
F
GND
+5 +12
+12VCC
GND
1
2
3
4
5
6
J1
DIN_6
Y
A
P
P
!
C
1
1
0
0
K
P
F
R
1
1
0
K
GND
GND
C A
D4
LED
R5
470
C A
D3
LED
R4
470
C A
D2
LED
R3
470
R2
470
C A
D1
LED
Glossario de termos utilizados
ROM, PROM, EPROM, EEPROM, FLASH
So memorias que no perdem o seu conteudo com a falta de alimentao e por esse motivo so normalmente utilisadas
em sistemas microprocessados para armazenar o programa a ser executado e em alguns caso para armazenar dados
permanentes.
Vjamos a diferna entre os varios tipos:
ROM - Read Only Memory (memoria somente de leitura) uma memoria ja programada que no pode
ser modificada ou apagada.
PROM - Programmable Read Only Memory (memoria programavel somente para leitura) uma
memoria ROM no prviamente programada. A programao pode ser feita atravz de um equipamento
especial de programao chamado de programador de PROM.
EPROM - Erasable Programmable Read Only Memory (memoria somente de leitura programvel e
apagavel) uma memoria PROM que pode ser apagada se exposta a luz de uma lampada ultra violeta.
Por este motivo o dispositivo dotado de EPROM existe uma janla transparente na qual possivel fazer
passar para dentro do chip a luz UV.
EEPROM - Electrical Erasable Programmable Read Only Memory (memoria somente de leitura
programavel, e apagavel eletricamente) uma memoria EPROM que pode ser apagada aletricamente sem
o auxilio da lampada UV.
FLASH - Assemelha-se em tudo e para tudo com a EEPROM ou seja uma memoria que pode ser
apagada e modificada eletricamente sem o auxilio de lamapada UV.

Glossario (rom, ram, eprom, eeprom, flash)


http://www.tanzilli.com/pbe/brasiliano/gloss/rom.htm [27/5/2003 12:58:30]
Glossario de termos utilizados
OPCODE
OPerativo CODE (do ingls codigo operativo) o valor numrico que identifica univocalmante uma instruo do PIC e
de seu parametro de funcionamento.
Por exemplo a instruo:
CLRWDT
tem um opcode par de 00 0000 0110 0100 (0x0064 in esadecimale) que diferente de qualquer outro codigo operativo
de qualquer outra instruo.
No caso de instruo com paramentro, como por exemplo:
CLRF F
onde F o endereo do registro a ser zerado, no opcode sera colocado antes o paramentro. Por exemplo se quisermos
zerar no Registrador de arquivo o endereo 0x0C, o opcode ser:
00 0001 1000 1100
onde a parte em vermelho o codigo que identifica a instruo e a parte em azul o parametro da instruo. Neste caso
o endereo do registro (0001100 = 0x0C).

Glossario (opcode)
http://www.tanzilli.com/pbe/brasiliano/gloss/opcode.htm [27/5/2003 12:58:32]
Glossario dei termini utilizzati
RAM
um tipo de memria que mantem os dados memorizados enquanto for mantida a alimentao. O acesso interno de
uma memria RAM pode ser feito em leitura ou escrita, ou em qualquer posio de memria especificando-se o
endereo da posio que se quer utilizar.
Dada a exetrma facilidade de escrever e ler uma RAM esta sera normalmente utilizada em um sistema microprocessado
para memorizar o dado de trabalho gerado dinamicamente pelo programa em execuo(variaveis,array, etc.).
Siglas de Random Access Memory ou seja (memoria de acesso aleatrio).

Glossario (ram)
http://www.tanzilli.com/pbe/brasiliano/gloss/ram.htm [27/5/2003 12:58:33]
www.tanzilli.com
http://www.tanzilli.com/index.php3?id=17 (4 of 4) [27/5/2003 12:59:36]
www.tanzilli.com
http://www.tanzilli.com/index.php3?page=prodotti.php&pclass=5 (6 of 6) [27/5/2003 13:00:22]
Glossario de termos utilizados
CPU
Siglas de Central Process Unit (unidade de processamento central) a componente que em um sistema de
microprocessador executa as intrues de programa.

Glossario (cpu)
http://www.tanzilli.com/pbe/brasiliano/gloss/cpu.htm [27/5/2003 13:05:13]
Diretivas do assembler MPASM
PROCESSADOR
Sintaxi
processor <processor_type>
Descrio
Define o tipo de processador quer utilizar.
Exemplo
processor 16F84

Glossario (processor)
http://www.tanzilli.com/pbe/brasiliano/gloss/processor.htm [27/5/2003 13:05:30]
AVVERTENZA !
Il progetto Yapp! non viene pi supportato dall'autore.
Questo programmatore ormai superato dai tempi per cui l'autore mantiene in linea
queste pagine solo per scopi didattici e ne sconsiglia vivamente la realizzazione per altri
scopi. Non viene inoltre fornita alcuna garanzia di funzionamento.
Lo Yapp! non viene assolutamente commercializzato dall'autore in nessuna forma per cui
eventuali versioni commerciali esistenti in commercio sono state realizzate in modo
assolutamente indipendente.
Yet Another Pic Programmer - Versione 2.7
Programmatore RS232 ICSP per PICmicro
Autore: Sergio Tanzilli ( sergio@tanzilli.com )
Ultimo aggiornamento: 26 luglio 2000
Introduzione
Note da leggere attentamente prima di realizzare lo Yapp!
Modelli di PIC programmabili
Come si usa lo Yapp!
Realizzazione
Links & Download
Note sulla programmazione ICSP dei PICmicro
Protocollo di comunicazione tra Yapp! e PC
Elenco dei comandi
Versioni firmware
Ringraziamenti
Software di gestione Yapp!
Home page di Sergio Tanzilli ( http://www.tanzilli.com )
Introduzione
Lo Yapp! un programmatore in-circuit seriale compatibile con gran parte dei PICmicro che
supportano la programmazione ICSP (In Circuit Serial Programming) di Microchip. Lo Yapp!
nato come tool di supporto e come esempio stesso di applicazione basata su PICmicro per ilcorso
Pic By Example disponibile gratuitamente su internet all'indirizzo ( http://www.tanzilli.com/pbe ).
In queste pagine viene presentata tutta la documentazione necessaria per la sua realizzazione
(schemi elettrici, source, manuali, ecc.).
Note da leggere attentamente prima di realizzare lo Yapp!
Per le modalit di programmazione adottate, lo Yapp! viene classificato, secondo le specifiche
Microchip, come un programmatore di tipo "prototype" o "development" e non adatto quindi ad un
uso professionale.
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (1 of 11) [27/5/2003 13:05:48]
Si sconsiglia vivamente la realizzazione dello Yapp! per la duplicazione di chip per il crack di
dispositivi hardware di qualsiasi genere. L'autore non fornisce alcuna informazione o supporto di
alcun genere a riguardo.
La versione attuale dello Yapp! non compatibile con i chip 12C508A e 12C509A ed in generale
con tutti i chip la cui sigla termina con la lettera A o B.
Lo Yapp! non un programmatore commerciale, o meglio, esistono alcune societ ed alcuni
privati che hanno realizzato lo Yapp! e che lo vendono in Kit o gi montato e funzionante. L'autore
non in alcun modo responsabile per i malfunzionamenti che questi prodotti dovessero presentare
per i quali vanno contattati i rispettivi costruttori.
Per poter realizzare lo Yapp! necessario disporre di un PIC16F84 opportunamente
pre-programmato. Il programma da inserire su questo PICmicro disponibile in queste pagine ma
comunque necessario trovare il modo di programmare questo PICmicro.
L'autore non si assume alcuna responsabilit su eventuali malfunzionamenti o danni causati a cose
o persone derivanti dall'uso dello Yapp! o, in genere, dall'uso delle informazioni presentate su
queste pagine. Tutto il materiale viene fornito cos come senza nessuna forma di garanzia sulla
sua validit .
L'autore non si assume alcuna responsabilit su eventuali malfunzionamenti o danni causati a cose
o persone derivanti dall'uso dello Yapp! o, in genere, dall'uso delle informazioni presentate su
queste pagine. Tutto il materiale viene fornito cos come senza nessuna forma di garanzia sulla
sua validit .
Modelli di PIC programmabili
Anche se nato per i PIC16C84, lo Yapp! in grado di programmare diversi modelli di PICmicro.
Essendo un progetto "aperto" e disponibile gratuitamente per ovvie ragioni di costo e di tempo,
l'autore non ha potuto effettuare test su tutti i modelli di PICmicro esistenti. Grazie alla
collaborazione di alcuni "beta tester" stato comunque possibile verificarne il corretto
funzionamento su alcuni modelli.
Ecco i modelli su cui lo Yapp! ha dato prova di un buon livello di funzionamento:
12C508, 12C509, 16C620, 16C621, 16C63, 16C71, 16C72, 16C73, 16C84, 16F84
Lo Yapp! comunque predisposto su carta per lavorare su altri modelli anche se nessuno finora ha
fatto delle prove vere e proprie. I modelli supportati "teoricamente" sono i seguenti:
16C554, 16C556, 16C558, 16C61, 16C62, 16C620, 16C621, 16C622, 16C64, 16C65, 16C66,
16C67, 16C710, 16C711, 16C74, 16C76, 16C77, 16F83, 16C923, 16C924, 16CE623, 16CE624,
16CE625
Come si usa lo Yapp!
Come visibile nella figura seguente, lo Yapp! si connette al PC tramite la porta seriale RS232 ed al
prototipo tramite un connettore a 6 pin.
A differenza di molti altri programmatori dello stesso tipo, lo Yapp! non utilizza i criteri della porta
seriale (DTS e RTS) per generare i segnali di programmazione ma solamente le linee RXD e TXD
per comunicare ad alto livello con il PC. Per permettere questo lo Yapp! contiene a sua volta un PIC
programmato che ne gestisce completamente le funzioni. Questa caratteristica consente di utilizzare
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (2 of 11) [27/5/2003 13:05:48]
lo Yapp! con diversi sistemi operativi e linguaggi di programmazione ma presenta lo svantaggio di
dover disporre di un PICmicro gi programmato per poter essere realizzato.
In queste pagine viene fornita la documentazione completa del protocollo di comunicazione tra
Yapp! e PC per favorire chi volesse sviluppare un proprio programma di gestione su PC. Vengono
inoltre forniti alcuni programmi di gestione per diversi sistemi operativi realizzati da diversi autori.
Lo Yapp! si occupa di generare tutti i segnali necessari per programmare il PICmicro a partire dai
comandi inviato dal PC sulla porta RS232. In pratica lo Yapp! si occupa di tradurre i comandi dal
formato seriale asincrono a 9600 baud 8,1,N nel formato Microchip e viceversa. Tutte le
temporizzazioni interne necessarie alla corretta programmazione vengono gestite dal micro
(anch'esso un PICmicro) presente sullo Yapp! liberando il programma di gestione su PC dalle
problematiche di gestione delle temporizzazione. Questa caratteristica ci consente di scrivere il
programma di gestione con linguaggi ad alto livello tramite i quali risulta difficile gestire
temporizzazioni precise.
Il collegamento tra lo Yapp! e la scheda da programmare avviene tramite un connettore a sei
contatti sul quale sono presenti i seguenti segnali:
MCLR ( pin1 ) Da collegare al pin MCLR del PIC da programmare.
DATA ( pin 2 ) Da collegare al pin RB7 del PIC da programmare.
CLOCK ( pin 3 ) Da collegare al pin RB6 del PIC da programmare.
GND ( pin 4 ) Massa.
N.C. ( pin 5 ) Questo pin non viene collegato e serve come chiave per evitare
inserzioni errate.
VCC ( pin 6 ) Tensione di alimentazione proveniente dalla scheda prototipo, viene
utilizzata per alimentare lo YAPP e deve essere compresa tra 12,6 e 14,6 volt.
All'interno del corso Pic By Example ( http://www.tanzilli.com/pbe ) troverete molti schemi di prototipi
predisposi per essere collegati allo Yapp!.
Realizzazione
Come possiamo vedere dallo schema elettrico, lo Yapp! utilizza un PICmicro ( U1 ) per il suo
funzionamento, in particolare un PIC16F84 di cui viene fornito il sorgente in assembler. In alternativa
possibile utilizzare anche un PIC16C84 cambiando semplicemente la direttiva PROCESSOR
all'interno del file sorgente YAPP.ASM.
Come gi dettp il PICmicro a bordo dello Yapp! si occupa di interpretare i comandi ricevuti dal PC
tramite la porta RS232 e di inviare i segnali di programmazione corretti al PIC da programmare.
Il circuito integrato U2, un MAX232, si occupa di convertire i segnali RS232 la cui tensione varia da
12 volt a + 12 volt nei rispettivi segnali TTL da 0 a 5 gestibili dal PIC16F84 (U1). In particolare sul
pin 12 (RB6) del PIC viene inviato il TxD proveniente dal PC e dal pin 11 (RB5) viene generato il
segnale da inviare allRxD del PC.
Lo YAPP si comporta come un dispositivo DCE (Data Comunication Equipment) e per collegarlo al
PC occorre utilizzare un cavo dritto, ovvero un cavo in cui i connettori alle estremit siano collegati
pin a pin. Un cavo modem pu andare benissimo mentre assolutamente da evitare luso di un
cavo null-modem nel quale vengono scambiati i collegamenti tra i pin dei connettori. Chi volesse
realizzare in proprio il cavo di collegamento pu seguire lo schema riportato nella seguente figura:
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (3 of 11) [27/5/2003 13:05:48]
Il diodo led verde D1 ed il diodo led rosso D2 servono rispettivamente ad indicare quando lo Yapp!
pronto a ricevere comandi dal PC (stato di READY) o quando lo Yapp! entrato in
PROGRAMMAZIONE.
Quando il led verde acceso, la linea MCLR viene messa a +5 volt consentendo al PIC appena
programmato di iniziare lesecuzione del codice.
Lalimentazione dello Yapp! viene ricavata direttamente dalla scheda prototipo tramite il pin 6 del
connettore e quindi ridotta a +5 volt dallintegrato U3 per alimentare gli integrati U1 e U2. La +12 volt
viene utilizzata anche per generare la tensione di programmazione Vpp inviata al PIC tramite il pin
MCLR.
Per realizzare lo Yapp! disponibile il master di un circuito stampato singola faccia.
Links & Download
Schema elettrico dello Yapp! versione 2.7 YAPP27.PDF
Master PCB ) versione 5 YAPP27.PCB . Dal sito Holophase potrete scaricare una demo per
visualizzare il PCB: ( http://www.holophase.com )
Sorgenti in assembler del firmware versione 2.7 per il PIC16F84 montato sullo Yapp! ( U1 )
FWYAPP27.ZIP
Software di gestione
Corso per principianti sui PICmicro "Pic By Example": http://www.tanzilli.com/pbe
Note sulla programmazione ICSP dei PICmicro
La programmazione ICSP (In-Circuit Serial Programming) implementata dalla Microchip per la
programmazione di alcune famiglie di PICmicro, consente di programmare i chip direttamente sulla
scheda destinazione abbreviando i tempi di sviluppo e produzione.
Queste pagine contengono una breve introduzione alla programmazione ICSP per i PIC16F84.
Tutta la documentazione necessaria per programmare altre famiglie di PIC disponibile
gratuitamente sul sito Microchip ( http://www.microchip.com ) o sul CD distribuito sempre da
Microchip.
La programmazione ICSP viene effettuata tramite tre soli collegamenti + massa tra il programmatore
ed il PIC da programmare ovvero:
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (4 of 11) [27/5/2003 13:05:48]
MCLR Piedino di master clear (pin 4 su PIC16F84) utilizzato per applicare la tensione
di programmazione VPP al chip.
RB6 Linea 6 della porta B (pin 12 su PIC16F84) utilizzata come linea CLOCK.
RB7 Linea 7 della porta B (pin 13 su PIC16F84) utilizzata come linea DATA.
La modalit di comunicazione con il PIC di tipo seriale sincrono in cui i bit trasmessi sulla linea
DATA (pin RB7) vengono scanditi dal segnale generato sulla linea di CLOCK (pin RB6).
Questultimo viene generato dal programmatore mentre il DATA bidirezionale a seconda
delloperazione in corso. Nella seguente figura viene riportato un esempio di trasmissione di un
comando dal programmatore al PIC.
Tutte le operazioni sul PIC da programmare devono essere precedute dallinvio di un comando da
parte del programmatore per comunicare al PIC loperazione che si intende eseguire. La lunghezza
dei comandi sempre di 6 bit a volte seguiti da una trasmissione di 14 bit contenenti il valore da
programmare. Di seguito viene riportato a titolo d'esempio lelenco dei comandi riconosciuti dai
PIC16x84:
Load Configuration ( 000000B )
Invia al PIC il prossimo dato da scrivere in memoria programma. Al codice comando
segue immediatamente il dato da memorizzare.
Load Data for Program Memory ( 000010B )
Invia al PIC il prossimo dato da scrivere in memoria dati. Al codice comando segue
immediatamente il dato da memorizzare.
Read Data from Program Memory ( 000100B )
Legge dal PIC la locazione corrente dallarea programma. Appena riceve questo
comando il PIC trasmette al programmatore il valore letto.
Increment Address ( 000110B )
Incrementa il puntatore alla locazione corrente nella memoria
dati/configurazione/programma.
Begin Programming ( 001000B )
Programma la locazione corrente.
Load Data for Data Memory ( 000011B )
Invia al PIC il prossimo valore da scrivere in memoria dati. Al codice comando segue
immediatamente il dato da memorizzare.
Read Data from Data Memory ( 000101B )
Legge dal PIC la locazione corrente dalla memoria dati. Appena riceve questo
comando il PIC trasmette al programmatore il valore letto.
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (5 of 11) [27/5/2003 13:05:48]
Bulk Erase Program Memory ( 001001B )
Cancella lintera memoria programma
Bulk Erase Data Memory ( 001011B )
Cancella lintera memoria dati
Il PIC16F84 dispone internamente di tre aree di memoria distinte programmabili
dallesterno: larea programma pari ad 1 kbyte, larea dati pari a 64 byte e larea
configurazione pari a 8 byte. Tutte le aree di memoria sono implementate su FLASH.
Le sole aree di programma e dati possono essere lette dallesterno.
Per poter scrivere in una qualsiasi locazione il programmatore deve inviare al PIC uno
dei comandi LOAD seguito da 14 bit contenenti il dato da memorizzare. Volendo ad
esempio scrivere nella locazione 0 della memoria programma baster inviare al PIC la
sequenza:
Load Data for Program Memory + valore a 14 bit
Begin Programming
Il comando Load Data trasferisce semplicemente il dato a 14 bit in un buffer
provvisorio allinterno del PIC, il comando Begin Programming effettua la scrittura
vera e propria del dato nella memoria programma. Lindirizzo della locazione di
memoria che viene scritta contenuto in un puntatore di scrittura azzerato
automaticamente non appena il PIC viene messo in programmazione (MCLR=12 volt)
ed incrementato tramite il comando:
Increment Address
A questo punto per programmare la locazione successiva baster trasmettere
nuovamente i seguenti comandi:
Load Data for Program Memory + valore locazione 1
Begin Programming
Increment Address
e cos via fino alla scrittura completa del programma. Per poter scrivere in una
locazione di memoria non necessario effettuare operazioni di cancellazione.
Larea dati e larea configurazione si programmano con le stesse modalit utilizzando il
comando LOAD relativo. Larea dati unarea FLASH visibile anche dal programma in
esecuzione sul PIC, la sua programmazione pu essere utile per assegnare dei valori
iniziali alle variabili utilizzate dal nostro programma. Larea configurazione contiene
dati invisibili al programma su PIC ma utili per determinare la modalit di
funzionamento di alcuni dispositivi interni al PIC quali loscillatore di clock, il watchdog
timer, ecc. che vedremo successivamente durante il nostro corso.
Protocollo di comunicazione tra Yapp! e PC
Lo Yapp! si connette al PC tramite una porta seriale RS232 ed al prototipo tramite un
connettore a 6 pin come rappresentato in figura:
I soli segnali utilizzati sono l'RXD ed il TXD, la velocit di trasferimento fissa a 9600
baud, 8 data bit, no parity, 1 stop bit. La sincronizzazione tra il PC e lo Yapp! viene
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (6 of 11) [27/5/2003 13:05:48]
effettuata via software. In pratica solo il PC pu iniziare un trasmissione mentre lo
Yapp! deve sempre rispondere con almeno un byte. Se lo Yapp! non risponde, il PC
deve uscire per timeout e segnalare la mancanza di connessione con lo Yapp!. Il PC
inizia la trasmissione inviando da 1 a 3 byte a seconda del tipo di comando richiesto.
Lo Yapp! risponde sempre con 1 o 2 byte.
Elenco dei comandi
Il primo carattere trasmesso dal PC allo Yapp! sempre un comando. Alcuni comandi
possono essere seguiti da 1 o 2 byte di dati. Nella seguente tabella vengono riportati
tutti i comandi riconosciuto dal firmware dello Yapp! versione 2.7.
Comando Formato Descrizione
LOAD_CONFIG 0x00
DATA_LO
DATA_HI
Load Configuration
Scrive nel registro di programmazione del PIC il prossimo
dato da scrivere nella memoria di configurazione. Se si
trasmette questo comando subito dopo un comando
PROG_MODE il puntatore di scrittura interno al PIC viene
settato all'indirizzo 0x2000 (inizio della memoria di
configurazione)
DATA il dato da memorizzare nel registro di
programmazione.
Return: ACK (0x10)
Comando standard Microchip
LOAD_DATA 0x02
DATA_LO
DATA_HI
Load Data for Program Memory
Scrive nel registro di programmazione del PIC il prossimo
dato da scrivere nella memoria programma. Se si trasmette
questo comando subito dopo un comando PROG_MODE il
puntatore di scrittura interno al PIC viene settato all'indirizzo
0x0000 (inizio della memoria programma)
DATA il dato da memorizzare nel registro di
programmazione.
Return: ACK (0x10)
Comando standard Microchip
READ_DATA 0x04 Read Data from Program Memory
Legge dal PIC la locazione corrente dallarea programma.
Return: In risposta il PIC trasmette il dato nella forma
DATA_LO, DATA_HI.
Comando standard Microchip
INC_ADDR 0x06 Increment Address
Incrementa il puntatore alla locazione corrente nella memoria
dati/configurazione/programma.
Return: ACK (0x10)
Comando standard Microchip
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (7 of 11) [27/5/2003 13:05:48]
BEGIN_PROG 0x08 Begin Programming
Programma la locazione corrente. Con questo comando viene
programmata la locazione corrente con il valore contenuto nel
registro di programmazione. Il comando viene inviato al PIC
direttamente senza alcun controllo. L'unica operazione
effettuata dallo YAPP! l'inserimento di un tempo di attesa
(impostato con i comandi SET_FLASH_MODE,
SET_EPROM_MODE) prima di rispondere con un ACK. Vedi
comando WPL.
Return: ACK (0x10)
Comando standard Microchip
LOAD_DATA_DM 0x03
DATA_LO
DATA_HI
Load Data for Data Memory
Scrive nel registro di programmazione del PIC il prossimo
dato da scrivere nella memoria dati. Se si trasmette questo
comando subito dopo un comando PROG_MODE il puntatore
di scrittura interno al PIC viene settato all'inizio dell'area dati.
DATA il dato da memorizzare nel registro di
programmazione.
Return: ACK (0x10)
Comando standard Microchip
Applicabile solo ai PIC16x84
READ_DATA_DM 0x05 Read Data from Data Memory
Legge dal PIC la locazione corrente dallarea dati
Return: In risposta il PIC trasmette il dato nella forma
DATA_LO, DATA_HI.
Comando standard Microchip
Applicabile solo ai PIC16x84
END_PROG 0x0E End programming
Termina la programmazione dei PIC dotati di EPROM.
Return: ACK (0x10)
Comando standard Microchip
Applicabile solo ai PIC dotati di EPROM
RESET_MODE 0x40 Reset Mode
Applica al PIC da programmare 0 volt sul pin MCLR (reset) e
5 volt sui pin DATA (RB7) e CLOCK (RB6). In questa
condizione il PIC da programmare si trova in stato di reset.
Return: ACK (0x10)
Comando YAPP!
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (8 of 11) [27/5/2003 13:05:48]
PROG_MODE 0x41 Programming Mode (TMOD1)
Applica al PIC da programmare 12 volt sul pin MCLR (reset)
e 0 volt sui pin DATA (RB7) e CLOCK (RB6). In questa
condizione il PIC da programmare si trova in stato di
programmazione. Questo comando deve essere inviato prima
di qualsiasi comando diretto al PIC.
Return: ACK (0x10)
Comando YAPP!
RUN_MODE 0x42 Run Mode
Applica al PIC da programmare 5 volt sul pin MCLR (reset)
ed 1 volt sui pin DATA (RB7) e CLOCK (RB6). In questa
condizione il PIC da programmare si trova in stato di running.
Questo comando deve essere inviato prima di uscire dal
programma di gestione dello YAPP! per mettere lo YAPP! in
stato di riposo.
Return: ACK (0x10)
Comando YAPP!
SET_CLOCK_HI 0x43 Set Clock Hi
Applica 1 volt sul pin CLOCK (RB6) del PIC da
programmare. Questo comando viene utilizzato
esclusivamente per verificare il funzionamento dell'hardware
dello YAPP!.
Return: ACK (0x10)
Comando YAPP!
SET_CLOCK_LO 0x44 Set Clock Lo
Applica 0 volt sul pin CLOCK (RB6) del PIC da
programmare. Questo comando viene utilizzato
esclusivamente per verificare il funzionamento dell'hardware
dello YAPP!.
Return: ACK (0x10)
Comando YAPP!
SET_DATA_HI 0x45 Set Data Hi
Applica 1 volt sul pin DATA (RB7) del PIC da programmare.
Questo comando viene utilizzato esclusivamente per
verificare il funzionamento dell'hardware dello YAPP!.
Return: ACK (0x10)
Comando YAPP!
SET_DATA_LO 0x46 Set Data Lo
Applica 0 volt sul pin DATA (RB7) del PIC da programmare.
Questo comando viene utilizzato esclusivamente per
verificare il funzionamento dell'hardware dello YAPP!.
Return: ACK (0x10)
Comando YAPP!
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (9 of 11) [27/5/2003 13:05:48]
SET_FLASH_MODE 0x47 Set FLASH programming mode
Predispone lo YAPP! per la programmazione di PIC dotati di
memoria FLASH. Questo programma determina il ritardo di
programmazione (10ms) applicato al comando
BEGIN_PROG ed il tipo di algoritmo di programmazione
applicato dal comando WPL.
Return: ACK (0x10)
Comando YAPP!
SET_EPROM_MODE 0x48 Set EPROM programming mode
Predispone lo YAPP! per la programmazione di PIC dotati di
memoria EPROM. Questo programma determina il ritardo di
programmazione (100us) applicato al comando
BEGIN_PROG ed il tipo di algoritmo di programmazione
applicato dal comando WPL.
Return: ACK (0x10)
Comando YAPP!
GET_VERSION 0x49 Get firmware version
Legge la versione firmware dello YAPP!
Return: VERSION (1 byte). Esempio versione 2.5 ritorna con
un byte esadecimale pari a 0x25.
Comando YAPP!
WPL 0x4A
DATA_LO
DATA_HI
Write Program Location
Effetua la programmazione di una locazione di memoria
programma. Questo comando applica l'algoritmo di
programmazione adatto per il tipo di memoria, effettua la
verifica di avvenuta programmazione ed incrementa il
puntatore di lettura.
Return: ACK (0x10) se la locazione stata programmata e
verificata correttamente. NACK (0x02) se la verifica ha
rilevato un errore di programmazione.
Comando YAPP!
BLANK_CHECK 0x4B
LEN_LO
LEN_HI
MASK
Write Program Location
Controlla se la memoria programma dei PIC dotati di EPROM
vergine (tutte le cella a 0x3FFF o 0x0FFF). Il dato LEN
contiene la lunghezza della memoria da verificare. Mentre il
dato MASK contiene la maschera utilizzata per la verifica
delle celle vergini. Se ad esempio deve essere controllata la
verginit delle celle nei PIC16F84 dotati di CPU a 14 bit. Il
dato mask deve contenere la maschera di bit del byte piu'
significativo dell'opcode ovvero 0x3f (parte alta del valore
massimo memorizzabile in una word 0x3FFF). Per i
PIC12C508 in cui la CPU dotata di 12 bit la maschera sar
0x0F (parte alta del valore massimo memorizzabile in una
word 0x0FFF).
Return: ACK (0x10) se tutta la memoria programma contiene
0x3FFF (o 0x0FFF) NACK (0x02) se anche una sola
locazione non vale 0x3FFF (o 0x0FFF).
Yet Another Pic Programmer
http://www.tanzilli.com/progetti/yapp/ (10 of 11) [27/5/2003 13:05:48]
Comando YAPP!
Tutti i codici comando non direttamente riconosciuti dallo YAPP! vengono comunque
trasmessi al PIC (solo i 6 bit meno significativi). Questo consente di inviare al PIC tutti i
comandi previsti dalla Microchip ma non testati direttamente dall'autore dello YAPP!
(ad esempio: Bulk Erase Program Memory e Bulk Erase Data Memory riconosciuti
dai PIC16x84). A questi comandi lo YAPP! risponde sempre con un ACK (0x10).
Il comando WPL effettua le operazioni specificate nel documento Microchip sulla
programmazione ICSP per quel che riguarda la scrittura della memoria programma,
ad eccezione del cambio sulla tensione di alimentazione non implementato sulla
versione corrente dell'hardware dello YAPP!. Per questo motivo lo YAPP! da
considerarsi un programmatore per sviluppatori e non adatto alla produzione. Prima di
utilizzare il comando WPL occorre aver specificato il tipo di memoria con i comandi
SET_FLASH_MODE o SET_EPROM_COM, aver messo il PIC in modalit di
programmazione con il comenaod PROG_MODE ed aver caricato almeno un dato
(non importa quale) nel registro di programmazione con il comando LOAD_DATA in
modo da resettare il puntatore di programmazione del PIC. Il comando WPL in pratica
invia al PIC i seguenti comandi senza ulteriore intervento del program su PC:
LOAD_DATA, BEGIN_PROG, END_PROG (solo EPROM), READ_DATA,
INC_ADDR. L'incremento dell'indirizzo avviene sia che la locazione sia stata
programmata correttamente che no.
Per default lo YAPP! settato in FLASH mode.
Versioni firmware
Versione 2.7 Correzione del bug della versione 2.5 per cui veniva programmato anche
il byte di calibrazione dell'oscillatore.
Allineamento del firmware allo schema elettrico versione 2.7.
Ampliamento della durata dei segnali di CLOCK e DATA.
Versione 2.6 Versione interna non rilasciata.
Versione 2.5/2.5a Programma anche i PIC12C508/509
Versione 2.4 Programma anche i PIC16C6X/7X/9XX. Implementa due nuovi comandi:
WPL Write Program Location per la gestione della programmazione/verifica e BC
Blank Check.
Ringraziamenti
Un ringraziamento speciale a quanti hanno collaborato e continuano a collaborare alla
buona riuscita del progetto Yapp!, con particolare riferimento a:
Tiziano Galizia - Realizzazione PCB doppia faccia
Fabrizio Sciarra - Porting su Linux
Alessandro Razeto - Porting su Linux
Tito Dal Canton - Beta tester e porting su MAC
Alessandro Ballerini - Beta tester
Antonio Casini - Beta tester
Massimo Battisti - Yapp95 per la gestione dello Yapp! in Win95/98/NT
Alberto Consolini - Yappw per la gestione dello Yapp! su Win 95/98/NT

Yet Another Pic Programmer


http://www.tanzilli.com/progetti/yapp/ (11 of 11) [27/5/2003 13:05:48]
A A
B B
C C
D D
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
VER: OF: PAGES: DATE:
ENGINEER:
NOTE:
PROJECT:
2 NOV 1998
PIC BY EXAMPLE
1 1 1.0
EXAMPLE N.1
SERGIO TANZILLI
WWW.PICPOINT.COM
GND GND
C3
22PF
C2
22PF
X1
4
M
H
Z
+5
6
RB0
7
RB1
8
RB2
9
RB3
10
RB4
11
RB5
12
RB6
13
RB7
17
RA0
18
RA1
1
RA2
2
RA3
3
RTCC/RA4 4
MCLR
16
OSC1/CLKIN
15
OSC2/CLKOUT
5
VSS
14
VDD
U1
PIC16C84
1
IN
2
GND
3
OUT
U2
7805
C6
1
0
0
K
P
F
C5
1
0
0
K
P
F
C7
4
7
U
F
C4
1
0
0
U
F
GND
+5 +12
+12VCC
GND
1
2
3
4
5
6
J1
DIN_6
Y
A
P
P
!
C A
D1
LED
R2
470
GND
C
1
1
0
0
K
P
F
R
1
1
0
K
GND
Glossario de termos utilizados
NotaoBINARIA e EXADECIMAL
Notao utilizada em programao paa indicar valores numerico em alternativa a notao decimal. A notao Binaria
ou notao na base 2, representa o bit que podem assumir s 2 valores 0 ou 1 e representa diretamente a modalidade de
memorizao dos numeros de um microprocessador. A notao Exadecimal ou notao na base 16, representa o
numero atravz de cifras exadecimal que podem assumir 16 valores. Em seguida sera mostrada uma simples tabela de
correspondecia para os mesmos valores entre notao binaria, decimal e exadeciamal.
Decimal Exadecimal Binaria
0 0 0
1 1 1
2 2 10
3 3 11
4 4 100
5 5 101
6 6 110
7 7 111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
16 10 10000
Na linguagem assembler do PICmicro a notao exadecimal pode ser representada em tres diferentes formas:
H'<hex_digit>' , 0x<hex_digit> e <hex_digit>H
onde, por exemplo, o mesmo numero exadeciamal 1 A ser representado na seguinte forma:
H'1A', 0x1A oppure 1AH
A notao binaria pode ser representada em duas formas:
B'<binary_digit>' e <binary_digit>B
onde o mesmo numero binario 01101100 ser representado na seguinte forma :
B'01101100' e 01101100B.
Glossario (notazione)
http://www.tanzilli.com/pbe/brasiliano/gloss/notaz.htm (1 of 2) [27/5/2003 13:07:08]

Glossario (notazione)
http://www.tanzilli.com/pbe/brasiliano/gloss/notaz.htm (2 of 2) [27/5/2003 13:07:08]
Diretivas do assembler MPASM
RADIX
Sintaxi
radix <default_radix>
Descrio
Defini-se o radix default para expresso numerica. Se no especifica-la o radix de default ser
exadecimal.O parametro <default_radix> pode valer: hex, dec ou oct.
Exemplo
radix dec
Glossario (radix)
http://www.tanzilli.com/pbe/brasiliano/gloss/radix.htm [27/5/2003 13:07:52]
Glossario de termos utilizados
AND G
CPU G
Memoria ROM, PROM, EPROM ed EEPROM G
Memoria RAM G
Microcontrolador G
NOT G
Notao decimal, exadecimal e binaria G
Pin MCLR/VPP G
Pin OSC1/CLKIN G
Pin OSC2/CLKOUT G
Pin RA0 G
Pin RA1 G
Pin RA2 G
Pin RA3 G
Pin RA4/RTCC G
Pin RB0/INT G
Pin RB1 G
Pin RB2 G
Pin RB3 G
Pin RB4 G
Pin RB5 G
Pin RB6 G
Pin RB7 G
Pin VDD G
Pin VSS G
Opcode G
OR G
Reset G
Subroutine G
XOR G

Glossario
http://www.tanzilli.com/pbe/brasiliano/gloss/glossario.htm [27/5/2003 13:26:16]
Glossario de termos utilizados
OPERAO BOOLEANA
A operao booleana e uma operao algbrica entre numeros binarios ulteis em programao para trabalhar bobre os
bit's contidos no registro do PIC. Vejamos brevemente a operao utilizada na programao do PIC.
AND
O AND entre dois bit's segue a seguinte tabela verdade:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Na prtica se um dos dois bit's valer 0 ento o resultado ser par 0. O AND entre dois registros ser efetuado com a
copia entre os bit's que ocupam a mesma posio como representado no exemplo abaixo:
01010101 AND
11110000 =
--------------
01010000
OR (o OR inclusivo)
O OR entre dois bit's segue a seguinte tabela verdade:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
Na prtica se um dos dois bit's vale 1 ento o resultado ser par de 1. O OR entre dois registro ser efetuado com a copia
entre o bit que ocupa a mesma posio come representado na figura abaixo:
01010101 OR
11110000 =
--------------
11110101
XOR (o OR esclusivo)
O XOR entre dois bit's segue a seguinte tabela verdade:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Na prtica se um dos dois bit's so iguais o resultado ser 0 caso contrrio valer 1. O XOR entre dois registros sera
efetuado com a copia entre o bit que ocupa a mesma posio como representado no exemplo abaixo:
Glossario (Operazioni booleane)
http://www.tanzilli.com/pbe/brasiliano/gloss/bool.htm (1 of 2) [27/5/2003 13:26:19]
01010101 XOR
11110000 =
--------------
10100101
NOT
O NOT consiste na simples negao do valor de um bit. Ou seja se um bit vale 0 o seu NOT ser 1 e viceversa.
NOT 0 = 1
NOT 1 = 0
O NOT de um registro ser efetuado negando simplesmente o bit como representado abaixo:
01010101 NOT =
----------------
10101010

Glossario (Operazioni booleane)


http://www.tanzilli.com/pbe/brasiliano/gloss/bool.htm (2 of 2) [27/5/2003 13:26:19]
Glossario de termosi utilizados
MICROCONTROLADOR
Chip programavel dotado de dispositivos com base a poder memorizar um programa (memoria EPROM ou EEPROM),
para poder memorizar dados e valores ( memoria RAM), executa a funo de entrada/saida (linha de I/O, porta seria,
etc.) e outras funes de auxilio ( gerador de clock, contador, etc.). O Microcomtrolador se destingue do processador
propriamente pela presena de dispositivos auxiliares dentro do mesmo chip que contem a CPU.

Glossario (microcontroller)
http://www.tanzilli.com/pbe/brasiliano/gloss/microc.htm [27/5/2003 13:26:27]
Diretivas do assembler MPASM
PROCESSADOR G
RADIX G

Direttive
http://www.tanzilli.com/pbe/brasiliano/gloss/direttive.htm [27/5/2003 13:27:03]
Set de instrues do PIC16F84
Este o set completo de instrues reconhecido pelo PIC16F84:
Sintaxi Descrio Microchip Operao equivalente
ADDLW k Add Literal and W W = W + k
ADDWF f,d Add W and f d = W + f (onde d pode ser W ou f)
ANDLW k AND Literal with W W = W AND k
ANDWF f,d AND W with f d = W AND f (onded pode ser W ou f)
BCF f,b Bit Clear f f(b) = 0
BSF f,b Bit Set f f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Se , pule uma instruo
BTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Se , pule uma instruo
CALL k Subroutine Call Chamada a uma subrotina no endereo k
CLRF f Clear f f = 0
CLRW Clear W Register W = 0
CLRWDT Clear Watchdog Timer Watchdog timer = 0
COMF f,d Complement f d = not f (onde d pode ser W ou f)
DECF f,d Decrement f d = f -1 (onde d pode ser W ou f)
DECFSZ f,d Decrement f, Skip if 0 d = f -1 (onde d pode ser W ou f) se d = 0 pula
GOTO k Go to address Pule para o endereo k
INCF f,d Increment f d = f +1 (onde d pode ser W ou f)
INCFSZ f,d Increment f, Skip if 0 d = f +1 (onde d pode ser W ou f) se d = 0 pule
IORLW k Inclusive OR Literal with W W = W OR k
IORWF f,d Inclusive OR W with f d = f OR W (onde d pode ser W ou f)
MOVLW k Move literal to W W = k
MOVF f,d Move f d = f (onde d pode ser W ou f)
MOVWF f Move W to f f = W
NOP No Operation Nenhuma operao
OPTION Load Option Register OPTION = W
RETFIE Return from Interrupt Retorna de uma interrupt handler
Set de instrues
http://www.tanzilli.com/pbe/brasiliano/istruzioni/istruzioni.htm (1 of 2) [27/5/2003 13:27:11]
RETLW k Return Literal to W Retorna de uma subrotina com W = k
RETURN Return from Subroutine Retorna de uma subrotina
RLF f,d Rotale Left f through Carry d = f << 1 (onde d pode ser W ou f)
RRF f,d Rotale Right f through Carry d = f >> 1 (onde d pode ser W o f)
SLEEP Go into Standby Mode Coloca em standby o PIC
SUBLW k Subtract W from Literal
W = k - W
SUBWF f,d Subtract W from f d = f - W (onde d pode ser W ou f)
SWAPF f Swap f f = Swap do bit 0123 com 4567 de f
TRIS f Load TRIS Register TRIS di f = W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = f XOR W (onde d pode ser W ou f)

Set de instrues
http://www.tanzilli.com/pbe/brasiliano/istruzioni/istruzioni.htm (2 of 2) [27/5/2003 13:27:11]
ADDLW ADD Literal and W
Soma a constante k a W
Sintaxi:
addlw k
Operao equivalente:
W = W + k
Descrio:
Soma a constante k ao valor memorizado no acumulador W e coloca o resultado no acumulador.
Exemplo:
org 00H
start
movlw 10
addlw 12
...
Depois de ter executado este programa o acumulador W ter o valor 22
Nota:
Esta instruo influncia o bit Z, DC e C do registro STATUS.
Z vale 1 se o resultado da operao for 0. G
DC vale 1 se o resultado da operao um numero superior a 15. G
C vale 1 se o resultado positivo ou seja se o bit 7 do registro contem o resultado 0 e 1 se o
resultado negativo ou seja se o bit 7 do registro tiver um resultado que vale 1.
G
instruo ADDLW
http://www.tanzilli.com/pbe/brasiliano/istruzioni/addlw.htm [27/5/2003 13:27:14]
ADDWF ADD W and F
Soma o valor contido em W com o valor contido no registro F
Sintaxi:
addwf f,d
Operao equivalente:
d = W + f (onde d pode ser W ou f)
Descrio:
Esta instruo soma o valor contido no acumulador W com o valor contido no registro inderessado pelo
parametro f. O parametro d um flag que indica sobre qual registro deve ser memorizado o resulatado.
Para d = W o resultado sera memorizado no registro W.
Para d = F o resultado sera memorizado no registro f.
Exemplo:
Vejamos um exemplo de somo entre dois registros:
add1 equ 0CH
add2 equ 0DH
org 00H

movlw 10 ;Primeiro somador = 10
movwf add1
movlw 15 ;Segundo somador = 15
movwf add2
movf add1,W ;W = add1
addwf add2,W ;W = W + add2
Nota:
Esta instruo influencia o bit Z, DC e C do registro STATUS.
Z vale 1 se o resultado da operao for 0. G
DC vale 1 se o resultado da operao um numero superior a 15. G
C vale 1 se o resultado positivo ou seja se o bit 7 do resgistro que conter o resultado for 0 e 1 se
oresultado negativo ou seja se o bit 7 do registro que contem o resultado for 1.
G

instruo ADDWF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/addwf.htm [27/5/2003 13:27:18]
ANDLW AND Literal com W
Efetua o AND entre W e uma constante k
Sintaxi:
andlw k
Operao equivalente:
W = W AND k
Descrio:
Efetua p AND entre o valor contido no acumulador W e o valor constante k. O resultado sera
memorizado no acumulador.
Exemplo:
org 00H
start
movlw 10101010B
andlw 11110000B
...
Depois de haver executado este programa o acumulador W ir 10100000B.
Nota:
Esta instruo infuencia o bit Z do registro STATUS.
Z vale 1 se o resultado da operao for 0. G

instruo ANDLW
http://www.tanzilli.com/pbe/brasiliano/istruzioni/andlw.htm [27/5/2003 13:27:21]
ANDWF AND W com F
Efetua o AND logico entre o valor contido em W e o valor contido no registro F
Sintaxi:
andwf f,d
Operao equivalente:
d = W AND f (onde d pode ser W o f)
Descrio:
Esta instruo efetua o AND lgico entre o valor contido no aculmulador W e o valor contido no registro
endereado do parametro f. O parametro d um flag que indica sobre qual registro deve ser memorizado
o resultado.
Para d = W o resultado sera memorizado no registro W
Per d = F o resultado sera memorizado no registro f
Exemplo:
Frequentemente o AND lgico sera utilizado para mascarar o valor de algum bit dentro de um registro.
Se por exemplo quisessemos extrair do numero binario 01010101B o quarto bit menos significativo a fim
de obter o seguinte valor 00000101B, bastar preparar uma mascara do tipo 00001111B e fazer o AND
com o nosso valor, vejamos como :
movlw 01010101B ;Memoriza no registro
movwf 0CH ;0CH o valor inicial da mascara
movlw 00001111B ;Prepara a mascara do bit
andwf 0CH,W ;Efetua o AND e memoriza o
;risultato no acumulador W
O resultado em W ser 00000101B como descrito.I
W = 00001111 AND
f = 01010101 =
----------------
W = 0000010101
ANDWF influencia o bit Z do registro STATUS que ir a 1 se o resultado da operao igual a 0.

instruo ANDWF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/andwf.htm [27/5/2003 13:27:26]
BTFSC Bit Test F, Skip if Clear
Pula a proxima instruo se um bit no registro F for 0
Sintaxi:
btfsc f,b
Operao equivalente:
f(b) = 0 ? Si, salta una istruzione
Descrio:
Testa o bit contido no registro no endereo f e pula a proxima instruo se este valer 0.
Exemplo:
parm1 equ 0CH
org 00H

movlw 11111110B ;Valor inicial
movwf parm1
loop
btfsc parm1,0 ;D0 = 0 ? Se,
goto loop ;No, execute o loop
Este programa executa um loop infinito o mesmo programa no executar o loop se substituirmos a
instruo :
movlw 11111110B ;Valor inicial
com instruo:
movlw 11111111B ;Valor inicial
Nota:
Esta instruo no infulencia nenhum bit de status.

instruo BTFSC
http://www.tanzilli.com/pbe/brasiliano/istruzioni/btfsc.htm [27/5/2003 13:27:37]
CLRWDT CLeaR WatchDog Timer
Reset do timer do watchdog
Sintaxi:
clrwdt
Descrio:
Esta instruo deve ser utilizada quando programarmos o PIC com a opo Watchdog ( fusivel WDTE ).
Nesta modalidade o PIC abilita um timer que, uma vez trascorriodo um determinado tempo, efetua o
reset do mesmo. Para evitar o reset do nosso programa deveremos executar ciclicamente a instruo
CLRWDT para zerar o timer antes deste tempo. Se no zerarmos o timer neste tempo, o circuito de
watchdog ( do ingls co de guarda ) interpretar este como um bloco de programa em execuo e
efetuar o reset para bloquea-lo.
Esemplo:
org 00H
loop
clrwdt
goto loop
Nota:
Esta instruo no influencia nenhum bit de status.

instruo CLRWDT
http://www.tanzilli.com/pbe/brasiliano/istruzioni/clrwdt.htm [27/5/2003 13:27:51]
COMF COMplement F
Efetua o complemento do registro F
Sintaxi:
comf f,d
Operao equivalente:
d = NOT f (onde d pode ser W ou f )
Descrio:
Esta instruo efetua o complemento do valor contido no registro endereado pelo parametro f. O
parametro d determina o destino do valor obtido.
Para d = W o valor sera memorizado no registro W
Para d = F o valor sera salovo no registro f.
Esemplo:
parm1 equ 0CH
org 00H

movlw 01010101B
movwf parm1
comf parm1,F
...
Ao termino da execuo do programa o valor do registro parm1 ser 10101010B.
Nota:
Esta instruo influencia o bit Z do registro STATUS.
Z vale 1 se o resultado da operao for 0. G

instruo COMF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/comf.htm [27/5/2003 13:27:55]
DECF DECrement F register
Decrementa o conteudo do registro F
Sintaxi:
decf f,d
Operao equivalente:
d = f -1 (onde d pode ser W ou f )
descrio:
Esta instruo decrementa o conteudo do registro endereado pelo paramentro f. O parametro d um flag que
indica sobre qual registro deve ser memorizado o resultado.
Para d = W o resultado sera memorizado no registro W
Para d = F o resultado sera memorizado no registro f
Esemplo:
Com o progama seguinte escrevemos o valor 23H no registro de endereo 0CH e assim o decrementamos de
um. Ao termino da execuo o registro da posio 0CH ter o valor 22H.

movlw 23H ;Escreve em W o valor 23H


movwf 0CH ;Copia no registro 0CH o valoroe de W
decf 0CH,F ;Decremente o valor contido no registro 0CH
Esemplo:
Esta instruo influencia o bit Z do registro de STATUS.
Z vale 1 se o resultado da operao for 0. G

instruo DECF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/decf.htm [27/5/2003 13:28:00]
DECFSZ DECrement F, Skip if Zero
Decrementa o valor do registro f e pula a prxima instruo se o risultato for zero
Sintaxi:
decfsz f,b
Operao equivalente:
d = f -1 (onde d pode ser W o f ) se d = 0 pula
Descrio:
Decrementa o valor de regisatro do endereo f e se o resultado for zero pula a proxima instruo. O
resultado do decremento pode ser memorizado no mesmo registro f ou ento no acumulador W com base
no valor do flag d.
Para d = W o resultado sera memorizado no registro W
Para d = F o resultado sera memorizado no registro f
Esemplo:
counter equ 0CH
org 00H

movlw 10 ;counter = 10
movwf counter
loop
decfsz counter,F ;counter = counter -1
;counter = 0 ? Se for
goto loop ;No, continua
Este programa executa 10 vezes a instruo decfsz at que counter seja = 0.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo DECFSZ
http://www.tanzilli.com/pbe/brasiliano/istruzioni/decfsz.htm [27/5/2003 13:28:05]
INCF INCrement F
Incrementa o valor do registro no endereo F
Sintaxi:
incf f,d
Operao equivalente:
d = f +1 (onde d pode ser W o f)
Descro:
Incrementa o conteudo do registro no endereo f e memoriza o resultado no mesmo registro ou no
acumulador W dependendo do valor do flag d.
Para d = W o resultado sera memorizado no registro W
Para d = F o resultado sera memorizado no mesmo registro F
Nota:
Esta instruo influencia o bit Z do registro STATUS.
Z vale 1 se o resultado da operao for 0. G

instruo INCF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/incf.htm [27/5/2003 13:28:09]
INCFSZ INCrement F, Skip if Zero
Incrementa o valor do registro f e pula a proxima instruo se o resultato for zero
Sintaxi:
incfsz f,b
Operao equivalente:
d = f +1 (onde d pode ser W ou f) se d = 0 pula
Descrio:
Incrementa o valor do registro f e se o resultado for zero pula a proxima instruo. O resultado do
incremento pode ser memorizado no mesmo registro f ou ento no acumulador W dependendo do flag d.
Para d = W o resultado sera memorizado no registro W
Para d = F o resultado sera memorizado no registro f
Esemplo:
counter equ 0CH
org 00H

movlw 250 ;counter = 250
movwf counter
loop
incfsz counter,F ;counter = counter + 1
;counter = 0 ? Se for
goto loop ;No, continua
Este programa executa para 256 -10 = 6 vezes a instruo incfsz at que counter = 0. Sendo counter um
registro de 8 bit's quando for incrementado do valor 255 assume novamente o valor 0 e dai a formula 256
- 10 = 6.
Nota:
Esta instruo no influencia nenhum bit de status.

instruo INCFSZ
http://www.tanzilli.com/pbe/brasiliano/istruzioni/incfsz.htm [27/5/2003 13:28:18]
IORLW Inclusive OR Literal with W
Efetua o inclusive OR entre W e uma constante k
Sintaxi:
iorlw k
Operao equivalente:
W = W OR k
Descrio:
Efetua o inclusive OR entre o valor contindo no acumulador W e o valor da constante k.
Esemplo:
org 00H
start
movlw 00001111B
iorlw 11110000B
...
Aps ser executado esse programa o acumulador W ser 11111111B.
Nota:
Esta instruo influencia o Z do registro de STATUS.
Z vale 1 se o resultado da operao for 0. G

instruo IORLW
http://www.tanzilli.com/pbe/brasiliano/istruzioni/iorlw.htm [27/5/2003 13:28:24]
IORWF Inclusive OR W with F
Effettua l'OR inclusivo tra il valore contenuto in W ed il valore contenuto nel registro F
Sintassi:
iorwf f,d
Operazione equivalente:
d = f OR W (dove d pu essere W o f)
Descrizione:
Questa istruzione effettua l'OR inclusivo tra il valore contenuto nell'accumulatore W ed il valore
contenuto nel registro indirizzato dal parametro f. Il parametro d determina dove viene memorizzato il
risultato dell'operazione:
Per d = W il risultato viene memorizzato nell'accumulatore W.
Per d = F il risultato viene memorizzato nel registro f.
Esempio:
parm1 equ 0CH
org 00H

movlw 00001111B
movwf parm1
movlw 11111111B
iorwf parm1,F
Al termine dell'esecuzione il valore del registro parm1 sar 11111111B.
Note:
Questa istruzione influenza il bit Z del registro STATUS.
Z vale 1 se il risultato dell'operazione vale 0. G

instruo IORWF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/iorwf.htm [27/5/2003 13:28:28]
MOVF MOVe F
Move o conteudo do registro F
Sintaxi:
movf f,d
Operao equivalente:
d = f (onde d pode ser W ou f)
Descrio:
Esta instruo copia o conteudo do registro endereado pelo paramentro f ou no acumulador W ou no
mesmo registro F. O parametro d determina o destino.
Para d = W o valor sera memorizado no registro W
Para d = F o valor sera mantido no registro f. E neste caso a utilidade desta instruo esta no fato que
sera alterado o bit Z do flag STATUS dependendo do valor contido no registro f.
Esemplo:
O exemplo a seguir copia o valor contido no registro do endereo 0CH no acumulador W:
movf 0CH,W

instruo MOVF
http://www.tanzilli.com/pbe/brasiliano/istruzioni/movf.htm [27/5/2003 13:28:37]
OPTION load OPTION register
Passa o valor de W ao registro OPTION
Sintaxi:
option
Operao equivalnte:
OPTION = W
Descrio:
Esta instruo memoriza no registro especial OPTION o valor contido no acumulador W.
Esemplo:
org 00H
start
movlw 01000100B
option
...
Nota:
Esta instruo existe para manter a compatibilidade com o PIC produto final, a Microchip no aconselha
o uso. Em alternativa aconselhavel usar a seguinte instruo:
org 00H
start
bsf STATUS,RP0 ;Ativa o banco de registro 1
movlw 01000100B
movwf OPTION_REG
...
Na prtica se aconselha a escrever diretamente no registro OPTION presente no banco 1 de registros do
PIC utilizando MOVWF ante a instruo OPTION que no futuro poder no mais ser implementada.
Esta instruo no influencia nenhum bit de status.

instruo OPTION
http://www.tanzilli.com/pbe/brasiliano/istruzioni/option.htm [27/5/2003 13:28:47]
RETFIE RET From Interrupt
Retorna de uma subrotina
Sintaxi:
retfie
Descrio:
Esta instruo deve ser colocada no termino de cada subrotina de controle das interrupes para retornar
o controle ao programa principal.
Esemplo:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfie ;Retorna da interrupo
Neste codigo o programa principal executa um loop infinito. Se abilitarmos uma das interrupes do
16F84 ele no apenas verificar o controle como ir automaticamente ao programa alocado no endereo
04H ( no exemplo intHandler), a instruo RETFI determinar ento o retorno ao loop principal.
Nota:
Esta instruo no influencia nenhum bit de ststus.

instruo RETFIE
http://www.tanzilli.com/pbe/brasiliano/istruzioni/retfie.htm [27/5/2003 13:28:50]

Você também pode gostar