Apostila da disciplina de laboratório de eletrônica especializada.
Citation preview
I.1- Principais Características
.....................................................................................
2
I.2 – Estrutura Interna
.................................................................................................
2
II – Uso do Winpic800
.................................................................................................
4
II.1– Descrição dos fusíveis (Configurations Bits)
....................................................... 10
III – Uso do PICkit2 Programmer
................................................................................
12
IV – Uso do CCS
........................................................................................................
14
VI.1 – Primeiros passos em CCS C
............................................................................
14
VI.1.1 – Utilizando o “Projetct Wizard”
........................................................................
16
V– Primeiros Programas em CCS C
...........................................................................
22
I – O Microcontrolador 16F628A
O 16F84 encabeçou durante um bom tempo a lista dos
microcontroladores PIC mais populares, representando a “porta de
entrada” para os hobistas que desejavam ingressar no mundo dos
microcontroladores. O baixo custo e a possibilidade de fácil
reprogramação eram seus principais atrativos. Embora ainda esteja
em linha, o PIC 16F628 o sobrepujou por apresentar mais recursos e
mais flexibilidade a um custo menor.
I.1- Principais Características:
- encapsulamento de 18 pinos - 15 portas de entrada/saída e uma
somente de entrada - memória de programa flash com 2K x 14 bits
(contra 1K x 14bits do 16F84) - memória EEPROM com 128 x 8 bits
(contra 64 x 8bits do 16F84) - memória de dados com 224 x 8 bits
(contra 68 x 8bits do 16F84) - duas fontes de osciladores internos:
4MHz e 37 KHz (não disponível no 16F84) - Três timers: timer 0 (de
8 bits); timer 1 (de 16 bits); e timer 2 (de 8 bits). (o 16F84 só
possui um módulo contador/temporizador). - USART (canal de
comunicação serial) - comparador - compatibilidade de pinos e
software com o 16F84 - tensão de alimentação de +3V a +5,5 V -
temperatura de trabalho de -40ºC até + 125ºC (faixa de temperatura
com designador “E”) - dissipação máxima de energia: 800 mW -
correntes máximas de entrada e saída por pino: 25 mA - 10 fontes de
interrupção - instruction set de 35 instruções
I.2 – Estrutura Interna
A figura I.1 mostra o diagrama em blocos da estrutura interna do
PIC 16F628A:
É característica da família PIC possuir uma memória RAM que é
compartilhada pelos registradores de finalidades específicas (SFRs
– Special Function Registers) , tais como o PORTx, TRISx, STATUS,
INTCON e OPTION_REG; e pelos registradores de propósito geral (GPRs
– General Purpose Register), que são utilizados para armazenamento
temporário de dados a serem processados pelo programa.
I.3 – Pinagem e Descrição dos Pinos
As figuras III.2 e III.3 mostram a pinagem e a descrição dos pinos,
respectivamente, dos PICs 16F62X.
Figura I.2 – Pinagem do PIC 16F62X
II – Uso do Winpic800
Em nossas práticas utilizaremos um dos softwares de programação
mais utilizados e fáceis de usar: o winpic800 versão 3.55. Ele pode
ser baixado gratuitamente do site www.winpic800.com.
Figura II.1 – Tela principal do Winpic800
A Figura II.1 mostra uma tela com o idioma de exibição –
Português-BR – já selecionado. Isto é feito no penúltimo menu
drop-down, da esquerda para a direita.
Os próximos passos são:
Figura II.3 – Configurando o programador do tipo JDM
7
esquerdo. Logo desta janela encontra-se a seleção da porta serial
“COM” na qual o programador será conectado, no caso: “COM1”.
-
Figura II.4 – Gravadores USB disponíveis no laboratório
A Figura II.4(a) mostra um gravador “clone” do PICKIT2. Ele possui
um software específico de gravação. Já a placa mostrada na Figura
II.4(b) é do tipo GTP USB (Grabador TodoPic ), que pode ser
gravado na versão do Winpic800 disponível no laboratório (3.55).
Basta selecionar GTP – USB – #0.
Obs.: Alguns gravadores USB utilizam um conversor USB-serial que
cria uma porta “COM” virtual. Neste caso, deve-se verificar no
Gerenciador de Dispositivos do Windows qual o número da porta COM
gerada, pois é aleatório (geralmente, funciona a partir de COM4).
Diferentemente dos ajustes anteriores, este tipo de ajuste deve ser
verificado toda vez que a placa for conectada.
FIGURA II.5 – Seleção do tipo de PIC.
3) No próximo passo, o software deve abrir o programa que se deseja
gravar no PIC. Este é um programa que já foi compilado por algum
software de compilação – tal como o CCS, que utilizaremos em nossas
práticas –, e é um arquivo com extensão “.h”.
Figura II.6 – Abrindo o programa compilado para a gravação
9
A Figura II.6 mostra que basta clicar no ícone da “pastinha
amarela” (para onde a seta está apontando) ou no menu “Arquivo” e
logo em seguida em “Abrir”, localizando-se a pasta na qual o
arquivo “.h” está gravado (a mesma pasta que foi criada para o
projeto e para o programa fonte, no caso, em C CCS). No exemplo,
está se abrindo um programa denominado PISCA_LED1.hex que se
encontra na pasta PISCA_LED1 (que pode estar dentro da pasta criada
para a turma, por exemplo).
4) O quarto passo, caso haja necessidade, é a configuração dos
chamados “fusíveis de configuração interna” ou “configuration
bits”. Se estes já foram definido em alguma diretiva do programa ou
no próprio software de edição/compilação, este passo pode ser
pulado. Independentemente do programador utilizado, é necessário
escolher uma configuração de trabalho do PIC. O 16F628A possui um
registrador específico para esta função, chamado CONFIG, o qual é
acessado por meio do endereço 2007h. Como este endereço está fora
da faixa de endereço da memória de programa (0000h até 07FFh), os
bits desse registrador são acessíveis somente na gravação ou
verificação.
Não há necessidade de preocupação com esta posição de memória,
pois, como já mencionado, os softwares de gravação, assim como
editores de linguagem, costumam permitir que o usuário escolha as
opções desejadas para os fusíveis, e então efetuar a gravação
automaticamente. Os itens configurados variam de PIC para PIC. O
PIC 16F628A possui as seguintes opções: - Tipo de oscilador -
Watchdog Timer (WDT) - Power up Timer - Brown Out Detect - Master
Clear Eneable - Low Voltage Program - Data EE read Protect - Code
Protect
A função de cada um desses fusíveis é descrita na seção II.1.
Clicando-se na opção “Config.” do Winpic800 – como é mostrado na
Figura II.7 –
é possível configurar estes bits, sem a necessidade de uma diretiva
no código em C, ou sem usar o programa editor. Isto também é
possível através do MPLAB, que pode trabalhar associado ao CCS, no
menu Configure/Configuration Bits...
Figura II.7 – Acesso aos fusíveis de configuração.
10
A função “Config” do Winpic800 também pode ser usada
simplesmente para
checar as configurações feitas anteriormente para o programa em
questão. Se não houver coincidência com o que foi previamente
configurado, geralmente é um dentre dois erros cometidos pelo
usuário: - O PIC não foi corretamente selecionado (Passo 2); ou - O
usuário abriu o programa errado.
5) Uma vez que a placa gravadora esteja conectada na porta “COM”
(conector DB9) e o PIC tenha sido detectado, clica-se no ícone que
tem o formato de um circuito integrado com uma seta vermelha
apontado para ele (“programar tudo”), como é destacado na Figura
II.8, e é só aguardar o tempo de gravação e verificação para ver se
tudo correu bem.
Figura II.8 – Programando o PIC
II.1 – Descrição dos fusíveis (Configurations Bits)
Tipo de Oscilador
Watchdog Timer
O WDTE é um fusível de programação que permite habilitar ou
desabilitar o WDT (Watchdog Timer – temporizador “Cão de
Guarda”), que é um temporizador interno RC que quando ocorre um
overflow ou estouro (atinge o máximo da contagem)
provoca um reset no programa que esteja funcionando em modo normal.
Tem um clock independente, rodando livre e independentemente do
clock principal. A principal finalidade do WDT é recuperar a CPU de
eventuais travamentos no programa, que podem ocorrer por
interferências externas ou erros no software. É importante em casos
onde o programa não pode parar de funcionar, como o caso de um
computador de bordo. Para a maioria dos nossos programas o WDTE
deve estar desabilitado, pois se o WDT estiver habilitado, este
deve ser resetado de tempos em tempos, de forma a nunca ocorrer o
overflow do mesmo. Este ajuste não pode ser alterado durante a
execução do programa.
Power up Timer
O temporizador de power up (PWRT), se estiver habilitado, permite
que o PIC só comece a operar cerca de 72 ms após a fonte ter sido
ligada. Evita problemas de inicialização incorreta ou travamentos
devido ao tempo de estabilização necessário da fonte de alimentação
ou do reset externo.
Master Clear Eneable (MCLRE)
Brown Out Detect Eneable (BODEN)
A habilitação desta opção irá resetar o PIC caso a tensão de
alimentação caia abaixo de certo valor (normalmente 4 V). Isto pode
evitar travamentos com determinadas quedas na tensão de
alimentação.
Low Voltage Program (LVP)
Ativa ou não a programação de baixa voltagem. Este recurso permite
que a memória de programa do PIC seja gravada em baixa tensão (5 V
ao invés dos tradicionais 13 V aplicados ao pino de programação).
Isto favorece a criação de sistemas onde um PIC grava o programa de
outro PIC ou sistemas de upgrades remotos. Como os 13V
raramente estão disponíveis nos projetos, este processo padroniza o
hardware em níveis TTL. Em geral, esta função estará desabilitada
de forma a permitir que o pino RB4/PGM atue como I/O.
Data EE Read Protect
Se esta opção estiver ativada não será possível ler a EEPROM
interna através do gravador do PIC. Se esta opção estiver
desativada todos os dados armazenados nesta memória serão perdidos
durante a gravação.
Code Protect (CP)
Uma vez ativado o código de proteção, o programa gravado no chip
não poderá mais ser lido, nem pelo programador, embora haja a
possibilidade de reprogramação. Isto evita cópias indevidas.
Checksum
O checksum é o resultado da soma de todos os valores numéricos
armazenados na memória de programa do PIC. Trata-se de uma técnica
de verificação de erros. Se um programa já gravado possui o mesmo
checksum de um programa compilado, mesmo com o code protect
ativado, deduz-se, por exemplo, que os dois possuem o mesmo código
fonte.
Número de Identificação
O PIC possui 4 bytes (posições de 2000h a 2003h) que podem ser
gravados para uma identificação de versão, por exemplo. Facilita o
rastreamento do software em caso de problemas futuros, mesmo com o
código de proteção ativado. Só os quatro bits menos significativos
de cada byte estão disponíveis, de forma que 4 dígitos de 0 a 9
podem ser usados como ID.
III – Uso PICkit2 Programmer
13
1º) Conecte o gravador numa entrada USB do computador e clique no
ícone abaixo na área de trabalho:
Figura III.1 – Ícone do PICkit2 na área de trabalho
2º) após abrir a tela abrir a tela abaixo (Figura III.2), a placa e
o PIC ligado a ela já devem ter sido detectados. Se a mensagem “No
device found” aparecer em na janela “Device”, clique em
“Programmer/Manual Device Select”.
Figura III.2 – Tela do software de programação do PICkit2
14
4º) Após a importação, clique em “Write” para gravar o PIC.
IV– Uso do CCS
A partir de agora passaremos a ter noções sobre a linguagem C para
sistemas embarcados (embedded systems), isto é, sistemas dedicados
(para propósitos específicos, em geral, automação e controle) que
integram um sistema elétrico e/ou mecânico maior. Muitos desses
sistemas, hoje em dia, são baseados em microcontroladores. Os
sistemas dedicados têm objetivos opostos aos sistemas de propósito
geral, como os PCs, voltados tipicamente para processamentos de
dados. O embedded C é uma extensão da linguagem C para
operação com sistemas embarcados, incluindo operações de I/O,
dentre outros recursos.
A aplicação da linguagem C em programação de microcontroladores tem
ganhado campo nos últimos anos, substituindo com várias vantagens a
programação em assembly que foi originalmente majoritária nessa
aplicação.
Adotamos como plataforma de desenvolvimento de nossos programas em
linguagem C o software PCWHD da CCS (Custom Computer Service),
empresa responsável pelos primeiros compiladores C para os
microcontroladores da Microchip. A versão demo, com duração de 45
dias, pode ser baixada do site www.ccsinfo.com.
Os chamados compiladores C-Aware IDE da CCS possuem as seguintes
versões, cuja aquisição depende da necessidade do cliente: -
PCW Para PICs 10/12/16; - PCWH Para PICs 10/12/16/18; -
PCDIDE Para PICs 24/dsPIC; - PCWHD Para PICs 10/12/16/18
e PICs 24/dsPIC.
O PCWHD, além do módulo IDE, é constituído por módulos
compiladores, chamados compiladores de linha de comando (comand
line), que podem ser comprados separadamente, conforme a
necessidade: PCB compilador para a linha base (pics de 12
bits) PCM compilador para a linha intermediária (pics de 14
bits) PCH compilador para o topo de linha (pics de 16 bits)
PCD compilador para os pics de 24 bits
IV.1 – Primeiros passos em CCS C
Esta seção tem por objetivo demonstrar o uso mais básico e imediato
do CCS através do processo de criação de um programa fonte em C e
de exemplos de programas. A partir daí, um primeiro contato com as
funções da linguagem C, bem como sua forma de estruturação, será
tomado. A versão ora usada em nosso laboratório é o PCWHD versão
5.009.
Após se clicar no ícone esquematizado na Figura VI.1, na área de
trabalho, será exibida a tela que é mostrada na Figura VI.2.
Figura IV.1 – Ícone do CCS na área de trabalho
Figura IV.2
À semelhança do MPLAB (que edita programas em assembly) e outros
softwares de programação de microcontroladores e CLPs, o CCS
organiza suas aplicações em “projetos”. O projeto consiste em um
único arquivo de projeto (extensão “.ccspjt”, na atual versão) e um
ou mais arquivos fontes em C (extensão “.c”). Só podem ser
compilados arquivos fontes que façam parte de um projeto. Assim, o
primeiro passo é a criação de um arquivo fonte em C e sua
respectiva vinculação a um projeto. Isto é feito usando uma dentre
três maneiras mais usuais:
1º) Trabalhando com o CCS de dentro do MPLAB; ou 2º) Utilizando-se
o “Project Wizard” do CCS; ou ainda 3º) Manualmente
16
até porque se torna um pouco inviável explorar todos esses recursos
durante o período letivo.
IV.1.1 – Utilizando o “Projetct Wizard”
O “Projetc Wizard” do CCS é a maneira mais simples, rápida e direta
de fazer as inicializações necessárias para um novo programa fonte
em linguagem C, inclusive as configurações dos fusíveis. Algumas
configurações de fusíveis, inclusive, não precisariam nem ser
especificadas, pois o compilador os configura automaticamente
(situação default ), da seguinte maneira:
- A programação em baixa tensão (Low Voltage Program ou LVP)
fica desativada; - O Power up Timer fica ativado;
- O Watch dog Timer fica automaticamente desativado se
não estiver presente no código fonte a função “restart_wdt()”; - A
configuração automática dos bits de configuração é feita baseada na
diretiva “#use delay(); - O Master Clear Eneable (MCLRE) é
ativado.
Passos:
1º) Clique “File”, logo em seguida em “New”, e finalmente em
“Project Wizard” (Figura IV.3):
Figura IV.3
17
2º) Ao ser aberta a tela “Salvar como” (Figura IV.4), salve o
projeto na pasta desejada, com o nome desejado (que por
default é “main.ccspjt).
Figura IV.4
3º) Na próxima tela que se abrirá (Figura IV.5), no item “Device” –
que é a primeiro que se abre – selecione PIC16 na caixa intitulada
“Family” (ou mantenha o defaut “all”), na aba “Options”
– “General” – “Device”;
Na caixa “Device”, na mesma aba, selecione o número do nosso PIC:
16F628A. Ainda na mesma aba, abaixo, estão as opções de clock. Na
caixa “Oscillator Type”
selecione “Internal”, para que o PIC possa funcionar com seu clock
interno, sem a necessidade de clocks externos (como um cristal, por
exemplo). Na caixa “Clock Speed”, digite a frequência desejada, que
pode ser selecionada em Hz, KHz ou MHz. No caso, usaremos a
frequência do clock interno de 4 MHz (4.000.000 Hz).
Mais abaixo, mantenha o Watchdog Timer desabilitado, mantendo
“desclicado” o “eneable” na opção WDT.
4º) Desça a barra de rolagem vertical na parte esquerda da tela até
o final e selecione a opção “Fuses” (Figura IV.6).
18
PIC – pino 4 – prescinda do uso de um resistor de pull-up, já que a
entrada de Master Clear não será utilizada. Isto disponibiliza
também a entrada RA5).
Figura IV.5
Habilite o “Power Up Time” e o “Reset when brownout detected”.
Clicando na aba “Code” (Figura IV.8) pode-se verificar a
configuração escolhida
para os fusíveis (que teria de ser introduzida manualmente no
programa caso não se utilizasse o o “Project Wizard”). O que
aparece à direita da dupla barra (//) são comentários. As
linguagens de programação dispõem desse recurso para facilitar a
interpretação do que o programa está fazendo, servindo apenas para
quem está lendo o código, pois não constituem comandos ou funções
da linguagem. A dupla barra é utilizada para comentários de linha
(apenas em uma linha), já para comentários de bloco (várias linhas)
deve-se utilizas os delimitadores “/*” no início do comentário e
“*/” no final do comentário.
Figura IV.8
5º) Clique em “Create Project” no canto inferior direito e será
exibida a tela da figura IV.9:
Figura IV.9
21
manualmente, caso não se houvesse empregado o “Project Wizard”,
usando as seguintes diretivas:
#include<16f628a.h>
#use delay(clock=4000000)
A diretiva “include” inclui um programa fonte em outro. A primeira
linha inclui um arquivo cabeçalho (header file, com extensão “.h”)
com as configurações do PIC que vai ser utilizado (16F628A). Um
arquivo cabeçalho é um programa reutilizável em vários outros
programas, pois permite manter separados certos elementos do código
fonte principal.
Sua forma geral é:
#include "nome_do_arquivo" ou #include
<nome_do_arquivo>
A diferença entre se usar " " ou < > esta somente
na ordem de procura nos diretórios pelo arquivo especificado. As
aspas devem ser utilizadas, caso se deseje informar o nome do
arquivo com o caminho completo, ou o arquivo estiver no diretório
de trabalho. Se o arquivo for próprio do sistema, use < >,
para procura por caminhos pré- especificados do compilador.
Toda diretiva é iniciada por “#” e não usa “;” no final da
linha.
A diretiva “fuses” configura os fusíveis (configurations bits), de
acordo com o quadro abaixo:
FUNÇÃO DESCRIÇÃO Master Clear MCLR
NOMCLR Habilita Master Clear
NOBROWNOUT Habilita brownout detect
NOWDT Habilita Watchdog Timer
NOPUT Habilita Power Up Timer
Desabilita Power Up Timer Low Voltage Program LVP
NOLVP Habilita prog. em b. tensão
desabilita prog. em b. tensão
Code Protect PROTECT NOPROTECT
Data EE Read Protect CPD NOCPD
Leitura da E²PROM prot. Leitura da E² PROM não p.
Oscilador LP, RC, XT, HS, INTRC_IO, INTRC_OSCOUT, EC e
EC_OSCOUT
Vários tipos de clock internos e externos
22
A diretiva ” use delay(clock=4000000)”, especifica a
frequência do clock em 4 MHz.
V – Primeiros Programas em CCS C
Um dos conceitos mais importantes da linguagem C é o de função. Uma
função encerra a idéia de uma sub-rotina, ou seja, um
subprograma.
Todo programa em C deve ter uma e somente uma função principal,
denominada “main”. O nosso programa mínimo em linguagem C está
esquematizado abaixo:
1º PROGRAMA – Programa_Mínimo em CCS C
#include <16F628A.h>
}
Em qualquer compilador de linguagem C tradicional a função Main,
com as duas chaves delimitando o início e o fim da função, já seria
o bastante. No caso do compilador para microcontroladores,
entretanto, há a necessidade da inclusão do arquivo cabeçalho
(header ) que contém as informações necessárias ao PIC que
será usado (no caso, o PIC 16F628A). Daí a necessidade da diretiva
“include” no início do programa (como visto anteriormente, isto é
feito automaticamente ao se usar o “Project Wizard”).
O programa anterior nada faz, mas já é compilado sem erros.
Experimente digitar, compilar e gravar os programas a seguir e, com
base nas explicações de sala de aula, responda o questionário a
seguir:
2º PROGRAMA – Programa Pisca_Led1
#use delay(clock=4000000)
#use delay(clock=4000000)
#define led pin_b5
return(0); }
#use delay(clock=4000000)
main() {
while(true) {
output_bit(pin_B1,0); // coloca o bit 1 da porta B em nível baixo
delay_ms(1000); output_bit(pin_B1,1); // coloca o bit 1 da porta B
em nível alto delay_ms(1000);
} return(0); }
#use delay(clock=4000000)
#use delay(clock=4000000)
} return(0); }
Exercícios
1) Numere a sequência de passos abaixo de forma a colocá-la na
ordem certa:
3) Em função do hardware abaixo, responda as questões a
seguir:
a) Sabendo-se que o circuito será montado num protoboard apenas com
os componentes apresentados, que cuidados devem ser tomados na
configuração dos fusíveis em relação ao Master Clear e ao tipo de
clock? Por quê? O que há de diferente na base de testes empregada
no laboratório no tocante a esses itens?
b) Calcule um adequado valor para R1 considerando-se: tensão de
saída em nível alto – 5,0 V corrente nominal do led – 20 mA tensão
sobre o led (aceso) – 2,0 V
c) Qual dos programas Pisca_led (1, 2 ou 3) estaria adequado para
este hardware, de forma que o led permaneça 1 segundo aceso e 1
segundo apagado?
d) Altere este programa de forma que:
4) Quais os limites máximo e mínimo da função Delay?
5) Redesenhe o esquema de forma a atender os outros dois programas
Pisca_led
6) Em relação a linguagem C, responda:
a) É uma linguagem estruturada? Por quê? b) É uma linguagem case
sensitive? O que acontece no CCS? c) Defina o conceito de função em
linguagem C d) Defina o conceito de diretiva e) Explique porque
instruções de desvio incondicional, do tipo GOTO, são
desaconselhados em C.
7) Correlacione as colunas:
1 – OUTPUT_HIGH (pino) 2 – OUTPUT_LOW (pino) 3 – OUTPUT_bit (pino,
estado) 4 – OUTPUT_X (byte)
( ) coloca o pino especificado em determinado nível lógico ( )
coloca o pino especificado em “0” ( ) coloca o pino especificado em
“1” ( ) Escreve um byte em uma determinada porta do
microcontrolador.
8) O arquivo de um programa fonte em “C” tem extensão:
( ) .HEX ( ).CCSPJT ( ).C ( ).PBAS
9) O arquivo de um programa para ser gravado no PIC deve ter
extensão:
( ) .HEX ( ).CCSPJT ( ).C ( ).PBAS
10) No Programa Pisca_Led3 cite exemplos de:
a) instrução de entrada e saída b) diretiva c) arquivo cabeçalho d)
instrução de controle de fluxo e) comentário f) instrução de
atraso
11) Quais as formas de citar um comentário em C?
27
13) Altere o 5º programa e o 6º programa de maneira a passar a
informação de binário para hexadecimal.