Beruflich Dokumente
Kultur Dokumente
Limoeiro do Norte-CE
Maro de 2015
Prefcio
Este trabalho destinado a proporcionar uma noo bsica sobre programao de
microcontroladores PIC em linguagem BASIC. Elaborado na disciplina de Projeto Social tem como
objetivo final a incluso social daqueles que iniciam a aprendizagem na programao e utilizao de
microcontroladores PIC em linguagem BASIC. Ser discutido questes bsicas de hardware,
software e assuntos correlacionados.
A princpio ser abordado conceitos sobre softwares utilizados na programao, compilao
e simulao de programaes. Em seguida ser mostrado conceitos sobre microcontroladores PIC,
em especial o PIC16F877A, que ser o utilizado para simulaes. Dado o conhecimento adquirido
anteriormente se far necessrio a explanao de alguns conceitos sobre eletroeletrnica, assim
auxiliando na melhor compreenso das estruturas utilizadas para o funcionamento correto dos
microcontroladores. Por ltimo ser abordado a estrutura de programao em BASIC, mostrando
quais so as principais funes e como elas funcionam, mostrando aplicaes e exemplos.
O software de programao e compilao utilizado para programao em Basic ser o Proton
IDE. Para a simulao ser utilizado o ISIS Proteus.
Vale ressaltar que apesar de apresentar conceitos bsicos sobre hardware o foco deste
trabalho ser a apresentao de modo bsico da linguagem de programao BASIC aplicado em
microcontroladores PIC.
Sumrio
1 - SOFTWARES UTILIZADOS .............................................................................................................. 1
1.1 ISIS PROTEUS ............................................................................................................................... 1
1.2 PROTON IDE ................................................................................................................................. 1
1.3 GRAVAO E COMPILAO DA PROGRAMAO ............................................................... 2
1.3.1 - Gravao de Programas Fisicamente ..................................................................................... 2
1.3.2 Gravao de Programas por simulao ................................................................................. 3
2 - O PIC 16F877A ..................................................................................................................................... 4
3 - CONCEITOS BSICOS SOBRE ESTRURAS INTERNAS DOS MICROCONTROLADORES .... 7
3.1 - Memrias........................................................................................................................................ 7
3.2- Unidades de memria ..................................................................................................................... 7
3.3 Memria de Programa (FLASH) .................................................................................................. 8
3.4 Memria de Dados (RAM) ............................................................................................................ 8
3.5 - Registo ............................................................................................................................................ 8
3.6 - SFR Registo de Funo Especial ................................................................................................. 8
3.7 - Portas de Entrada/Sada I/O....................................................................................................... 9
3.8 - Interrupes ................................................................................................................................... 9
3.9 - CPU Unidade Central de Processamento ................................................................................... 9
3.10 - Oscilador ...................................................................................................................................... 9
3.11 - Arquitetura Interna ....................................................................................................................10
4 - CONCEITOS DE ELETRNICA ......................................................................................................11
4.1 Oscilador Externo ........................................................................................................................11
4.2 Estado Lgico de pinos I/O ..........................................................................................................12
4.3 Optoacopladores ...........................................................................................................................12
4.4 - PWM .............................................................................................................................................13
4.5 Analgico x Digital .......................................................................................................................14
5 BASIC: PRINCIPAIS COMANDOS E SUAS ESTRUTURAS NO PROTON IDE .........................15
6 EXEMPLOS E APLICAES ..........................................................................................................22
6.1 Primeiros Programas com o PIC 16F877A ..................................................................................22
6.2.1 Projeto 1: Fazendo um LED piscar..........................................................................................23
6.2.2 Projeto 2: Ligar e Desligar 2 LEDs alternadamente. ................................................................24
6.2.3 - Projeto 3: Fazer uma contagem binaria comeando com 0, 1 e depois com potencias de 2 (2x) at
128......................................................................................................................................................25
6.2.4 Projeto 4: Utilizando botes nas entradas para acionar sadas. Utilizando as instrues IF
THEN. ................................................................................................................................................26
6.2.5 - Projeto 5: Contagem de 0 a 9 com display de 7 segmentos. ......................................................28
6.2.6 - Projeto 6: Utilizando o Display de Cristal Lquido (LCD). .......................................................30
1 - SOFTWARES UTILIZADOS
1.1 ISIS PROTEUS
O ISIS Proteus um software da linha Proteus ASM capaz de simulaes de diversos
componentes/equipamentos eletroeletrnicos, adotando simbologias destes. De grande utilidade para
aqueles que desejam realizar testes em elaboraes de circuitos, auxilia na observao de
caractersticas de funcionamento, parmetros e possveis defeitos de projeto.
Este software ser utilizado para a simulao de circuitos e programao do PIC, ajudando
assim na observao do funcionamento destes e ainda em possveis erros.
Aps gerar arquivo hexadecimal do programa e com o PIC introduzido no ISIS Proteus,
s d um duplo clique no componente e na linha Program File: clica no cone de uma pasta e
indicar o caminho do arquivo hexadecimal referente ao programa que se quer simular.
2 - O PIC 16F877A
A escolha do microcontrolador PIC 16F877A se d pelo fato de tal componente abranger
todas as caractersticas dos demais componentes da famlia PIC de modo que ao aprender a utiliza-lo
lhe dar meios de utilizar os demais.
De modo geral os PIC so uma famlia de microcontroladores desenvolvido e fabricado pela
Companhia Microchip Technologies Inc. De certo modo podemos comparar esses dispositivos a um
computador, porm bem menores, dado que assim como estes possuem memria de programa,
memria RAM entre outras coisas semelhantes. Dada suas caractersticas de funcionamento se pode
assemelha-lo ao corao dos circuitos controlados, ou seja, o microcontrolador o responsvel pela
operao de controle de todos os processos de um dado circuito eletrnico baseado nas instrues e
rotinas que definem funes de controle.
Microcontroladores x Microprocessadores: apesar de funcionamento semelhantes no
funcionamento so diferentes em vrios aspectos construtivos. Para se usar um microprocessador
vrios outros componentes externos devem ser adicionados, memria e componentes de envio e
recebimento de dados. Em seu projeto o microcontrolador foi confeccionado para se ter tudo num s
equipamento, no necessitando de componentes externos para seu funcionamento.
A elaborao de projetos com microcontroladores requer um estudo prvio da estrutura do
hardware a que se far necessrio para a confeco de programas e com isso saber qual ser a funo
especifica de cada pino, qual dos Portes I/O (IN/OUT) ser utilizado para que possam ser
configurados de maneira correta e etc. Estes detalhes serviro para a correta utilizao e controle de
dispositivos como Botes, LCD, teclados, motores de passo, LEDs, servomotores e outros.
Para o melhor entendimento da identificao dos pinos do PIC ser mostrado abaixo uma
tabela com o significado de cada nomenclatura.
Tabela 1: Identificao dos pinos e PORTs do PIC 16F877A
Nome do Pino
N
Pino
I/O/
P
Tipo
Descrio
OSC1/CLKIN
13
ST/
CMOS(4)
OSC2/CLKOU
T
14
MCLR/Vpp
I/p
ST
Vss
Vdd
12/3
11/3
p
p
RA0/AN0
RA1/AN1
2
3
I/O
I/O
TTL
TTL
RA2/AN2/
Vref/C Vref
RA3/AN3/VREF+
4
5
RA4/T0CKI/
C1OUT
I/O
I/O
TTL
TTL
I/O
ST
I/O
TTL
I/O
I/O
TTL/ST
TTL
TTL
RA5/SS/AN4/
C2OUT
RB0/INT
RB1
RB2
33
34
35
RB3/PGM
RB4
RB5
36
37
38
TTL
TTL
TTL
RB6/PGC
39
TTL/ST
RB7/PGD
40
I/O
TTL/ST
RC0/T10SO/
T1CKI
RC1/T10SI/
CCP2
15
I/O
ST
16
I/O
ST
RC2/CCP1
17
I/O
ST
RC3/SCK/SCL
18
I/O
ST
RC4/SDI/SDA
23
I/O
ST
RC5/SDO
RC6/TX/CK
24
25
I/O
I/O
ST
ST
RC7/RX/DT
26
I/O
ST
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
19
20
21
22
27
28
29
30
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
RE0/RD/AN5
I/O
TTL/ST(3)
RE1/WR/AN6
I/O
TTL/ST(3)
RE2/CS/AN7
10
I/O
TTL/ST(3)
Legenda:
I
O
I/O
P
TTL
ST
=
=
=
=
=
=
=
Input (entrada)
Output (sada)
Input/Output (entrada ou sada)
Power (alimentao)
No-utilizado
Entrada tipo TTL
Entrada tipo Schmitt Trigger
ROM Read Only Memory: Apenas de Leitura, usada para gravar permanentemente o
programa a executar.
OTP ROM One Time Programmable ROM: ROM onde s se pode escrever o programa
na memria apenas uma vez.
UV EPROM Ultra Violet Erasable Programmable ROM: ROM que permite apagar o
programa, usando luz Ultravioleta.
FLASH: O seu contedo pode ser escrito/apagado quase que infinitamente, usado na maioria
dos microcontroladores.
RAM Random Acess Memory: Memria voltil, quando se desliga a alimentao do chip
as informaes desaparecem. Usada para armazenamento temporrio de dados.
EEPROM Electrically Erasable Programmable ROM: ROM programvel, que se pode
apagar eletricamente. Seu contedo no perdido ao se desligar a alimentao do microcontrolador.
7
3.8 - Interrupes
uma caracterstica do microcontrolador em que s se far a leitura de suas entradas no
momento em que elas estiverem em modo de ativao e assim poder executar uma ao. Se essa
caracterstica no fosse usada o microcontrolador ficaria a todo momento fazendo a leitura do estado
da sua entrada tornando impraticvel sua utilizao. Essa caracterstica de certo modo delega pelo
microcontrolador a um perito da estrutura interna que reage ao haver necessidade.
3.9 - CPU Unidade Central de Processamento
unidade que memoriza e controla todos os processos dentro do microcontrolador, sendo
subdividida em: Decodificador de Instrues parte eletrnica que reconhece as instrues de
programa fazendo os outros circuitos funcionarem com base nisso. ALU a Unidade Lgica e
Aritmtica, sendo responsvel por todas as operaes lgicas e matemticas. Acumulador um SFR
responsvel pela operao da ALU, usado para armazenar todos os dados de execuo de uma
operao e tambm os resultados de uso de continuao do processamento.
3.10 - Oscilador
O mdulo oscilador se trata de componentes que oferecem uma oscilao continua de sinal,
normalmente configurado para usar um cristal de quartzo e as vezes em conjunto com um ressoador
(capacitor) cermico para melhor estabilidade de oscilao, possibilita a operao sncrona do
microcontrolador advinda dos pulsos dados pelo oscilador. A no necessidade de estabilidade de
oscilao dada por uma dada aplicao abre a possibilidade de um oscilador RC
(resistncia/Capacitor).
Von-Neumann
Se tem uma nica zona de memria disponvel e um barramento de dados de 8 bits de modo
a ser sobrecarregado por ter todos os dados trocados usando somente estas 8 linhas e isso deixa a
comunicao lenta e sem eficincia. A CPU s pode ler ou escrever dados de/para a memria sendo
impossvel ambas ao mesmo tempo devido a utilizao do barramento com os dados.
Harvard
10
4 - CONCEITOS DE ELETRNICA
Devido grande necessidade da utilizao de estruturas e componentes de circuitos
eletrnicos usado no correto funcionamento dos microcontroladores faremos aqui um estudo destes.
4.1 Oscilador Externo
um circuito indispensvel para o funcionamento do microcontrolador e que tambm define
a velocidade a que ele vai funcionar podendo operar entre quatro opes:
Oscilador LP: Oscilador de baixo consumo (Low Power);
Oscilador XT: Cristal / Ressonador (Capacitor);
Oscilador HS: Oscilador de alta Velocidade (High Speed);
Oscilador RC: Resistencia/Condensador (Capacitor).
Cada tipo de oscilador caracterizado pela frequncia de oscilao e consequentemente pelo
cristal/capacitores usados como mostra a tabela 1.
Tabela 2: Tipos de Osciladores e seus componentes
Tipo
LO
XT
HS
Frequncia
32 kHz
200 kHz
2 MHz
4 MHz
4 MHz
10 MHz
Capacitor 1
68 100 pF
15 33 pF
15 33 pF
15 33 pF
15 33 pF
15 33 pF
Capacitor 2
68 100 pF
15 33 pF
15 33 pF
15 33 pF
15 33 pF
15 33 pF
11
Lgica Negativa nesse estado logico o Pino I/O alimentado com tenso (5V), ao
pressionar o boto de pulso a tenso estar agora sobre o resistor pois a corrente passa toda por ele e
com isso o pino fica sem tenso (0V). Resumindo: inicial o pino est com tenso e ao pressionar o
boto esse fica sem tenso.
Lgica Positiva nesse estado lgico o Pino I/O est sem alimentao (0V), ao pressionar
o boto de pulso o pino alimentado com tenso (5V) devido ao resistor ser um caminho menos
favorvel para a corrente. Resumindo: inicialmente o pino est sem tenso e ao pressionar o boto
esse fica com tenso.
4.3 Optoacopladores
Os optoacopladores so componentes muito uteis quando se deseja separar a parte de
comando da parte de potncia de um circuito. Em uma de suas verses, se trar basicamente de um
LED que ao ser acionado ilumina a base de um fototransistor, fazendo este conduza corrente entre o
coletor emissor.
Figura 18: Circuito utilizando optoacoplador, com sada negativa quando ativo.
12
Na configurao da figura 18, quando aplicado no pin I/O um nvel lgico alto (5V) o LED
do optoacoplador e o fototransistor conduzem corrente a terra e assim se tem um nvel lgico baixo
(0V) na Sada. Ao desativar o LED o fototransistor no conduz fazendo com que se tenha um nvel
lgico alto (5V) na Sada.
J na configurao da figura 19, quando aplicado um nvel lgico alto (5V) no pin I/O, o
LED do optoacoplador acende e o fototransistor conduz para pino de sada um nvel lgico alto (5V).
Porem havendo um nvel lgico baixo (0V) na entrada, o fototransistor permanecer aberto entre
coletor e emissor, tendo como resultado um nvel lgico baixo (0V) na Sada.
Figura 19: Circuito utilizando optoacoplador, com sada positiva quando ativo.
4.4 - PWM
um recurso muito poderoso pois com ele se pode obter uma tenso analgica a partir de
um sinal digital, porem sendo essa sada na verdade meramente digital, ou seja, podendo assumir os
estados 0 e 1.
O nome PWM uma sigla originada do ingls (Pulse Width Modulation), que significa
Modulao por Largura de Pulso. Trata-se de uma onda com frequncia constante (perodo fixo) e
largura de pulso (duty cycle) varivel.
Este um tipo de gerao de sinal muito importante, atravs dele possvel implementar um
conversor digital analgico com um nico pino do microcontrolador, uma vez que controlando a
largura do pulso possvel obter uma tenso analgica varivel.
13
14
Relao
Igualdade
Igualdade
Desigualdade
Desigualdade
Menor que
Maior que
Menor ou igual a
Maior ou Igual a
Tipo de Expresso
X=Y
X==Y (mesmo que acima Igualdade)
X< >Y
X != Y (mesmo que acima Desigualdade)
X<Y
X>Y
X <= Y
X >= Y
OPERADORES MATEMTICOS
Addition '+'.
Subtraction '-'.
Multiply '*'.
Multiply HIGH '**'.
Multiply MIDDLE '*/'.
Divide '/'.
Modulus '//'.
Bitwise AND '&'.
Bitwise OR '|'.
Bitwise XOR '^'.
Bitwise SHIFT LEFT '<<'.
Bitwise SHIFT RIGHT '>>'.
Bitwise Complement '~'.
ABS.
ACOS
ASIN
ATAN
COS.
DCD.
DIG.
EXP
LOG
LOG10
MAX.
MIN.
NCD.
POW
REV.
SIN.
SQR.
TAN
DIV32.
16
DECLARE
DELAYMS
DEVICE
DIM
END
Sintaxe: END
Viso geral: A declarao END faz parar a compilao de origem, e cria um loop infinito.
GOTO
HIGH
17
LOW
SYMBOL
TRISA = 30
FOR...NEXT...STEP
IF THEN - ELSE
Sintaxe:
SELECT Expresso
CASE Condio
Instruo
CASE ELSE
Instruo
ENDSELECT
Viso geral: Avalia uma expresso ento executa continuamente um bloco de cdigo
BASIC com base nas comparaes, com Condio(s). Depois de executar um bloco de cdigo, o
programa continua a linha seguinte at chegar a ENDCASE. Se no houver casos verdadeiros
encontrados e nem um ELSE CASE, o cdigo levar a execuo do ENDSELECT.
Exemplo: SELECT VAR1
CASE 1
RESUL=1
CASE 2
RESUL=2
CASE ELSE
RESUL=0
ENDSELECT
ALL_DIGITAL = TRUE
Viso geral: Esta instruo define todos os pinos como digitais, inclusive os analgicos.
ADCON1
Viso geral: Esta instruo define a configurao de pinos como Analgicos.
Exemplo: ADCON1=%10000001
o bit 7 configura a justificao, os bits 6/5/4 no
tem funo, 3/2/1/0 configuram os canais
utilizados.
EREAD
19
EWRITE
Comando
$FE, 1
$FE, 2
$FE, $10
$FE, $14
$FE, $18
$FE, $1C
$FE, $0C
$FE, $0E
$FE, $0F
$FE, $C0
$FE, $94
$FE, $D4
Operao
Limpa o LCD e move o cursor para a posio home.
Move o cursor para a primeira linha da primeira coluna.
Move o cursor uma posio esquerda.
Move o cursor uma posio a direita.
Desloca todo os caracteres do display a esquerda.
Desloca todo os caracteres do display a direita.
Desliga o cursor.
Cursor sublinhado.
Cursor piscando.
Move o cursor para o incio da segunda linha.
Move o cursor para o incio da terceira linha.
Move o cursor para o incio da quarta linha.
20
ADIN
Sintaxe: Varivel = ADIN ncanal
Viso geral: Ler o valor do conversor A/D on-board.
Exemplo: VAR = ADIN 0
Coloca o valor da converso do canal 0 na varivel VAR.
SERVO
Sintaxe: SERVO Pino, Valor da Rotao
Viso geral: Controla o centro de controle de um servo motor. Pino equivale ao pino do
PORT escolhido em que o servo conectado. Valor de Rotao uma constante ou varivel WORD
dedicada ao posicionamento do motor podendo assumir valores entre 500 a 2500, sendo 1500 o valor
central de posicionamento.
Exemplo: SERVO PORTD.0, 1500
Posiciona o servo ligado ao pino 0 do PORT
centralmente.
PWM
Sintaxe: PWM Pino, Nvel, Ciclo
Viso geral: Gera uma sada com Modulao por Largura de Pulso em pino, em seguida,
retorna o pino para o estado de entrada.
21
6 EXEMPLOS E APLICAES
Fazer um programa simplesmente elaborar uma lista de instrues para o microcontrolador
executa-las sequencialmente. Ao escrever o programa se faz extrema importncia que essa sequncia
de execuo esteja bem defina para se atingir o objetivo desejado. como uma receita de bolo:
1 Pega os Ingredientes;
2 Mistura os Ingredientes;
3 Coloca a Mistura na Forma;
4 Leva a Forma ao Forno;
5 Tira a Forma do Forno e espera esfriar;
6 Come o Bolo.
Claramente essa seria a sequncia correta de programao para se fazer um bolo. Mas e se
fosse feito uma sequncia como abaixo?
1 Leva a Forma ao Forno;
2 Come o Bolo;
3 Tira a Forma do Forno e espera esfriar;
4 Mistura os Ingredientes;
5 Coloca a Mistura na Forma;
6 Pega os Ingredientes.
Certamente todas as instrues foram informadas, porm com ordenamento incorreto. Na
primeira instruo se pode at levar a Forma ao Forno, mas sem a mistura dos ingredientes e assim
no tem como comer o bolo antes de faz-lo, obvio, e isso causar um erro de execuo. Por isso se
faz de grande importncia o conhecimento correto da sequncia de instrues dada ao
microcontrolador.
6.1 Primeiros Programas com o PIC 16F877A
Para se aprender a programar um microcontrolador importante comear o assunto com
exemplos prticos e simples, isso ajuda a entender como a arquitetura do PIC e as instrues do
programa esto sendo usados.
Os circuitos estaro baseados nos conhecimentos mostrados em pginas anteriores.
Para melhorar a compreenso dos projetos que faremos na sequencia desse material,
utilizaremos uma sequncia simples de elaborao dos programas, como mostrado abaixo
Declarao do Microcontrolador;
Declarao do Oscilador;
Nomear os pinos ou PORTs a serem usados;
Configurar os pinos ou PORTs como entradas ou sadas;
Configurao dos PORTs como Digitais ou Analogicos;
Declarao de Varveis;
*Declarao de outros componentes (se necessrio);
Instrues e/ou rotinas.
Obs.: Vale ressaltar que o Proton IDE ler as linhas de programao sequencialmente e que
comentrios no programa so feitos com a adio do acento grave ( ` ) frente das palavras da linha.
22
Programa
Device = 16F877A
'Declara qual o Microcontrolador
Xtal 4
'Declara o Oscilador
Symbol LED = PORTB.0
TRISB.0 = 0
AQUI:
'Rtulo da rotina
High LED
'Coloca o LED em nvel lgico Alto
DelayMS 1000
'Atrasa a execuo do programa em 1000ms
Low LED
DelayMS 1000
GoTo AQUI
End
Comentando
Device = 16F877A declara qual o microcontrolador usado. Xtal 4 declara qual o oscilador
usado. Symbol LED = PORTB.0 nomeia o pino do PORT B como LED facilitando. TRISB.0 = 0
declara que o pino 0 do PORT B ser usado como sada. AQUI: o rtulo de uma rotina a ser
executada. High LED coloca 5V no pino 0 do PORT B. DelayMS 1000 atrasa o programa em 1000
milissegundos ou 1 segundo. Low LED coloca 0V no pino 0 do PORT B. Goto AQUI faz com que
a rotina do rtulo AQUI seja executada. End informa ao compilador o fim do programa.
Assim o LED ascender, permanecendo assim por 1 segundo e apagar por mais 1 segundo
at que a rotina seja repetida.
23
Programa
Device = 16F877A
'Declara qual o Microcontrolador
Xtal 4
'Declara o Oscilador
TRISB = %00000000
PORTB = 0
AQUI:
'Rtulo da rotina
High PORTB.0
'Coloca o 5V no pino 0 do PORT B
Low PORTB.7
'Coloca o 0V no pino 7 do PORT B
DelayMS 500
'Atrasa a execuo do programa em 500ms
Low PORTB.0
High PORTB.7
DelayMS 500
GoTo AQUI
End
Comentando
A maioria das instrues so bem parecidas com o do projeto 1. Neste projeto
TRISB=%00000000 declara de forma binaria que todos os pinos do PORT B sero usados como
sadas. PORTB=0 faz com que todos pinos do PORT B fiquem com 0V. A rotina executada dentro
do rtulo AQUI: faz com que enquanto o pino 0 tenha 5V o pino 7 tenha 0V e vice-versa, de modo
que na simulao da figura 23 os leds ascendam e apaguem alternadamente, ou seja, enquanto um
ascende o outro apaga e vice-versa.
24
6.2.3 - Projeto 3: Fazer uma contagem binaria comeando com 0, 1 e depois com potencias
de 2 (2 ) at 128.
x
Circuito
Programa
Device = 16F877A
'Declara qual o Microcontrolador
Xtal 4
'Declara o Oscilador
TRISB = %00000000
PORTB = 0
AQUI:
'Rtulo da rotina
PORTB = %00000000 'PORT B igual a 0
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00000001 'PORT B igual a 1
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00000010 'PORT B igual a 2
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00000100 'PORT B igual a 4
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00001000 'PORT B igual a 8
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00010000 'PORT B igual a 16
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %00100000 'PORT B igual a 32
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %01000000 'PORT B igual a 64
DelayMS 150
'Atrasa a execuo do programa em 150ms
PORTB = %10000000 'PORT B igual a 128
DelayMS 150
'Atrasa a execuo do programa em 150ms
End
GoTo AQUI
'Manda o programa executar a rotina do rtulo AQUI
'Informa o fim do programa
25
Comentando
O que se tem de diferente nesse programa em relao aos demais a configurao do nvel
lgico dos pinos do PORT B de forma binria. PORTB = %00000001 uma forma binaria (o
smbolo % a representao binria na programao) de indicar quais os pinos estaro com 0V ou
5V, nvel lgico baixo ou alto, assim a configurao citada anteriormente faz com que o pino 0 do
PORT B fique com 5V e os demais pinos do PORT fiquem com 0V, com representao decimal igual
a 1. O programa faz uma contagem binaria com as sadas, de modo que comece com 0, depois 1 e em
seguida faa a contagem da potencias de 2 at 128. Isto far com que os leds ascendam de forma
crescente.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
6.2.4 Projeto 4: Utilizando botes nas entradas para acionar sadas. Utilizando as
instrues IF THEN.
Circuito
26
Programa
Device = 16F877A
Xtal 4
TEST:
'teste do boto
If BOTAO = 0 Then LIGAR1 'Condio 'Se' 1 para o boto
If BOTAO = 1 Then LIGAR2 'Condio 'Se' 2 para o boto
LIGAR1:
High LED1
Low LED2
DelayMS 50
GoTo TEST
'Liga LED1
'Desliga LED2
'Atraso de execuo
'Retorna para teste do boto
LIGAR2:
Low LED1
High LED2
DelayMS 50
GoTo TEST
'Desliga LED1
'Liga LED2
'Atraso de execuo
'Retonar para teste de boto
End
Comentando
Nesta programao temos trs pontos importantes a se analisar. A primeira coisa que na
figura 25 se observa o boto B1 no MCLR que servir como reset, ou seja, numa lgica positiva
que enquanto o boto B1 no for pressionado o microcontrolador no tem alimentao (0V) e
consequentemente no executara nenhuma instruo, mas ao pression-lo uma tenso de 5V far a
alimentao e colocar o microcontrolador em funcionamento. O segundo ponto importante o outro
boto B2 no pino 0 do PORT D (configurado como entrada no TRISD.0=1 e nomeado como
BOTAO) que servir como uma entrada digital (sensor) que tem a funo de ligar e desligar as sadas
referentes ao LED1 e LED2. A ltima coisa a se relatar a utilizao da instruo IF THE dentro
rtulo TEST:, que tem a funo de impor uma condio de anlise e de ao dentro do programa
para assim saber qual a resposta a se dar dependendo do estado lgico do boto B2.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
27
Circuito
28
Programa
Device = 16F877A
Xtal 4
INICIO:
For CONT = 0 To 9
'coloca 0 no display
'coloca 1 no display
'coloca 2 no display
'coloca 3 no display
'coloca 4 no display
'coloca 5 no display
'coloca 6 no display
'coloca 7 no display
'coloca 8 no display
'coloca 9 no display
Comentando
Para essa aplicao temos uma instruo nova que a FOR NEXT que se trata de um lao
onde a varivel tem uma contagem de incio e um fim, sendo que a cada contagem a rotina dentro
desse lao executada at que o lao chegue sua contagem final. A contagem no display feita
colocando 0V ou 5V nos pinos referentes a cada segmento a que se quer acionar para representar o
nmero escolhido, onde tal procedimento feito pela indicao do nvel lgico de cada pino do PORT
B nomeado como DISPLAY, de forma binaria, como por exemplo em DISPLAY=%00111111
indicando os pinos 0 a 6 como 5V e 7 a 8 como 0V, mostrando 0 no display.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
29
Figura 28: Display LCD com 2 linhas e 16 colunas cada uma, total de 32 caracteres.
Pinagem
Os pinos 1 e 2 (VSS e VDD) do LCD corresponde a alimentao GND e Vdc
respectivamente, onde a tenso mxima suportada de 5 Vdc. J o pino 3 VEE corresponde ao
controle de contraste, assim um potencimetro conectado a ele para ter esse controle.
O pino 4 RS (Register Select) utilizado para definir o tipo de informao passada atravs
da comunicao paralela. Quando o RS 0 a informao enviada um comando ou instruo. Se RS
for 1 A informao enviada um registro de dados ou caractere alfanumrico.
O pino 5 R/W (Read/Write), um pino utilizado para ler dados a partir da tela do LCD ou
escrever uma entrada no LCD. Se R/W=0 o LCD est habilitado para se poder escrever dados na tela.
Se R/W=1 o LCD habilita a leitura de seus dados. Em muitos casos esse pino no utilizado, ficando
permanentemente ligado ao Vss, assim o LCD opera somente em modo de escrita. Por isso preciso
garantir o trmico das operaes internas do mdulo de LCD atravs de tempos pr-estabelecidos.
O pino 6 E (Enable), um pino de habilitao, ou seja, se E=0 o LCD desativado para
receber dados, mas se E=1 ento o LCD capaz de trabalhar de modo a podermos escrever ou ler
dados no mesmo.
Os pinos 7 a 14 (D0 a D7) equivalem ao barramento de dados paralelo. Apesar da existncia
de 8 vias de dados, esses displays podem operar com 4 vias (D4 a D7) j que as demais vias ficam
sem funes, assim as informaes so enviadas em dois pacotes de 4 bits cada um.
30
Ao se trabalhar com 8 bits, estes devero ser conectados em um s PORT e nunca em PORTs
diferentes do microcontrolador. Ao se trabalhar com somente 4 bits mais significativos do LCD, estes
devem ser conectados aos quatro bits menos significativos ou aos quatro bits mais significativos do
PORT escolhido.
Os pinos E (pino 6) e RS (pino 4) podem ser conectados em qualquer PORT do
microcontrolador. O pino R/W deve estar conectado terra (GND) para indicar ao LCD que se est
trabalhando com escrita de dados.
No Proton IDE necessrio fazer algumas declaraes para o uso de displays alfanumricos
para o uso do comando PRINT.
1 DECLARE LCD TYPE 1 ou 0 - Informa ao compilador o tipo de display a ser utilizado
pelo comando PRINT, se (Grfico ou Alfanumrico)
2 DECLARE LCD_DTPIN PORT.PIN identifica o PORT e os pinos que as vias de
dados do LCD est ligada. Por exemplo: Se utilizado uma via de dados de 8 bits o comando seria
DECLARE LCD_DTPIN PORTB.0 ou Se utilizado uma via de 4 bits seria DECLARE LCD_DTPIN PORTB.4.
3 DECLARE LCD_ENPIN PORT.PIN Identifica o PORT e o pino que a via de
habilitao (enable) LCD est ligada.
4 DECLARE LCD_RSPIN PORT.PIN Identifica o PORT e o pino que a via RS do
LCD est ligada.
5 DECLARE LCD_INTERFACE 4 ou 8 Informa ao compilador o tamanho da via de
dados do LCD utilizada.
6 DECLARE LCD_LINES 1, 2 ou 4 Informa ao compilador o nmero de linhas do
LCD utilizada.
Circuito
31
Programa 1
Device = 16F877A
Xtal 4
Declare LCD_Type 0 'Informa que o LCD Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2
' Informa o numero de linhas do LCD
Comentando
Neste programa feito os declares para o LCD funcionar com a instruo Print e depois est
funo imprime no LCD a mensagem MECATRONICA, o Modificador At faz com que o primeiro
caractere do texto inicie na primeira linha e primeira coluna do LCD.
Programa 2
Device = 16F877A
Xtal 4
Dim INDICE As Byte 'declara a varivel
Dim CHAR As Byte 'declara a varivel
EWrite 0, [" IFCE LIMOEIRO "] 'coloca na memoria das pos. 0 a 16
EWrite 17, [" MECATRONICA "] 'coloca na memoria das pos. 17 a 32
Declare LCD_Type 0 'Informa que o LCD Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2
' Informa o numero de linhas do LCD
INICIO:
Cls
'Limpa o LCD
For INDICE = 0 To 15
CHAR = ERead INDICE 'Ler a memoria na posio INDICE e coloca em CHAR
DelayMS 100
Print $FE, 14, $FE, $0C, CHAR 'Move uma pos. a direita, desliga cursor
Next
'e imprime o caractere de CHAR
DelayMS 300
Print $FE, 2
'Retorna inicio primeira linha
For INDICE = 0 To 15
CHAR = ERead INDICE 'Ler a memoria na posio INDICE e coloca em CHAR
DelayMS 100
Print $FE, $1C, CHAR
'Move os caracteres p/ direita
Next
DelayMS 300
32
Comentando
Neste programa foi usado a escrita e leitura de memria onde cada caractere dos textos
equivale colocados nela equivale a uma posio. Na impresso dos caracteres no LCD, as letras foram
colocadas uma de cada vez para a primeira linha, movidas da esquerda para direita e em seguida da
direita para a esquerda. Depois o segundo texto foi impresso no LCD tambm uma letra por vez.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
33
2(1)
=
Este valor de tenso equivalente a uma dada temperatura, e por isso o valor convertido
(1101) equivale a mesma temperatura. Assim, temos que duas converses devem ser feitas, uma para
o sinal analgico em digital e a outra de digital para a unidade desejada que representa a grandeza a
ser medida como por exemplo C.
34
Bit
4 (Msb)
3
2
1 (Lsb)
Tenso
2,5000 V
1,2500 V
0,6250 V
0,3250 V
35
Bit 6
---
Bit 5
---
Bit 4
---
Bit 3
PCFG3
Bit 2
PCFG2
Bit 1
PCFG1
Bit 0
PCFG0
Para esta configurao se deve analisar a tabela 5, que defini quais pinos do PORT A ou E
sero entradas do conversor A/D.
Tabela 5: Pinos de entrada analgicas e tenso de referncia.
PCFG3:
AN7
AN6
AN5
AN4
AN3
AN2
AN1
AN0
PCFG0
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
RE2
A
A
D
D
D
D
D
D
A
D
D
D
D
D
D
D
RE1
A
A
D
D
D
D
D
D
A
D
D
D
D
D
D
D
RE0
A
A
D
D
D
D
D
D
A
A
A
A
D
D
D
D
RA5
A
A
A
A
D
D
D
D
A
A
A
A
A
D
D
D
RA3
A
VREF+
A
VREF+
A
VREF+
D
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+
RA2
A
A
A
A
D
D
D
D
VREFA
A
VREFVREFVREFD
VREF-
RA1
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
D
RA0
A
A
A
A
A
A
D
D
A
A
A
A
A
A
A
A
VREF+
VREF-
VDD
RA3
VDD
RA3
VDD
RA3
VDD
VDD
RA3
VDD
RA3
RA3
RA3
RA3
VDD
RA3
VSS
VSS
VSS
VSS
VSS
VSS
VSS
VSS
RA2
VSS
VSS
RA2
RA2
RA2
VSS
RA2
36
Referncia
VREF +
VREF (VREF + = VREF -)
Mnimo (V)
VDD 2,5
VSS 0,3
2,0
Mximo (V)
VDD + 0,3
VREF + - 2,0
VDD + 0,3
Bit 6
ADCS0
Bit 5
CHS2
Bit 4
CHS1
Bit 3
CHS0
Bit 2
GO/DONE
Bit 1
---
Bit 0
ADON
37
ADFM
1
OPO
Justificado pela direita.
Utiliza todos os bits de
ADRESL [7:0] e somente
2 bits de ADRESH [1:0]
Justificado pela esquerda.
Utiliza todos os bits de
ADRESH [7:0] e somente
2 bits de ADRESL [1:0]
Tal justificao se faz valida quando queremos trabalhar com somente 8 bits do conversor,
assim se pode justificar pela esquerda e acessarmos somente a parte mais significativa atravs de
ADRESH. Com isso se cria um filtro, onde se joga fora os 2 bits menos significativos do ADRESL.
ADON
Estado do A/D
0
Sistema Desligado
1
Sistema Ligado
O sistema pode ser mantido desligado quando no utilizado, para reduo de consumo.
A prxima ao a escolha do canal a ser utilizado, entre os oito disponveis, atravs de
ADCON0<CHS2:CHS0>:
Tabela 10: Configurao do canal utilizado.
CHS2 : CHS0
000
001
010
011
100
101
110
111
Canal Selecionado
Canal 0 (RA0/AN0)
Canal 1 (RA1/AN1)
Canal 2 (RA2/AN2)
Canal 3 (RA3/AN3)
Canal 4 (RA5/AN4)
Canal 5 (RE0/AN5)
Canal 6 (RE1/AN6)
Canal 7 (RE2/AN7)
GO/DONE
1
0
Estado do A/D
Inicia a Converso
Indica o termino da converso.
Se forado manualmente, cancela a converso atual.
Para fazermos a leitura do canal A/D escolhido utilizaremos da instruo ADIN, mas para
usa-la necessrio alguns declares.
DECLARE ADIN_RES 10 Informa o nmero de bits usado para o resultado da
converso.
DECLARE ADIN_TAD FRC Informa qual a fonte de clock para o sistema de converso
A/D, configurando os bits do ADCON0<ADCS1:ADCS0>.
DECLARE ADIN_STIME 50 a 100 Determina o tempo de carga total do capacitor de
amostragem, mais comumente adotado entre 50s a 100s.
Obs.: S por motivo de precauo importante lembrar que se faz muito importante a
configurao do PORT ou pino escolhido como entrada atravs do da instruo TRIS.
39
Circuito
Programao
Device = 16F877A
Xtal 4
Dim VALOR As Word 'Declara a variavel
Dim TENSAO As Float 'Declara a variavel
Dim RESOLUCAO As Float 'Declara a variavel
RESOLUCAO = 0.0049 'Declara uma constante
TRISA.0 = 1 'Declara o pino como entrada
TRISB = 0 'Declara o PORT como sada
Declare LCD_Type 0 'Informa que o LCD Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2
' Informa o numero de linhas do LCD
Declare Adin_Res 10 'Bits usado na converso
Declare Adin_Tad FRC 'Fonte do clock da converso
Declare Adin_Stime 50 'tempo de carga do capacitor de amostragem
ADCON1=%10001110
INICIO:
Cls
'Limpa o LCD
VALOR = ADIn 0 'Coloca o valor do canal 0 no variavel VALOR
TENSAO = VALOR * RESOLUCAO 'Converte de Bits p/ valor real de tenso
Print "VALOR = ", Dec4 VALOR 'imprime o valor do canal 0
Print At 2, 1, "TENSAO = ", Dec4 TENSAO 'Imprime o valor de tenso
DelayMS 500
GoTo INICIO
40
Comentando
Neste programa temos que em ADCON1=%10001110 configuramos a leitura do A/D com
justificao a direita e ativamos o pino RA0/AN0 como o canal analgico a ser usado na converso.
A varivel VALOR recebe a converso A/D em binrio atravs da instruo ADIn 0 (canal 0). Como
VALOR recebe o valor da converso em binrio, temos que converter esse valor para que se possa
fazer a leitura real de tenso analgica na entrada do pino. Essa converso se faz multiplicando
VALOR pela constante RESOLUCAO (que indica quanto vale cada bit da converso A/D). Por
ltimo imprimimos VALOR e TENSAO no LCD para que possamos visualizar os dados da
converso.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
41
42
Programa
Device = 16F877A
Xtal 4
Dim VALOR As Word 'Declara a variavel
Dim TEMPERATURA As Float 'Declara a variavel
Dim CONVERSAO As Float 'Declara a variavel
CONVERSAO = 0.4883 'Declara uma constante
TRISA.0 = 1 'Declara o pino como entrada
TRISB = 0 'Declara o PORT como sada
Declare LCD_Type 0 'Informa que o LCD Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2
' Informa o numero de linhas do LCD
Declare Adin_Res 10 'Bits usado na converso
Declare Adin_Tad FRC 'Fonte do clock da converso
Declare Adin_Stime 50 'tempo de carga do capacitor de amostragem
ADCON1=%10001110
INICIO:
Cls
'Limpa o LCD
VALOR = ADIn 0 'Coloca o valor do canal 0 no variavel VALOR
TEMPERATURA = VALOR * CONVERSAO 'Converte de Bits p/ temperatura
Print "VALOR = ", Dec4 VALOR 'imprime o valor do canal 0
Print At 2, 1, "Temperatura=", Dec4 TEMPERATURA, 'Imprime o valor
DelayMS 500
'de TEMPERATURA
GoTo INICIO
Comentando
Neste projeto o valor convertido no canal 0 do A/D proveniente do sensor de temperatura
LM35DZ colocado na varivel VALOR e depois com a constante de converso CONVERSAO, o
valor da varivel VALOR convertido para o valor de temperatura graus Celsius registrada pelo
sensor. E por ltimo impresso no LCD, VALOR e TEMPERATURA.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
43
44
Uma vez que o servo recebe um sinal de 1,5ms (por exemplo), ele verifica se o potencimetro
encontra-se na posio correspondente, se ele estiver nada feito. Se o potencimetro no estiver na
posio correspondente ao sinal recebido, o circuito de controle aciona o motor at que o
potencimetro esteja na posio correta. A direo de rotao do servo motor depende da posio do
potencimetro. O motor vai girar na direo levando o potencimetro mais rapidamente na posio
correta.
45
Circuito
Programa
Device 16F877A
Xtal 4
TRISB=%00000000
TRISD=%11100000
Dim POS As Word
Symbol SERVO1 = PORTB.0 'Nomeia pino do servo
Symbol BOTAO1 = PORTD.5 'Nomeia pino do Boto 1
Symbol BOTAO2 = PORTD.6 'Nomeia pino do Boto 2
Symbol BOTAO3 = PORTD.7 'Nomeia pino do Boto 3
PORTB=0
PORTD=0
POS=1500 'Coloca o valor 1500 na variavel POS
TEST:
If BOTAO1=1 Then If POS<2000 Then POS=POS+1 'Gira p/ direita
If BOTAO2=1 Then POS=1500
'Centraliza
If BOTAO3=1 Then If POS>0 Then POS=POS-1 'Gira p/ esquerda
Servo SERVO1, POS 'Instruo para controle do Servo Motor
DelayMS 20
GoTo TEST
Comentando
Esse um programa bem simples onde a instruo Servo controla a posio do servo motor
atravs de pulsos entre 1ms e 2ms de durao, sendo esse tempo controlado pela instruo IF-THEN
relacionando os valores com 3 botes ligados ao PORTD, onde o BOTAO1 incrementa uma unidade
no tempo do pulso de controle do servo, assim acrescentando 0,001ms de durao ao sinal de pulso,
fazendo o servo girar para a direita. O BOTAO2 centraliza o servo motor com pulso do sinal de
controle em 1,5ms e o BOTAO3 decrementa 0,001ms de durao do sinal de controle do pulso e com
isso o servo gira para a esquerda.
46
O PWM muito usado para regular tenses em fontes. Este controle se faz modificando
Nvel da largura de pulso de trabalho do sinal gerado. Pode-se aplicar a formula a baixo para obter o
Nvel dos pulsos ou a tenso de sada.
=
255
255
Onde:
Vout: tenso de sada
Vfonte: tenso da fonte de alimentao do circuito
Nvel: constante entre 0 a 255.
47
Circuito
Programa
Device 16F877A
Xtal 4
TRISB=%00000000
INICIO:
PWM PORTB.7, 128, 100 'PWM para 50% do sinal
GoTo INICIO
End
Comentando
Nesse projeto o intuito foi adquirir na sada um sinal com metade da fonte de tenso, que
nesse caso seria 5V proveniente do microcontrolador PIC. Utilizando a formula anteriormente citada
se pode calcula o valor do Nvel: Nvel=(2,5*255)/5=127,5 ou 128. O Ciclo foi de 100 ciclos do PWM.
Na sada analgica temos 2,5V na sada analgica para a configurao da figura 40, com a
configurao do PWM, 128, 100.
48
7 REFERENCIAS BIBLIOGRFICAS
SOUSA, David Jos de. Nicols Csar L. Conectando o PIC-Recursos Avanados. 3a Edio
Editora Erica, 2002.
49