Curso Microcontrolador PIC
Curso Microcontrolador PIC
Curso Microcontrolador PIC
MICROCONTROLADORES PIC
"O propsito deste livro no fazer de si um perito, mas sim equipar-lo aos que
sabem onde ir para obter as respostas."
Autor
Introduo
As circunstncias que se nos deparam hoje no campo dos microcontroladores tm
os seus primrdios no desenvolvimento da tecnologia dos circuitos integrados. Este
desenvolvimento tornou possvel armazenar centenas de milhares de transstores
num nico chip. Isso constituiu um pr-requisito para a produo de
microprocessadores e, os primeiros computadores foram construdos adicionando
perifricos externos tais como memria, linhas de entrada e sada, temporizadores
e outros. Um crescente aumento do nvel de integrao, permitiu o aparecimento
de circuitos integrados contendo simultaneamente processador e perifricos. Foi
assim que o primeiro chip contendo um microcomputador e que mais tarde haveria
de ser designado por microcontrolador, apareceu.
Histria
no ano de 1969 que uma equipa de engenheiros japoneses pertencentes
companhia BUSICOM chega aos Estados Unidos com a encomenda de alguns
circuitos integrados para calculadoras a serem implementados segundo os seus
projectos. A proposta foi entregue INTEL e Marcian Hoff foi o responsvel pela
sua concretizao. Como ele tinha tido experincia de trabalho com um computador
(PC) PDP8, lembrou-se de apresentar uma soluo substancialmente diferente em
vez da construo sugerida. Esta soluo pressupunha que a funo do circuito
integrado seria determinada por um programa nele armazenado. Isso significava
que a configurao deveria ser mais simples, mas tambm era preciso muito mais
memria que no caso do projecto proposto pelos engenheiros japoneses. Depois de
algum tempo, embora os engenheiros japoneses tenham tentado encontrar uma
soluo mais fcil, a ideia de Marcian venceu e o primeiro microprocessador
nasceu. Ao transformar esta ideia num produto concreto, Frederico Faggin foi de
uma grande utilidade para a INTEL. Ele transferiu-se para a INTEL e, em somente 9
meses, teve sucesso na criao de um produto real a partir da sua primeira
concepo. Em 1971, a INTEL adquiriu os direitos sobre a venda deste bloco
integral. Primeiro eles compraram a licena companhia BUSICOM que no tinha a
mnima percepo do tesouro que possua. Neste mesmo ano, apareceu no
mercado um microprocessador designado por 4004. Este foi o primeiro
microprocessador de 4 bits e tinha a velocidade de 6 000 operaes por segundo.
No muito tempo depois, a companhia Americana CTC pediu INTEL e Texas
Instruments um microprocessador de 8 bits para usar em terminais. Mesmo apesar
de a CTC acabar por desistir desta ideia, tanto a Intel como a Texas Instruments
continuaram a trabalhar no microprocessador e, em Abril de 1972, os primeiros
microprocessadores de 8 bits apareceram no mercado com o nome de 8008. Este
podia enderear 16KB de memria, possua 45 instrues e tinha a velocidade de
300 000 operaes por segundo. Esse microprocessador foi o pioneiro de todos os
microprocessadores actuais. A Intel continuou com o desenvolvimento do produto
e, em Abril de 1974 ps c fora um processador de 8 bits com o nome de 8080 com
a capacidade de enderear 64KB de memria, com 75 instrues e com preos a
comearem em $360.
Os registos so, portanto, locais de memria cujo papel ajudar a executar vrias
operaes matemticas ou quaisquer outras operaes com dados, quaisquer que
sejam os locais em que estes se encontrem.
Vamos olhar para a situao actual. Ns temos duas entidades independentes
(memria e CPU) que esto interligadas, deste modo, qualquer troca de dados
retardada bem como a funcionalidade do sistema diminuda. Se, por exemplo, ns
desejarmos adicionar os contedos de dois locais de memria e tornar a guardar o
resultado na memria, ns necessitamos de uma ligao entre a memria e o CPU.
Dito mais simplesmente, ns precisamos de obter um "caminho" atravs do qual os
dados possam passar de um bloco para outro.
1.3 Bus
Quando se est a trabalhar com ele, o porto funciona como um local de memria.
Qualquer coisa de que se est a ler ou em que se est a escrever e que possvel
identificar facilmente nos pinos do microcontrolador.
1.7 Watchdog
Uma outra coisa que nos vai interessar a fluncia da execuo do programa pelo
microcontrolador durante a sua utilizao. Suponha que como resultado de
qualquer interferncia (que ocorre frequentemente num ambiente industrial), o
nosso microcontrolador pra de executar o programa ou, ainda pior, desata a
trabalhar incorrectamente.
1.9 Programa
CAPTULO 2
Microcontrolador PIC16F84
Introduo
O PIC 16F84 pertence a uma classe de microcontroladores de 8 bits, com uma arquitectura RISC. A
estrutura genrica a do mapa que se segue, que nos mostra os seus blocos bsicos.
Memria de programa (FLASH) - para armazenar o programa que se escreveu.
Como a memria fabricada com tecnologia FLASH pode ser programa e limpa mais que uma vez. ela
torna-se adequada para o desenvolvimento de dispositivos.
EEPROM - memria dos dados que necessitam de ser salvaguardados quaando a alimentao
desligada. Normalmente usada para guardar dados importantes que no se podem perder quando a
alimentao, de repente, vai abaixo. Um exemplo deste tipo de dados a temperatura fixada para os
reguladores de temperatura. Se, durante uma quebra de alimentao, se perdessem dados, ns
precisaramos de proceder a um novo ajustamento quando a alimentao fosse restabelecida. Assim, o
nosso dispositivo, perderia eficcia.
PORTO A e PORTO B so ligaes fisicas entre o microcontrolador e o mundo exterior. O porto A tem
cinco pinos e o porto B oito pinos.
CISC, RISC
J foi dito que o PIC16F84 tem uma arquitectura RISC. Este termo encontrado, muitas vezes, na
literatura sobre computadores e necessita de ser explicada aqui, mais detalhadamente. A arquitectura de
Harvard um conceito mais recente que a de von-Neumann. Ela adveio da necessidade de pr o
microcontrolador a trabalhar mais rapidamente. Na arquitectura de Harvard, a memria de dados est
separada da memria de programa. Assim, possvel uma maior fluncia de dados atravs da unidade
central de processamento e, claro, uma maior velocidade de funcionamento. A separao da memria de
dados da memria de programa, faz com que as instrues possam ser representadas por palavras de mais
que 8 bits. O PIC16F84, usa 14 bits para cada instruo, o que permite que que todas as instrues
ocupem uma s palavra de instruo. tambm tpico da arquitectura Harvard ter um reportrio com
menos instrues que a de von-Neumann's, instrues essas, geralmente executadas apenas num nico
ciclo de relgio.
Aplicaes
O PIC16F84, perfeitamente adequado para muitas variedades de aplicaes, como a indstria
automvel, sensores remotos, fechaduras elctricas e dispositivos de segurana. tambm um dispositivo
ideal para cartes inteligentes, bem como para dispositivos alimentados por baterias, por causa do seu
baixo consumo.
A memria EEPROM, faz com que se torne mais fcil usar microcontroladores em dispositivos onde o
armazenamento permanente de vrios parmetros, seja necessrio (cdigos para transmissores, velocidade
de um motor, frequncias de recepo, etc.). O baixo custo, baixo consumo, facilidade de manuseamento
e flexibilidade fazem com que o PIC16F84 se possa utilizar em reas em que os microcontroladores no
eram anteriormente empregues (exemplo: funes de temporizao, substituio de interfaces em
sistemas de grande porte, aplicaes de coprocessamento, etc.).
A possibilidade deste chip de ser programvel no sistema (usando somente dois pinos para a transferncia
de dados), do flexibilidade do produto, mesmo depois de a sua montagem e teste estarem completos.
Esta capacidade, pode ser usada para criar linhas de produo e montagem, para armazenar dados de
calibragem disponveis apenas quando se proceder ao teste final ou, ainda, para aperfeioar os programas
presentes em produtos acabados.
O clock do oscilador, ligado ao microcontrolador atravs do pino OSC1, aqui, o circuito interno do
microcontrolador divide o sinal de clock em quatro fases, Q1, Q2, Q3 e Q4 que no se sobrepem. Estas
quatro pulsaes perfazem um ciclo de instruo (tambm chamado ciclo de mquina) e durante o qual
uma instruo executada.
A execuo de uma instruo, antecedida pela extraco da instruo que est na linha seguinte. O
cdigo da instruo extrado da memria de programa em Q1 e escrito no registo de instruo em Q4.
A descodificao e execuo dessa mesma instruo, faz-se entre as fases Q1 e Q4 seguintes. No
diagrama em baixo, podemos observar a relao entre o ciclo de instruo e o clock do oscilador (OSC1)
assim como as fases Q1-Q4.
O contador de programa (Program Counter ou PC) guarda o endereo da prxima instruo a ser
executada.
Pipelining
Cada ciclo de instruo inclui as fases Q1, Q2, Q3 e Q4. A extraco do cdigo de uma instruo da
memria de programa, feita num ciclo de instruo, enquanto que a sua descodificao e execuo, so
feitos no ciclo de instruo seguinte. Contudo, devido sobreposio pipelining (o microcontrolador ao
mesmo tempo que executa uma instruo extrai simultaneamente da memria o cdigo da instruo
seguinte), podemos considerar que, para efeitos prticos, cada instruo demora um ciclo de instruo a
ser executada. No entanto, se a instruo provocar uma mudana no contedo do contador de programa
(PC), ou seja, se o PC no tiver que apontar para o endereo seguinte na memria de programa, mas sim
para outro (como no caso de saltos ou de chamadas de subrotinas), ento dever considerar-se que a
execuo desta instruo demora dois ciclos. Isto acontece, porque a instruo vai ter que ser processada
de novo, mas, desta vez, a partir do endereo correcto. O ciclo de chamada comea na fase Q1,
escrevendo a instruo no registo de instruo (Instruction Register IR). A descodificao e execuo
continua nas fases Q2, Q3 e Q4 do clock.
Fluxograma das Instrues no Pipeline
TCY0 lido da memria o cdigo da instruo MOVLW 55h (no nos interessa a instruo que foi
executada, por isso no est representada por rectngulo).
TCY1 executada a instruo MOVLW 55h e lida da memria a instruo MOVWF PORTB.
TCY2 executada a instruo MOVWF PORTB e lida a instruo CALL SUB_1.
TCY3 executada a chamada (call) de um subprograma CALL SUB_1 e lida a instruo BSF
PORTA,BIT3. Como esta instruo no a que nos interessa, ou seja, no a primeira instruo do
subprograma SUB_1, cuja execuo o que vem a seguir, a leitura de uma instruo tem que ser feita de
novo. Este um bom exemplo de uma instruo a precisar de mais que um ciclo.
TCY4 este ciclo de instruo totalmente usado para ler a primeira instruo do subprograma no
endereo SUB_1.
TCY5 executada a primeira instruo do subprograma SUB_1 e lida a instruo seguinte.
Tipos de osciladores
O PIC16F84 pode trabalhar com quatro configuraes de oscilador. Uma vez que as configuraes com
um oscilador de cristal e resistncia-condensador (RC) so aquelas mais frequentemente usadas, elas so
as nicas que vamos mencionar aqui.
Quando o oscilador de cristal, a designao da configurao de XT, se o oscilador for uma resistncia
em srie com um condensador, tem a designao RC. Isto importante, porque h necessidade de optar
entre os diversos tipos de oscilador, quando se escolhe um microcontrolador.
Oscilador XT
O oscilador de cristal est contido num envlucro de metal com dois pinos onde foi escrita a frequncia a
que o cristal oscila. Dois condensadores cermicos devem ligar cada um dos pinos do cristal massa.
Casos h em que cristal e condensadores esto contidos no mesmo encapsulamento, tambm o caso do
ressonador cermico ao lado representado. Este elemento tem trs pinos com o pino central ligado
massa e os outros dois pinos ligados aos pinos OSC1 e OSC2 do microcontrolador. Quando projectamos
um dispositivo, a regra colocar o oscilador to perto quanto possvel do microcontrolador, de modo a
evitar qualquer interferncia nas linhas que ligam o oscilador ao microcontrolador.
OSCILADOR RC
Ao ligar a alimentao do circuito, o oscilador comea a oscilar. Primeiro com um perodo de oscilao e
uma amplitude instveis, mas, depois de algum tempo, tudo estabiliza.
Para evitar que esta instabilidade inicial do clock afecte o funcionamento do microcontrolador, ns
necessitamos de manter o microcontrolador no estado de reset enquanto o clock do oscilador no
estabiliza. O diagrama em cima, mostra uma forma tpica do sinal fornecido por um oscilador de cristal de
quartzo ao microcontrolador quando se liga a alimentao.
2.2 Reset
O reset usado para pr o microcontrolador num estado conhecido. Na prtica isto significa que s vezes
o microcontrolador pode comportar-se de um modo inadequado em determinadas condies indesejveis.
De modo a que o seu funcionamento normal seja restabelecido, preciso fazer o reset do
microcontrolador, isto significa que todos os seus registos vo conter valores iniciais pr-definidos,
correspondentes a uma posio inicial. O reset no usado somente quando o microcontrolador no se
comporta da maneira que ns queremos, mas, tambm pode ser usado, quando ocorre uma interrupo
por parte de outro dispositivo, ou quando se quer que o microcontrolador esteja pronto para executar um
programa .
De modo a prevenir a ocorrncia de um zero lgico acidental no pino MCLR (a linha por cima de MCLR
significa o sinal de reset activado por nvel lgico baixo), o pino MCLR tem que ser ligado atravs de
uma resistncia ao lado positivo da alimentao. Esta resistncia deve ter um valor entre 5 e 10K. Uma
resistncia como esta, cuja funo conservar uma determinada linha a nvel lgico alto, chamada
resistncia de pull up.
Os reset mais importantes so o a) e o b). O primeiro, ocorre sempre que ligada a alimentao do
microcontrolador e serve para trazer todos os registos para um estado inicial. O segundo que resulta da
aplicao de um valor lgico baixo ao pino MCLR durante o funcionamento normal do microcontrolador
e, usado muitas vezes, durante o desenvolvimento de um programa.
Reset quando o valor da alimentao desce abaixo do limite permitido (Brown-out Reset).
O impulso que provoca o reset durante o estabelecimento da alimentao (power-up), gerado pelo
prprio microcontrolador quando detecta um aumento na tenso Vdd (numa faixa entre 1,2V e 1,8V).
Esse impulso perdura durante 72ms, o que, em princpio, tempo suficiente para que o oscilador
estabilize. Esse intervalo de tempo de 72ms definido por um temporizador interno PWRT, com um
oscilador RC prprio. Enquanto PWRT estiver activo, o microcontrolador mantm-se no estado de reset.
Contudo, quando o dispositivo est a trabalhar, pode surgir um problema no resultante de uma queda da
tenso para 0 volts, mas sim de uma queda de tenso para um valor abaixo do limite que garante o
correcto funcionamento do microcontrolador. Trata-se de um facto muito provvel de ocorrer na prtica,
especialmente em ambientes industriais onde as perturbaes e instabilidade da alimentao ocorrem
frequentemente. Para resolver este problema, ns precisamos de estar certos de que o microcontrolador
entra no estado de reset de cada vez que a alimentao desce abaixo do limite aprovado.
A unidade lgica aritmtica (ALU Arithmetic Logic Unit), responsvel pela execuo de operaes de
adio, subtraco, deslocamento (para a esquerda ou para a direita dentro de um registo) e operaes
lgicas. O PIC16F84 contm uma unidade lgica aritmtica de 8 bits e registos de uso genrico tambm
de 8 bits.
Por operando ns designamos o contedo sobre o qual uma operao incide. Nas instrues com dois
operandos, geralmente um operando est contido no registo de trabalho W (working register) e o outro
operando ou uma constante ou ento est contido num dos outros registos. Esses registos podem ser
Registos de Uso Genrico (General Purpose Registers GPR) ou Registos com funes especiais
(Special Function Registers SFR). Nas instrues s com um operando, um dos operandos o contedo
do registo W ou o contedo de um dos outros registos. Quando so executadas operaes lgicas ou
aritmticas como o caso da adio, a ALU controla o estado dos bits (que constam do registo de estado
STATUS). Dependendo da instruo a ser executada, a ALU, pode modificar os valores bits do Carry
(C), Carry de dgito (DC) e Z (zero) no registo de estado - STATUS.
Diagrama bloco mais detalhado do microcontrolador PIC16F84
Registo STATUS
O registo de estado (STATUS), contm o estado da ALU (C, DC, Z), estado de RESET (TO, PD) e os
bits para seleco do banco de memria (IRP, RP1, RP0). Considerando que a seleco do banco de
memria controlada atravs deste registo, ele tem que estar presente em todos os bancos. Os bancos de
memria sero discutidos com mais detalhe no captulo que trata da Organizao da Memria. Se o
registo STATUS for o registo de destino para instrues que afectem os bits Z, DC ou C, ento no
possvel escrever nestes trs bits.
Registo OPTION
bits 0 a 2 PS0, PS1, PS2 (bits de seleco do divisor Prescaler)
Estes trs bits definem o factor de diviso do prescaler. Aquilo que o prescaler e o modo como o valor
destes trs bits afectam o funcionamento do microcontrolador ser estudado na seco referente a TMR0.
2.4 Portos
Porto, um grupo de pinos num microcontrolador que podem ser acedidos simultaneamente, e, no qual
ns podemos colocar uma combinao de zeros e uns ou ler dele o estado existente. Fisicamente, porto
um registo dentro de um microcontrolador que est ligado por fios aos pinos do microcontrolador. Os
portos representam a conexo fsica da Unidade Central de Processamento (CPU) com o mundo exterior.
O microcontrolador usa-os para observar ou comandar outros componentes ou dispositivos. Para
aumentar a sua funcionalidade, os mesmos pinos podem ter duas aplicaes distintas, como, por exemplo,
RA4/TOCKI, que simultaneamente o bit 4 do porto A e uma entrada externa para o
contador/temporizador TMR0. A escolha de uma destas duas funes feita atravs dos registos de
configurao. Um exemplo disto o TOCS, quinto bit do registo OPTION. Ao seleccionar uma das
funes, a outra automaticamente inibida.
Todos os pinos dos portos podem ser definidos como de entrada ou de sada, de acordo com as
necessidades do dispositivo que se est a projectar. Para definir um pino como entrada ou como sada,
preciso, em primeiro lugar, escrever no registo TRIS, a combinao apropriada de zeros e uns. Se no local
apropriado de um registo TRIS for escrito o valor lgico 1, ento o correspondente pino do porto
definido como entrada, se suceder o contrrio, o pino definido como sada. Todos os portos, tm um
registo TRIS associado. Assim, para o porto A, existe o registo TRISA no endereo 85h e, para o porto B
existe o registo TRISB, no endereo 86h.
PORTO B
O porto B tem 8 pinos associados a ele. O respectivo registo de direco de dados chama-se TRISB e tem
o endereo 86h. Ao pr a 1 um bit do registo TRISB, define-se o correspondente pino do porto como
entrada e se pusermos a 0 um bit do registo TRISB, o pino correspondente vai ser uma sada. Cada pino
do PORTO B possui uma pequena resistncia de pull-up (resistncia que define a linha como tendo o
valor lgico 1). As resistncias de pull-up so activadas pondo a 0 o bit RBPU, que o bit 7 do registo
OPTION. Estas resistncias de pull-up so automaticamente desligadas quando os pinos do porto so
configurados como sadas. Quando a alimentao do microcontrolador ligada, as resistncias de pull-up
so tambm desactivadas.
Quatro pinos do PORTO B, RB4 a RB7 podem causar uma interrupo, que ocorre quando qualquer
deles varia do valor lgico zero para valor lgico um ou o contrrio. Esta forma de interrupo s pode
ocorrer se estes pinos forem configurados como entradas (se qualquer um destes 4 pinos for configurado
como sada, no ser gerada uma interrupo quando h variao de estado). Esta modalidade de
interrupo, acompanhada da existncia de resistncias de pull-up internas, torna possvel resolver mais
facilmente problemas frequentes que podemos encontrar na prtica, como por exemplo a ligao de um
teclado matricial. Se as linhas de um teclado ficarem ligadas a estes pinos, sempre que se prime uma
tecla, ir-se- provocar uma interrupo. Ao processar a interrupo, o microcontrolador ter que
identificar a tecla que a produziu. No recomendvel utilizar o porto B, ao mesmo tempo que esta
interrupo est a ser processada.
O exemplo de cima mostra como os pinos 0, 1, 2 e 3 so definidos como entradas e 4, 5, 6 e 7 como
sadas.
PORTO A
O porto A (PORTA) est associado a 5 pinos. O registo de direco de dados correspondente o TRISA,
no endereo 85h. Tal como no caso do porto B, pr a 1 um bit do registo TRISA, equivale a definir o
correspondente pino do porto A, como entrada e pr a 0 um bit do mesmo registo, equivale a definir o
correspondente pino do porto A, como sada.
O quinto pino do porto A tem uma funo dupla. Nesse pino est tambm situada a entrada externa do
temporizador TMR0. Cada uma destas opes escolhida pondo a 1 ou pondo a 0 o bit TOCS (bit de
seleco de fonte de clock de TMR0). Conforme o valor deste bit, assim o temporizador TMR0
incrementa o seu valor por causa de um impulso do oscilador interno ou devido a um impulso externo
aplicado ao pino RA4/TOCKI.
Este exemplo mostra como os pinos 0, 1, 2, 3 e 4 so declarados como entradas e os pinos 5, 6 e 7 como
pinos de sada.
Memria de programa
A memria de programa implementada usando tecnologia FLASH, o que torna possvel programar o
microcontrolador muitas vezes antes de este ser instalado num dispositivo, e, mesmo depois da sua
instalao, podemos alterar o programa e parmetros contidos. O tamanho da memria de programa de
1024 endereos de palavras de 14 bits, destes, os endereos zero e quatro esto reservados
respectivamente para o reset e para o vector de interrupo.
Memria de dados
A memria de dados compreende memria EEPROM e memria RAM. A memria EEPROM consiste
em 64 posies para palavras de oito bits e cujos contedos no se perdem durante uma falha na
alimentao. A memria EEPROM no faz parte directamente do espao de memria mas acedida
indirectamente atravs dos registos EEADR e EEDATA. Como a memria EEPROM serve usualmente
para guardar parmetros importantes (por exemplo, de uma dada temperatura em reguladores de
temperatura), existe um procedimento estrito para escrever na EEPROM que tem que ser seguido de
modo a evitar uma escrita acidental. A memria RAM para dados, ocupa um espao no mapa de memria
desde o endereo 0x0C at 0x4F, o que corresponde a 68 localizaes. Os locais da memria RAM so
tambm chamados registos GPR (General Purpose Registers = Registos de uso genrico). Os registos
GPR podem ser acedidos sem ter em ateno o banco em que nos encontramos de momento.
Registos SFR
Os registos que ocupam as 12 primeiras localizaes nos bancos 0 e 1 so registos especiais e tm a ver
com a manipulao de certos blocos do microcontrolador. Estes registos so os SFR (Special Function
Registers ou Registos de Funes Especiais).
Bancos de Memria
Alm da diviso em comprimento entre registos SFR e GPR, o mapa de memria est tambm dividido
em largura (ver mapa anterior) em duas reas chamadas bancos. A seleco de um dos bancos feita
por intermdio dos bits RP0 e RP1 do registo STATUS.
Exemplo :
bcf STATUS, RP0
A instruo BCF limpa o bit RP0 (RP0 = 0) do registo STATUS e, assim, coloca-nos no banco 0.
A instruo BSF pe a um, o bit RP0 (RP0 = 1) do registo STATUS e, assim, coloca-nos no banco 1.
Normalmente, os grupos de instrues muito usados so ligados numa nica unidade que pode ser
facilmente invocada por diversas vezes num programa, uma unidade desse tipo chama-se genericamente
Macro e, normalmente, essa unidade designada por um nome especifico facilmente compreensvel. Com
a sua utilizao, a seleco entre os dois bancos torna-se mais clara e o prprio programa fica mais
legvel.
BANK0 macro
Bcf STATUS, RP0 ;Selecionar o banco 0 da memria
Endm
BANK1 macro
Bsf STATUS, RP0 ; Selecionar o banco 1 da memria
Endm
Os locais de memria 0Ch 4Fh so registos de uso genrico (GPR) e so usados como memria
RAM. Quando os endereos 8Ch CFh so acedidos, ns acedemos tambm s mesmas
localizaes do banco 0. Por outras palavras, quando estamos a trabalhar com os registos de uso
genrico, no precisamos de nos preocupar com o banco em que nos encontramos!
Contador de Programa
O contador de programa (PC = Program Counter), um registo de 13 bits que contm o endereo da
instruo que vai ser executada. Ao incrementar ou alterar (por exemplo no caso de saltos) o contedo do
PC, o microcontrolador consegue executar as todas as instrues do programa, uma aps outra.
Pilha
O PIC16F84 tem uma pilha (stack) de 13 bits e 8 nveis de profundidade, o que corresponde a 8 locais de
memria com 13 bits de largura. O seu papel bsico guardar o valor do contador de programa quando
ocorre um salto do programa principal para o endereo de um subprograma a ser executado. Depois de ter
executado o subprograma, para que o microcontrolador possa continuar com o programa principal a partir
do ponto em que o deixou, ele tem que ir buscar pilha esse endereo e carreg-lo no contador de
programa. Quando nos movemos de um programa para um subprograma, o contedo do contador de
programa empurrado para o interior da pilha (um exemplo disto a instruo CALL). Quando so
executadas instrues tais como RETURN, RETLW ou RETFIE no fim de um subprograma, o contador
de programa retirado da pilha, de modo a que o programa possa continuar a partir do ponto em que a
sequncia foi interrompida. Estas operaes de colocar e extrair da pilha o contador de programa, so
designadas por PUSH (meter na pilha) e POP (tirar da pilha), estes dois nomes provm de instrues com
estas designaes, existentes nalguns microcontroladores de maior porte.
Programao no Sistema
Para programar a memria de programa, o microcontrolador tem que entrar num modo especial de
funcionamento no qual o pino MCLR posto a 13,5V e a voltagem da alimentao Vdd deve permanecer
estvel entre 4,5V e 5,5V. A memria de programa pode ser programada em srie, usando dois pinos
data/clock que devem ser previamente separados do dispositivo em que o microcontrolador est
inserido, de modo a que no possam ocorrer erros durante a programao.
Modos de endereamento
Endereamento Directo
O endereamento directo feito atravs de um endereo de 9 bits. Este endereo obtm-se juntando aos
sete bits do endereo directo de uma instruo, mais dois bits (RP1 e RP0) do registo STATUS, como se
mostra na figura que se segue. Qualquer acesso aos registos especiais (SFR), pode ser um exemplo de
endereamento directo.
Bsf STATUS,
; Banco 1
RP0
movlw 0xFF ; w = 0xFF
movwf TRISA ; o endereo do registo TRISA tirado do cdigo da instruo movwf TRISA
Endereamento Directo
Endereamento Indirecto
O endereamento indirecto, ao contrrio do directo, no tira um endereo do cdigo instruo, mas f-lo
com a ajuda do bit IRP do registo STATUS e do registo FSR. O local endereado acedido atravs do
registo INDF e coincide com o endereo contido em FSR. Por outras palavras, qualquer instruo que use
INDF como registo, na realidade acede aos dados apontados pelo registo FSR. Vamos supor, por
exemplo, que o registo de uso genrico de endereo 0Fh contm o valor 20. Escrevendo o valor de 0Fh no
registo FSR, ns vamos obter um ponteiro para o registo 0Fh e, ao ler o registo INDF, ns iremos obter o
valor 20, o que significa que lemos o contedo do registo 0Fh, sem o mencionar explicitamente (mas
atravs de FSR e INDF). Pode parecer que este tipo de endereamento no tem quaisquer vantagens sobre
o endereamento directo, mas existem problemas que s podem ser resolvidos de uma forma simples,
atravs do endereamento indirecto.
Endereamento Indirecto
Um exemplo pode ser enviar um conjunto de dados atravs de uma comunicao srie, usando buffers e
indicadores (que sero discutidos num captulo mais frente, com exemplos), outro exemplo limpar os
registos da memria RAM (16 endereos neste caso) como se pode ver a seguir.
Quando o contedo do registo FSR igual a zero, ler dados do registo INDF resulta no valor 0 e escrever
em INDF resulta na instruo NOP (no operation = nenhuma operao).
2.6 Interrupes
As interrupes so um mecanismo que o microcontrolador possui e que torna possvel responder a
alguns acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa que o
microcontrolador esteja a executar no momento. Esta uma parte muito importante, porque fornece a
ligao entre um microcontrolador e o mundo real que nos rodeia. Geralmente, cada interrupo muda a
direco de execuo do programa, suspendendo a sua execuo, enquanto o microcontrolador corre um
subprograma que a rotina de atendimento de interrupo. Depois de este subprograma ter sido
executado, o microcontrolador continua com o programa principal, a partir do local em que o tinha
abandonado.
Uma das possveis fontes de interrupo e como afecta o programa principal
O registo que controla as interrupes chamado INTCON e tem o endereo 0Bh. O papel do INTCON
permitir ou impedir as interrupes e, mesmo no caso de elas no serem permitidas, ele toma nota de
pedidos especficos, alterando o nvel lgico de alguns dos seus bits.
Registo INTCON
bit 0 RBIF (flag que indica variao no porto B) Bit que informa que houve mudana nos nveis lgicos
nos pinos 4, 5, 6 e 7 do porto B.
1= pelo menos um destes pinos mudou de nvel lgico
0= no ocorreu nenhuma variao nestes pinos
bit 1 INTF (flag de interrupo externa INT) Ocorrncia de uma interrupo externa
1= ocorreu uma interrupo externa
0= no ocorreu uma interrupo externa
Se um impulso ascendente ou descendente for detectado no pino RB0/INT, o bit INTF posto a 1 (o
tipo de sensibilidade, ascendente ou descendente definida atravs do bit INTEDG do registo OPTION).
O subprograma de atendimento desta interrupo, deve repor este bit a 0, afim de que a prxima
interrupo possa ser detectada.
bit 2 TOIF (Flag de interrupo por transbordo de TMR0) O contador TMR0, transbordou.
1= o contador mudou a contagem de FFh para 00h
0= o contador no transbordou
Para que esta interrupo seja detectada, o programa deve pr este bit a 0
bit 3 RBIE (bit de habilitao de interrupo por variao no porto B) Permite que a interrupo por
variao dos nveis lgicos nos pinos 4, 5, 6 e 7 do porto B, ocorra.
1= habilita a interrupo por variao dos nveis lgicos
0= inibe a interrupo por variao dos nveis lgicos
A interrupo s pode ocorrer se RBIE e RBIF estiverem simultaneamente a 1 lgico.
bit 4 INTE (bit de habilitao da interrupo externa INT) bit que permite uma interrupo externa no bit
RB0/INT.
1= interrupo externa habilitada
0= interrupo externa impedida
A interrupo s pode ocorrer se INTE e INTF estiverem simultaneamente a 1 lgico.
bit 5 TOIE (bit de habilitao de interrupo por transbordo de TMR0) bit que autoriza a interrupo por
transbordo do contador TMR0.
1= interrupo autorizada
0= interrupo impedida
A interrupo s pode ocorrer se TOIE e TOIF estiverem simultaneamente a 1 lgico.
bit 6 EEIE (bit de habilitao de interrupo por escrita completa, na EEPROM) bit que habilita uma
interrupo quando uma operao de escrita na EEPROM termina.
1= interrupo habilitada
0= interrupo inibida
Se EEIE e EEIF (que pertence ao registo EECON1) estiverem simultaneamente a 1, a interrupo pode
ocorrer.
bit 7 GIE (bit de habilitao global de interrupo) bit que permite ou impede todas as interrupes
1= todas as interrupes so permitidas
0= todas as interrupes impedidas
De um modo geral, cada fonte de interrupo tem dois bits associados. Um habilita a interrupo e o
outro assinala quando a interrupo ocorre. Existe um bit comum a todas as interrupes chamado GIE
que pode ser usado para impedir ou habilitar todas as interrupes, simultaneamente. Este bit muito til
quando se est a escrever um programa porque permite que todas as interrupes sejam impedidas
durante um perodo de tempo, de tal maneira que a execuo de uma parte crtica do programa no possa
ser interrompida. Quando a instruo que faz GIE= 0 executada (GIE= 0 impede todas as interrupes),
todas os pedidos de interrupo pendentes, sero ignorados.
Esquema das interrupes no microcontrolador PIC16F84
As interrupes que esto pendentes e que so ignoradas, so processadas quando o bit GIE posto a 1
(GIE= 1, todas as interrupes permitidas). Quando a interrupo atendida, o bit GIE posto a 0, de
tal modo que, quaisquer interrupes adicionais sejam inibidas, o endereo de retorno guardado na pilha
e, no contador de programa, escrito 0004h somente depois disto, que a resposta a uma interrupo
comea!
Depois de a interrupo ser processada, o bit que por ter sido posto a 1 permitiu a interrupo, deve
agora ser reposto a 0, seno, a rotina de interrupo ir ser automaticamente processada novamente, mal
se efectue o regresso ao programa principal.
A nica coisa que guardada na pilha durante uma interrupo o valor de retorno do contador de
programa (por valor de retorno do contador de programa entende-se o endereo da instruo que estava
para ser executada, mas que no foi, por causa de ter ocorrido a interrupo). Guardar apenas o valor do
contador de programa no , muitas vezes, suficiente. Alguns registos que j foram usados no programa
principal, podem tambm vir a ser usados na rotina de interrupo. Se ns no salvaguardamos os seus
valores, quando acontece o regresso da subrotina para o programa principal os contedos dos registos
podem ser inteiramente diferentes, o que causaria um erro no programa. Um exemplo para este caso o
contedo do registo de trabalho W (work register). Se supormos que o programa principal estava a usar o
registo de trabalho W nalgumas das suas operaes e se ele contiver algum valor que seja importante para
a instruo seguinte, ento a interrupo que ocorre antes desta instruo vai alterar o valor do registo de
trabalho W, indo influenciar directamente o programa principal.
Uma das possveis causas de erros no salvaguardar dados antes de executar um subprograma de
interrupo
Devido sua simplicidade e uso frequente, estas partes do programa podem ser implementadas com
macros. O conceito de Macro explicado em Programao em linguagem Assembly. No exemplo que
se segue, os contedos de W e do registo STATUS so guardados nas variveis W_TEMP e
STATUS_TEMP antes de correr a rotina de interrupo. No incio da rotina PUSH, ns precisamos de
verificar qual o banco que est a ser seleccionado porque W_TEMP e STATUS_TEMP esto situados no
banco 0. Para troca de dados entre estes dois registos, usada a instruo SWAPF em vez de MOVF, pois
a primeira no afecta os bits do registo STATUS.
Se existirem mais variveis ou registos que necessitem de ser salvaguardados, ento, precisamos de os
guardar depois de guardar o registo STATUS (passo 3) e recuper-los depois de restaurar o registo
STATUS (passo 5).
A mesma operao pode ser realizada usando macros, desta maneira obtemos um programa mais legvel.
Os macros que j esto definidos podem ser usados para escrever novos macros. Os macros BANK1 e
BANK0 que so explicados no captulo Organizao da memria so usados nos macros push e
pop.
Interrupo externa no pino RB0/INT do microcontrolador
A interrupo externa no pino RB0/ INT desencadeada por um impulso ascendente (se o bit INTEDG =
1 no registo OPTION<6>), ou por um impulso descendente (se INTEDG = 0). Quando o sinal correcto
surge no pino INT, o bit INTF do registo INTCON posto a 1. O bit INTF (INTCON<1>) tem que ser
reposto a 0 na rotina de interrupo, afim de que a interrupo no possa voltar a ocorrer de novo,
aquando do regresso ao programa principal. Esta uma parte importante do programa e que o
programador no pode esquecer, caso contrrio o programa ir constantemente saltar para a rotina de
interrupo. A interrupo pode ser inibida, pondo a 0 o bit de controle INTE (INTCON<4>).
O transbordar do contador TMR0 (passagem de FFh para 00h) vai pr a 1 o bit TOIF (INTCON<2>),
Esta uma interrupo muito importante, uma vez que, muitos problemas da vida real podem ser
resolvidos utilizando esta interrupo. Um exemplo o da medio de tempo. Se soubermos de quanto
tempo o contador precisa para completar um ciclo de 00h a FFh, ento, o nmero de interrupes
multiplicado por esse intervalo de tempo, d-nos o tempo total decorrido. Na rotina de interrupo uma
varivel guardada na memria RAM vai sendo incrementada, o valor dessa varivel multiplicado pelo
tempo que o contador precisa para um ciclo completo de contagem, vai dar o tempo gasto. Esta
interrupo pode ser habilitada ou inibida, pondo a 1 ou a 0 o bit TOIE (INTCON<5>).
Uma variao em 4 bits de entrada do Porto B (bits 4 a 7), pe a 1 o bit RBIF (INTCON<0>). A
interrupo ocorre, portanto, quando os nveis lgicos em RB7, RB6, RB5 e RB4 do porto B, mudam do
valor lgico 1 para o valor lgico 0 ou vice-versa. Para que estes pinos detectem as variaes, eles
devem ser definidos como entradas. Se qualquer deles for definido como sada, nenhuma interrupo ser
gerada quando surgir uma variao do nvel lgico. Se estes pinos forem definidos como entradas, o seu
valor actual comparado com o valor anterior, que foi guardado quando se fez a leitura anterior do porto
B. Esta interrupo pode ser habilitada/inibida pondo a 1 ou a 0, o bit RBIE do registo INTCON.
Esta interrupo apenas de natureza prtica. Como escrever num endereo da EEPROM leva cerca de
10ms (o que representa muito tempo quando se fala de um microcontrolador), no recomendvel que se
deixe o microcontrolador um grande intervalo de tempo sem fazer nada, espera do fim da operao da
escrita. Assim, dispomos de um mecanismo de interrupo que permite ao microcontrolador continuar a
executar o programa principal, enquanto, em simultneo, procede escrita na EEPROM. Quando esta
operao de escrita se completa, uma interrupo informa o microcontrolador deste facto. O bit EEIF,
atravs do qual esta informao dada, pertence ao registo EECON1. A ocorrncia desta interrupo
pode ser impedida, pondo a 0 o bit EEIE do registo INTCON.
Iniciao da interrupo
Para que num microcontrolador se possa usar um mecanismo de interrupo, preciso proceder a
algumas tarefas preliminares. Estes procedimentos so designados resumidamente por iniciao. Na
iniciao, ns estabelecemos a que interrupes deve o microcontrolador responder e as que deve ignorar.
Se no pusermos a 1 o bit que permite uma certa interrupo, o programa vai ignorar a correspondente
subrotina de interrupo. Por este meio, ns podemos controlar a ocorrncia das interrupes, o que
muito til.
O exemplo que se segue, ilustra uma maneira tpica de lidar com as interrupes. O PIC16F84 tem
somente um endereo para a rotina de interrupo. Isto significa que, primeiro, necessrio identificar
qual a origem da interrupo (se mais que uma fonte de interrupo estiver habilitada), e a seguir deve
executar-se apenas a parte da subrotina que se refere interrupo em causa.
O regresso de uma rotina de interrupo pode efectuar-se com as instrues RETURN, RETLW e
RETFIE. Recomenda-se que seja usada a instruo RETFIE porque, essa instruo a nica que
automaticamente pe a 1 o bit GIE, permitindo assim que novas interrupes possam ocorrer.
O incremento do temporizador feito em simultneo com tudo o que o microcontrolador faz. Compete ao
programador arranjar maneira de tirar partido desta caracterstica. Uma das maneiras incrementar uma
varivel sempre que o microcontrolador transvaza (passa de 255 para 0). Se soubermos de quanto tempo
um temporizador precisa para perfazer uma contagem completa (de 0 a 255), ento, se multiplicarmos o
valor da varivel por esse tempo, ns obteremos o tempo total decorrido.
Quando a contagem ultrapassa 255, o temporizador volta de novo a zero e comea um novo ciclo de
contagem at 255. Sempre que ocorre uma transio de 255 para 0, o bit TOIF do registo INTCON
posto a '1'. Se as interrupes estiverem habilitadas, possvel tirar partido das interrupes geradas e da
rotina de servio de interrupo. Cabe ao programador voltar a pr a '0' o bit TOIF na rotina de
interrupo, para que uma nova interrupo possa ser detectada. Alm do oscilador de clock do
microcontrolador, o contedo do temporizador pode tambm ser incrementado atravs de um clock
externo ligado ao pino RA4/TOCKI. A escolha entre uma destas opes feita no bit TOCS, pertencente
ao registo OPTION. Se for seleccionado o clock externo, possvel definir o bordo activo do sinal
(ascendente ou descendente), que vai incrementar o valor do temporizador.
O exemplo seguinte mostra como iniciar o temporizador para contar os impulsos descendentes
provenientes de uma fonte de clock externa com um prescaler 1:4.
O mesmo exemplo pode ser implementado atravs de uma interrupo do modo seguinte:
O prescaler tanto pode ser atribudo ao temporizador TMR0, como ao watchdog. O watchdog um
mecanismo que o microcontrolador usa para se defender contra "estouros" do programa. Como qualquer
circuito elctrico, tambm os microcontroladores podem ter uma falha ou algum percalo no seu
funcionamento. Infelizmente, o microcontrolador tambm pode ter problemas com o seu programa.
Quando isto acontece, o microcontrolador pra de trabalhar e mantm-se nesse estado at que algum
faa o reset. Por causa disto, foi introduzido o mecanismo de watchdog (co de guarda). Depois de um
certo perodo de tempo, o watchdog faz o reset do microcontrolador (o que realmente acontece, que o
microcontrolador executa o reset de si prprio). O watchdog trabalha na base de um princpio simples: se
o seu temporizador transbordar, feito o reset do microcontrolador e este comea a executar de novo o
programa a partir do princpio. Deste modo, o reset poder ocorrer tanto no caso de funcionamento
correcto como no caso de funcionamento incorrecto. O prximo passo evitar o reset no caso de
funcionamento correcto, isso feito escrevendo zero no registo WDT (instruo CLRWDT) sempre que
este est prximo de transbordar. Assim, o programa ir evitar um reset enquanto est a funcionar
correctamente. Se ocorrer o "estouro" do programa, este zero no ser escrito, haver transbordo do
temporizador WDT e ir ocorrer um reset que vai fazer com que o microcontrolador comece de novo a
trabalhar correctamente.
O prescaler pode ser atribudo ao temporizador TMR0, ou ao temporizador do watchdog, isso feito
atravs do bit PSA no registo OPTION. Fazendo o bit PSA igual a '0', o prescaler atribudo ao
temporizador TMR0. Quando o prescaler atribudo ao temporizador TMR0, todas as instrues de
escrita no registo TMR0 (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vo limpar o prescaler. Quando
o prescaler atribudo ao temporizador do watchdog, somente a instruo CLRWDT ir limpar o
prescaler e o temporizador do watchdog ao mesmo tempo. A mudana do prescaler est completamente
sob o controle do programador e pode ser executada enquanto o programa est a correr.
Existe apenas um prescaler com o seu temporizador. Dependendo das necessidades, pode ser
atribudo ao temporizador TMR0 ou ao watchdog, mas nunca aos dois em simultneo.
RA4/T0CKI.
1 = impulsos externos
0 = 1/4 do clock interno
Na prtica, a memria EEPROM usada para guardar dados importantes ou alguns parmetros de
processamento.
Um parmetro deste tipo, uma dada temperatura, atribuda quando ajustamos um regulador de
temperatura para um processo. Se esse valor se perder, seria necessrio reintroduzi-lo sempre que
houvesse uma falha na alimentao. Como isto impraticvel (e mesmo perigoso), os fabricantes de
microcontroladores comearam a instalar nestes uma pequena quantidade de memria EEPROM.
A memria EEPROM colocada num espao de memria especial e pode ser acedida atravs de registos
especiais. Estes registos so:
EEDATA no endereo 08h, que contm o dado lido ou aquele que se quer escrever.
EEADR no endereo 09h, que contm o endereo do local da EEPROM que vai ser acedido
EECON1 no endereo 88h, que contm os bits de controle.
EECON2 no endereo 89h. Este registo no existe fisicamente e serve para proteger a EEPROM de
uma escrita acidental.
O registo EECON1 ocupa o endereo 88h e um registo de controle com cinco bits implementados.
Os bits 5, 6 e 7 no so usados e, se forem lidos, so sempre iguais a zero.
Os bits do registo EECON1, devem ser interpretados do modo que se segue.
Registo EECON1
bit 0 RD (bit de controle de leitura)
Ao pr este bit a '1', tem incio a transferncia do dado do endereo definido em EEADR para o registo
EEDATA. Como o tempo no essencial, tanto na leitura como na escrita, o dado de EEDATA pode j
ser usado na instruo seguinte.
1 = inicia a leitura
0 = no inicia a leitura
bit 4 EEIF (bit de interrupo por operao de escrita na EEPROM completa) Bit usado para informar
que a escrita do dadoo na EEPROM, terminou.
Quando a escrita tiver terminado, este bit automaticamente posto a '1'. O programador tem que repr a
'0' o bit EEIF no seu programa, para que possa detectar o fim de uma nova operao de escrita.
1 = escrita terminada
0 = a escrita ainda no terminou ou no comeou.
Pondo a 1 o bit RD inicia-se a transferncia do dado do endereo guardado no registo EEADR para o
registo EEDATA. Como para ler os dados no preciso tanto tempo como a escrev-los, os dados
extrados do registo EEDATA podem j ser usados na instruo seguinte.
Uma poro de um programa que leia um dado da EEPROM, pode ser semelhante ao seguinte:
Depois da ltima instruo do programa, o contedo do endereo 0 da EEPROM pode ser encontrado no
registo de trabalho w.
Escrevendo na Memria EEPROM
Para escrever dados num local da EEPROM, o programador tem primeiro que enderear o registo
EEADR e introduzir a palavra de dados no registo EEDATA. A seguir, deve colocar-se o bit WR a 1, o
que faz desencadear o processo. O bit WR dever ser posto a 0 e o bit EEIF ser posto a 1 a seguir
operao de escrita, o que pode ser usado no processamento de interrupes. Os valores 55h e AAh so as
primeira e segunda chaves que tornam impossvel que ocorra uma escrita acidental na EEPROM. Estes
dois valores so escritos em EECON2 que serve apenas para isto, ou seja, para receber estes dois valores
e assim prevenir contra uma escrita acidental na memria EEPROM. As linhas do programa marcadas
como 1, 2, 3 e 4 tm que ser executadas por esta ordem em intervalos de tempo certos. Portanto, muito
importante desactivar as interrupes que possam interferir com a temporizao necessria para executar
estas instrues. Depois da operao de escrita, as interrupes podem, finalmente, ser de novo
habilitadas.
Exemplo da poro de programa que escreve a palavra 0xEE no primeiro endereo da memria
EEPROM:
Recomenda-se que WREN esteja sempre inactivo, excepto quando se est a escrever uma palavra de
dados na EEPROM, deste modo, a possibilidade de uma escrita acidental mnima.
Todas as operaes de escrita na EEPROM limpam automaticamente o local de memria, antes de
escrever de novo nele !
CAPTULO 3
Conjunto de Instrues
Introduo
J dissemos que um microcontrolador no como qualquer outro circuito
integrado. Quando saem da cadeia de produo, a maioria dos circuitos integrados,
esto prontos para serem introduzidos nos dispositivos, o que no o caso dos
microcontroladores. Para que um microcontrolador cumpra a sua tarefa, ns temos
que lhe dizer exactamente o que fazer, ou, por outras palavras, ns temos que
escrever o programa que o microcontrolador vai executar. Neste captulo iremos
descrever as instrues que constituem o assembler, ou seja, a linguagem de baixo
nvel para os microcontroladores PIC.
Conjunto de Instrues da
Famlia PIC16Cxx de
Microcontroladores
O conjunto completo compreende 35 instrues e mostra-se na tabela que se
segue. Uma razo para este pequeno nmero de instrues resulta principalmente
do facto de estarmos a falar de um microcontrolador RISC cujas instrues foram
optimizadas tendo em vista a rapidez de funcionamento, simplicidade de
arquitectura e compacidade de cdigo. O nico inconveniente, que o programador
tem que dominar a tcnica desconfortvel de fazer o programa com apenas 35
instrues.
Transferncia de dados
Lgicas e aritmticas
A lgica dentro do PIC tem a capacidade de executar as operaes AND, OR, EX-
OR, complemento (COMF) e rotaes (RLF e RRF).
Estas ltimas instrues, rodam o contedo do registo atravs desse registo e da
flag C de uma casa para a esquerda (na direco do bit 7), ou para a direita (na
direco do bit 0). O bit que sai do registo escrito na flag C e o contedo anterior
desta flag, escrito no bit situado do lado oposto no registo.
Direco de execuo de um
programa
As instrues GOTO, CALL e RETURN so executadas do mesmo modo que em
todos os outros microcontroladores, a diferena que a pilha independente da
RAM interna e limitada a oito nveis. A instruo RETLW k idntica instruo
RETURN, excepto que, ao regressar de um subprograma, escrita no registo W
uma constante definida pelo operando da instruo. Esta instruo, permite-nos
implementar facilmente listagens (tambm chamadas tabelas de lookup). A maior
parte das vezes, usamo-las determinando a posio do dado na nossa tabela
adicionando-a ao endereo em que a tabela comea e, ento, lido o dado nesse
local (que est situado normalmente na memria de programa).
CAPTULO 4
Programao em Linguagem Assembly
Introduo
A capacidade de comunicar da maior importncia nesta rea. Contudo, isso s
possvel se ambas as partes usarem a mesma linguagem, ou seja, se seguirem as
mesmas regras para comunicarem. Isto mesmo se aplica comunicao entre os
microcontroladores e o homem. A linguagem que o microcontrolador e o homem
usam para comunicar entre si designada por linguagem assembly. O prprio
ttulo no tem um significado profundo, trata-se de apenas um nome como por
exemplo ingls ou francs. Mais precisamente, linguagem assembly apenas
uma soluo transitria. Os programas escritos em linguagem assembly devem ser
traduzidos para uma linguagem de zeros e uns de modo a que um
microcontrolador a possa receber. Linguagem assembly e assembler so coisas
diferentes. A primeira, representa um conjunto de regras usadas para escrever um
programa para um microcontrolador e a outra, um programa que corre num
computador pessoal que traduz a linguagem assembly para uma linguagem de
zeros e uns. Um programa escrito em zeros e uns diz-se que est escrito em
linguagem mquina.
Linguagem Assembly
Labels (rtulos)
Instrues
Operandos
Directivas
Comentrios
Instrues
As instrues so especficas para cada microcontrolador, assim, se quisermos
utilizar a linguagem assembly temos que estudar as instrues desse
microcontrolador. O modo como se escreve uma instruo designado por
"sintaxe". No exemplo que se segue, possvel reconhecer erros de escrita, dado
que as instrues movlp e gotto no existem no microcontrolador PIC16F84.
Operandos
Operandos so os elementos da instruo necessrios para que a instruo possa
ser executada. Normalmente so registos, variveis e constantes. As constantes
so designadas por literais. A palavra literal significa nmero.
Comentrios
Comentrio um texto que o programador escreve no programa afim de tornar
este mais claro e legvel. colocado logo a seguir a uma instruo e deve comear
com uma semi-vrgula ";".
Directivas
Uma directiva parecida com uma instruo mas, ao contrrio desta,
independente do tipo de microcontrolador e uma caracterstica inerente prpria
linguagem assembly. As directivas servem-se de variveis ou registos para
satisfazer determinados propsitos. Por exemplo, NIVEL, pode ser uma designao
para uma varivel localizada no endereo 0Dh da memria RAM. Deste modo, a
varivel que reside nesse endereo, pode ser acedida pela palavra NIVEL. muito
mais fcil a um programador recordar a palavra NIVEL, que lembrar-se que o
endereo 0Dh contm informao sobre o nvel.
Para que o seu funcionamento seja correcto, preciso definir vrios parmetros
para o microcontrolador, tais como:
- tipo de oscilador
- quando o temporizador do watchdog est ligado e
- quando o circuito interno de reset est habilitado.
Tudo isto definido na directiva seguinte:
Logo que todos os elementos de que precisamos tenham sido definidos, podemos
comear a escrever o programa.
Primeiro, necessrio definir o endereo para que o microcontrolador deve ir
quando se liga a alimentao. esta a finalidade de (org 0x00).
O endereo para onde um programa salta se ocorrer uma interrupo (org 0x04).
Como este um programa simples, suficiente dirigir o microcontrolador para o
incio de um programa com uma instruo "goto Main" (Main = programa
principal).
Directivas de controle
Sintaxe:
#define<nome> [< texto atribudo a nome > ]
Descrio:
De cada vez que a palavra <nome> aparece no programa, vai ser substituda por
<texto atribudo a nome>.
Exemplo:
#define ligado 1
#define desligado 0
Sintaxe:
include <<nome_do_ficheiro>>
include <nome_do_ficheiro>
Descrio:
A aplicao desta directiva faz com que um ficheiro completo seja copiado para o
local em que a directiva include se encontra. Se o nome do ficheiro estiver entre
aspas, estamos a lidar com um ficheiro do sistema, se no estiver entre aspas, mas
sim entre os sinais < >, trata-se de um ficheiro do utilizador. A directiva include,
contribui para uma melhor apresentao do programa principal.
Exemplo:
include < regs.h >
include subprog.asm
Sintaxe:
constant < nome > = < valor >
Descrio:
Cada vez que < nome > aparece no programa, substitudo por < valor > .
Exemplo:
constant MAXIMO = 100
constant Comprimento = 30
Sintaxe:
variable < nome > = < valor >
Descrio:
Ao utilizar esta directiva, a designao textual muda o seu valor.
Difere da directiva CONSTANT no facto de, depois de a directiva ser aplicada, o
valor da designao textual poder variar.
Exemplo:
variable nivel = 20
variable tempo = 13
Sintaxe:
Descrio:
varivel < nome_variavel > atribuda a expresso <valor> . A directiva SET
semelhante a EQU, mas com a directiva SET possvel tornar a definir a varivel
com outro valor.
Exemplo:
nivel set 0
comprimento set 12
nivel set 45
Sintaxe:
< nome_da_constante > equ < valor >
Descrio:
Ao nome de uma constante < nome_de_constante > atribudo um valor < valor >
Exemplo:
cinco equ 5
seis equ 6
sete equ 7
Sintaxe:
<rtulo> org <valor>
Descrio:
Esta a directiva mais frequentemente usada. Com esta directiva ns definimos em
que stio na memria de programa o programa vai comear.
Exemplo:
Inicio org 0x00
movlw 0xFF
movwf PORTB
Sintaxe:
end
Descrio:
No fim do programa, necessrio colocar a directiva 'end', para que o tradutor do
assembly (assembler), saiba que no existem mais instrues no programa.
Exemplo:
.
.
movlw 0xFF
movwf PORTB
end
Instrues condicionais
Sintaxe:
if <termo_condicional>
Descrio:
Se a condio em <termo_condicional> estiver satisfeita, a parte do programa que
se segue directiva IF, dever ser executada. Se a condio no for satisfeita,
ento executada a parte que se segue s directivas ELSE ou ENDIF.
Exemplo:
if nivel = 100
goto ENCHER
else
goto DESPEJAR
endif
Sintaxe:
Else
Descrio:
Usado com a directiva IF como alternativa no caso de termo_condicional ser falso.
Exemplo:
if tempo < 50
goto DEPRESSA
else goto DEVAGAR
endif
Sintaxe:
endif
Descrio:
Esta directiva escrita no fim de um bloco condicional, para informar o tradutor do
assembly de que o bloco condicional terminou.
Exemplo:
if nivel = 100
goto METER
else
goto TIRAR
endif
Sintaxe:
while <condio>
.
endw
Descrio:
As linhas do programa situadas entre WHILE e ENDW devem ser executadas,
enquanto a condio for verdadeira. Se a condio deixar de se verificar, o
programa dever executar as instrues a partir da linha que sucede a ENDW. O
nmero de instrues compreendidas entre WHILE e ENDW pode ir at 100 e
podem ser executadas at 256 vezes.
Exemplo:
while i < 10
i=i+1
endw
Sintaxe:
endw
Descrio:
Esta directiva escrita no fim do bloco condicional correspondente a WHILE, assim,
o assembler fica a saber que o bloco condicional chegou ao fim.
Exemplo:
while i < 10
i=i+1
.
endw
Sintaxe:
ifdef < designao >
Descrio:
Se a designao <designao> tiver sido previamente definida (normalmente
atravs da directiva #DEFINE), as instrues que se lhe sucedem sero executadas
at encontrarmos as directivas ELSE ou ENDIF.
Exemplo:
#define teste
.
ifdef teste ; como teste foi definido
...............; as instrues nestas linhas vo ser executadas
endif
Sintaxe:
ifndef <designao>
Descrio:
Se a designao <designao> no tiver sido previamente definida ou se esta
definio tiver sido mandada ignorar atravs da directiva #UNDEFINE, as instrues
que se seguem devero ser executadas, at que as directivas ELSE ou ENDIF,
sejam alcanadas.
Exemplo:
#define teste
........
#undefine teste
.........
ifndef teste ; como teste no est definido
........ ; as instrues nestas linhas so executadas
endif
Directivas de Dados
Sintaxe:
Cblock [< termo >]
<rtulo> [:<incremente>], <rtulo> [:<incremente>]......
endc
Descrio:
Esta directiva usada para atribuir valores s constantes a seguir nomeadas. A
cada termo seguinte, atribudo um valor superior em uma unidade ao anterior. No
caso de <incremente> estar preenchido, ento o valor de <incremente> que
adicionado constante anterior.
O valor do parmetro <termo>, o valor inicial. Se no for dado, ento, por
defeito, considerado igual a zero.
Exemplo:
cblock 0x02
primeiro, segundo ; primeiro = 0x02, segundo = 0x03
terceiro ;terceiro = 0x04
endc
cblock 0x02
primeiro : 4, segundo : 2 ; primeiro = 0x06, segundo = 0x08
terceiro ; terceiro = 0x09
endc
Descrio:
Esta directiva utilizada no fim da definio de um bloco de constantes, para que o
tradutor de assembly saiba que no h mais constantes.
Sintaxe:
[<termo>] db <termo> [, <termo>,......,<termo>]
Descrio:
Esta directiva reserva um byte na memria de programa. Quando h mais termos a
quem preciso atribuir bytes, eles sero atribudos um aps outro.
Exemplo:
db t, 0x0f, e, s', 0x12
Sintaxe:
[<termo>] de <termo> [, <termo>,......,<termo>]
Descrio:
Esta directiva reserva um byte na memria EEPROM. Apesar de ser destinada em
primeiro lugar para a memria EEPROM, tambm pode ser usada em qualquer
outro local de memria.
Exemplo:
org H2100
de Verso 1.0, 0
Sintaxe:
[<termo>] dt <termo> [, <termo>,......,<termo>]
Descrio:
Esta directiva vai gerar uma srie de instrues RETLW, uma instruo para cada
termo.
dt Mensagem , 0
dt primeiro, segundo, terceiro
Sintaxe:
__config<termo> ou __config <endereo>, <termo>
Descrio:
So definidos o tipo de oscilador, e a utilizao do watchdog e do circuito de reset
interno. Antes de usar esta directiva, tem que declarar-se o processador atravs da
directiva PROCESSOR.
Exemplo:
__CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC
Sintaxe:
processor <tipo_de_microcontrolador>
Descrio:
Esta directiva, estabelece o tipo de microcontrolador em que o programa vai correr.
Exemplo:
processor 16f84
Macros
As macros so elementos muito teis em linguagem assembly. Uma macro pode
ser descrita em poucas palavras como um grupo de instrues definido pelo
utilizador que acrescentado ao programa pelo assembler, sempre que a macro for
invocada. possvel escrever um programa sem usar macros. Mas, se as
utilizarmos, o programa torna-se muito mais legvel, especialmente se estiverem
vrios programadores a trabalhar no mesmo programa. As macros tm afinidades
com as funes nas linguagens de alto nvel.
Como as escrever:
<rtulo> macro
[<argumento1>,<argumento2>,.....,<argumentoN>]
.........
.........
endm
Pelo modo como so escritas, vemos que as macros podem aceitar argumentos, o
que tambm muito til em programao.
Quando o argumento invocado no interior de uma macro, ele vai ser substitudo
pelo valor <argumentoN>.
Exemplo:
O exemplo de cima, mostra uma macro cujo propsito enviar para o porto B, o
argumento ARG1, definido quando a macro foi invocada. Para a utilizarmos num
programa, basta escrever uma nica linha: ON_PORTB 0xFF e, assim, colocamos o
valor 0xFF no porto B. Para utilizar uma macro no programa, necessrio incluir o
ficheiro macro no programa principal, por intermdio da instruo #include
nome_da_macro.inc. O contedo da macro automaticamente copiado para o
local em que esta macro est escrita. Isto pode ver-se melhor no ficheiro lst visto
atrs, onde a macro copiada por baixo da linha #include bank.inc.
CAPTULO 5
MPLAB
Introduo
O MPLAB um pacote de programas que correm no Windows e que tornam mais
fcil escrever ou desenvolver um programa. Pode descrever-se ainda melhor como
sendo um ambiente de desenvolvimento para uma linguagem de programao
standard e destinado a correr num computador pessoal (PC). Anteriormente, as
operaes incidiam sobre uma linha de instruo e contemplavam um grande
nmero de parmetros, at que se introduziu o IDE "Integrated Development
Environment" (Ambiente Integrado de Desenvolvimento) e as operaes tornaram-
se mais fceis, usando o MPLAB. Mesmo agora, as preferncias das pessoas
divergem e alguns programadores preferem ainda os editores standard e os
intrpretes linha a linha. Em qualquer dos casos, o programa escrito legvel e
uma ajuda bem documentada est disponvel.
Alm destes, existem sistemas de suporte para os produtos da Microchip, tais como
o PICSTART Plus e ICD (In Circuit Debugger - Deteco de erros com o
microcontrolador a funcionar). Este livro no aborda estes dois dispositivos que so
opcionais.
A instalao propriamente dita, comea depois destes sete passos. As figuras que
se seguem explicam o significado de certas etapas dessa instalao.
Como suposto irmos trabalhar com o Windows 95 (ou um sistema operativo ainda
mais moderno), tudo aquilo que diga respeito ao sistema operativo DOS, no deve
ser contemplado ao fazer a seleco da linguagem assembler. Contudo, se preferir
continuar a trabalhar em DOS, ento precisa de desmarcar todas as opes
relacionadas com o Windows e seleccionar os componentes apropriados para o
DOS.
Os utilizadores que j tenham o MPLAB instalado (verso mais antiga que esta),
necessitam da opo que se segue.
O propsito desta opo salvaguardar cpias de todos os ficheiros que foram
modificados durante o processo de mudana da verso antiga para a verso mais
moderna do MPLAB. No nosso caso, deixaremos a opo NO seleccionada, porque
se presume que estamos a fazer a primeira instalao do MPLAB no nosso
computador.
Opes para os utilizadores que esto a instalar uma nova verso do
MPLAB por cima de outra verso instalada, mais antiga
5.2 MPLAB
Quando terminamos o processo de instalao, aparece-nos no cran o programa
propriamente dito. Como pode ver-se, o aspecto do MPLAB o mesmo da maioria
dos programas Windows. Perto da rea de trabalho existe um menu (faixa azul
em cima, com as opes File, Edit, etc.), toolbar (barra com figuras que
preenchem pequenos quadrados) e a linha de status no fundo da janela. Assim,
pretende-se seguir uma regra no Windows que tornar tambm acessveis por
baixo do menu, as opes usadas mais frequentemente no programa,. Deste modo,
possvel aced-las de um modo mais fcil e tornar o nosso trabalho mais rpido.
Ou seja, aquilo que est disponvel na barra de ferramentas, tambm est
disponvel no menu.
O cran depois de o MPLAB ser iniciado
Depois de dar um nome ao projecto clique em OK. Veremos que aparece uma nova
janela, idntica que se mostra na figura seguinte.
Com o rato, clique em "proba [.hex], o que activa a opo 'Node properties', ao
fundo no lado direito. Clicando esta opo, obtm-se a janela seguinte.
Definindo os parmetros do assembler MPASM
Para abrir um novo ficheiro, clica-se em FILE>NEW. Assim, obtemos uma janela de
texto dentro do espao de trabalho do MPLAB.
Um novo ficheiro assembler foi aberto
A nova janela representa o ficheiro onde o programa vai ser escrito. Como o nosso
ficheiro assembler tem que ser designado por "proba.asm", vamos dar-lhe esse
nome. A designao do programa faz-se (como em todos os programas Windows)
clicando em FILE>SAVE AS. Deste modo, vamos obter uma janela anloga que se
mostra na figura seguinte.
Este programa tem que ser copiado numa janela que esteja aberta, ou copiado do
disco ou tirado da pgina da internet da MikroElektronika usando os comandos
copiar e colar. Quando o programa copiado para a janela "proba.asm", ns
podemos usar o comando PROJECT -> BUILD ALL (se no existirem erros) e, uma
nova janela idntica representada na figura seguinte, vai aparecer.
Janela com as mensagens que se sucedem traduo do programa
assembler
Alm dos registos SFR, pode ser til observar os contedos dos outros registos.
Uma janela com as filas-registos pode ser aberta, clicando em WINDOW->FILE
REGISTERS.
Se existirem variveis no programa, tambm conveniente observ-las. A cada
varivel pode ser atribuda uma janela (Watch Windows) clicando em WINDOW-
>WATCH WINDOWS.
Simulador com janelas abertas para registos SFR, filas registos e variveis
Sempre que se clica este con, uma nova toolbar aparece. Se clicarmos quatro
vezes seguidas, a barra actual reaparece.
con para abrir um projecto. O projecto aberto desta maneira contm todos os
ajustamentos do cran e de todos os elementos que so cruciais para o projecto
actual.
Clicando neste con obtemos uma janela com um programa, mas neste caso na
memria de programa, onde podemos ver quais as instrues e em que
endereos.
Com a ajuda deste con, obtemos uma janela com o contedo da memria RAM
do microcontrolador .
Clicando neste con, aparece a janela dos registos SFR (registos com funes
especiais). Como os registos SFR so usados em todos os programas,
recomenda-se que, no simulador, esta janela esteja sempre activa.
Se uma programa contiver variveis cujos valores necessitemos de acompanhar
(por exemplo um contador), ento necessria uma janela para elas, isso pode
ser feito usando este con.
CAPTULO 6
Exemplos
Introduo
Os exemplos que se mostram neste captulo, exemplificam como se deve ligar o
microcontrolador PIC a perifricos ou a outros dispositivos quando projectamos o
nosso prprio sistema de microcontrolador. Cada exemplo contm uma descrio
detalhada do hardware com o esquema elctrico e comentrios acerca do
programa. Todos os programas podem ser copiados da pgina da internet da
MikroElektronika.
6.3 Exemplos
Dodos Emissores de Luz - LEDs
Os LEDs so seguramente uns dos componentes mais usados em electrnica. LED
uma abreviatura para Light Emitting Diode (Dodo emissor de luz). Quando se
escolhe um LED, vrios parmetros devem ter-se em ateno: dimetro, que
usualmente de 3 ou 5mm (milmetros), corrente de funcionamento, habitualmente
de cerca de 10mA (pode ser menor que 2mA para LEDs de alta eficincia alta
luminosidade) e, claro, a cor que pode ser essencialmente vermelha ou verde,
embora tambm existam amarelos, laranjas, azuis, etc.
Os LEDs, para emitirem luz, tm que ser ligados com a polaridade correcta e a
resistncia de limitao de corrente tem tambm que ter o valor correcto para que
o LED no se estrague por sobreaquecimento. O plo positivo da alimentao deve
estar do lado do nodo e o negativo do lado do ctodo. Para identificar os terminais
do led, podemos ter em ateno que, normalmente, o terminal do ctodo mais
curto e, junto deste, a base do LED plana. Os LEDs s emitem luz se a corrente
fluir do nodo para o ctodo. Se for ao contrrio, a juno PN fica polarizada
inversamente e, a corrente, no passa. Para que o LED funcione correctamente,
deve ser adicionada uma resistncia em srie com este, que vai limitar a corrente
atravs do LED, evitando que este se queime. O valor desta resistncia
determinado pelo valor da corrente que se quer que passe atravs do LED. A
corrente mxima que pode atravessar um LED est estabelecida pelo fabricante. Os
LEDs de alto rendimento podem produzir uma sada muito satisfatria com uma
corrente de 2mA.
O Rel
Um rel um dispositivo electromecnico que transforma um sinal elctrico em
movimento mecnico. constitudo por uma bobina de fio de cobre isolado,
enrolado volta de um ncleo ferromagntico e por uma armadura metlica com
um ou mais contactos.
Quando a tenso de alimentao ligada bobina, esta vai ser atravessada por
uma corrente e vai produzir um campo magntico que atrai a armadura fechando
uns contactos e /ou abrindo outros.
Um rel pode tambm ser activado atravs de um optoacoplador que actua como
buffer de corrente e ao mesmo tempo aumenta a resistncia de isolamento. Estes
optoacopladores capazes de fornecerem uma corrente muito grande, contm
normalmente um transistor Darlington na sada.
A ligao atravs de um optoacoplador recomendada especialmente em
aplicaes de microcontroladores que controlam motores, j que o rudo provocado
pela actuao dos comutadores, pode regressar ao microcontrolador atravs das
linhas da alimentao. O optoacoplador faz actuar o rel e este activa o motor.
A figura em baixo, um exemplo de um programa de activao do rel e inclui
algumas macros anteriormente apresentadas.
Produzindo um som
Um diafragma pizoelctrico pode ser adicionado a uma linha de sada do
microcontrolador para se obterem tons, bips e sinais.
importante saber-se que existem dois tipos de dispositivos pizo emissores de
som. Um, contm componentes activos encontram-se dentro do envlucro e s
precisam de que lhe seja aplicada uma tenso contnua que emita um tom ou um
bip. Geralmente os tons ou bips emitidos por estes dispositivos sonoros no podem
mudar, pois so fixados pelos respectivos circuitos internos. No este o tipo de
dispositivo que vamos discutir neste artigo.
O outro tipo requer, para que possa funcionar, que lhe seja aplicado um sinal.
Dependendo da frequncia da forma de onda, a sada pode ser um tom, uma
melodia, um alarme ou mesmo mensagens de voz.
Para o pormos a funcionar, vamos fornecer-lhe uma forma de onda constituda por
nveis Alto e Baixo sucessivos. a mudana de nvel ALTO para BAIXO ou de BAIXO
para ALTO que faz com que o diafragma se mova para produzir um pequeno som
caracterstico. A forma de onda pode corresponder a uma mudana gradual (onda
sinusoidal) ou uma variao rpida (onda rectangular). Um computador um
instrumento ideal para produzir uma onda quadrada. Quando se utiliza a onda
quadrada produz-se um som mais spero.
Como no caso de uma tecla, podemos utilizar uma macro que fornea uma ROTINA
BEEP ao programa, quando for necessrio.
BEEP macro freq, duration:
freq: frequncia do som. Um nmero maior produz uma frequncia mais alta.
duration: durao do som. Quanto maior o nmero, mais longo o som.
Exemplo 1: BEEP 0xFF, 0x02
Nesta caso, a sada do dispositivo pizoelctrico, tem a maior frequncia possvel e a
durao de 2 ciclos de 65,3mS o que d 130,6mS.
Exemplo 2: BEEP 0x90, 0x05
Aqui, a sada do diafragma pizoelctrico, tem uma frequncia de 0x90 e uma
durao de 5 ciclos de 65,3mS. melhor experimentar diversos argumentos para a
macro e seleccionar aquele que melhor se aplica.
A seguir, mostra-se a listagem da Macro BEEP:
O exemplo que se segue, mostra o uso de uma macro num programa. O programa produz duas melodias
que so obtidas, premindo T1 ou T2. Algumas das macros apresentadas anteriormente so utilizadas no
programa.
Registos de deslocamento
Existem dois tipos de registos de deslocamento: de entrada paralelo e registo de
sada paralelo. Os registos de deslocamento de entrada recebem os dados em
paralelo, atravs de 8 linhas e enviam-nos em srie para o microcontrolador,
atravs de duas linhas. Os registos de deslocamento de sada trabalham ao
contrrio, recebem os dados em srie e quando uma linha habilitada esses dados
ficam disponveis em paralelo em oito linhas. Os registos de deslocamento so
normalmente usados para aumentar o nmero de linhas de entrada e de sada de
um microcontrolador. Actualmente no so to usados, j que os
microcontroladores mais modernos dispem de um grande nmero de linhas de
entrada e de sada. No caso dos microcontroladores PIC16F84, o seu uso pode ser
justificado.
numero o nmero de 0 a 99 que vai ser mostrado nos dgitos MSD e LSD.
Exemplo: LED_Disp2 0x34
DISPLAY LCD
Cada vez mais os microcontroladores esto a usar displays de cristal lquido - LCD
para visualizarem a sada de dados. A discusso que se segue diz respeito ligao
de um display LCD Hitachi a um microcontrolador PIC. Estes displays LCD so
baseados no mdulo de LCD HD44780 da Hitachi, so baratos, fceis de usar e
permitem utilizar os 8x80 pixels de display. Estes displays LCD contm um conjunto
de caracteres ASCII standard e ainda caracteres japoneses, gregos e smbolos
matemticos.
Cada um dos 640 pixels do display, podem ser acedidos individualmente, esta
tarefa executada por chips de controle montados em superfcie, na parte detrs
do display.
Isto permite-nos poupar uma enorme quantidade de fios e linhas de controle, de tal
maneira que, atravs de poucas linhas possvel fazer a ligao do display ao
mundo exterior. possvel comunicar com o exterior atravs de um bus de 8 bits
ou mesmo atravs de um bus de dados de apenas 4 bits.
A linha Enable (E) permite a activao do display e a utilizao das linhas R/W e
RS. Quando a linha de habilitar (Enable) est a nvel baixo, o LCD fica inibido e
ignora os sinais R/W e RS. Quando (E) est a nvel alto, o LCD verifica os estados
das duas linhas de controle e reage de acordo com estes.
RS 0 Instruo
1 Caracter
Ler o dado das linhas de dados (no caso de uma operao de leitura)
Depois de iniciado o LCD, ele fica pronto para continuar a receber dados ou
comandos. Se receber um caracter, ele escreve-o no display e move o cursor um
espao para a direita. O cursor marca o local onde o prximo caracter vai ser
escrito. Quando queremos escrever uma cadeia de caracteres, primeiro
necessitamos de estabelecer um endereo de incio e depois enviar os caracteres,
um de cada vez. Os caracteres que podem ser mostrados no display esto
guardados na RAM de display de dados (DD). O tamanho da DDRAM de 80 bytes.
Uma maneira, verificar o bit BUSY que coincide com a linha de dados D7. Este
no , contudo, o melhor mtodo porque o LCD pode bloquear e o programa
permanecer para sempre num loop de verificao do bit BUSY. A outra maneira,
introduzir um tempo de espera no programa. Este perodo de tempo deve ser
suficientemente longo para permitir que o LCD termine a operao. As instrues
destinadas a ler ou escrever na memria de um LCD, mostram-se na tabela
anterior.
LCDinit macro usada para iniciar o porto a que o LCD est ligado. O LCD
configurado para trabalhar no modo de 4 bits.
Exemplo: LCDinit
Exemplo: LCDChar d
LCDw
Exemplo: LCD_DDAdr .3
Exemplo: LCDline 2
Como tal, difcil apresent-los num display. por isso que necessrio converter
esses nmeros do sistema binrio para o sistema decimal, de modo a que possam
ser facilmente entendidos. A seguir, apresentam-se as listagens de duas macros
LCDval_08 e LCDval_16.
Trata-se de um conceito lato. Que se torna um pouco mais complexo quando tem
que ser aplicado.
Se juntarmos estas 8 linhas numa caixa preta, elas passaro a ser designadas
como linhas de sada e, assim, temos que arranjar uma linha de entrada. Com esta
configurao, ns podemos detectar 255 incrementos entre zero e 1. Esta caixa
preta designada por CONVERSOR e, como estamos a converter um valor
Analgico num Digital, o conversor designado por conversor analgico-digital
ou ADC (Analog Digital Converter).
Os quatro bits do valor mais alto esto na varivel HI e os oito bits menos
significativos da converso esto na varivel LO. Count uma varivel auxiliar
para contar o nmero de passagens no ciclo.
RS232init Macro para iniciar o pino RB0 como linha de transmisso de dados (pino
TX).
Exemplo: RS232init
Exemplo: SEND g
Exemplo:
movlw t
SENDw
Exemplo:
Programa principal:
Apndice A
Conjunto de Instrues
Apndice B
Sistemas Numricos
Introduo
Exemplo:
Exemplo:
Aquilo que falta para nos familiarizarmos com a lgica que usada no sistema
numrico binrio, saber extrair um valor numrico decimal de uma srie de zeros
e uns e, claro, de uma maneira que ns possamos entender. Este procedimento
designado por converso binrio-decimal.
Exemplo:
Exemplo:
Exemplo:
Exemplo:
O sistema numrico hexadecimal, tem uma base igual a 16. Se a base 16, vamos
precisar de 16 smbolos diferentes para algarismos. No sistema hexadecimal, os
algarismos so: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. As letras A, B, C, D, E
e F correspondem respectivamente aos decimais 10, 11, 12, 13, 14 e 15.
Escolhemos estes smbolos, afim de tornar a escrita dos nmeros mais fcil. Tal
como para o caso do sistema binrio, tambm aqui, ns podemos determinar,
atravs da mesma frmula, qual o maior nmero decimal que possvel
representar com um determinado nmero de algarismos hexadecimais.
Exemplo:
Exemplo:
Exemplo:
Exemplo:
Concluso
Microcontrolador
Software
Hardware
Simulador
ICE
ICE (In Circuit Emulator) ou emulador interno, um utenslio bastante til que se
liga entre um PC (e no um microcontrolador) e o dispositivo que estamos a
desenvolver. Isto permite, ao software, correr no computador PC, mas tudo se
passando como se fosse um microcontrolador real que estivesse inserido no
dispositivo. O ICE, possibilita que nos desloquemos atravs do programa, em
tempo real, para observar o que se est a passar dentro do microcontrolador e
como este comunica com o mundo exterior.
Emulador de EPROM
Assembler
Pacote de software que traduz cdigo fonte em cdigo que o microcontrolador pode
compreender. Uma parte deste software, destina-se tambm, deteco dos erros
cometidos, ao escrever o programa.
Ficheiro HEX
Ficheiro criado pelo tradutor assembler, quando traduz um ficheiro fonte e que est
num formato que entendido pelos microcontroladores. Este ficheiro aparece
normalmente sob a forma Nome_ficheiro.HEX, daqui deriva a designao de
ficheiro hex".
Ficheiro LIST
Endereamento
ASCII
Carry
Cdigo
Flag
Normalmente, refere-se aos bits do registo de estado (status). Quando estes bits
so actuados (postos a 1 ou a 0), o programador notificado de que um
determinado acontecimento ocorreu. Se necessrio, esta ocorrncia pode motivar
uma resposta do programa.
Programador
Produto