Académique Documents
Professionnel Documents
Culture Documents
www.tinyurl.com/SanUSB
APOSTILA DE MICROCONTROLADORES
PIC E PERIFRICOS
Sandro Juc
Renata Pereira
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Contedo
1 INTRODUO .............................................................................................................................. 18
1.10 CAPACITORES........................................................................................................................ 25
2
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2.7 GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX ................................ 49
UM POTENCIMETRO ................................................................................................................................... 55
UM POTENCIMETRO ................................................................................................................................... 62
3
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
4 INTERRUPES E TEMPORIZADORES.................................................................................. 71
4
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
5
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
10.1 EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM LCD ............... 147
11 LDR............................................................................................................................................... 149
6
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
(RTOS) 184
SANUSB 189
18.6.3 EXEMPLO: PROGRAMA PARA ACENDER UM LED QUANDO CHAVE FOR ACIONADA.. 208
7
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
18.6.5 EXEMPLO: PROGRAMA PARA ACENDER UMA SEQUNCIA DE LEDS NA PORTA B ...... 209
18.6.6 EXEMPLO: MENSAGEM PELA RS-232 COM A FUNO GETS PARA LEITURA DE STRING
210
20.2 PROGRAMA QUE GRAVA E L 24 PALAVRAS DE 3 BYTES CADA (UM BYTE PARA
ENDEREO E DOIS PARA UMA VARIVEL DE 16 BITS INCREMENTADA POR INTERRUPO). ........... 226
8
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
9
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
10
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
NDICE DE FIGURAS
11
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
12
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
14
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Figura 18. 1: Esquema eltrico de PIC 16F628A com led no pino B0. ......................................197
Figura 18. 2: Pinagem do PIC16F688. ......................................................................................199
Figura 18. 3: Leitura de texto em monitor serial. ......................................................................200
Figura 18. 4: Pinagem do PIC 16F819. .....................................................................................200
Figura 18. 5: Pinagem do PIC 16F873A. ..................................................................................201
Figura 18. 6: Pinagem do PIC 16F877. .....................................................................................202
Figura 18. 7: Gravao do PIC 16F877A via serial. ..................................................................203
Figura 18. 8: Foto do PIC sendo gravado em protoboard via serial. ..........................................203
Figura 18. 9: Instrues fusveis. ..............................................................................................205
Figura 18. 10: Envio de dados via serial com PIC 16F877. .......................................................207
Figura 18. 11: Esquemtico para comunicao serial. ...............................................................207
Figura 18. 12: Ligando led com boto utilizando pull up interno. .............................................209
Figura 18. 13: Acendendo sequncia de leds. ...........................................................................210
Figura 18. 14: Escrita de mensagens via monitor serial.............................................................211
Figura 18. 15: Trabalhando com formato de nmeros via serial. ...............................................211
Figura 18. 16: Registros de controle (1)....................................................................................213
Figura 18. 17: Registros de controle (2)....................................................................................214
15
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
16
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
17
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
1 INTRODUO
18
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Como pode ser visto, a famlia PIC16F (14 bits com aproximadamente 35 instrues) no
possui uma instruo em assembly que realize multiplicao ou diviso de dois operandos, o que
curiosamente presente na linguagem assembly da famlia MCS51 (256 instrues que
satisfazem a maioria das aplicaes industriais). Portanto, para realizar uma multiplicao,
necessrio realizar somas sucessivas, ou seja, em vez de multiplicar uma varivel por outra,
realizar somas de uma varivel em uma terceira rea de memria, tantas vezes quando for o valor
da segunda varivel. (X * 5 = X + X + X + X + X).
Mas em linguagem C possvel se utilizar o operador de multiplicao (*), de forma
simples e prtica. Ao compilar, a linguagem gerada ir converter a multiplicao em somas
sucessivas sem que o programador se preocupe com isso.
19
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
- A linguagem C permite maior portabilidade, uma vez que um mesmo programa pode ser
recompilado para um microcontrolador diferente, com o mnimo de alteraes, ao contrrio do
ASSEMBLY, onde as instrues mudam muito entre os diversos modelos de microcontroladores
existentes como PIC e 8051.
- possvel incluir, de forma simples e padronizada, outro arquivo em C (biblioteca) para servir
como parte do seu programa atual como, por exemplo, incluir o arquivo LCD (#include <lcd.c>),
desenvolvido por voc anteriormente.
- O ponto fraco da compilao em C que o cdigo gerado, muitas vezes, maior do que um
cdigo gerado por um montador (assembler), ocupando uma memria maior de programa e
tambm uma memria maior de dados. No entanto, para a maioria das aplicaes sugeridas na
rea de automao industrial, a linguagem C para PIC se mostra a mais adequada, tendo em vista
que a memria de programa tem espao suficiente para estas aplicaes.
A arquitetura de um sistema digital define quem so e como as partes que compe o sistema
esto interligadas. As duas arquiteturas mais comuns para sistemas computacionais digitais so as
seguintes:
permite que, enquanto uma instruo executada, uma outra seja buscada na memria, ou seja,
um PIPELINE (sobreposio), o que torna o processamento mais rpido.
1.5 BARRAMENTOS
Figura 1. 2: Memrias.
As instrues de um programa so gravadas em linguagem de mquina hexadecimal na
memria de programa flash (ROM). No incio da operao do microcontrolador, o contador de
programa (PC) indica o endereo da primeira instruo da memria de programa, esta instruo
carregada, atravs do barramento de dados, no Registro de Instruo da CPU.
21
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O oscilador externo (geralmente um cristal) ou o interno (circuito RC) usado para fornecer
um sinal de clock ao microcontrolador. O clock necessrio para que o microcontrolador possa
executar as instrues de um programa.
Nos microcontroladores PIC, um ciclo de mquina (CM) possui quatro fases de clock que so
Q1, Q2, Q3 e Q4. Dessa forma, para um clock externo de 4MHz, temos um ciclo de mquina
(CM=4 x 1/F) igual a 1s.
22
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
instrues da CPU no ciclo Q4. Ela decoficada e executada no prximo ciclo, no intervalo de
Q1 e Q4. Essa caracterstica de buscar a informao em um ciclo de mquina e execut-la no
prximo, ao mesmo tempo em que outra instruo buscada, chamada de PIPELINE
(sobreposio). Ela permite que quase todas as instrues sejam executadas em apenas um ciclo
de mquina, gastando assim 1 s (para um clock de 4 MHz) e tornando o sistema muito mais
rpido. As nicas exees referem-se s instrues que geram saltos no contador de programa,
como chamadas de funes em outro local da memria de programa e os retornos dessas funes.
Para desenvolver os projetos e exerccos propostos nessa apostila ser necessrio a uilizao
de uma Matriz de Contatos (ou Protoboard em ingls), mostrada na figura abaixo, que uma
placa com diversos furos e conexes condutoras para montagem de circuitos eletrnicos. A
grande vantagem do Protoboard na montagem de circuitos eletrnicos a facilidade de insero
de componentes (no necessita soldagem).
Figura 1. 4: Protoboard.
Na superfcie de uma matriz de contatos h uma base de plstico em que existem centenas
de orifcios onde so encaixados os componentes ou tambm por ligaes mediante fios. Em sua
parte inferior so instalados contatos metlicos que interliga eletricamente os componentes
inseridos na placa que so organizados em colunas e canais. De cada lado da placa, ao longo de
seu comprimento, h duas colunas completas. H um espao livre no meio da placa e de cada
lado desse espao h vrios grupos de canais horizontais (pequenas fileiras), cada um com 05
orifcios de acordo como ilustrado na figura abaixo.
23
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
1.9 RESISTORES
24
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
1.10 CAPACITORES
25
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
26
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
27
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
A USB, sigla para Universal Serial Bus, o padro de interface para perifricos externos ao
computador provavelmente mais popular dos j criados. Um sistema USB composto por
hardware mestre e escravo. O mestre chamado de host e o escravo denomina-se dispositivo ou
simplesmente perifrico. Todas as transferncias USB so administradas e iniciadas pelo host.
Mesmo que um dispositivo queira enviar dados, necessrio que o host envie comandos
especficos para receb-los.
A fase de preparao, conhecida como enumerao, acontece logo depois de quando o
dispositivo USB fisicamente conectado ao computador. Nesse momento, o sistema operacional
realiza vrios pedidos ao dispositivo para que as caractersticas de funcionamento sejam
reconhecidas. O sistema operacional, com a obtida noo do perifrico USB, atribui-lhe um
endereo e seleciona a configurao mais apropriada de acordo com certos critrios. Com
mensagens de confirmao do dispositivo indicando que essas duas ltimas operaes foram
corretamente aceitas, a enumerao finalizada e o sistema fica pronto para o uso.
28
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Communication Device Class (CDC) Basicamente o driver emula uma porta COM,
fazendo com que a comunicao entre o software e o firmware seja realizada como se fosse uma
porta de comunicao serial padro. o mtodo mais simples de comunicao bidirecional com
velocidade de comunicao de at 115 kbps, ou seja, aproximadamente 14,4 kB/s. Mais
detalhes em uma aplicao Windows com protocolo Modbus RTU
http://www.youtube.com/watch?v=KUd1JkwGJNk e em uma aplicao de comunicao
bidirecional no Linux http://www.youtube.com/watch?v=cRW99T_qa7o.
29
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2 FERRAMENTA SanUSB
Alm de todas estas vantagens, os laptops e alguns computadores atuais no apresentam mais
interface de comunicao paralela e nem serial EIA/RS-232, somente USB.
Como pode ser visto, esta ferramenta possibilita que a compilao, a gravao e a simulao real
de um programa, como tambm a comunicao serial atravs da emulao de uma porta COM
virtual, possam ser feitos de forma rpida e eficaz a partir do momento em o microcontrolador
esteja conectado diretamente a um computador via USB.
30
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
31
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
32
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Note que, este sistema multiplataforma (Windows, Linux e Mac OSX), compatvel com
o software de gravao HID USB da Microchip tambm para Linux e Mac OSX, pode ser
implementado tambm em qualquer placa de desenvolvimento de microcontroladores PIC com
interface USB, pois utiliza o boto de reset, no pino 1, como boto de gravao via USB. Ao
conectar o cabo USB e alimentar o microcontrolador, com o pino 1 no Gnd (0V), atravs do
boto ou de um simples fio, o microcontrolador entra em Estado para Gravao via USB (led no
pino B7 aceso) e que, aps o reset com o pino 1 no Vcc (+5V atravs do resistor fixo de 2K2 sem
o jump), entra em Estado para Operao do programa aplicativo (firmware) que foi compilado.
O cabo USB apresenta normalmente quatro fios, que so conectados ao circuito do
microcontrolador nos pontos mostrados na figura acima, onde normalmente, o fio Vcc (+5V) do
cabo USB vermelho, o Gnd (Vusb-) marrom ou preto, o D+ azul ou verde e o D- amarelo
ou branco. Note que a fonte de alimentao do microcontrolador nos pinos 19 e 20 e dos
barramentos vermelho (+5V) e azul (Gnd) do circuito provem da prpria porta USB do
computador. Para ligar o cabo USB no circuito possvel cort-lo e conect-lo direto no
protoboard, com fios rgidos soldados, como tambm possvel conectar sem cort-lo, em um
protoboard ou numa placa de circuito impresso, utilizando um conector USB fmea. O diodo de
33
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
34
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Para obter vrios programas-fonte e vdeos deste sistema livre de gravao, comunicao
e alimentao via USB, basta se cadastrar no grupo de acesso livre www.tinyurl.com/SanUSB e
clicar no item Arquivos.
35
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
void main()
{
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
while (1)
{
output_toggle(pin_B7); // comuta Led na funo principal
delay_ms(500);
}
}
O programa pisca3 abaixo pisca trs leds conectados nos pinos B5, B6 e B7.
#include <SanUSB.h>
main(){
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
while (1)
{
output_high(pin_B5); // Pisca Led na funo principal
delay_ms(500);
output_low(pin_B5);
output_high(pin_B6);
delay_ms(500);
output_low(pin_B6);
output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
}}
---------------------------------------------------------------------------------------------------------------------
36
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
37
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
1- Conecte o modem Xbee ao microcontrolador com apenas 4 fios: Vcc(3,3V), Gnd, Tx e Rx,
como mostra a figura abaixo. Na figura, o fio vermelho ligado ao pino 20 (Vcc) do
microcontrolador e ao pino 1 (Vcc) do modem Zigbee, o fio azul ligado ao 19 (Gnd) do
microcontrolador e ao pino 10 (Gnd) do modem Zigbee, o fio laranja ligado ao pino 18 (Rx) do
microcontrolador e ao pino 2 (DOUT) do modem Zigbee, o fio amarelo ligado ao 17 (Tx) do
microcontrolador e ao pino 3 (DIN) do modem Zigbee
38
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2- A gravao s vai acontecer se os mdulos Zigbee estiverem com o mesmo baud rate do
microcontrolador (exemplo 19200 bps). Para isso Grave via USB os programas.hex de
configurao do modem na pasta ConfigSanUSBwireless. Tente grav-los em seqncia e
examinar em qual programa.hex o led no pino B7 ir piscar intermitentemente. Quando o led em
B7 estiver piscando, significa que o modem est conectado corretamente ao microcontrolador e
est apto para gravao wireless.
A gravao pela sem fio inicia com o reset do microcontrolador. No caso deste sistema de
gravao, o reset realizado por software com comando enviado pelo PC coordenador. Para
resetar manualmente basta desligar e ligar rapidamente a alimentao do microcontrolador. Para
mais detalhes basta ver os vdeos disponveis em:
http://www.youtube.com/watch?v=_Pbq2eYha_c .
39
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
usb_cdc_kbhit( ) Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer de
recepo USB do PIC.
Ex.: if (usb_cdc_kbhit()) {dado = usb_cdc_getc();}
O exemplo abaixo mostra a leitura e escrita em um buffer da EEPROM interna do
microcontrolador com emulao da serial atravs da USB:
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
while (1) {
40
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
41
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Escolha a opo Instalar de uma lista ou local especifico (avanado). Aps Avanar, selecione a
opo Incluir este local na pesquisa e selecione a pasta DriverSanWinCDC, onde est o driver
CDC.
42
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
43
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
V em painel de controle -> sistema -> Hardware -> Gerenciador de dispositivos -> Portas (COM
& LPT) e confira qual a porta COM virtual instalada.
44
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
BYTE comando;
void main() {
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC
while (TRUE)
{
if (usb_cdc_kbhit( )) //avisa se chegou dados do PC
45
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
{ //verifica se tem um novo byte no buffer de recepo, depois o kbhit zerado para prximo
byte
comando=usb_cdc_getc(); //se chegou, retm o caractere e compara com L ou D em ASCII
46
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Esta aplicao substitui a gravao via USB pelo terminal do Linux, pois uma forma
mais simples e direta de gravao. Com apenas dois cliques no instalador automtico
SanUSB.deb possvel instalar este aplicativo em qualquer mquina com Linux (Ubuntu 10.04,
equivalente ou posterior). Depois de instalado, a interface de gravao localizada em
Aplicativos -> acessrios.
Se voc j tem o Java instalado (JRE ou SDK) baixe o instalador automtico.deb
atualizado disponvel no link: http://www.4shared.com/file/RN4xpF_T/sanusb_Linux.html
contido tambm na pasta geral http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html.
Se ainda no tem o Java (JRE ou SDK), baixe o instalador SanUSB, j configurado com
o Java JRE e disponvel em: http://www.4shared.com/file/3mhWZS5g/sanusb.html .
A figura abaixo mostra a interface grfica desenvolvida para gravao direta de
microcontroladores via USB:
47
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
48
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2.7 GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX
3. Aps entrar na pasta do exectvel sanusb, acesse informaes do contedo deste arquivo
digitando:
. / sanusb-h
A figura abaixo mostra o printscreen de exemplo de um processo de acesso pasta e
tambm do processo de gravao pelo terminal:
4. Com o circuito SanUSB montado, coloque-o em modo de gravao (pino 1 ligado ao Gnd com
boto pressionado ou jump ) e conecte o cabo USB do circuito no PC.
49
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
50
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
usb_cdc_kbhit( ) Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer de
recepo USB do PIC.
#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual via USB
BYTE comando;
main() {
51
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC
while (TRUE)
{
if (usb_cdc_kbhit( )) //avisa se chegou dados do PC
{ //verifica se tem um novo byte no buffer de recepo, depois o kbhit zerado para prximo
byte
comando=usb_cdc_getc(); //se chegou, retm o caractere e compara com 'L' ou 'D' em ASCII
Este firmware realiza a comunicao serial virtual com o protocolo CDC inserido no
firmware do microcontrolador atravs da biblioteca usb_san_cdc.h. Este protocolo padro no
sistema operacional Linux.
Aps gravar o firmware via USB com o executvel linux sanusb, instale o software de
comunicao serial digitando pelo terminal do linux #sudo apt-get install cutecom .
Verifique a porta serial virtual criada digitando dmesg no terminal. Abra o Cutecom, digitando
cutecom no terminal e direcione a porta virtual criada em Device do Cutecom, geralmente a porta
ttyACM0 ou ttyACM1. Mais informaes podem ser obtidas no video:
http://www.youtube.com/watch?v=cRW99T_qa7o .
52
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
53
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
BYTE comando;
#int_timer1
void trata_t1 ()
{
led = !led; // inverte o led - pisca a cada 0,5 seg.
output_bit (pin_b7,led);
set_timer1(3036 + get_timer1());
}
#int_ext
void bot_ext()
{
for(x=0;x<5;x++) // pisca 5 vezes aps o pino ser aterrado (boto pressionado)
{
output_high(pin_B5); // Pisca Led em B5
delay_ms(1000);
output_low(pin_B5);
54
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(1000);
}
}
main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
//enable_interrupts (int_ext); // Habilita interrupcao externa 0 no pino B0
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// configura o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036); // Conta 62.500us x 8 para estourar= 0,5s
while (1){
output_high(pin_B6); // Pisca Led na funo principal
delay_ms(500);
output_low(pin_B6);
delay_ms(500);
}}
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
clock_int_4MHz();
output_high(pin_b7);
55
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}
Para obter novos programas e projetos, basta acessar os arquivos do grupo SanUSB em
www.tinyurl.com/SanUSB como tambm baixar a apostila completa disponvel em
TTP://www.4shared.com/document/Qst_pem-/100923Apostila_CPIC.html .
Para este circuito simples de gravao s necessrio 3 resistores de 10k, um cabo serial
DB9 (RS-232) e uma fonte externa de 5V, que pode ser obtida da porta USB. O circuito e a foto
abaixo mostram o esquema simples de ligao dos pinos.
Este circuito a partir da porta COM DB9 pode ser visualizado na figura abaixo.
56
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
57
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
58
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
59
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Veja a nomenclatura dos canais analgicos de cada modelo, dentro da biblioteca do CCS
na pasta Device. Depois, no lao infinito, basta selecionar o canal para leitura, esperar um tempo
para a seleo fsica e ento ler o canal AD.
Para este tpico utilizado como exemplo de ajuste da resoluo do conversor AD, o sensor
de temperatura LM35 que fornece uma sada de tenso linear e proporcional com uma resoluo
de 10mV a cada C.
Para conversores AD de 8 bits e VREF de 5V, a resoluo mxima de 19,6mV (R= VREF / (2n-
1). Dessa forma, como a Resoluo do sensor 10mV/C (RS), necessrio aplicar um ajuste de
resoluo com um ganho na tenso de fundo de escala do sensor para que cada grau possa ser
percebido pelo conversor do microcontrolador. A forma mais comum de ganho a utilizao de
amplificadores operacionais no inversores. Veja mais detalhes no material de apoio no final
dessa apostila. A tenso de fundo de escala (VFS) est relacionada Temperatura Mxima
desejada de medio (TMAX), onde VFS = RS(10mV/C) * TMAX e o Ganho (G) de aproximao
da tenso de fundo de escala (VFS) tenso de referencia (VREF) dado por G = VREF / VFS, ou
seja, para uma Temperatura Mxima desejada de 100C, o ganho deve ser aproximadamente 5.
60
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Outra forma mais simples de ajuste por Hardware (aumento da resoluo do conversor
AD) a aproximao da tenso de referencia (VREF) tenso de fundo de escala (VFS) atravs da
diminuio da tenso de referncia (VREF) com o uso de um potencimetro (divisor de tenso).
Por exemplo, um conversor AD de 8 bits com uma tenso de referncia (VREF) de 2,55V no pino
A3, apresenta uma resoluo de 10mV por bit (2,55/(28-1)), ou seja, a mesma sensibilidade do
sensor LM35 de 10mV/C . Percebe variao de cada C.
Para conversores de 10 bits, com maior resoluo (4,89 mV), o ajuste (escalonamento)
realizado geralmente por software, em linguagem C, que possui um elevado desempenho em
operaes aritmticas.
OBS.: O ganho de tenso de um circuito poderia ser simulado por software com os
comandos: Int32 valorsensor= read_adc();
Int32 VFS = 4 * Valorsensor;
A frmula utilizada pelo programa no PIC para converter o valor de tenso fornecido pelo
sensor LM35 em uma temperatura :
ANALGICO DIGITAL
5V = 5000mV -> 1023
T(C)* 10mV/C -> (int32)read_adc()
onde (int32)read_adc() o valor digital obtido a partir da temperatura (T(C)) analgica medida.
Esta varivel configurada com 32 bits (int32), porque ela recebe os valores dos clculos
intermedirios e pode estourar se tiver menor nmero de bits, pois uma varivel de 16 bits s
61
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
clock_int_4MHz();
output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}
---------------------------------------------------------------------------------------------------------------------
62
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
int16 temperatura;
main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a USB do PC
while(1){
set_adc_channel(0);
delay_ms(10);
temperatura=430*read_adc()/1023; //Vref = 4,3V devido queda no diodo, ento (430*temp)
printf (usb_cdc_putc,\r\nTemperatura do LM35 = %lu C\r\n,temperatura);
63
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
3.1.7 TERMISTOR
LINEARIZAO
64
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
regio de tenso linear ser simtrica em torno da temperatura ambiente (como visto em figura
abaixo).
A memria de instrues, que uma espcie de BIOS (binary input and output system), se
localiza dentro da CPU para comparao com o cdigo hexadecimal do programa que est sendo
processado e execuo de uma ao correspondente.
65
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
A maioria dos modelos da famlia PIC apresenta memria EEPROM interna, com
dimenses de 128 ou 256 bytes. Em algumas aplicaes, a EEPROM interna muito til para
guardar parmetros de inicializao ou reter valores medidos durante uma determinada operao
de sensoreamento.
O PIC18F2550 contm 256 bytes (posies 0 a 255) de EEPROM interna, que podem ser
escritas facilmente utilizando a instruo write_eeprom(posicao, valor); e lidas com a instruo
valor2=read_eeprom (posicao);. O projeto de controlde de acesso com teclado matricial abaixo
mostra o uso desta memria.
66
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
67
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Note que o programa de controle de acesso em anexo utiliza a EEPROM interna para
possibilitar a insero de novas senhas na EEPROM, sem a necessidade de gravar novamente a
memria de programa do microcontrolador.
PONTEIROS
Ponteiros guardam endereos de memria de programa.
Exemplo para declarar um ponteiro:
68
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
/////////////////////////////////////////////////////////////////////////
///Teclado Matricial insere novas senhas pelo teclado com a senha mestre//
/////oscilador interno 4 de MHz//////////////////////////////////////////
//Se faltar energia ou existir um reset, as senhas armazenadas no so
//perdidas e possivel armazenar novas senhas aps a ltima senha gravada
// possvel apagar senhas lendo a EEPROM e zerando as posies da senha ex.:write_eeprom(
endereco, 0 );
#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial
char caract,tecla0,tecla1,tecla2,tecla3;
unsigned int16 p=100,i,j;
unsigned int mult=8,k=0,n=0;
int1 led,flag=0,flag2=0,flag3=0;
//////////////////////////////////////////////////////////////////////////////////
#int_timer1 // Interrupo do timer 1
void trata_t1 () // Conta 62.500us x 8 = 0,5s
{--mult;
if (!mult)
{mult=8; // 8 x0,5s - 4 seg
p=100; tecla0='F';tecla1='F';tecla2='F';tecla3='F'; // volta a posio de origem a cada 4 seg
}}
//////////////////////////////////////////////////////////////////////////////////
main() {
clock_int_4MHz();
port_b_pullups(true);
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
while (1)
{
// Reconhecimento de tecla por varredura
output_low(pin_b0);output_high(pin_b1);output_high(pin_b2);
if(input(pin_b3)==0) {*p='1'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
69
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
output_high(pin_b0);output_low(pin_b1);output_high(pin_b2);
if(input(pin_b3)==0) {*p='2'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
if(input(pin_b4)==0) {*p='5'; flag=1; while(input(pin_b4)==0);delay_ms(200);}
if(input(pin_b5)==0) {*p='8'; flag=1; while(input(pin_b5)==0);delay_ms(200);}
if(input(pin_b6)==0) {*p='0'; flag=1; while(input(pin_b6)==0);delay_ms(200);}
output_high(pin_b0);output_high(pin_b1);output_low(pin_b2);
if(input(pin_b3)==0) {*p='3'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
if(input(pin_b4)==0) {*p='6'; flag=1; while(input(pin_b4)==0);delay_ms(200);}
if(input(pin_b5)==0) {*p='9'; flag=1; while(input(pin_b5)==0);delay_ms(200);}
if(input(pin_b6)==0) {*p='!'; flag=1; while(input(pin_b6)==0);delay_ms(200);}
//****************************************************************************
//****************************************************************************
if (flag2==1 && flag3==1) { //Se a senha mestre j foi digitada (flag3) e a nova senha do usurio
tambm foi digitada (flag2)
write_eeprom( 4*k, tecla0 ); //Grave a nova senha
write_eeprom( (4*k)+1, tecla1 );
write_eeprom( (4*k)+2, tecla2 );
write_eeprom( (4*k)+3, tecla3 );
++k; // incremente as posies para armazenar nova senha
70
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//****************************************************************************
for(i=0; i<6; ++i) //L EEPROM
{
for(j=0; j<40; ++j) {printf(usb_cdc_putc,"%2x ", read_eeprom(i*40+j) );}//Leitura da
eeprom interna
printf(usb_cdc_putc,"\r\n");
}
}
//****************************************************************************
flag=0; flag2=0; //Zera as flags para que novas senhas possam ser digitadas
4 INTERRUPES E TEMPORIZADORES
4.1 INTERRUPES
Observe que no precisamos verificar a todo instante, se existe ou no algum na linha, pois
somente quando o ramal chamado, o telefone toca avisando que existe algum querendo falar
com voc.
Aps do atendimento das interrupes, o microcontrolador retorna exatamente ao ponto
onde parou no programa antes de atend-la. As interrupes mais comuns na famlia PIC18F so:
- pela interrupo externa 0 (Pino B0) -> enable_interrupts(int_ext);
- pela interrupo externa 1 (Pino B1) -> enable_interrupts(int_ext1);
- pela interrupo externa 2 (Pino B2) -> enable_interrupts(int_ext2);
- pelo contador/temporizador 0 -> enable_interrupts(int_timer0);
- pelo contador/temporizador 1 -> enable_interrupts(int_timer1);
- pelo contador/temporizador 2 -> enable_interrupts(int_timer2);
- pelo canal de comunicao serial -> enable_interrupts(int_rda); //serial
As interrupes do PIC so vetorizadas, ou seja, tm endereos de incio da interrupo
fixos para a rotina de tratamento. No PIC18F2550 o endereo de tratamento 0x08. No
programa em C basta escrever a funo de tratamento da interrupo aps #, e o compilador far
o direcionamento do cdico automaticamente para essa posio.
O modelo PIC18F2550 possui trs interrupes externas, habilitadas nos pinos B0 (ext) ,
B1 (ext1) e B2 (ext2), que atuam (modo default) quando os pinos so aterrados. Quandos
atuados o processamento desviado para #int_ext, #int_ext1 ou #int_ext2, respectivamente,
para que a interrupo possa ser tratada por uma funo especfica, que no caso do exemplo
void bot_ext().
Dentro da funo principal deve-se habilitar o disjuntor geral das interrupes,
enable_interrupts(global); e depois a interrupo especfica, por exemplo
enable_interrupts(int_ext); como mostra o exemplo com aplicao de interrupo externa e
tambm interruo do temporizador 1.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
BYTE comando;
#int_timer1
void trata_t1 ()
{
led = !led; // inverte o led - pisca a cada 0,5 seg.
output_bit (pin_b7,led);
set_timer1(3036 + get_timer1());
}
#int_ext
void bot_ext()
{
72
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext); // Habilita interrupcao externa 0 no pino B0
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// configura o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036); // Conta 62.500us x 8 para estourar= 0,5s
#int_timer0
void trata_t0 () //Funo de taratamento, o Timer0 configurado com o nome RTCC
73
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
{
led0 = !led0; // inverte o led a cada 4 seg pois tem prescaler igual a 64 (RTCC_DIV_64)
output_bit (pin_b7,led0);
set_timer0(3036 + get_timer0()); // get_timer() carrega o timer compensando o tempo gasto no
tratamento da interrupo
}
main(){
clock_int_4MHz();
74
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#byte port_b = 0xf81//Atribuio do nome portb para o registro da porta B localizado na posio
0xf81
int setseg[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //Vetor com 10
elementos
int flag=0;
int i=0, z, dezena, unidade; //ndice dezena,unidade (ponteiro)
//******************************************
#int_timer0
void trata_t0 () //O Timer0 configurado com o nome RTCC
{
if(i<=99) {++i;}
if(i>99) {i=0;}
set_timer0(3036 + get_timer0()); // get_timer() carrega o timer compensando o tempo gasto na
interrupo
}
//*********************************************
switch(flag)
{
case 0: {
output_high(pin_a0); //pin_a0 aciona transistor do comum das dezenas
output_low(pin_a1); //pin_a3 aciona transistor do comum das unidades
port_b = setseg[dezena]; //A porta B recebe o desenho do nmero das dezenas apontado pela
varivel dezena
flag=1; break;}
case 1: {
output_high(pin_a1); //selecionei a unidade
output_low(pin_a0);
port_b = setseg[unidade]; //A porta B recebe o desenho do nmero das unidades apontado
pela varivel unidade
75
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
flag=0; break;}
set_timer1(55536 + get_timer1());
}
main(){
clock_int_4MHz();
set_tris_b(0b00000000);// Define os pinos da porta B como sada
---------------------------------------------------------------------------------------------------------------------
Os operadores lgicos descritos abaixo adotam o padro ANSI C, ou seja, podem ser
utilizados por qualquer compilador em linguagem C direcionado microcontroladores.
76
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
OPERADOR COMANDO
&& Operao E (AND)
ll Operao OU (OR)
! Operao NO (NOT)
Exemplos:
if (segundodec==05 && (minutodec==00|| minutodec==30)) {flagwrite=1;}//Analisando um
relgio para setar a flagwrite
if (x>0 && x<20) (y=x;) // Estabelecendo faixa de valores para y.
77
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O circuito abaixo mostra as possveis entradas booleanas nos pinos B1, B2 e B3 e a sada
do circuito lgico booleano expressa de forma real atravs do LED no pino B7.
Figura 4. 2: Uso de resistores de pull down para aplicar funo lgica 0/1.
importante salientar que atravs das operaes bsicas E, OU, NO e OU-Exclusivo
possvel construir outras operaes como NAND, NOR e Coincidncia, que o inverso do OU-
Exclusivo. Isto realizado transformando a expresso booleana literal em uma expresso
booleana em C e apresentando o resultado em um LED de sada.
main(){
78
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
clock_int_4MHz();
while (TRUE)
{
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
saida = A^B; //saida igual ao resultado do OU-Exclusivo obtida pelas entradas dos pinos
AeB
output_bit(pin_b7,saida); //O pino_b7 mostra o resultado do circuito lgico booleano alocado em
saida
main(){
clock_int_4MHz();
while (TRUE)
{
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
C=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
saida = !(!A & B) & !C; //saida do circuito booleano obtida pelas entradas de b1, b2 e b3
output_bit(pin_b7,saida); //O pino_b7 mostra o resultado do circuito lgico booleano
delay_ms(500);
}
}
---------------------------------------------------------------------------------------------------------------------
Note que para emular qualquer outro circuito booleano com trs entradas, basta modificar apenas
a funo de converso em negrito (saida = !(!A & B) & !C). A tabela verdade desse circuito
booleano mostarada abaixo:
ENTRADAS SAIDA
A B C S
0 0 0 1
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 1
1 1 1 0
Exemplo 3: Elabore um programa e a tabela verdade para emular uma o circuito lgico
booleano abaixo.
main(){
clock_int_4MHz();
while (TRUE)
{
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
C=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
D=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
80
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
ENTRADAS SAIDA
A B C D S
0 0 0 0 1
0 0 0 1 1
0 0 1 0 1
0 0 1 1 0
0 1 0 0 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 0 1
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 1
A tabela verdade pode ser facilmente comprovada de forma real montando o circuito proposto.
81
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
82
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
CI - 9317
Entradas Sadas Desenh
o
/L /RBI A0 A1 A2 A3 a b c d e f g pont
T o
L X X X X X L L L L L L L H teste
H L L L L L H H H H H H H L apaga
H H L L L L L L L L L L H H 0
H X H L L L H L L H H H H H 1
H X L H L L L L H L L H L H 2
H X H H L L L L L L H H L H 3
H X L L H L H L L H H L L H 4
H X H L H L L H L L H L L H 5
H X L H H L L H L L L L L H 6
H X H H H L L L L H H H H H 7
H X L L L H L L L L L L L H 8
H X H L L H L L L L H L L H 9
83
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
void main ()
{
clock_int_4MHz();
set_tris_b(0b00000000);// Define os pinos da porta B como sada
while(1)
{
for (i=0;i<10;i++)
{
port_b = setseg[i];
delay_ms(500);
}
}
}
---------------------------------------------------------------------------------------------------------------------
Exemplo: Construa um decodificador emulado atarvs de diagramas de Karnaugh para escrever,
letra por letra, a cada segundo, a palavra StoP. importante salientar que os pinos do
microcontrolador e os pinos do display em anodo comum devem ser conectados com um resistor
de 220 a 1K para no queimar os segmentos do display. O circuito abaixo mostra a ligao do
display de 7 segmentos.
84
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Os segmentos ascendem com zero no pino do microcontrolador (anodo comum). Note que
como so somente quatro letras s necessrio duas entradas (Xe Y) para a decodificao.
Aps a definio de cada segmento do display para representar os caracteres da palavra, feita a
simplicao de cada segmento atravs dos diagramas de Karnaugh abaixo para a construo da
funo de emulao do decodificador fixo.
a /Y Y b /Y Y c /Y Y d /Y Y
/X 0 1 /X 1 1 /X 0 1 /X 0 0
X 1 0 X 1 0 X 0 1 X 0 1
e /Y Y f /Y Y g /Y Y
/X 1 0 /X 0 0 /X 0 0
X 0 0 X 1 0 X 0 0
O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra StoP
obtidas dos diagramas de Karnaugh.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> // Emulao de decodificador para display de 7 segmentos - palavra StoP
short int X, Y; //Entradas
short int a, b, c, d, e, f, g; //sadas
void decodificador(short int X, short int Y) //Funo auxiliar do decodificador fixo para StoP
{
a=X ^ Y; output_bit(pin_b0,a); //Anodo comum
b=!X | !Y; output_bit(pin_b1,b);
c=Y; output_bit(pin_b2,c);
d=X & Y; output_bit(pin_b3,d);
e=!X & !Y; output_bit(pin_b4,e);
f=X & !Y; output_bit(pin_b5,f);
g=0 ; output_bit(pin_b6,g);
}
main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo Sada letra S
delay_ms(1000);
85
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Aps a definio de cada segmento do display para representar os caracteres da palavra, feita a
simplicao de cada segmento atravs dos diagramas de Karnaugh abaixo para a construo da
funo de emulao do decodificador fixo.
a /Y Y b /Y Y c /Y Y d /Y Y
/X 1 0 /X 0 1 /X 0 0 /X 0 0
X 1 0 X 1 0 X 0 1 X 0 0
e /Y Y f /Y Y g /Y Y
/X 0 1 /X 0 0 /X 1 0
X 0 0 X 0 1 X 0 0
O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra USb2
obtidas dos diagramas de Karnaugh.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> // Emulao de decodificador para display de 7 segmentos - palavra Usb2
short int X, Y; //Entradas
short int a, b, c, d, e, f, g; //sadas
void decodificador(short int X, short int Y) //Funo auxiliar do decodificador fixo para USb2
{
a=!Y; output_bit(pin_b0,a); //Anodo comum
86
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
b=X^Y; output_bit(pin_b1,b);
c=X&Y; output_bit(pin_b2,c);
d=0; output_bit(pin_b3,d);
e=!X&Y; output_bit(pin_b4,e);
f=X&Y; output_bit(pin_b5,f);
g=!X&!Y; output_bit(pin_b6,g);
}
main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo Sada letra S
delay_ms(1000);
87
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
void main ()
{
clock_int_4MHz();
set_tris_b(0b00000000);// Define os pinos da porta B como sada
while(1)
{
for (i=0;i<99;i++)
{
for(z=0;z<20;z++){
88
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
A comunicao serial teve incio com a inveno do telgrafo. Depois teve um grande
desenvolvimento com a inveno do Teletype (teletipo) pelo Francs Jean Maurice mile
Baudot, em 1871, da o nome Baud Rate. Baudot, alm de criar toda a mecnica e eltrica do
Teletype, criou tambm uma tabela de cdigos (Cdigo de Baudot) com letras, nmeros, e
smbolos para a transferncia serial assncrona digital de informaes. Da surgiu o Padro de
comunicao RS-232, que significa Padro Recomendado verso 232.
Na transmisso dos caracteres atravs da linha telegrfica, o sinal de Marca era representado
pela presena de corrente eltrica, e o Espao pela ausncia desta corrente. Para que o Teletype
conseguisse distinguir o incio e o final de um caractere, o mesmo era precedido com um sinal
Espao (start bit) e finalizado com um sinal de Marca (stop bit). Entenda que o estado da linha
ociosa (sem transmisso de dados) era o sinal de Marca (presena de corrente eltrica). Foi
baseado nesse sistema que o padro de transmisso RS-232 evoluiu e se tornou um padro muito
utilizado nos computadores e equipamentos digitais.
Algumas interfaces EIA/RS-232 nos computadores atuais fornecem aproximadamente -
10v e +10v, mas suportam mnimas de -25v e mximas de +25v.
A Comunicao serial feita pela transmisso de bits em seqncia. um modo de comunicao
muito recomendado para transmisso de dados a longa distncia. Nesse caso, a comunicao
serial apresenta um menor custo pelo nmero reduzido de fios e conseqentemente menor
velocidade em relao comunicao paralela.
Para a transmisso de dados por distncias maiores e com pouca interferncia pode-se
utilizar uma interface com outros padres como o EIA/RS-232 e o EIA/RS-485. A comunicao
serial pode ser sncrona ou assncrona. Na primeira, alm dos bits de dados so enviados tambm
bits de sincronismo, ou seja, o receptor fica em constante sincronismo com o Transmissor. Na
comunicao assncrona, que o modo mais utilizado de comunicao entre sistemas de controle
e automao por no necessitar de sincronismo, existe um bit que indica o incio da transmisso,
chamado de start bit (nvel lgico baixo) e um bit que indica o final da transmisso chamado de
89
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
stop bit (nvel lgico alto). Nessa transmisso, o Receptor em sincronismo com o Transmissor
apenas no incio da transmisso de dados. Deve-se considerar que o transmissor e o receptor
devem estar na mesma velocidade de transmisso.
Quando o canal serial est em repouso, o sinal correspondente no canal tem um nvel
lgico 1. Um pacote de dados sempre comea com um nvel lgico 0 (start bit) para sinalizar
ao receptor que um transmisso foi iniciada. O start bit inicializa um temporizador interno no
receptor avisando que a transmisso. Seguido do start bit, 8 bits de dados de mensagem so
enviados com a velocidade de transmisso pr-programada no emissor e no receptor. O pacote
concludo com os bits de paridade e de parada (stop bit).
O bit de paridade usado como nono bit com o propsito de deteco de erro. Nessa
conveno, quando o nmero total de dgitos 1 , o valor do bit de paridade 1 e quando for
mpar 0.
90
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Se o nmero de 1s for par, o bit de paridade X7 zero e, se for mpar, X7 um. A Tabela de
Caracteres ASCII mostrada abaixo:
91
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
92
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
mximas de +25v. Assim Como o MAX232 existem outros conversores, tipo ICL3232, etc. O
esquema de ligao do MAX232 mostrado a seguir:
Este circuito utiliza o pino 8 (Clear To Send igual a 10V) para fornecer tenso negativa
para o pino 2 (Rx) quando o bit de recepo tiver nivel lgico alto. Ele vlido para pequenos
cabos e velocidade de transmisso relativamente baixas, utiliza basicamente dois transistores,
BC337 (NPN) e outro BC557 (PNP), 2 resistores de 4,7K, um de 2,2K e um de 10K para a
converso TTL/RS232, como mostra a figura abaixo. Note que, o nvel lgico alto 1 em RS232
varia de 3 a 25V, e o nvel lgico baixo 0 varia de +3 a +25V.
93
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Este protocolo muito utilizado ema rede mestre/escravo que adota o princpio de difuso
da informao (Broadcast), onde todos recebem, em interrupo serial, um pacote (conjunto de
bytes) de informaes, mas s responde quem tem o endereo do pacote. Tem-se assim uma
forma de evitar colises de dados na rede, visto que apenas o mestre ou o escravo escolhido est
transmitindo.
94
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
recomendado cabos par tranado ou triaxial com 1 ou dois pares de fios 24 AWG com
impedncia caracterstica de 120 W. Os cabos utilizados em ambientes industriais adiciona ao par
tranado a blindagem dupla com folha de alumnio (proteo capacitiva) e malha de cobre
(proteo magntica) com conector dreno. Um erro comum nas montagens de rede RS-485 a
troca da ligao entre os terminais A e B de dispositivos distintos.
95
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
96
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#INT_RDA
void recepcao_serial()// Interrupicao serial
{
97
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
char escravo,estado;
escravo=getc(); //comando o Byte recebido pela serial
if (escravo=='A')
{
estado=getc();
switch (estado)
{
case '0': {output_high(pin_B6);}
break;
case '1': {output_low(pin_B6);}
break;
}
} }
main()
{
Clock_int_4MHz();
enable_interrupts(GLOBAL); // Possibilita todas interrupcoes
enable_interrupts(INT_RDA); // Habilita interrupcao da serial
output_low(PIN_b6);
//#############################################################################
#
output_low(PIN_A4); // Max485 inicia em modo de recepo
//#############################################################################
while(1)
{
//#############################################################################
output_high(PIN_A4); //Habilita Max485 em modo de Transmisso
printf ("A0\r\n"); //Transmite dado
output_low(PIN_A4); //Habilita Max485 em Modo de Recepo
//#############################################################################
output_high(pin_B7);
delay_ms (1000);
//#############################################################################
output_high(PIN_A4); //Habilita Max485 em modo de Transmisso
printf ("A1\r\n"); //Transmite dado
output_low(PIN_A4); //Habilita Max485 em Modo de Recepo
//#############################################################################
output_low(pin_B7);// Apaga
delay_ms (1000);
}} }}
---------------------------------------------------------------------------------------------------------------------
98
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
99
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
100
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
J que o motor imprime uma fora constante, a variao do torque entre engrenagens
ocorre devido ao raio de giro. Na prtica em um sistema de engrenagens, comprovada pelas
equaes abaixo, quanto maior o dimetro da engrenagem movida (D2), maior o torque (T2)
proporcional e menor a velocidade de rotao (n2). Considerando a engrenagem 1 com motora e a
engrenagem 2 como movida, tem-se:
101
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
i = Nc . Zc =Np. Zp
Nc=Np. Zp /Zc
onde:
Nc = nmero de rotaes da coroa (rpm)
Zc = nmero de dentes da coroa
Np = nmero de rotaes do parafuso com rosca sem-fim (rpm)
Zp= nmero de entradas do parafuso
102
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
103
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Neste caso interessante definir que no princpio seguidor de parede o rob considera o
obstculo como referncia a qual ele vai seguir em movimento de avano normal. Nesse exemplo
104
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
ele cola do lado esquerdo, ou seja, o motor direito deve ser mais rpido que o motor esquerdo,
quando os dois estiverem acionados.
Seguindo as paredes do labirinto at final encontram-se quatro situaes:
Para garantir estabilidade do controle de movimento, ou seja, garantir que o rob est
seguindo corretamente a referncia (o obstculo), o sensor tico lateral (L), com sinal analgico,
deve ser lido frequentemente e estar com valores que garantam a presena do obstculo.
Caso seja acusada a ausncia de obstculo, o microcontrolador deve parar o motor
esquerdo e acionar o motor direito, um determinado tempo, suficiente para garantir as situaes 3
e 4. Note que o tempo de 4 maior que o de 3, mas com o tempo de 4 na situao 3, o rob vai
ser seguro pelo obstculo at acabar o tempo de desvio e seguir em frente at encontrar obstculo
frontal ou lateral.
Caso o sensor frontal verifique obstculo, mostrado na situao 2, o microcontrolador
para o motor direito, aciona o motor esquerdo e segue em frente at encontrar obstculo lateral, o
que garante a estabilidade do movimento. Note que se o desvio para a direita for pouco, o guia
oval frontal do rob conduzir o rob estabilidade ao tocar no obstculo com o avano frontal.
O circuito mostrado abaixo:
105
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Programa:
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro
main() {
clock_int_4MHz();
while(1){
output_high(esquerdo);output_high(direito); //Os dois motores em frente
//*****************************************************************************
set_adc_channel(1);
delay_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
if (tensaolateral<=4790) { flagnaosensor=0; flagfrente=0; flaggiro=0; } // Estabilizou, Habilita o
giro e a virada de //frente para a direita
//*****************************************************************************
106
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
107
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
A finalidade deste controle de velocidade com a modulao de tenso por largura de pulsos
(PWM) realizar uma converso digital-analgica que acontece devido impedncia inerente do
circuito em alta frequncia.
108
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O programa abaixo mostra o controle de velocidade de um motro CC por PWM com perodo
constante de 20ms, onde cada incremento ou decremento da onda quadrada corresponde a 1ms,
ou seja, ou seja, um acrscimo ou decrscimo de 5% no ciclo de trabalho.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
main() {
clock_int_4MHz();
109
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
port_b_pullups(true);
incton=2; inctoff=18; //Perodo de 20ms - Passo mnimo de tempo = 1ms (5% (1/20) do duty
cicle )
guardaton=read_eeprom(10);guardatoff=read_eeprom(11);
if (guardaton>0 && guardaton<=20) {incton=guardaton; inctoff=guardatoff;}
while (1) {
ton=incton; toff=inctoff;
if (!input(pin_b1)) {flag1=1;}
if (incton<20 && flag1==1 && input(pin_b1) ) {flag1=0;++incton;--inctoff;output_high(led);//se
no chegou no mximo (incton<50),
write_eeprom(10,incton);write_eeprom(11,inctoff); //se o boto foi pressionado (flag1==1) e se
o boto j foi solto (input(pin_b1)) incremente
}// a onda quadrada e guarde os valores na eeprom
if (!input(pin_b2)) {flag2=1;}
if (inctoff<20 && flag2==1 && input(pin_b2) ) {flag2=0;++inctoff;--incton;output_low(led);
write_eeprom(10,incton);write_eeprom(11,inctoff);
}
output_high(motor);
while(ton) {--ton;delay_ms(1); } //Parte alta da onda quadrada
output_low(motor);
while(toff) {--toff;delay_ms(1); } //Parte baixa da onda quadrada
}}
---------------------------------------------------------------------------------------------------------------------
A figura abaixo mostra o circuito montado para com este exemplo. Veja o funcionamento desse
circuito no vdeo http://video.google.com/videoplay?docid=-842251948528771304&hl=en# .
110
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
8.4 PONTE H
O exemplo abaixo mostra o controle de velocidade de um motor CC por PWM nos dois
sentidos com uma ponte H, o incmento da onda quadrada de tenso feito no pino B2 e o
decremento no pino B3. O sentido de rotao invertido com um boto no pino B5. Na prtica
no lugar dos transitores utilizado o driver ULN2803 que contm internamente oito transistores
com diodos de roda livre. A figuras abaixo mostra a foto do circuito de simulao deste exemplo
que pode ser visto em http://www.youtube.com/watch?v=cFTYHBTEBh8 .
111
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
unsigned int16 i;
unsigned int ton,toff,incton,inctoff,guardaton,guardatoff;
int1 flag1, flag2, flag3;
main() {
OSCCON=0B01100110;
port_b_pullups(true);
112
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
incton=2; inctoff=18; //Perodo de 20ms - Passo mnimo de tempo = 1ms (5% (1/20) do duty
cicle )
guardaton=read_eeprom(10);guardatoff=read_eeprom(11);
if (guardaton>0 && guardaton<=20) {incton=guardaton; inctoff=guardatoff;}
if (!input(pin_b1)) {flag1=1;}
if (incton<20 && flag1==1 && input(pin_b1) ) {flag1=0;++incton;--inctoff;output_high(led);//se
no chegou no mximo (incton<50),
write_eeprom(10,incton);write_eeprom(11,inctoff); //se o boto foi pressionado (flag1==1) e se
o boto j foi solto (input(pin_b1)) incremente
}// a onda quadrada e guarde os valores na eeprom
if (!input(pin_b2)) {flag2=1;}
if (inctoff<20 && flag2==1 && input(pin_b2) ) {flag2=0;++inctoff;--incton;output_low(led);
write_eeprom(10,incton);write_eeprom(11,inctoff);
}
if (!input(pin_b5)) { // Bateu recuou
for(i=0; i<400; ++i) //Volta 400 perodos de 20ms
{ ton=incton; toff=inctoff;
output_high(esquerdavcc);output_low(direitagnd);
output_low(direitavcc);output_high(esquerdagnd);
while(ton) {--ton;delay_ms(1); } //Parte alta da onda quadrada
output_high(direitavcc);output_low(esquerdagnd);
while(toff) {--toff;delay_ms(1); }
}}
output_high(esquerdavcc);output_low(direitagnd);
while(toff) {--toff;delay_ms(1); } //Parte baixa da onda quadrada
}}
---------------------------------------------------------------------------------------------------------------------
Uma das solues mais simples e barata em atuao de robs mvis consiste utilizar um
integrado motor driver como o L293D. Este integrado possibilita o controle de dois motores CC,
utilizando quatro pinos de sada do microcontrolador.
113
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O circuito integrado L293D deve ter duas alimentaes. Uma para comando (5V) no pino
16 e outra para potncia (por exemplo 9,6 V ou 5V) no pino 8. Os motores percebem uma queda
de 0,7V em relao tenso da fonte externa.
A mudana dos sinais nos pinos de entrada tem o efeito de produzir a alterao do sentido
da corrente no enrolamento do motor, logo do seu sentido de rotao. A Tabela permite
programar o movimento em qualquer direo (conjugando 2 motores).
Se a primeira entrada alta, segunda entrada baixa , ento o motor se desloca para frente, se
a primeira entrada baixa e a segunda entrada alta , o motor se movimenta para trs. Se ambas as
entradas baixas ou altas, o motor pra.
114
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Uma solenide consiste num mbolo de ferro colocado no interior de uma bobina
(indutncia) eltrica, enrolada em torno de um tubo. Quando se alimenta eletricamente a bobina,
cria-se um campo magntico que atrai o mbolo (ncleo mvel) para dentro da bobina como
mostrado na figura abaixo. No caso de um rel, fecha um contato para circulao de outro nivel
maior de corrente.
115
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
figura abaixo. A bobina do rel acionada por uma tenso contnua que especificada de acordo
com o fabricante, bobinas de 5, 12 e 24 Volts so as mais comuns.
116
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Como foi visto, acionamento da ponte H permite o movimento do motor nos dois sentidos.
A ponte H pode ser feita tambm com apenas dois microrels. Neste caso, pode-se utilizar
tambm o driver ULN2803 para a energizao das bobinas, pois j contm internamente oito
transistores com resistores de base e oito diodos de roda livre. Esse tipo de ponte H, mostrada na
figura abaixo, no causa queda de tenso na fonte de alimentao do motor, porque as fontes de
energizao da bobina do microrel e de alimentao do motor devem ser diferentes, ou seja,
isoladas uma da outra, para que seja possvel o chaveamento do rel.
117
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
118
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
bobinas, uma vez que cada bobina se encontra dividida em duas pela derivao ao centro das
bobinas (comum).
Normalmente, a derivao central das bobinas est ligada ao terminal positivo da fonte de
alimentao (Vcc) e os terminais de cada bobina so ligados alternadamente terra atravs de
chaveamento eletrnico produzindo movimento.
As bobinas se localizam no estator e o rotor um im permanente com 6 plos ao longo
da circunferncia. Para que haja uma maior resoluo angular, o rotor dever conter mais plos.
119
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
N do
1a 2a 1b 2b Decimal
passo
1--> 1 0 0 0 8
2--> 0 1 0 0 4
3--> 0 0 1 0 2
4--> 0 0 0 1 1
N do
1a 2a 1b 2b Decimal
passo
1--> 1 1 0 0 8
2--> 0 1 1 0 4
3--> 0 0 1 1 2
4--> 1 0 0 1 1
Figura 8. 26: Caractersticas e Lgica de acionamento de motor de passo.
120
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
8.7 SERVO-MOTORES
H dois tipos de servos: os de posio, com giro de 180, e o de rotao, que possui o giro
contnuo. O Servo de Posio utilizado em antenas parablicas, em braos robticos, na
robtica mvel terrestre com o controle de pernas mecnicas e no controle de cmeras. O Servo
de Rotao prioritariamente escolhido para a locomoo por rodas.
Trata-se de dispositivos muito precisos que giram sempre o mesmo ngulo para um dado
sinal. Um servo tpico possui trs fios de ligao, normalmente preto, vermelho e branco (ou
amarelo). O condutor preto a referncia de massa da alimentao (0 volts), o condutor vermelho
a alimentao e o condutor branco (ou amarelo) o sinal de posicionamento, como mostrado
na figura abaixo que um carro para desvio de obstculos, acionado por dois servo-motores de
rotao. O sinal do servo-motor de posio normalmente um pulso de 1 a 2 milisegundos (ms),
repetido depois de um pulso de 10 a 20ms. Com o pulso de aproximadamente 1 ms o servo move-
se para um sentido e com o impulso de 2 ms para o sentido oposto. Desse modo, com um impulso
de 1,5 ms, o servo roda para a posio central.
121
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
int16 frente=50;
short int led;
main(){
clock_int_4MHz();
while (TRUE)
{
while (frente>0)
{ output_high(motor2); //Inicializa o pulso do motor 1
output_high(motor1); //Inicializa o pulso do motor 2
delay_ms(1);
output_low(motor1); //Termina o pulso de 1ms do motor1 sentido horrio
delay_ms(1);
output_low(motor1);
output_low(motor2); //Termina o pulso de 2ms do motor2 sentido anti-horrio
122
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(10);
--frente;
}
frente=50;
led=!led; //pica led a cada 50 ciclos do servo-motor, ou seja a cada 12ms*50 = 600ms
output_bit(pin_b7,led);
}}
---------------------------------------------------------------------------------------------------------------------
int16 FRENTE=200, TRAS=200; //no servo de teste 200 passos corresponderam a aprox. 1 volta
void main()
{
clock_int_4MHz();
while (1)
{
while (FRENTE>0)
{
FRENTE--;
output_high(pin_b0);
delay_ms(1); // tempo de busca de 0 graus
output_low(pin_b0);
delay_ms(10);
}
123
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
FRENTE=200;
while (TRAS>0)
{
TRAS--;
output_high(pin_b0);
delay_ms(2); // tempo de busca de 180 graus
output_low(pin_b0);
delay_ms(10);
}
TRAS=200;
output_toggle(pin_b7);
}
}
---------------------------------------------------------------------------------------------------------------------
125
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Para ter um maior alcance e perceber uma maior variao de posio, com esse sensor,
aconselhvel utilizar o conversor AD de 10 bits do microcontrolador para identificar variaes de
at 5mV no sinal do sensor. A distncia tima a distncia em que incide no receptor a maior
parte do feixe de luz emitido pelo transmissor. Nessa distncia ocorre a maior variao (queda)
do sinal de sada analgico do receptor IR.
Utilizando o princpio on/off, s h identificao de posio quando o sinal do receptor for
menor ou igual a 2,5V (nvel lgico baixo), o que torna o sensoreamento muito limitado.
Durante os testes desse circuito foi verificado que, devido a resistncia de 390 em
paralelo com 2K2, quando o led conectado no circuito, h uma diminuio na variao do sinal
de sada analgico do receptor IR. O prgrama abaixo mostra a leitura em mV do sensor tico via
emulao serial.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
clock_int_4MHz();
output_toggle(pin_b7);
delay_ms(500);
}}
---------------------------------------------------------------------------------------------------------------------
126
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
127
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#int_ext
void bot_ext()
{
rele=!rele;
output_bit(pin_b5,rele);
delay_ms(1000); //Tempo para deixar o receptor cego por 1 seg aps a 1 atuao da interrupo
}
main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext);//Habilita int. ext. 0 no pino B0 onde est o receptor infravermelho
while (TRUE)
{
output_toggle(pin_B7);
128
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(500);
}}
---------------------------------------------------------------------------------------------------------------------
Para filtrar as interferncias dinmicas necessrio colocar o receptor em uma caixa preta
com um pequeno orifcio ou em um tubo feito de caneta com cola quente, como mostra a figura
abaixo, para receber somente a luz IR direcional.
RC5 uma norma universal desenvolvida pela Phillips para comandos a distncia por
infravermelho utilizada principalmente em equipamentos de udio, televisores, videocassetes e
outros aparelhos domsticos, com uma rea de alcance de aproximadamente 10m.
A norma RC5 usa modulao bifsica, ou seja, cdigo Manchester. Cada bit separado
por dois semi-ciclos; a metade esquerda e direita tm nveis opostos. Se o bit a ser transmitido for
zero (0), o seu lado esquerdo (primeiro semi-ciclo) um e o seu lado direito zero (segundo
semi-ciclo). Se o bit a ser transmitido for um (1), o seu lado esquerdo zero quando o seu lado
direito um.
129
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
- 1 bit para controle (toggle bit ou flip) que muda de estado lgico cada vez que um boto
pressionado na unidade de comando a distncia. Isto serve para indicar se o boto foi pressionado
uma vez ou se continua sendo pressionado;
- 5 bits de endereo do sistema para seleo de 1 dos 32 sistemas possveis listados na tabela 7.
Isso define o tipo de aparelho que se pretende controlar;
- 6 bits de comando representando 1 dos 128 comandos possveis. Isso define a ao que se
pretende executar em um determinado aparelho (sistema) selecionado.
Na figura abaixo vemos os bits de 1 a 14 e sua identificao: em azul claro os start bits 1 e
2 de equalizao; o bit 3, FLIP, em amarelo; bits de 4 a 8 em azul indicando o endereamento; e
os bits de 9 a 14, indicando o comando a executar.
void identifica_bit(void)
{
bit_rx=0;
if (input(pin_b0)==1) {bit_rx=1;} //identifica 0 ou 1
delay_us(860); // //pula para o prximo perodo para outra leitura
}
#int_ext
void san_ext()
{
output_toggle(pin_b6);
sistema=0;
comando=0;
130
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//*************************************************
delay_us(750); //Tempo do start bit 1 com a perda do tempo do primeiro semi-ciclo alto pela
interrupo
delay_us(1720); //Tempo do start bit 2
delay_us(1720); //Tempo do toogle bit
//*************************************************
main() {
clock_int_4MHz();
while(1)
{
if (usb_cdc_kbhit(1)) //avisa se chegou dados do PC
{
chegoupc=usb_cdc_getc(); //se chegou, retm o caractere e compara com 'L' ou 'D'
if (chegoupc=='L') {output_toggle(pin_b6); printf(usb_cdc_putc, "\r\nTesta led!\r\n");}
}
++i; if (i>=10000) {i=0; output_toggle(pin_b7);} //Led de visualizao
}}
---------------------------------------------------------------------------------------------------------------------
132
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Os Triacs opto-isolados, geralmente utilizados em cargas CA, podem conduzir nos dois
semi-ciclos de uma onda senoidal. Dessa forma, so utilizados tanto como rels de estado slido
sem controle de fase da tenso, como tambm no controle de tenso para uma carga CA atravs
de pulsos no gatilho do triac em perodos determinados aps a passagem pelo zero realizando o
controle de fase da tenso, que promovem a conduo de tenso para a carga at a nova passagem
pelo zero.
Os rels de estado slido (Solid State Relay), que no apresentam comutao
eletromecnica, por isso o nome, consistem na alternativa moderna ideal para uso em lugar dos
rels eletromecnicos com seus contatos ruidosos e seus problemas mecnicos. Na verdade, a
tendncia uma substituio gradativa dos rels eletromecnicos pelos de estado slido a base de
tiristores como os triacs.
133
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
134
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Figura 9. 12: Zero-crossing: forma de ondas obtidas pelos dois mtodos de sensoriamento
da rede.
Nota-se que a forma de onda pelo cruzamento do zero com sensoriamento por opto-
acoplador no exata, sendo adequada para uso por exemplo, com sistemas de controle de
iluminao. Neste caso, pode ser que os tempos t1 e t2, obtidos nos semi-ciclos simtricos
negativo e positivo, respectivamente, so diferentes. Um exemplo de placa de circuito impressa
com o respectivo circuito mostrada na fgura abaixo.
135
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
136
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Figura 9. 15
O Programa abaixo identifica a passagem pelo zero de tenso e determina a partir da,
com dois botes, o ngulo de fase (atraso de chaveamento) entre 300 valores de uma tabela, em
que cada atraso corresponde a variao de 0,3% da potncia concedida para a carga.
---------------------------------------------------------------------------------------------------------------------
#include <SanUSB.h> //Mais detalhes em http://www.youtube.com/watch?v=7O9a0E_WXPA
int16 pointer=0;
int16 CONST table[300] =
{ 500, 482, 474, 468, 463, 459, 455, 451, 448, 445,
442, 439, 436, 433, 431, 428, 426, 423, 421, 419,
417, 415, 413, 411, 409, 407, 405, 403, 401, 399,
398, 396, 394, 392, 391, 389, 387, 386, 384, 383,
381, 379, 378, 376, 375, 373, 372, 370, 369, 368,
366, 365, 363, 362, 361, 359, 358, 356, 355, 354,
352, 351, 350, 348, 347, 346, 345, 343, 342, 341,
340, 338, 337, 336, 335, 333, 332, 331, 330, 328,
327, 326, 325, 324, 323, 321, 320, 319, 318, 317,
315, 314, 313, 312, 311, 310, 309, 307, 306, 305,
304, 303, 302, 301, 300, 298, 297, 296, 295, 294,
293, 292, 291, 290, 289, 287, 286, 285, 284, 283,
282, 281, 280, 279, 278, 277, 276, 275, 273, 272,
271, 270, 269, 268, 267, 266, 265, 264, 263, 262,
261, 260, 258, 257, 256, 255, 254, 253, 252, 251,
250, 249, 248, 247, 246, 245, 244, 243, 242, 240,
239, 238, 237, 236, 235, 234, 233, 232, 231, 230,
229, 228, 227, 225, 224, 223, 222, 221, 220, 219,
218, 217, 216, 215, 214, 213, 211, 210, 209, 208,
207, 206, 205, 204, 203, 202, 200, 199, 198, 197,
196, 195, 194, 193, 191, 190, 189, 188, 187, 186,
137
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
185, 183, 182, 181, 180, 179, 177, 176, 175, 174,
173, 172, 170, 169, 168, 167, 165, 164, 163, 162,
160, 159, 158, 157, 155, 154, 153, 152, 150, 149,
148, 146, 145, 144, 142, 141, 139, 138, 137, 135,
134, 132, 131, 130, 128, 127, 125, 124, 122, 121,
119, 117, 116, 114, 113, 111, 109, 108, 106, 104,
102, 101, 99, 97, 95, 93, 91, 89, 87, 85,
83, 81, 79, 77, 74, 72, 69, 67, 64, 61,
58, 55, 52, 49, 45, 41, 37, 32, 26, 18
};//*/
int16 i, phase_count=0;
signed int j=0, disparo=0;
#int_TIMER2
void function_t0 ()
{
// set_timer2(239); //es zhlt 20 us bis interrupt, d.h. 50kHz
++phase_count;
if(table[pointer]==phase_count){
output_high(PIN_B6); //triac an
}
}
#INT_EXT
void Crossing0()
{
output_low(PIN_B6); //triac aus
phase_count=0;
void main(void)
{
clock_int_4MHz(); //Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
enable_interrupts (global);
138
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
enable_interrupts (int_timer2);
//enable_interrupts (int_timer1);
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
//setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1);// inicia o timer 1 em 8 x 62500 = 0,5s
setup_timer_2(T2_DIV_BY_1,239,1);
while(1)
{
++i; if (i>=20000) {i=0; restart_wdt(); // must clear WDT flag in 16 sec.
output_toggle(pin_b7);} //Led
if(!input(button))
{ delay_ms(30); //while(!input(button)) delay_ms(50); //filter
pointer++; //
if(pointer>=299) {pointer=299;} //o boto no pino E3 regula o ngulo de disparo
write_eeprom(10, pointer);
}
if(!input(button1))
{ delay_ms(30); //while(!input(button1)) delay_ms(50);
pointer--;
if(pointer<=1) {pointer=0;}
write_eeprom(10, pointer);
}
}
}
---------------------------------------------------------------------------------------------------------------------
139
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
void identifica_bit(void)
{
bit_rx=0;
if (input(pin_b0)==1) {bit_rx=1;} //identifica 0 ou 1
delay_us(860); // //pula para o prximo perodo para outra leitura
}
#int_ext
void san_ext()
{
disable_interrupts(INT_EXT1);
sistema=0;
comando=0;
//*************************************************
delay_us(700); //Diminuir de 750 pelo break etc. Tempo do start bit 1 com a perda do tempo do
primeiro semi-ciclo alto pela interrupo
140
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//*************************************************
enable_interrupts(INT_EXT1);
}
#INT_EXT1
void CruzaPor0()
{
if (!input(pin_b0)) break;
delay_us(500); //devido a deteco de interrup. j com 2,5V como zero,
//o inicio para o disparo se encontra ainda no semi-ciclo anterior, por isso,
//o delay de inicial para entrar no prximo semi-ciclo
delay_ms(disparo); //Para 60 Hz cada semi-ciclo aprox. 4,33ms e o ciclo 8,66ms
else {
j=0;
ext_int_edge(L_TO_H); // Muda a interrupo da borda de descida para subida da senide
}
}
void main()
{
clock_int_4MHz(); //Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
ext_int_edge(L_TO_H);
while(true)
{
142
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
if(!input(botao1))
{ delay_ms(100); while(!input(botao1)) delay_ms(100);
disparo--;
if(disparo<=0) {disparo=0;}
write_eeprom(10, disparo);
enable_interrupts(INT_EXT1);
}
}
}
---------------------------------------------------------------------------------------------------------------------
Alguns modelos comerciais de triac so o BT e o TIC. Com eles possvel construir
dimmers (controladores de luminosidade de lmpadas) e tambm controladores de velocidade de
motores CA como ventiladores.
Este princpio de controle possibilita tambm economia de energia, pois, enquanto ele
no recebe o disparo, no h conduo de corrente para a carga. Outra caracterstica importante
a causa pela qual passou a substituir o reostato original, que acompanha os motores das mquinas
de costura. Como o controle de velocidade feito pela parcela do semiciclo aplicado e no pela
tenso, o torque se mantm mesmo em baixas velocidades.
A outra srie de MOC3041, j projetada com circuito interno fixo para deteco de
passagem por zero, assim o chaveamento automtico e no possvel nenhum controle do
ngulo de disparo.
O LCD, ou seja, display de cristal lquido, um dos perifricos mais utilizados como
dispositivo de sada em sistemas eletrnicos. Ele contm um microprocessador de controle, uma
RAM interna que mantm escritos no display (DDRAM) os dados enviados pelo
microcontrolador e uma RAM de construo de caracteres especiais (CGRAM). Os LCDs so
encontrados nas configuraes previstas na Tabela abaixo.
143
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
16 2 14/16
16 4 14/16
20 1 14/16
20 2 14/16
20 4 14/16
24 2 14/16
24 4 14/16
40 2 16
40 4 16
144
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Desliga 0 0 0C
Desloca para Esquerda 0 0 10
Desloca para Direita 0 0 14
Cursor Home 0 0 02
Cursor Piscante 0 0 0D
Cursor com Alternncia 0 0 0F
Sentido de deslocamento Para a esquerda 0 0 04
cursor ao entrar com caractere Para a direita 0 0 06
Deslocamento da mensagem Para a esquerda 0 0 07
ao entrar com caractere Para a direita 0 0 05
Deslocamento da mensagem Para a esquerda 0 0 18
sem entrada de caractere Para a direita 0 0 1C
End. da primeira posio primeira linha 0 0 80
segunda linha 0 0 C0
int16 temperatura;
int8 x;
int1 led;
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
while (1) {
set_adc_channel(0);
delay_ms(10);
145
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
temperatura=500*read_adc()/1023;
led=!led; output_bit(pin_b7,led);
delay_ms(500);
} }}
---------------------------------------------------------------------------------------------------------------------
Para ativar o cursor, utilize o comando lcd_envia_byte(0,0x0E). Para ativar o cursor
piscante, utilize o comando lcd_envia_byte(0,0x0F), e para desativar o cursor, use
lcd_envia_byte(0,0x0C);
Posicionando o cursor:
Desta forma, caso deseje escrever algo na primeira linha do display, sem apagar a segunda
linha, basta inserir o comando lcd_pos_xy(1,1). Isso ir posicionar o cursor na primeira linha, e
primeira coluna. No entanto, tome cuidado, pois uma vez que o display no foi apagado, as
informaes antigas permanecero na primeira linha, a menos que voc as sobrescreva.
STRING : o trecho de caracteres delimitado por aspas duplas, que ir definir como ser a
seqncia de caracteres a ser gerada. Dentro das aspas, podem ser inseridos caracteres de texto,
caracteres especiais e especificadores de formato.
No caso dos caracteres especiais, por no possurem uma representao impressa, so
compostos por uma barra invertida seguida de um smbolo, geralmente uma letra.
Exemplo de caracteres especiais : \f (limpar display), \n (nova linha), \b (voltar um
caractere), \r (retorno de carro), \g (beep), etc...
Obs: alguns caracteres especiais somente resultaro efeito em terminais seriais.
J os especificadores de formato so os locais, em meio ao texto, onde sero inseridas as
variveis que aparecero aps a STRING. Desta forma, estes especificadores devem obedecer
algumas regras, de acordo com o tipo da varivel a ser impressa.
147
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
output_low(rele);
output_low(ledrele);
148
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (1) {
//********************************BOTES*************************************
if (!input(botaoinc)) {flag1=1;}
if (flag1==1 && input(botaoinc) ) {flag1=0;++vref; //se o boto foi pressionado (flag1==1) e se
o boto j foi solto (input(botao)) incremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref); }// Como Vref>256, guarde o valor de
vref nas posices 10 e 11 da eeprom interna
if (!input(botaodec)) {flag2=1;}
if (flag2==1 && input(botaodec) ) {flag2=0;--vref; //se o boto foi pressionado (flag2==1) e se o
boto j foi solto (input(botao)) decremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref); }// guarde o valor na de vref nas
posices 10 e 11 da eeprom interna
//*****************************************************************************
//*****************************************************************************
valorAD = read_adc(); // efetua a converso A/D
vatual=((constante*5*valorAD)/1023); //Regra de trs: 5 --------- 1023
// Tenso real (mV) -------- ValorAD
lcd_pos_xy(1,2);
printf(lcd_escreve,"Vref=%lu Vat=%lu ",vref, vatual);
delay_ms(300); }}
---------------------------------------------------------------------------------------------------------------------
11 LDR
LDR significa Light Dependent Resistor, ou seja, Resistor Varivel Conforme Incidncia de
Luz. Esse resistor varia sua resistncia conforme a intensidade de radiao eletromagntica do
espectro visvel que incide sobre ele.
Um LDR um transdutor de entrada (sensor) que converte a (luz) em valores de resistncia.
feito de sulfeto de cdmio (CdS) ou seleneto de cdmio (CdSe). Sua resistncia diminui quando
a luz intensa, e quando a luz baixa, a resistncia no LDR aumenta.
149
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Um multmetro pode ser usado para encontrar a resistncia na escurido (geralmente acima de
1M) ou na presena de luz intensa (aproximadamente 100).
O LDR muito frequentemente utilizado nas chamadas fotoclulas que controlam o
acendimento de poste de iluminao e luzes em residncias. Tambm utilizado em sensores
foto-eltricos.
Este luxmetro tem em seu circuito sensor um LDR, um resistor divisor de tenso e uma
fonte de tenso estabilizada, como mostra a figura abaixo.
Para obter este circuito e os valores de tenso na sada para as diferentes luminosidades,
forma tidos por ANTONIETI, B. Em que as medies da tenso de sada foram feitas e
colocadas em uma tabela juntamente com as iluminncias medidas por um luxmetro comercial
da marca MINIPA, modelo MLM-1010, de 3 dgitos , com preciso de 4% da leitura + 0.5%
do fundo de escala, na faixa de 1 a 50000 Lux. Os valores encontrados so vistos na tabela
abaixo. Os valores em negrito foram considerados como limite de cada equao da reta.
Correspondncia entre a tenso da sada e a iluminncia
150
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2500
2000
1500
(Lux)
1000
500
0
2 2,3 2,5 2,8 3,1 3,6 4 4,3 4,7 4,9
(V)
Para simplificar o programa do PIC, foi modelado a curva do grfico acima, dividindo-a
em trs retas como mostra a figura abaixo.
Diviso
da curva
em trs
retas
151
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2500
2000
1500
(Lux)
1000
500
0
2 2,2 2,4 2,6 2,8 3 3,2 3,4 3,6 3,8 4 4,2 4,4 4,6 4,8 5
(V)
152
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
11.1.1 SUPERVISRIO
153
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O luxmetro mostrado neste trabalho apresenta como uma soluo de baixo custo para
aplicaes onde no necessrio haver uma grande preciso nas medies. O mtodo do
modelagem de curva pode ser aplicado em vrias ocasies onde no se sabe a equao que gerou
o grfico proposto. Isto ratifica a versatilidade de sistemas microcontrolados.
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
output_low(pin_b6);
154
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while(1)
{
set_adc_channel(1);
delay_ms(20);
tens=5*(float)read_adc()/1023;
if (tens>2 && tens<2.8) { lux=(3936.4-(1249*tens))/0.8; }
if (tens>3.8) { lux=(900-180*tens)/1.2; }
12 INTERFACE I2C
I2C significa Inter-IC (Integrated Circuit). Este barramento serial foi desenvolvido pela
Philips como o objetivo de conectar CIs e perifricos de diferentes fabricantes em um mesmo
circuito, como microcontroladores, memrias externas e relgio em tempo real, usando o menor
nmero de pinos possvel. Este protocolo serial necessita somente de duas linhas: uma linha serial
de dados (SDA) e uma de clock (SCL). Quando o baramento no est em uso, as duas linhas
ficam em nvel lgico alto foradas pelos resistores de pull-up.
Cada bit da linha de dados s lido quando o nvel da linha de clock est em nvel alto.
157
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
primeiro byte de dados. O SLAVE deixa a linha de dados em nvel H e o MASTER gera a
condio de parada.
Caso haja uma interrupo interna no SLAVE durante a transmisso, ele dever levar
tambm a linha de clock SCL a nvel L, forando o MASTER a entrar em um modo de espera.
Para escrever um dado nos escravos necessrio enviar um byte de endereo do escravo,
onde os 4 bits mais significativos identificam o tipo de escravo (por exemplo, memrias
EEPROM 1010 ou 0xa0 e RTC 1101 ou 0xd0 (com exceo do RTC PCF8583 cujo endereo
tambm 0xa0). Os 3 bits intermedirios especificam de um at 8 dispositivos, que so
discriminados nos pinos de endereo de cada escravo, e o bit menos significativo R/W indica se
a operao de leitura (1) ou escrita (0). Aps isso, deve-se enviar uma palavra de 8 ou16 bits de
endereo onde se quer escrever e depois o dado. No final do pacote uma condio de parada
(i2c_stop).
memrias EEPROM externals. Os modelos mais comuns so o 24LC e 24C256 (256 Kbits que
corresponde a 32Kbytes). Estas memrias possuem oito pinos e apresentam, entre outras
caractersticas, interface de comunicao I2C. A figura abaixo mostra o circuito simples de uma
EEPROM I2C ligada nn ferramenta SanUSB.
160
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
resultado1 = valor32/256; byte1 = valor32%256; //o que for resto (%) menos significativo
resultado2 = resultado1/256; byte2= resultado1%256;
byte3= resultado2%256; byte4 = resultado2/256;
return(byte4,byte3,byte2,byte1);
}
main() {
clock_int_4MHz();
while(1){
set_adc_channel(0);
delay_ms(10); //Tenso 32bis porque o produto 5000* read_adc() de 10 bits (1023) pode ser
maior que 65536
tensao_lida32=(5000*(int32)read_adc())/1023; //Calcula a tenso Trimpot em mV: 5000mV
- 1023 (10bis)
printf (usb_cdc_putc,"\r\n tensao do Trimpot = %lu mV\r\n",tensao_lida32);// tensao_lida
- read_adc();
conv_dec_4bytes(tensao_lida32);
//printf (usb_cdc_putc,"\r\nVariavel em Hexadecimal = %x %x %x
%x\r\n",byte4,byte3,byte2,byte1);//Debug
O Real Time Clock I2C DS1307 um relgio/calendrio serial de baixo custo controlado
por um cristal externo de 32.768 Hz. A comunicao com o DS1307 atravs de interface serial
I2C (SCL e SDA). Oito bytes de RAM do RTC so usados para funo relgio/calendrio e so
configurados na forma Binary Coded Decimal BCD. possvel a reteno dos dados na falta de
energia utilizando uma bateria de ltio de 3V - 500mA/h conectada ao pino 3.
162
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
163
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Char entrada,funcao,endrtc,valorrtc1,valorrtc2;
unsigned int endereco, valor,valorbcd, numquant;
boolean led;
/*****************************************************************************
* Converso BCD P/ DECIMAL
****************************************************************************/
int bcd_to_dec(int valorb)
{
int temp;
temp = (valorb & 0b00001111);
temp = (temp) + ((valorb >> 4) * 10);
return(temp);
}
/*****************************************************************************
* Converso DECIMAL p/ BCD
*****************************************************************************/
int dec_para_bcd(unsigned int valord)
{
return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da diviso por 10 no nibble mais
significativo
}
//////////////////////////////////////////////////////////////////////////////////
main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
while (1) {
//*****************************************************************************
if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo,
depois o kbhit zerado
164
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Este sistema de aquisio de dados USB Dual Clock, ou seja, utiliza duas fontes de
clock, uma para o canal USB de 48MHz, proveniente do oscilador externo de 20MHz, e outra
166
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
167
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#include <SanUSB.h>
//#device ADC=8
#include ".\include\usb_san_cdc.h"// Biblioteca para comunicao serial
#include <i2c_dll16sanc.c>
168
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
char escravo,funcao,sensor,endrtc,
valorrtc1,valorrtc2,posmeme1,posmeme2,posmeme3,posmeml1,posmeml2,posmeml3,posquant1,
posquant2;
unsigned int ender, endereco, val, valor,valorbcd;
unsigned int mult=2,end=0, reg, numquant;
unsigned int16
hora,horadec,minuto,minutodec,segundo,segundodec,dia,diadec,mes,mesdec,ano,anodec;
unsigned int16 i, j,numpose, numposl,num16,endpromext,k,puloext,bufferdia;
int8 regi[2];
boolean led,ledint,flagwrite;
/*****************************************************************************
* Converso BCD P/ DECIMAL
*******************************************************************/
int bcd_to_dec(int valorb)
{
int temp;
temp = (valorb & 0b00001111);
temp = (temp) + ((valorb >> 4) * 10);
return(temp);
}
/*****************************************************************************
* Converso DECIMAL p/ BCD
***************************************************************/
int dec_para_bcd(unsigned int valord)
{
169
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//////////////////////////////////////////////////////////////////////////////////
main() {
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
while (1) {
//*****************************************************************************
if (flagwrite==1) {flagwrite=0; //Flag de gravao setada na interrupo do timer quando chega a
hora de gravar
k=0;
for(k=0;k<2;k++)
{
set_adc_channel(k);
170
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(20);
regi[k]= read_adc(); //Tenso M1[0], correnteM1[1]
endpromext=(minutodec/10)+(horadec*6)+((diadec-1)*24*6*2)+24*6*k;
//endpromext=(segundodec/10)+(minutodec*6)+((diadec-1)*60*6*2)+60*6*k; //Para teste 60
em vez de 24
escreve_eeprom(0,endpromext, regi[k]);
printf(usb_cdc_putc,"\r\nPosicao = %lu -> Sensor[%lu] = %u\r\n",endpromext,k,regi[k]);
}
}
//*****************************************************************************
led = !led; // inverte o led de teste
output_bit (pin_b7,led);
//*****************************************************************************
case '4':
{
endrtc=usb_cdc_getc();
valorrtc1=usb_cdc_getc();
valorrtc2=usb_cdc_getc(); //Ex: A4M43 - Altera os minutos para 43
if (valorrtc1>='0'&&valorrtc1<='9') {numquant=(valorrtc1-0x30);}
if (valorrtc2>='0'&&valorrtc2<='9') {numquant=numquant*10+(valorrtc2-0x30);
valor=numquant;
hora=le_rtc(2);minuto=le_rtc(1);segundo=le_rtc(0);
printf(usb_cdc_putc,"\r\nA4%2x:%2x:%2x",hora, minuto,segundo);
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
}
}
break;
}
printf(usb_cdc_putc,"\r\n"); //posiciona prxima linha
}
break;
}}}
}
}
---------------------------------------------------------------------------------------------------------------------
A sigla GSM significa Global Standard Mobile ou Global System for Mobile
Communications que quer dizer Sistema Global para Comunicaes Mveis. O GSM um
sistema de celular digital baseado em diviso de tempo, como o TDMA, e considerado a
evoluo deste sistema, pois permite, entre outras coisas, a troca dos dados do usurio entre
telefones atravs do SIM Card e acesso mais rpido a servios WAP e Internet, atravs do
sistema GPRS.
A transmisso de dados GSM pode ser feita por:
- GPRS (General Package Radio Service): uma conexo em uma rede de pacote de dados. Uma
vez conectado nessa rede, o sistema estar sempre on line, podendo transferir dados
imediatamente. O GPRS compatvel com o protocolo de rede TCP/IP e as operadoras de GSM
disponibilizam um gateway para a Internet, possibilitando conectar e controlar equipamentos
wireless atravs da Internet. Como o GPRS baseado no protocolo IP, ele necessita de
autenticao de um servidor da internet.
- SMS (Short Message Service): o servio de envio/recebimento de pequenas mensagens de
texto do tipo datagrama, sem autenticao de um servidor de internet.
Os Modems GSM so controlados atravs de comandos AT. Esses comandos so normalizados
pelas normas GSM 07.07 e GSM 07.05.
A manipulao do modem pode ser realizada em algum emulador de comunicao serial
como o Hyperterminal, nele deve-se ajustar para 9600 bps,e no esquecendo de instalar o SIM
Card no modem.
Comando AT Significado
173
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Comando AT Significado
+CMGR L menssagens
174
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
OK
AT+CMGL="ALL"
+CMGL: 1,"REC READ","+85291234567",,"06/11/11,00:30:29+32"
Hello, welcome to our SMS tutorial.
+CMGL: 2,"REC READ","+85291234567",,"06/11/11,00:32:20+32"
A simple demo of SMS text messaging.
Adiante apresentado um exemplo de como enviar uma mensagem SMS do modem GSM
para um celular com uso do PC. Os comandos enviados ao modem esto em negrito para
diferenciar de suas respostas.
1-AT
2-OK
3- AT+CMGF=1
4- OK
5-AT+CMGS="+558588888888"
6->Intruso
7- OK
As figuras abaixo apresentam a foto em protoboard e o circuito esquemtico para
transmisso GPRS/GSM. A conexo USB observado no esquema, foi utilizada pela ferramenta
SanUSB para a alimentao do circuito e gravao do programa no PIC atravs do PC. O LED
verde foi usado por esta ferramenta para sinalizar o momento em que o sistema estava no modo
de gravao. O vermelho simulou o acionamento do alarme, como descrito anteriormente. As
chaves conectadas aos pinos 23, 24 e 25, representam as chaves sinalizadoras dos trs sensores
utilizados. A figura abaixo mostra tambm o dispositivo MAX232 usado na interface RS/EIA-
232 entre o microcontrolador e o modem. Este, representado na figura apenas pelo conector DB9,
possui o pino 2 para transmisso de dados e o 3 para recepo, j que se trata de um equipamento
do tipo DCE (Data Comunication Equipment).
175
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
main(){
clock_int_4MHz();
176
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);
putc(0x0D);
while(TRUE){ output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
delay_ms(500);
}}
---------------------------------------------------------------------------------------------------------------------
O protocolo Modbus foi desenvolvido pela Modicon Industrial Automation Systems, hoje
Schneider, para comunicar um dispositivo mestre com outros dispositivos escravos. Embora seja
utilizado normalmente sobre conexes seriais padro EIA/RS-232 e EIA/RS-485, ele tambm
pode ser usado como um protocolo da camada de aplicao de redes industriais tais como TCP/IP
sobre Ethernet.
Este talvez o protocolo de mais utilizado em automao industrial, pela sua simplicidade
e facilidade de implementao.
A motivao para embarcar um microcontrolador em uma rede MODBUS pode ser por:
- Baixo custo;
- Tamanho reduzido;
- Alta velocidade de processameto (1 a 12 MIPs);
- Possuir 10 canais ADs internos com resoluo de 10 bits;
- Ferramentas de desenvolvimento gratuitas e possibilidade de programao da memria de
programa sem necessidade de hardware adicional, bastando uma porta USB;
- Estudo das caractersticas construtivas de hardware e de software de uma rede MODBUS.
177
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
H dois mecanismos para deteco de erros no protocolo Modbus serial: bits de paridade
em cada caractere e o frame check sequence ao final da mensagem. O modo RTU utiliza como
frame check sequence um valor de 16 bits para o CRC (ciclic redundance check), utilizando
como polinmio, P(x) = x16 + x15 + x2 + 1. O registro de clculo do CRC deve ser inicializado
com o valor 0xffff.
Existem dois modos de transmisso: ASCII (American Code for Information Interchange)
e RTU (Remote Terminal Unit), que so selecionados durante a configurao dos parmetros de
comunicao.
Como a comunicao geralmente utilizada em automao industrial em modo RTU, o
projeto proposto foi desenvolvido nesta forma de comunicao.
178
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
179
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
180
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
void rxler (void) //Leu a porta a no buffer[4] e escreve o CRC no buffer[5] e [6], pois
tamanhodata = 5
{
printf(usb_cdc_putc,"%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buf
fer[5],buffer[6]); // 6 bytes
}
buffer[3]=usb_cdc_getc();
buffer[4]=usb_cdc_getc();
buffer[5]=usb_cdc_getc();
buffer[6]=usb_cdc_getc();
buffer[7]=usb_cdc_getc();
buffer[8]=usb_cdc_getc();
buffer[9]=usb_cdc_getc();
buffer[10]=usb_cdc_getc();
delay_ms(3);
tamanhodata = 6;
CRC16();
port_b = buffer[8]; //A porta B do microcontrolador recebe o valor enviado pelo SCADA
}
printf(usb_cdc_putc,"%c%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],
buffer[5],buffer[6],buffer[7]); //7 bytes
}
main()
{
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
set_tris_b(0b00000000);
while(1)
{
if (usb_cdc_kbhit(1))
{
//verifica se acabou de chegar um novo dado no buffer USB, depois o kbhit zerado para
prximo dado
buffer[0]=usb_cdc_getc();
z = buffer[0];
if (z==1) //verifica se o endereco do slave e igual a 1
{
buffer[1]=usb_cdc_getc(); //verifica a funo contida no segundo byte buffer[1]
y = buffer[1];
}
if (y==3) //verifica se a funo para leitura e encaminha para leitura de varivel do
microcontrolador
{
ler();
182
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
rxler();
}
Note que a comunicao serial desse projeto foi emulada via USB, para aplicao em um
processo real necessrio utilizar um transceptor ou TTL/EIA-232 (MAX232) ou transceptor ou
TTL/EIA-485 (MAX485). Com o MODBUS embarcado possvel integrar um
183
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Alm das funes anteriores, o comando de pr-processamento # use rtos() deve ser
especificado no incio do programa, antes de chamar as funes RTOS. O formato deste comando
pr-processador:
A tarefa declarada como qualquer outra funo em C, mas as tarefas de uma aplicao
multi-tasking no tem argumentos e no retornam nenhum valor. Antes de uma tarefa ser
184
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//O firmware abaixo executa uma multi-tarefa (multi-tasking) onde 3 LEDs comutam
//independentes e simultaneamente
// Define qual o timer utilizado para o multitasking e o maior tempo de cada tarefa (minor_cycle)
do RTOS
#use rtos(timer=0, minor_cycle=10ms)
void main()
{
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
set_tris_b(0); // Configura PORTB como sada
185
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
186
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
187
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
188
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
189
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Monitor 3.4.3: Aps a gravao do firmware na placa Gogo via USB utilizando a
ferramenta SanUSB, o programa Monitor, ilustrado na figura 2, pode ser utilizado para o
monitoramento dos sensores e motores e tambm realiza comandos simples como acender/apagar
LED e como tambm dar BIP. Possui tambm uma aba Logo Procedures em que se pode
programar literalmente com instrues intuitivas em portugus e ingls, como tambm transferir
para o microcontrolador o firmware via emulao serial. Mais detalhes sobre este tutorial em
http://www.youtube.com/watch?v=BDtJjkoN-Gk .
190
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
191
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
192
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Blocos: Ambiente de programao grfico, utilizado para se programar a placa. Com ele
ser possvel fazer programas simples, ligar motores, sensores, acender leds entre outros.
O programa Blocos escrito na linguagem de programao Python. Portanto necessrio
instalar diversos pacotes da linguagem Python. No entanto, j fornecido um executvel
instalador BlocosBr_Gogo_python.exe que contm todas as dependncias necessrias, que est
disponvel na pasta com todos os programas necessrios em
http://www.4shared.com/file/AqaXvbjg/GogoSanUSB.html .
O pacote de instalao BlocosBr_Gogo_python.exe que contm todas as dependncias do
executvel Blocos. Para instalar basta clicar sempre em avanar e ignorar qualquer erro. Aps a
instalao, o Windows ser reinicializado.
193
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Para acessar o executvel Blocos, basta ir no menu Iniciar -> Todos os Programas ->
Python 2.5 -> PythonWin -> Open e encontrar o arquivos Blocos.py da pasta Blocos e depois em
-> File Run -> Ok, e aparecer a tela da figura 6.
Neste tpico so descritos alguns modelos das famlias PIC16F e 18F (F de memria de
programa flash, ou seja, pode ser apagada e gravada por completo diversas vezes).
194
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O PIC16F84, que foi um dos primeiros a usar memria de programa flash com recurso de
gravao serial (ICSP) permitindo a divulgao de projetos simples de gravadores para PIC e que
ajudou a disseminar a utilizao dos microcontroladores Microchip.
Dentre os modelos mais difundidos dos microcontroladores intermedirios depois do
PIC16F84, esto o PIC16F628A (sem conversor AD interno) e o PIC16F877A (40 pinos e sem
oscilador interno).
Devido melhor relao custo/desempenho na maioria das prticas propostas, os modelos
mais recomendados nesta apostila da famlia PIC16F e descritos abaixo so o PIC16F628A,
PIC16F688, o PIC16F819, o PIC16F873A e o PIC16F877A. As caractersticas destes cinco
modelos so descritas abaixo:
195
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
//Programa para piscar um led no pino B0 com comandos do CCS output_high e output_low
---------------------------------------------------------------------------------------------------------------------
#include <16f628A.h>
#fuses INTRC_IO, NOMCLR, NOWDT, NOLVP, NOBROWNOUT, PUT,
NOPROTECT//sem cristal
#define LED PIN_B0
#use delay(clock=4000000)
main()
{
while(true)//Ficar repetindo enquanto expresso entre parenteses for verdadeira
{ // como a expressao sempre verdadeira (true), o loop infinito
output_high(LED);
delay_ms(500);
output_low(LED);
delay_ms(500);
}
}
---------------------------------------------------------------------------------------------------------------------
196
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
OU
---------------------------------------------------------------------------------------------------------------------
#include <16f628A.h>
#fuses INTRC_IO, NOMCLR, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
#use delay(clock=4000000)
#byte port_b = 0x06 // Aponta a posio 6h da RAM como PORT_B para o compilador CCS
main()
{
port_b_pullups(true);
set_tris_b(0b11111110); //necessrio definir: pin_b0 como sada e demais como entrada
inicio:
bit_set(port_b,0);
delay_ms(700);
bit_clear(port_b,0);
delay_ms(700); // Outra forma de mover o valor para a port_b :
port_b=0b00000001;
delay_ms(500);
port_b=0b00000000;
delay_ms(500);
goto inicio;
}
---------------------------------------------------------------------------------------------------------------------
Figura 18. 1: Esquema eltrico de PIC 16F628A com led no pino B0.
Na verdade, o circuito de Hardware necessrio para fazer o LED piscar com oscilador
interno e o reset interno apenas a conexo do pino VDD em +5Ve VSS em GND, e o LED
conectado ao pino RB0 atravs de um resistor de 1K.
197
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
interno e USART para comunicao serial. Ele apresenta duas portas bidirecionais que so a
porta A, contm weak (fraco) pull-up interno em A0, A1, A2, A4 e A5 configurado por software
(port_a_pullups(true);) e a porta C tristate, ou seja, utilizada geralmente como entrada. Para
nvel lgico alto na sada necessrio colocar resistores de pull-up externo, geralmente de 10K.
A porta A apresenta ainda um pino de interrupo externa (A2), habilitado com borda de descida
quando o INTEDG (bit 6) do registro OPTION (81h) zero (default um), e interrupo por
mudana de estado em todos pinos da porta A.
Uma desvantagem do PIC16F688 em relao aos outros modelos como o PIC16F628A e
o 16F877A que ele no apresenta os resistores de pull-up internos da porta A estveis para
entrada (somente para sada como, por exemplo, acionamento de LEDs), ou seja, sempre que um
pino for aterrado com um boto, deve-se colocar um resistor de pull-up externo para retornar o
nvel lgico alto quando o boto for liberado.
Para a simulao do PIC16F688 no Proteus, embora se verifique que os modelos
apresentam alguns erros em relao a operao real, pode-se utilizar o modelo PIC16F88
considerando a diferena das portas, ou o PIC16F870 trocando o fusvel INTRC_IO (clock
interno) por XT (clock externo at 4 MHz).
Para gravar a flash do PIC16F688 incluindo o oscilador RC interno, recomendvel
configurar o registro OSCCON que apresenta oito frequncias de clock, para frequncias de 4 ou
8 MHz (OSCCON=0b01100100;). Um exemplo de programa para piscar alternadamente Leds na
porta A, com oscilador interno e reset interno, mostrado a seguir:
---------------------------------------------------------------------------------------------------------------------
#include <16f688.h> //pisca pinos alternados da porta A
#use delay (clock=4000000)
#fuses PUT,NOWDT,NOBROWNOUT,INTRC_IO,NOMCLR
#byte port_a = 0x05 // Aponta a posio 5h da RAM como PORT_A para o compilador CCS
#byte tris_a = 0x85
#BYTE OSCCON=0X8F //Byte de controle do oscilador interno
main()
{
OSCCON=0b01100100; // Configura o oscilador como interno e com frequncia de 4MHz
port_a_pullups(true); //Pull-up interno em A exceto A3
set_tris_a(0b00000000);//Porta A como sada
while(1) //Loop infinito
{
port_a=0b01010101;
delay_ms(500);
port_a=0b10101010;
delay_ms(500);
}
}
---------------------------------------------------------------------------------------------------------------------
198
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
199
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O compilador CCS tambm apresenta uma interface de comunicao serial com mostra
a figura abaixo que o resultado do exemplo. Para acess-lo basta acessar tolls -> serial port
monitor e depois configure a taxa e a porta de comunicao serial em configuration -> set port
options.
201
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
202
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
203
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Este modelo contm um contador de programa com 16 bits e, por isso, podem dar um
pulo para chamada de uma funo de at 216, ou seja, 64K (65536 posies), diferente da famlia
16F com contador de programa com 11 bits, ou seja , s capaz de fazer uma chamada de uma
posio distante somente a 2K (2048 posies). Assim, quando se trabalha com programas de
alto nvel em C, com vrias aplicaes na funo principal main ou na funo de interrupo
serial, necessrio utilizar um modelo da famlia 18F, pois facilmente se tornam maiores que 2K
e o contador de programa no consegue mais fazer a chamada destas funes. Alm disso, em
operaes matemticas ou com matrizes, o compilador utiliza a memria RAM para variveis de
dados e, tambm, como memria cash, ou seja, ele guarda os valores intermedirios das
operaes matemticas complexas em outras posies da RAM. Assim, para programas de alto
nvel que utilizam operaes matemticas ou matrizes tambm necessrio modelos da famlia
18F. As caractersticas do modelo 18F452 so mostradas na tabela abaixo.
#INCLUDE: Utiliza-se essa diretiva para inserir arquivos de biblioteca e funes no cdigo do
programa atual.
Exemplo:
204
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Exemplo:
Uma grande parte da famlia PIC16F como, por exemplo, o 16F628A, 16F688 e 16F819,
possuem um circuito RC de clock interno configurvel por software, transformando os pinos
OSC1 e OSC2 em pinos de I/O sem sada de pulso de clock. Esta funo selecionada pelos
fusveis (INTRC_IO), o que permite, alm de reduzir o custo do projeto por no necessitar de
um cristal externo, utilizar os pinos referentes localizao do cristal (no 16F628A os pinos
15(A6) e 16(A7)), como Entrada/Sada.
Vale salientar que tambm possvel utilizar, em alguns modelos, o pino de Reset externo
pino 4 (A5) como I/O, habilitando o Reset interno (NOMCLR). Dessa forma, o circuito auxiliar
do PIC reduz-se somente alimentao VDD (+5V no pino 14) e VSS (Gnd no pino 5), ou seja,
este PIC de 18 pinos apresenta 16 pinos de I/O. Neste caso importante desabilitar o Watch Dog
Timer (NOWDT), porque a flag de estouro ficar ressetando o PIC caso no seja
periodicamente limpa.
Alguns modelos como o PIC16F628A e o PIC16F877A apresentam em um pino de IO
(chamado de PGM) com a funo de programao em baixa tenso (LVP) habilitada. Dessa
forma, importante desabilitar essa funo (NOLVP) para garantir a funo do pino como
entrada e sada.
Para desabilitar o reset para tensoe abaixp de 4V, utiliza-se o comando
(NOBROWNOUT).
205
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#DEFINE: Nome utilizado para substituir um identificador, que pode ser um byte da memria de
dados, um bit ou uma constante. #DEFINE NOME IDENTIFICADOR.
Exemplo:
#define LED PIN_B0
#USE DELAY(): Informa a velocidade de clock do sistema. Esta diretiva utilzada para o
clculo das funes de atraso (delay_us() e delay_ms()) e tambm para gerar a taxa de
transmisso e recepo na comunicao serial (Baud Rate).
Exemplo:
#use delay(clock=4000000)
#USE RS232(): Utilizada para ordenar o compilador a gerar o cdigo para comunicao serial
assncrona padro rs232, como mostra a prtica 2.
Exemplo:
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
---------------------------------------------------------------------------------------------------------------------
#include <16f877.h>
#use delay(clock=4000000)
#fuses XT, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
main()
{ int x,y;
for (x=0,y=10;x<=10;x++,y--) printf("%u , %u\r\n",x,y);
}
---------------------------------------------------------------------------------------------------------------------
206
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Figura 18. 10: Envio de dados via serial com PIC 16F877.
Neste programa deve-se verificar no simulador Proteus, com o boto direito sobre o
dispositivo, se o clock do PIC est em 4MHz e se Taxa de transmisso do Virtual Terminal, que
o receptor, tambm est em 2400 bps como o programa.
O circuito acima conectado porta RS232 do computador por meio do driver Max232.
O LED1 ligado ou desligado atravs do computador.
207
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#INCLUDE <16F628A.H>
#use delay(clock=4000000)
#fuses INTRC_IO, NOMCLR, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
#define led pin_b0 //o comando output_high(led); aciona o pull-up interno do pino
#define chave pin_a3 // Necessita de um rsistor de pull-up externo
main()
{
for( ; ; ) { output_low(led); // loop infinito
while(!input(chave)) { output_high(led); }
// enquanto a chave for zero ascende led
}
}
---------------------------------------------------------------------------------------------------------------------
A porta B pode assumir resistores de pull-up internos habilitados por software com o
comando port_b_pullups(true); eliminando a necessidade de resistores externos ligados ao
+Vcc. Veja prximo exemplo:
#INCLUDE <16F628A.H>
#use delay(clock=4000000)
#fuses INTRC_IO, NOMCLR, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
#define led pin_b0
#define chave pin_b3
main()
{ port_b_pullups(true); //Habilita o pull-up interno de todos os pinos da porta B
for( ; ; ) { output_low(led); // loop infinito
while(!input(chave)) { output_high(led); }
// enquanto a chave for zero ascende led
}
}
208
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Figura 18. 12: Ligando led com boto utilizando pull up interno.
---------------------------------------------------------------------------------------------------------------------
#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT
#use Delay(Clock=4000000) // Seta pelo clock do Cristal utilizado
#use standard_IO(B) // Sada ou Entrada direta para Porta B - mais rpida
#byte porta_do_uc=0x06 // Define porta_do_uc como a posio de memria de dados 6h(port_b)
main()
{
port_b_pullups(true);
set_tris_b(0x00); // Define Porta B como sada porque no se utiliza o output_high(PIN_B0);
porta_do_uc = 0x01;
while(true)
{
rotate_left(&porta_do_uc, 1);//Rotacione o contedo de 1 byte na memria
// apontada por porta_do_uc
delay_ms(1000);
}
}
---------------------------------------------------------------------------------------------------------------------
209
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <16F88.h>
#fuses PUT,NOBROWNOUT,NOWDT,INTRC_IO,NOMCLR
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_B5,rcv=PIN_B2) // no 16F688 xmit=PIN_C4,rcv=PIN_C5
#BYTE OSCCON=0X8F
main ()
{
while(1)
{
char nome[10];
printf ("Digite o seu nome: ");
gets (nome);
printf ("\r\n Ola, %s\r\n",nome);
getchar();
}
}
---------------------------------------------------------------------------------------------------------------------
210
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <16F88.h>
#fuses PUT,NOBROWNOUT,NOWDT,INTRC_IO,NOMCLR
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_B5,rcv=PIN_B2) // no 16F688 xmit=PIN_C4,rcv=PIN_C5
#BYTE OSCCON=0X8F
main()
{
printf("%c %d %x \r\n",'A','A','A');
printf("%c %c %c \r\n",'A',65,0x41);
getchar();
}
---------------------------------------------------------------------------------------------------------------------
211
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
212
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
213
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
214
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
215
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
216
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
217
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#int_timer1
void trata_t1 ()
{
boolean led;
int multiplic;
// reinicia o timer 1 em 15536 mais a contagem que j passou
set_timer1(15536 + get_timer1()); //vai contar 50000
multiplic++;
// se j ocorreram 2 interrupes
if (multiplic == 10) //vai contar 10 * 50000
{
multiplic=0;
led = !led; // inverte o led
output_bit (pin_b0,led);
}
}
main()
{
// configura o timer 1 para clock interno e prescaler dividindo por 8
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_2 );//vai contar 2 * 10 * 50000 = 1s
// inicia o timer 1 em 15536
set_timer1(15536);
// habilita interrupes
218
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
enable_interrupts (global );
enable_interrupts (int_timer1);
while (true); // espera interrupo
}
---------------------------------------------------------------------------------------------------------------------
219
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Em C o fusvel INTRC_IO seta o bit menos significativo do OSCCON (SCS), e as finies para
4MHz podem ser definidas como #define OSC_4MHZ 0x61, #define OSC_INTRC 1, #define
OSC_STATE_STABLE 4.
Caso o oscilador deva ser externo XT, a Microship apresenta uma tabela com algumas
faixas de capacitores de filtro usados para cada frequncia, embora o mais comum seja de 15pF.
Esses registros indicam o valor das portas de entrada e sada do microcontrolador. Em relao ao
pull-up interno (conexo ao VDD para que o pino possa utilizar o nvel lgico alto na sada), a
configurao varivel para cada modelo:
- PIC16F628A (18 pinos): Port A (Tristate) e Port B (pull-up interno configurvel por software);
- PIC16F688 (14 pinos): Port C (Tristate) e Port A (pull-up interno configurvel por software
exceto A3);
- PIC16F819 (18 pinos): Port A(com pull-up de 0 a 4, os demais pinos Tristate) e Port B (pull-up
interno configurvel por software);
- PIC16F870 (28 pinos) a 877A (40 pinos): Port A (com pull-up de 0 a 3, os demais Tristate),
Port B (pull-up interno configurvel por software), Port C (com pull-up) e PORT D e E
(Tristate).
Esses registradores servem para configurar os pinos das portas como entrada ou sada.
Quando colocado 1 em um bit do TRIS, o pino relacionado a ele configurado como entrada.
Para configurar o pino como sada, necessrio escrever 0 no bit relacionado. Uma maneira
prtica para memorizar essa regra associar 1 ao I de Input (entrada) e o 0 ao O de
Output (sada). Para configurar o PORTA, deve ser utilizado o registrador TRISA, para o PORTB
utilizado o TRISB, etc.
20 INTERFACE USART
220
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
221
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#fuses XT,PUT,BROWNOUT,NOWDT,NOPROTECT,NOLVP
// Habilitar 16f870 sempre PUT e BROWNOUT, Desabilitar WDT e os outros, O reset externo.
#include <MOD_LCD_PORTB.c> // RB0-D4, RB1-D5, RB2-D6, RB3-D7, RB4-E, RB5-RS
#byte port_a = 0x05 // Define a posio 5h da RAM como PORT_A, pois no est na biblio CCS
main() // e nem no compilador. Se a port_a for utilizada o registro TRIS deve ser definido
{
unsigned int valorlido; //8 bits de 0 a 255
int32 valtensao; // valtensao = (5000 * valorlido) / 255 -> ex.: 5000*200=800.000 > 65535
(long int)
222
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (true)
{
valorlido = read_adc(); // efetua a converso A/D
valtensao = (5000 * (int32)valorlido) / 255; //ex.: 5000*200=800.000 > 65535
(long int)
lcd_pos_xy(10,1); // Coloca na posio de sobrescrever
printf (lcd_escreve,"%lu mV ",valtensao);
USO DE DOIS CANAIS SIMULTNEOS: Este exemplo utiliza o PIC16F819 com dois canais
analgicos, um canal para a leitura da temperatura um sensor LM35 e o outro canal l a tenso
em mV de um potencimetro. Neste caso, caso o oscilador interno seja utilizado, o registro
OSCCON deve ser configurado. O PIC16F819 no existe no PROTEUS. Dessa forma, o
conversor AD simulado com o PIC16F870, considerando as mudanas de fusveis.
---------------------------------------------------------------------------------------------------------------------
#include <16f819.h>
#device ADC=10 // define que o AD utilizado ser de 10 bits
#use delay (clock=4000000) // L de 0 a 1023
#fuses PUT,NOWDT,BROWNOUT,NOLVP,NOMCLR,INTRC_IO // sem cristal
// No 16f870 habilitar sempre XT, MCLR, PUT, BROWNOUT, Desabilitar WDT.
#include <MOD_LCD_PORTB.c>
#BYTE OSCCON=0X8F //Byte de controle do oscilador interno
long int AD(int CANAL) // declara funo (subrotina) usada para ler entrada analgica
223
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
{
int32 VALOR; //Declara uma varivel de 16 bits para canal de 10 bits
set_adc_channel(CANAL); //Congigurao do canal do conversor AD
delay_us(100); //Tempo para carregar capacitor canal escolhido
VALOR = read_adc(); //Faz a leitura e armazena na varivel AUXILIAR
return(VALOR); //Retorna valor analgico lido
}
main()
{
unsigned int16 valorlido0, valorlido1; //10 bits
int32 valtensao0,valtensao1;
OSCCON=0b01100100; //configurao do oscilador interno para 4 MHz no 16F819 e
16F688
// valtensao0 = (5000 * valorlido) / 1023 -> ex.: 5000*200=800.000 > 65535 (long int)
lcd_ini();
setup_adc_ports(RA0_RA1_RA3_ANALOG); //Habilita entradas analgicas
setup_adc(ADC_CLOCK_INTERNAL); //Configurao do clock do conversor AD
224
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
---------------------------------------------------------------------------------------------------------------------
#include <16F688.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C4,rcv=PIN_C5)
#include <input.c> //Converte ascii em numero
#BYTE OSCCON=0X8F
225
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
226
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
main() {
OSCCON=0B01100100; // oscilador interno com 4MHz, o bit INTRC foi setado nos fusveis
enable_interrupts(GLOBAL); // Possibilita todas interrupcoes
ENABLE_INTERRUPTS(INT_EXT); //pin_a2
EXT_INT_EDGE(H_TO_L); //borda de descida: bit 6 baixo no option_reg (81h)
port_b_pullups(true);
while (1) {
}
}
---------------------------------------------------------------------------------------------------------------------
valor1 = reg/256; valor = reg%256;// valor1 a parte alta do int16 e valor a parte baixa
printf ("\r\nVariavel = %lu Em Hexa = %x %x\r\n",reg,valor1,valor);
write_eeprom( endereco, valor1 );
write_eeprom( endereco+1, valor );
resp1=(256*read_eeprom(endprom+4))+read_eeprom(endprom+5);
resp2=(256*256*read_eeprom(endprom+3))+resp1;
resp3=(256*256*256*read_eeprom(endprom+2))+resp2;
printf ("\r\Calculo dos 4 Bytes em decimal = %lu \r\n",resp3); //resp3 ser igual a reg
21 CONSIDERAES FINAIS
22 REFERNCIAS BIBLIOGRFICAS
Grupo SanUSB (2011). Arquivos do Grupo SanUSB. Retirado em 05/01/11, no World Wide
Web: www.tinyurl.com/SanUSB/.
Jornal O Povo (2011). Da escola pblica para o mundo. Retirado em 05/01/11, no World Wide
Web:
http://www.opovo.com.br/app/opovo/cienciaesaude/2011/01/08/noticiacienciaesaudejorna
l,2086691/da-escola-publica-para-o-mundo.shtml.
Jornal O Povo (2010). De Maracana para Eslovquia. Retirado em 05/01/11, no World Wide
Web: http://publica.hom.opovo.com.br/page,489,109.html?i=2051467.
Dirio do Nordeste (2010). Rob cearense. Retirado em 05/01/11, no World Wide Web:
http://diariodonordeste.globo.com/materia.asp?codigo=861891.
TV Dirio (2010). Feira do Empreendedorismo SEBRAE. Retirado em 05/01/11, no World Wide
Web: http://www.youtube.com/watch?v=8Y7gOPd_zN4.
TV Verdes Mares (2009). Estudantes competem com robs. Retirado em 05/01/11, no World
Wide Web: http://tvverdesmares.com.br/bomdiaceara/estudantes-competem-com-robos/.
TV Cidade (2009). Projetos Comsolid/Setapi IFCE. Retirado em 05/01/11, no World Wide Web:
http://www.youtube.com/watch?v=i_waT0_201o.
229
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2) Para compilar os programas com o C18 e o SanUSB, crie uma pasta, como por exemplo,
C:\ExemplosC18SanUSB e insira nessa pasta programas, como o exemplo pisca.c, os
arquivos SanUSBlkr.lkr e a biblioteca cabealho SanUSB.h. Todos esses programas esto
na pasta do arquivo ExemplosC18SanUSB do Grupo SanUSB
(www.tinyurl.com/SanUSB).
4) Para abrir direto o projeto, se o MPLAB C18 j estiver configurado, basta clicar no
arquivo Projeto1C18 e abrir o projeto da pasta. Se no, no MPLAB, v em Project ->
Project Wizard -> Avanar. No step one insira o Device PIC18F2550.
230
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
5) No step two, selecione a ferramenta Active Toolsuite como Microchip C18 Tollsuite e
aponte o endereo de cada um de seus executveis (contents) do C18 e avance:
Toolsuite contents: Location:
MPASMWIN.exe C:\mcc18\mpasm\MPASMWIN.exe
mcc18.exe C:\mcc18\bin\mcc18.exe
MPLink.exe C:\mcc18\bin\MPLink.exe
MPLib.exe C:\mcc18\bin\MPLib.exe
6) No step three indique o nome do projeto e a pasta (Browse..) onde ele ser criado, por
exemplo, C:\ ExemplosC18SanUSB \Projeto1C18.
7) Aps avanar, adicione no step four o arquivo pisca.c e o linkador SanUSBlkr.lkr e clique
em avanar e concluir. Esses arquivos iro aparecer no Workspace (espao de trabalho)
do IDE MPLAB. Se no aparecer basta clicar em View -> Project. Para compilar outro
programa necessrio adicion-lo clicando com o boto direito sobre a pasta Source Files
no Workspace e adicionar o programa pisca.c e adicionar tambm na pasta Linker do
Workspace o arquivo SanUSBlkr.lkr que esto dentro da pasta do projeto. Dessa forma,
para compilar necessrio ter apenas o arquivo .c a ser compilado em Source File e o
linkador SanUSBlkr.lkr no Linker Script, como mostra a figura abaixo.
possvel visualizar o programa com um duplo clique sobre pisca.c. Para compilar
pressione F10. Para compilar outros programas basta cri-los com a extenso .c dentro da
mesma pasta do projeto e inserir no Souce Files do Wokspace, removendo o anterior.
Informaes detalhadas sobre esse compilador podem ser encontradas na pasta instalada
C:\MCC18\doc.
231
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Este grupo de funes define a estrutura do programa uma vez que o usurio deve
escrever o programa.c de sua aplicao inserindo o arquivo #include<SanUSB.h>.
O microcontrolador possui um recurso chamado watchdog timer (wdt) que nada mais do
que um temporizador co-de-guarda contra travamento do programa. Caso seja habilitado
habilita_wdt() na funo principal main(), este temporizador est configurado para contar
aproximadamente um intervalo de tempo de 16 segundos. Ao final deste intervalo, se a flag
limpa_wdt() no for zerada, ele provoca um reset do microcontrolador e conseqentemente a
reinicializao do programa. A aplicao deve permanentemente zerar a flag limpa_wdt() dentro
do lao infinito (while(1)) na funo principal main() em intervalos de no mximo 16 segundos.
Este recurso uma segurana contra qualquer possvel falha que venha travar o programa e
paralisar a aplicao. Para zerar o wdt, o usurio pode tambm utilizar a funo ClrWdt() do
compilador C18.
clock_int_4MHz()
#include<SanUSB.h>
232
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
nivel_alto()
nivel_baixo()
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
sada_pino(pino,booleano)
tempo_us()
233
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
tempo_ms()
entrada_pin_xx
habilita_interrupcao()
habilita_interrupcao(timer0);
habilita_interrupcao(ext1);
if(xxx_interrompeu)
Funo: Flag que verifica, dentro da funo de tratamento de interrupes, se uma interrupo
especfica ocorreu.
Complemento: timer0, timer1, timer2, timer3, ext0, ext1, ext2, ad e serial.
Argumentos de sada: No h.
Observaes: A flag deve ser zerada dentro da funo de interrupo.
Exemplo:
234
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
liga_timer16bits(timer,multiplicador)
tempo_timer16bits(timer,conta_us)
habilita_interrupcao(timer0);
liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 16
tempo_timer16bits(0,62500); //Timer 0 estoura a cada 16 x 62500us = 1 seg.
habilita_wdt()
235
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#include<SanUSB.h>
limpaflag_wdt()
#include<SanUSB.h>
le_eeprom()
236
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
dado=le_eeprom(85);
habilita_canal_AD()
le_AD8bits()
PORTB = le_AD8bits(0); //L canal 0 da entrada analgica com resoluo de 8 bits e coloca na
porta B
le_AD10bits()
237
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Observaes: No h.
Exemplo:
taxa_rs232();
void main() {
clock_int_4MHz();
habilita_interrupcao(recep_serial);
taxa_rs232(2400); // Taxa de 2400 bps
while(1); //programa normal parado aqui }
le_rs232();
if (serial_interrompeu) {
238
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
serial_interrompeu=0;
c = le_rs232();
if (c >= '0' && c <= '9') { c -= '0'; PORTB = c;} }}
escreve_rs232();
void main(){
clock_int_4MHz();
while (1)
{
nivel_alto(pin_b0); // Pisca Led na funo principal
tempo_ms(500);
nivel_baixo(pin_b0);
nivel_alto(pin_b6);
tempo_ms(500);
nivel_baixo(pin_b6);
nivel_alto(pin_b7);
tempo_ms(500);
nivel_baixo(pin_b7);
tempo_ms(500);
}
}
239
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
void main(void){
clock_int_4MHz();
while(1)
{
ledXOR = entrada_pinb1^entrada_pinb2; //OU exclusivo entre os pinos b1 e b2 ->input
#include <SanUSB.h>
// inserir o desvio _asm goto interrupcao _endasm na funo void _high_ISR (void){ } em
SanUSB.h
void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada
240
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
habilita_interrupcao(timer0);
liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 8
tempo_timer16bits(0,62500); //Conta 16 x 62500us = 1 seg.
habilita_interrupcao(timer3);
liga_timer16bits(3,8); //liga timer1 - 16 bits com multiplicador (prescaler) 8
tempo_timer16bits(3,50000); //Conta 8 x 50000us = 0,4 seg.
while(1);
}
//4- Programa que utiliza o wdt, reseta em 16 seg. se a limpaflag_wdt() no for limpa
#include <SanUSB.h>
void main(){
clock_int_4MHz();
habilita_wdt(); // Se a flag wdt no foor limpa (limpaflag_wdt();) reseta em 16 segundos.
nivel_alto(pin_b0);
nivel_alto(pin_b7);
tempo_ms(3000);
while (1)
{
//limpaflag_wdt();
nivel_alto(pin_b0); // Pisca Led na funo principal
nivel_baixo(pin_b7);
tempo_ms(500);
nivel_baixo(pin_b0);
nivel_alto(pin_b7);
tempo_ms(500);
}
}
void main(){
clock_int_4MHz();
TRISB=0x00; //Porta B sada
habilita_canal_AD(AN0);
while(1){
241
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#include <SanUSB.h>
// inserir o desvio _asm goto interrupcao _endasm na funo void _high_ISR (void){ } em
SanUSB.h
if (serial_interrompeu) {
serial_interrompeu=0;
c = le_rs232();
if (c >= '0' && c <= '9') { c -= '0'; PORTA = c;}
PORTBbits.RB0 =! PORTBbits.RB0; //Inverte o LED em B0
tempo_ms(500);
void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada
habilita_interrupcao(recep_serial);
taxa_rs232(9600);
habilita_interrupcao(timer0);
242
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while(1); }
#include <SanUSB.h>
void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada
243
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (1);
}
RCONbits.IPEN = 1;
244
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
245
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O Java tem uma grande vantagem frente a outras plataformas de desenvolvimento que a
possibilidade de um mesmo software ser executa em diversas plataformas sob uma mesma
compilao, no necessrio reescrever ou nem mesmo recompilar o software para que este
esteja disponvel em outras plataformas (sejam elas Windows, Linux, Mac ou at mesmo PDAs
de gama alta).
Mas toda essa facilidade tem certo custo, com Java a tarefa de chamar APIs nativas dos
sistemas operacionais ou ainda fazer comunicao com o hardware diretamente se torna um
pouco mais complexo. Mas para isso a Sun e demais empresas envolvidas no desenvolvimento
Java disponibilizam diversas APIs para facilitar o trabalho, como o caso da API RXTX
(portvel em Linux, Windows e Mac). Nesta prtica ser desenvolvida comunicao via USB
com esta API utilizando a emulao de uma porta serial para se comunicar com comando simples
atravs de bytes em ASCII.
Esta prtica visa desenvolver um aplicativo em Java que utilize a API RXTX para
permitir a comunicao do aplicativo com o microcontrolador via USB atravs da emulao de
uma porta serial virtual. O programa envia o caractere L ou D atravs de um boto acionado
pelo usurio e captura a mensagem do microcontrolador: Led Ligado! ou Led Desligado!.
Firmware do microcontrolador PIC18F2550 que emula uma porta serial virtual:
#include <SanUSB.h> // exemplo_emulSerial.c
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
BYTE Comando;
void main() {
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz
para CPU)
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC
while (1)
{
if (usb_cdc_kbhit()) //avisa se chegou dados do PC
{ //verifica se acabou de chegar um novo byte no buffer de recepo, depois o kbhit zerado para
prximo byte
comando=usb_cdc_getc(); //se chegou, retm o caractere e compara com L ou D
if (comando=='L') {output_high(pin_b7); printf(usb_cdc_putc, "\r\nLed Ligado!\r\n");}
if (comando=='D') {output_low(pin_b7); printf(usb_cdc_putc, "\r\nLed Desligado!\r\n");}
}
247
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
250
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
A ltima varivel a ser configurada a PATH, geralmente essa varivel j existe no seu
sistema ento voc ter que localiz-la e edit-la ao invs de criar uma nova. Fora isso o processo
o mesmo do descrito acima, basta alterar o valor da varivel a acrescentar a pasta dos arquivos
binrios do seu SDK como mostra abaixo.
Pronto, agora com certeza sua API est totalmente funcional, se por acaso no funcionar
provavelmente algum passo foi efetuado de maneira incorreta, basta refazer o processo de
instalao.
251
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Em primeiro lugar devemos configurar a IDE, que um processo bastante simples. Segue
abaixo um exemplo adicionando o arquivo comm.jar passo a passo (So os mesmos passos para
adicionar o arquivo RXTXcomm.jar).
252
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
3: Add External JARs e selecionar a biblioteca comm.jar que vem dentro do pacote da API que
deve ser baixado diretamente do site da SUN, como mostrado anteriormente.
Feito isso, preciso realizar algumas configuraes necessrias para que a API fique
integrada ao Sistema Operacional. Ao baixar o arquivo compactado, ser necessrio
descompact-lo, abrir o arquivo Readme.html e localizar as instrues para a instalao (no
entrarei em detalhes sobre isso, por se tratar de uma tarefa simples e dependente do Sistema
Operacional).
253
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Importando Bibliotecas:
Como a API RXTX baseada na API Javacomm, o cdigo o mesmo para reconhecer,
abrir, enviar bytes e receber dados da porta serial. O que muda so os pacotes que voc vai
precisar importar.
API Javacomm
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
API RXTX
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
Reconhecendo as Portas
//....
Enumeration listaDePortas;
listaDePortas = CommPortIdentifier.getPortIdentifiers();
//...
//..
int i = 0;
portas = new String[10];
while (listaDePortas.hasMoreElements()){
CommPortIdentifier ips = listaDePortas.nextElement();
portas[i] = ips.getName();
i++;
}
//..
254
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
CommIdentifier cp = CommPortIdentifier.getPortIdentifier(minhaPortaEscolhida);
O mtodo open() tem como parmetros o nome da classe principal (faa isso para no
gerar conflitos) e o valor desejado para timeout. Em seguida, precisamos atribuir fluxos de
entrada e sada. Basta utilizar as classes Abstratas OutputStream e InputStream, j que a classe
SerialPort implementa os mtodos de entrada e sada dessas classes para comunicao serial. Para
ler dados na porta serial [2]:
255
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
At agora tudo foi relativamente simples, e ento entramos na rea mais complicada: ler
dados! A API de comunicaes Java facilita bastante o trabalho, mas mesmo assim, so vrias
linhas de cdigo [2]. Basicamente o que deve ser feito :
Criar um fluxo de entrada.
Adicionar um gerenciador de eventos para dados na porta serial.
Instanciar uma Thread para aguardar os eventos
Tratar o evento e receber os dados
A etapa i. j foi detalhada. Para adicionarmos um gerenciador de eventos para a porta serial
basta fazer [2]:
porta.addEventListener(this);
Em seguida precisamos notificar o objeto porta criado de que podem exister dados para
serem lidos [2]:
porta.notifyOnDataAvailable(true);
Agora falta apenas tratar o evento. Infelizmente, essa a parte mais complicada. Primeiro
instanciamos um Array de bytes. Esse Array ser nosso buffer de dados [2].
J definimos entrada como nosso fluxo de entrada de dados. O mtodo available() retorna
sempre 0 se InputStream (nesse caso entrada) classe da qual ele invocado [2].
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
O metodo read(byte[] b) faz toda a leitura. Ele copia os bytes lidos para o Array
bufferLeitura e retorna um inteiro representando o nmero de bytes lidos. Podemos converter
esses valores para uma String como mostrado abaixo [2]:
256
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido!");
} else {
System.out.println(Dadoslidos);
}
} catch (Exception e) {
System.out.println("Erro durante a leitura: " + e );
}
System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}
Desenvolvimento:
Recursos:
- 01 cabo USB
- 01 microcontrolador PIC18F2550 com o programa exemplo_emulSerial.hex gravado
- 01 computador pessoal com sistema operacional Linux Ubuntu e/ou Windows.
- Eclipse 3.5
- jdk1.6.0_01
- API RXTX: rxtx-2.1-7-bins-r2.zip
257
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Foi desenvolvido uma classe com o nome ListarPorta. Essa classe foi implementado
utilizando a API JavaComm e RXTX, pois como vimos o que muda de uma API para a outra
apenas o endereo dos pacotes. Veja o cdigo abaixo:
package controller;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Vector;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import javax.swing.JTextArea;
import view.Mensagens;
try {
Enumeration portIdentifiers =
CommPortIdentifier.getPortIdentifiers();
258
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier object = (CommPortIdentifier)
listaDePortas.nextElement();
portas.add(object.getName());
}
return portas;
} catch (Exception e) {
dialogo.erro("Erro ao listar portas!",
"Comunicacao pela porta serial");
}
return null;
if(!conectado){
portaComnIdentifier =
CommPortIdentifier.getPortIdentifier(porta);
portaSerial =
(SerialPort)portaComnIdentifier.open("SComm",100);
input = portaSerial.getInputStream();
output = portaSerial.getOutputStream();
portaSerial.setSerialPortParams(
velocidade,
SerialPort.DATABITS_7,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE
);
portaSerial.addEventListener(this);
portaSerial.notifyOnDataAvailable(true);
conectado = true;
dialogo.conexao("Porta "
+ porta
+ " \n conectada com sucesso!",
"Comunicacao pela porta serial");
}
} catch (Exception e) {
e.printStackTrace();
conectado = false;
dialogo.erro("Erro na conexao da porta "
+ porta
259
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
+ "!",
"Comunicacao pela porta serial");
}
return conectado;
}
} catch (Exception e) {
dialogo.erro("Erro ao enviar dados ",
"Comunicacao pela porta serial");
}
return false;
}
return instancia;
}
int quanBytes = 0;
try {
while ( input.available() > 0 )
quanBytes = input.read(bufferLeitura);
String Dadoslidos =
260
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
new String(bufferLeitura);
jTextArea.setText(jTextArea.getText()
+ "\n" + Dadoslidos);
System.out.println("lidos = " + quanBytes);
} catch (Exception e) {
conectado = false;
dialogo.erro("Erro ao ler dados!",
"Comunicacao pela porta serial");
e.printStackTrace();
}
}
Para visualizar o programa executando basta criar uma classe que herde de JPanel
(adicionar componentes como boto e campo de texto) e uma outra classe que herde de JFrame
(adicionar o objeto da classe Jpanel). Veja o resultado dos programas abaixo em Windows e
Linux utilizando a API JavaComm e RXTX. Para baixar exemplos basta clicar no link:
http://www.4shared.com/file/rQBe5jJw/ProgramasFonteJavaSerial.html .
Este tutorial trata do compilador livre SDCC e da IDE Piklab utilizado para
desenvolvimento de sistemas embarcados com microcontroladores PIC e a ferramenta SanUSB.
Nesta pasta est disponvel tambm informaes sobre os compiladores CCS e MPLAB C18.
com exemplos em anexo. Neste tutorial so definidos os softwares SDCC e da IDE Piklab e um
exemplo de programa escrito na linguagem C para o microcontrolador PIC utilizando o
compilador e a IDE citados.
Objetivos:
Este tutorial tem como objetivo demonstrar ao leitor as instalaes do compilador SDCC e da
IDE Piklab.
O documento visa mostrar tambm exemplos de programas escritos em C.
H um plugin que permite integrar o SDCC junto como o IDE Eclipse, permitindo compilar
programas para microcontroladores.
O trabalho est em andamento no apoio Microchip PIC16 e PIC18 srie. SDCC Free Open
Source Software, distribudo sob a GNU General Public License (GPL).
Um detalhe legal que alm de gratuito ele possui verses para Linux, Windows e MAC. Para
quem tem curiosidade de usar ou busca uma ferramenta gratuita para iniciar seus projetos pode
fazer o download do SDCC no site http://sdcc.sourceforge.net/.
SDCC foi escrito por Sandeep Dutta e liberado sob a licena GPL. Desde seu lanamento, houve
vrias correes de bugs e melhorias. Em dezembro de 1999, o cdigo foi movido para o
SourceForge, onde todos os "usurios virou desenvolvedores" pode acessar a mesma fonte.
SDCC constantemente atualizado com todos os usurios e desenvolvedores de entrada.
Recursos:
Alguns dos recursos incluem:
sdas SDCC e sdld, um montador retargettable e vinculador, com base em ASXXXX, Free Open
Source Software, distribudo sob a GNU General Public License (GPL).
uma srie de otimizaes padro, como sub-expresso eliminao global, otimizaes de loop
(loop invariante, diminuio da resistncia das variveis de induo e reverso loop), dobra
constante e propagao, propagao de cpia, eliminao de cdigo morto e tabelas salto para
switch 'declaraes'.
backend MCU adaptvel especficos que devem ser bem adaptados para outros MCUs 8 bits
uma ampla gama de tipos de dados: char (8 bits, 1 byte), short (16 bits, 2 bytes), int (16 bits, 2
bytes), longo (32 bits, 4 bytes) e float (4 bytes IEEE).
263
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
a capacidade de informar sobre a complexidade de uma funo para ajudar a decidir o que deve
ser re-escrito em assembler.
SDCC tambm vem com a fonte de nvel depurador SDCDB, usando a atual verso do simulador
de S51 Daniel.
O SDCC um compilador que converte os arquivos com extenso .c para arquivos em assembly
.asm,. Por este motivo necessrio ainda um assembler (gpasm) e um linker (gplink) para
converter o assembly em hexadecimal para ser gravado no microcontrolador.
Assembler e Linker:
possvel usar para assembler e linker o GPUTILS. Esta ferramenta voltada exclusivamente
para microcontroladores PIC, e alm do assembler - gpasm - e do linker - gplink, tambm fornece
suporte para criar bibliotecas - gplib.
O GPUTILS esta disponvel sob licena GPL para Linux, Windows e Mac.
O GPUTILS tem um plugin para o MPLAB tambm, porm somente no ambiente Windows.
Pelo terminal do Linux ou Mac OSX, possvel compilar direto um arquivo.c, como o exemplo1
abaixo, com as seguintes linhas de comando utilizando o SDCC:
Para converter um arquivo .c (file.c) em um arquivo .asm:
sdcc -S -V -mpic16 -p18f2550 -D__18f2550 --use-non-free \
file.c -o file.asm
Para converter um arquivo.asm em um arquivo .o:
gpasm -c file.asm
Para linkar multiplos arquivos .o em um arquivo .hex:
gplink -m -s /usr/share/gputils/lkr/18f2550.lkr \
-o output.hex /usr/share/sdcc/non-free/lib/pic16/libdev18f2550.lib \
file1.o file2.o file3.o
Pronto, o file.hex foi gerado e j pode ser gravado com a ferramenta SanUSB.
IDE:
Como Ide, voc pode usar.
PIKdev, compatvel com assembler para todos os PICs e linguagem C apenas para srie PIC18.
PIKLab, e o mais completo, como trabalhar no MPLAB e tem total integrao com o SDCC e o
GPUTILS.
Para gravar:
Esta aplicao substitui a gravao via USB uma forma mais simples e direta de gravao. Com
apenas dois cliques no instalador automtico SanUSB.deb possvel instalar este aplicativo em
qualquer mquina com Linux (Ubuntu 10.04, equivalente ou posterior). Depois de instalado, a
264
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Se voc j tem o Java instalado (JRE ou SDK) baixe o instalador automtico.deb atualizado
disponvel no link: http://www.4shared.com/file/RN4xpF_T/sanusb_Linux.html contido
tambm ou na pasta http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html.
Se ainda no tem o Java (JRE ou SDK), baixe o instalador SanUSB, configurado com o
Java JRE, disponvel em: http://www.4shared.com/file/3mhWZS5g/sanusb.html .
Neste aplicativo, esto disponveis botes para Abrir o programa em hexadecimal
compilado, para Gravar o programa hexadecimal no microcontrolador via USB e para Resetar o
microcontrolador no intuito de coloc-lo em operao. A interface apresenta ainda um boto para
gravar e resetar automaticamente.
importante salientar que para utilizar esta ferramenta no Linux necessrio estar logado
com permisso para acessar a porta USB como, por exemplo, super-usurio (sudo su), e que para
estabelecer comunicao com o microcontrolador necessrio gravar anteriormente no
microcontrolador, somente uma vez, com qualquer gravador especfico para PIC, o gerenciador
de gravao pela USB GerenciadorLinux.hex, disponvel na pasta SanUSB ou em
http://www.4shared.com/file/HGrf9nDz/Gerenciador.html .
Aps gravar o GerenciadorLinux.hex com um gravador convencional para PIC, coloque o
circuito SanUSB em modo de gravao pela USB (pino 1 ligado ao Gnd (0V) atravs de boto ou
fio ) e conecte o cabo USB do circuito no PC. Se o circuito SanUSB estiver correto, acender o
led do pino B7. Pronto, o sistema j est preparado para gravar no microcontrolador, de forma
simples e direta, quantos programas .hex voc desejar utilizando a interface USB.
265
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Para programar novamente, basta pressionar o boto de gravao no pino 1, desconecte e conecte
o cabo USB de alimentao, selecione o programa.hex desejado em Abrir e pressione o boto
Gravar&Resetar.
Plataformas suportadas:
Linux - 86, Microsoft Windows - x86 e Mac OS X so as plataformas principais, os chamados
"oficialmente suportado".
Baixando SDCC:
Acesse o site http://sdcc.sourceforge.net/ incluindo a fonte e pacotes binrios para Linux - x86,
Microsoft Windows - x86 e Mac OS X - PPC e i386.
Linux - x86_64
Linux - Alpha
Linux - IBM Power5
NetBSD - i386
NetBSD - Sparc64
FreeBSD - i386
Sun Solaris - i386
Sun Solaris Sparc
Instalando o SDCC:
No sistema operacional Ubuntu, a instalao do SDCC bem simples.
266
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
_asm
<cdigo em linguagem assembly>
_endasm;
c) Chamada do Compilador.
267
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
.globl _delay
.rea CSEG
_delay: ...
RET
IDE Piklab:
Piklab um ambiente de desenvolvimento integrado (IDE) para aplicaes baseadas em
Microchip PIC e dsPIC microcontroladores semelhante ao ambiente MPLAB. Ele se integra com
268
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
o compilador e vrios toolchains assembler (como gputils, sdcc, C18) e com o simulador gpsim.
Ele suporta os programadores mais comuns (serial, paralela, ICD2, PICkit2, Picstart +), o
depurador ICD2, e vrios gestores de arranque (Tiny, PICkit2 e PICDEM).
269
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Programao:
Leitura, programa, verificar e apagar todo dispositivo ou faixas de memria somente os
selecionados.
Programao "Direta" (serial ou paralelo) para linha de base, de mdio porte, a maioria dos
dispositivos 18F e 24C eeproms.
ICD1 (no testado em tudo!)
ICD2 (serial e USB) com firmware upload automtico.
PICkit1 (regenerao osccal suportado).
PICkit2 apenas com a verso 1.x do firmware (regenerao osccal e upload de firmware
suportado).
Picstart + (dispositivos 18F no suportado).
Tiny Bootloader , bootloader PICkit2 e PICDEM bootloader FUSB.
Depurao:
ICD2 depurao de alguns dispositivos 16F (16F87X e 16F7X7) e todos os dispositivos 18F.
Gpsim simulador.
Run, etapa parar, e simples ponto de interrupo.
Contador de programa e ponto de interrupo no editor de fonte (quando desmontagem listagem
est disponvel).
Ler, assistir e gravar registros.
Ferramentas:
pinos de IO, alcance, layout DIP (para alguns dispositivos): vista Informaes do dispositivo.
Hex editor de arquivo, mas para todos os mais recentes dispositivos (testado somente com inhx32
formato).
Checksum computao (apoio parcial).
Registre-se ler: exibe registros disponveis.
Configurao do gerador de bits por algum toolchains (gpasm,SDCC, e PIC30): apoio parcial.
Modelo de gerador de fonte para algumas toolchains (gpasm, SDCC,e ASM30): apoio parcial.
270
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
271
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O comando anterior retorna os repositrios do Ubuntu com relao ao piklab. Assim podemos
saber se o software j foi instalado.
Utilizando o compilador SDCC e a IDE Piklab desenvolvemos alguns programas simples escritos
na linguagem C.
Para isso utilizamos o gravador SanUSB que grava arquivos .hex para o microcontrolador PIC
atravs da porta USB. Este programa est disponvel no link:
http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html .
272
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Exemplo 01:
#include <pic18f2550.h>
//#include "SanUSB.h"
273
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (ms--)
for (i=0; i < 330; i++)
;
}
void main() {
TRISBbits.TRISB7=0;
while(1)
{
LATBbits.LATB7=1;
delay_ms(500);
LATBbits.LATB7=0;
delay_ms(500);
}
}
Concluses:
Neste tutorial foram abordados o compilador SDCC e a IDE Piklab. Foi comentado tambm o
funcionamento de cada aplicativo e o seu uso na programao de microcontroladores,
especialmente o microcontroladores da famlia PIC.
Vimos que o compilador SDCC um compilador ANSIC que permite compilar e usar para a
linha Microchip PIC16 e PIC18, alm disso, tem a vantagem de ser um projeto open source sob
licena GLP da GNU. A base do seu funcionamento converter os arquivos com extenso .c
para arquivos em assembly .asm. Por isso necessrio um LINKER para converter o assembly
em hexadecimal para sua aplicao. Podemos utilizar a IDE Piklab, pois tem integrao completa
com o SDCC e o GPUTILS.
274
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
- Blocos de comando: em Pascal delimitado pelas palavras begin e end, em C pelos caracteres {
};
275
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
2- Nomeie, inserindo dois Label do componente Standard, o ComCombobox superior como Porta
serial e o inferior como Baud Rate;
3- Execute (F9) o projeto para ver se o executvel gerado; Para voltar ao projeto (Alt+F4);
if Bconectar.Caption='Conecta&r'
then begin
ComPort1.Connected:=true;
Bconectar.Caption:='Desconecta&r'
end
else begin
ComPort1.Connected:=false;
Bconectar.Caption:='Conecta&r'
end
4- Insira dois botes do componente Standard para ligar e desligar um Led, V em caption e
chame-os de Liga e Desliga; Clique duas vezes no boto Liga e escreva a String para ligar o
LED:
if Comport1.Connected = true then
begin
Comport1.WriteStr('L1');
276
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
end
else
begin
ShowMessage('Conecte a porta serial!!');
End
Clique duas vezes no boto Desliga e escreva a String para desligar o LED:
5- Para mostrar os bytes recebidos insira um Memo do componente Standard e configure name
para MemoRx, v na propriedade Line e apague qualquer texto Default dentro do MemoRx.
Ento escreva:
var recebe:string;
begin
//Escreva a expresso de recepo serial abaixo e declare a varivel recebe como string, veja
acima de begin:
277
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Comport1.ReadStr(recebe,count);
6- Insira dois panel para representar um Led, o primeiro apague caption, cor branca e nome
PledOff e o outro por trs apague caption, cor vermelha e nome PledOn e Visible:=false. One o
Led ir ascender (vermelho) quando o boto Liga for pressionando e apagar (branco) quando o
boto Desliga for pressionando.
importante salientar que pela USB as strings (L1, D1, etc.) emuladas so enviadas do
PIC para o supervisrio atravs bytes individuais, ento existem duas sadas para compreenso do
supervisrio:
- comandos enviados pelo microcontrolador com apenas um byte e no um conjunto de bytes, por
exemplo, L ao invs de L1 e M ao invs de L2.
Exemplo:
if recebe='L' then begin // Correto!
PLedOn.Visible:=true;
278
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
PLedOff.Visible:=false;
end;
- inserir na recepo serial uma varival global recebe (deve ser declarada antes de
implementation) do tipo string para receber os caracteres individuais emulados pela USB e
construir uma string dentro do evento de recepo serial do ComPort. (recebe:=recebe+receb1;)
var
Serial_Leds: TSerial_Leds;
recebe:string; //Varivel Global
implementation
.....
......
procedure TSerial_Leds.ComPort1RxChar(Sender: TObject; Count: Integer);
var receb1:string;
begin
ComPort1.ReadStr(receb1,count);
recebe:=recebe+receb1; //Artifcio usado para que a varivel global
//recebe os caracteres individuais emulados pela USB
if recebe = 'L1' then
begin
Label1.Caption:= 'Led ligado';
Button2.Caption:= 'Desligar';
recebe:=''; //Limpa a varivel global recebe
end;
Neste exemplo, o supervisrio envia L1 depois que o boto ligar Led 1 pressionado, o
label do boto muda para Desliga. Quando o boto Desligar Led 1 pressionado, o supervisrio
envia D1. O microcontrolador atua o led e depois confirma para o supervisrio enviando L1 ou
D1 que atualiza o label indicando Led 1 ligado ou desligado.
279
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Esta interface pode ser construda de forma similar ao exemplo anterior, inserindo na
recepo serial uma varival global recebe do tipo string para receber os caracteres individuais
emulados pela USB, no evento de recepo serial do ComPort. Ela deve ser declarada antes de
implementation:
var
Serial_Leds: TSerial_Leds;
recebe:string; //Varivel Global
implementation
.....
......
procedure TSerial_Leds.ComPort1RxChar(Sender: TObject; Count: Integer);
var receb1:string;
begin
ComPort1.ReadStr(receb1,count);
recebe:=recebe+receb1; //Artifcio usado para que a varivel global
//recebe os caracteres individuais emulados pela USB
if recebe = 'L1' then
begin
Label1.Caption:= 'Led ligado';
Button2.Caption:= 'Desligar';
recebe:=''; //Limpa a varivel global recebe
end;
PROGRAMA DO MICROCONTROLADOR
280
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#include <SanUSB.h>
#include <usb_san_cdc.h>
char dado1,dado2;
main() {
port_b_pullups(true);
output_low(pin_b0);
output_low(pin_b6);
output_low(pin_b7);
while(1)
{
if (usb_cdc_kbhit(1)) //se o endpoint de contem dados do PC
{
dado1=usb_cdc_getc();
if (dado1=='L')
{
dado2=usb_cdc_getc();
if (dado2=='1')
{
output_high(pin_b0);
printf(usb_cdc_putc,"L1");
}
if (dado2=='2')
{
output_high(pin_b6);
printf(usb_cdc_putc,"L2");
}
if (dado2=='3')
{
output_high(pin_b7);
printf(usb_cdc_putc,"L3");
}
}
if (dado1=='D')
281
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
{
dado2=usb_cdc_getc();
if (dado2=='1')
{
output_low(pin_b0);
printf(usb_cdc_putc,"D1");
}
if (dado2=='2')
{
output_low(pin_b6);
printf(usb_cdc_putc,"D2");
}
if (dado2=='3')
{
output_low(pin_b7);
printf(usb_cdc_putc,"D3");
}
}
}
}}
282
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Note em (a), que o lado da entrada positiva o mesmo lado da alimentao +Vcc e que,
quando a entrada no-inversora ou o transistor Q1 saturado, parte da corrente de +Vcc tende a
ir, passando por Rc, no sentido de Vo, gerando uma tenso na sada Vo positiva. Quando a
entrada inversora ou o transistor Q2 saturado, parte da corrente tende a ir em sentido
contrrio, gerando uma tenso na sada Vo negativa.
Na verdade, a estrutura interna de um amplificador operacional muito complexa, sendo
constitudo por dezenas de transistores e resistncias contidos numa muito pequena pastilha de
Silcio (chip). A figura 3 mostra o diagrama de componentes internos do LM741.
284
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Tenso de "offset" - A sada de um amplificador operacional ideal nula quando suas entradas
esto em mesmo nvel de tenso. Nos amplificadores reais, devido principalmente a um
casamento imperfeito dos dispositivos de entrada, normalmente diferencial, a sada do
amplificador operacional pode ser diferente de zero quando ambas entradas esto no potencial
zero. Significa dizer que h uma tenso CC equivalente, na entrada, chamada de tenso de
"offset". O valor da tenso de "offset" nos amplificadores comerciais esto situado na faixa de 1 a
100 mV. Os componentes comerciais so normalmente dotados de entradas para ajuste da
tenso de "offset".
Na prtica os Amp-Ops so circuitos integrados que, como qualquer sistema fsico tem
suas limitaes. Um dos Amp-Ops mais difundidos at hoje o 741, que recebe inmeras
codificaes de acordo com seu fabricante, como por exemplo: uA741, LM741 entre outras. Os
pinos 1 e 5 so destinados ao ajuste da tenso de off-set. O Amp-Op 741 mostrado na figura a
seguir:
285
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
em que A o ganho do amplificador, dito em malha aberta (sem realimentao). Este ganho
normalmente muito elevado, sendo da ordem de 105 ou superior. A tenso mxima de sada
igual tenso de alimentao, por exemplo, 15 V, o que significa que em malha aberta, uma
diferena de tenso da ordem de 100mV entre as duas entradas suficiente para elevar a sada a
este valor, saturando o amplificador. Na Figura 2 representa-se esta "caracterstica de
transferncia" de um amplificador operacional, isto , o traado da tenso de sada em funo da
tenso de entrada.
286
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Esse sistema em malha aberta tambm conhecido como comparador de tenso entre Vi
(tenso de entrada) e Vref (tenso de referncia), que nesse tem a Vref igual ao Gnd. possvel
ver uma prtica de LM 741 no link: http://www.youtube.com/watch?v=EDol0zL96Ms .
287
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Vin V V V V R
= out out = 2
R1 R2 Vin R1
Quase todas as aplicaes de AmpOps envolvem realimentao negativa. Nesse caso,
quando a tenso de sada aumenta, uma parte da tenso de sada realimentada para a entrada
inversora i reduzindo a sada. Muito rapidamente, o AmpOp encontra seu ponto operacional.
Note que o ganho do AmpOp depende da relao entre R2 e R1.
Exemplo de um amplificador inversor:
288
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Nesse circuito, a corrente i4 igual a soma de i1 , i2 e i3. Na figura abaixo, observa-se que
o circuito um amplificador somador, em que cada entrada pode ser operada com fatores de
escala diferentes. i4= - es / R4
Dessa forma, considerando R4 igual a R e as palavras digitais 10011 e 00001 (em decimal
19 e 1, respectivamente), os valores de tenso na sada sero:
Vo = -(16 + 0 + 0 + 2 + 1) = -19V
Vo = -(0 + 0 + 0 + 0 + 1) = -1V
289
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Na prtica pode se considerar o valor de R4 muito maior que R para limitar o valor da
tenso mxima de sada em 5V. Uma prtica interessante construir um conversor DA a partir de
sinais digitais de uma porta do microcontrolador e conferindo o valor convertido com um
multmetro.
A tenso de sada deve ser menor do que a tenso de alimentao, pois o ganho linear
somente se no h saturao. Se U1 for ligado ao Gnd, a sada ser igual a entrada no inversora
U2 amplificada pelo ganho (R4/R1). Dessa forma, possvel amplificar sinais de tenso com
pequena amplitude (sensores de corrente e de vibrao) e aumente a capacidade do conversor
AD.
290
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Muito utilizados por sensores com sinais de tenso diferenciais como termopares e
sensores de corrente. O amplificador de instrumentao representado na figura abaixo, adota dois
amplificadores no inversores (AmpOps 1 e 2) na entrada e um amplificador diferencial (AmpOp
3) na sada. Neste caso, a resistncia de entrada vista por cada uma das duas fontes infinita
(com a mesma resistncia de entrada dos terminais positivos dos AmpOps 1 e 2), e o ganho de
tenso dado pelo produto de dois cocientes entre as resistncias no amplificador diferencial.
Nesse caso a tenso de referncia na entrada vs2 pode ser flutuante, ou seja, possvel
amplificar faixas de tenses entre as entradas vs1 e vs2 no simtricas.
v1+ = v1- = vs1 -> vo1 = v1- + Rx . i e i = (vs1-vs2) / R -> vo1 = vs1 + Rx . (vs1-vs2) / R
v2+ = v2- = vs2 -> vo2 = v2- - Rx . i e i = (vs1 -vs2) / R -> vo2 = vs2 - Rx . (vs1-vs2) / R
291
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Amplificador Integrador
O integrador e o diferenciador so circuitos que simulam os operadores matemticos integral e
derivada respectivamente. Alm disso, so usados para modificar formas de onda, gerando
pulsos, ondas quadradas, ondas triangulares etc.
1
Vs = . Vedt
R.C
(a) (b)
Figura 26. 8: Resposta de um integrador a um degrau de tenso (a) positivo e (b) negativo.
292
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Exerccio Resolvido
1
fC = = 160 Hz
2. .10.10 3.0,1.10 6
293
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Portanto, para frequncias muito acima de 160Hz teremos uma boa integrao, isto ,
obteremos na sada uma onda triangular com grande linearidade.
Quanto maior for a frequncia do sinal em relao frequncia de corte, melhor ser a
integrao do sinal. Na Fig2.33a a frequncia da onda quadrada de entrada menor do que fC e
na Fig2.33b a frequncia da onda quadrada muito maior do que fC, resultando uma sada com
menor amplitude mas perfeitamente triangular.
f=100Hz
(a)
f=2KHz
(b)
294
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
26.7 DIFERENCIADOR
dV e
V S = R.C.
dt
Isto , a tenso de sada proporcional derivada da tenso de entrada. Por exemplo se a
entrada for uma tenso constante a sada ser nula pois a derivada de uma constante zero, se a
entrada for uma rampa, a sada ser constante. O sinal negativo se deve configurao
inversora.
Na prtica o circuito da Fig2.34 sensvel a rudo, tendendo a saturar. A soluo limitar
o ganho em altas frequncias colocando em srie com C uma resistncia RS como na Fig2.35a.
A Fig2.35b a curva de resposta em frequncia do circuito.
295
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
(a) ( b)
Figura 26. 12: ( a ) Diferenciador prtico e ( b ) curva de resposta em frequncia.
O circuito da figura 2.35a somente funcionar como diferenciador para frequncias muito
abaixo da frequncia de corte, acima o circuito se comportar como amplificador inversor de
ganho igual a R/RS.
O circuito s se comportar como diferenciador se f<< fC, pois nessas condies a
reatncia de C ser muito maior do que RS e na prtica como se no existisse RS e portanto o
circuito ter comportamento semelhante ao da Fig2.34.
Exerccio Resolvido
Para o circuito da Fig2.35a qual a forma de onda de sada se a entrada quadrada, para as
frequncias de 100Hz e 2KHz.?
1
fC = = 1600Hz
2. .10 .0,1.10 6
3
Para frequncias muito abaixo de 1600Hz a sada sero pulsos muito estreitos, negativos na borda
de subida e positivos na borda de descida.
296
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
(a)
(b)
Figura 26. 13: Resposta de um diferenciador a uma onda quadrada de ( a ) f<<fc ( b ) f>fc.
297
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Continuando com o conceito que a tenso na sada (Vo) ser nula ou a desejada
quando as entradas inversora (-) e no inversora (+) apresentem o mesmo potencial (V+ =
V-). Ento:
298
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O circuito seguidor de tenso constitui uma das aplicaes mais comuns do amplificador
operacional e um caso particular do no inversor com R2 igual a zero e R1 infinito, da o ganho
unitrio. Esse circuito designado como isolador ou buffer (amortecedor).
Vo/Vs = 1 -> Vo = Vs
299
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
O Slew Rate (SR) significa taxa de inclinao ou de resposta que a mxima taxa de
variao da tenso na sada com o tempo, isto :
SR =VS/t.
Ela surge devido ao tempo necessrio para saturao dos transistores internos do AmpOp.
Na Fig2.9 o AmpOp do exemplo tem um SR = 2V/1s = 2v/s, isto significa que se o sinal de
entrada for mais rpido do que isso, o AmpOP no responder na mesma velocidade distorcendo
o sinal na sada.
SR = w.VM
SR = 2f .VM
300
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
Exerccio Resolvido
A) Um AmpOp tem SR = 2V/s, qual a mxima frequncia (w=2..f) que pode ter um sinal
senoidal de 10V de amplitude na entrada do AmpOp para que no haja distoro por
slew rate na sada?
Soluo:
27.1 i2c_sanusb.c
/**********http://br.groups.yahoo.com/group/GrupoSanUSB/*************************/
// Definies dos pinos de comunicao I2C SanUSB
#ifndef scl
#define scl pin_c1 // pino de clock
301
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
/****************************************************************************/
//SUB-ROTINAS DA COMUNICAO I2C
void I2C_start(void)
// coloca o barramento na condio de start
{
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
seta_sda; // coloca a linha de dados em alta impedncia (1)
delay_us(5);
seta_scl; // coloca a linha de clock em alta impedncia (1)
delay_us(5);
apaga_sda; // coloca a linha de dados em nvel 0
delay_us(5);
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
}
void I2C_stop(void)
// coloca o barramento na condio de stop
{
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
apaga_sda; // coloca a linha de dados em nvel 0
delay_us(5);
seta_scl; // coloca a linha de clock em alta impedncia (1)
delay_us(5);
seta_sda; // coloca a linha de dados em alta impedncia (1)
delay_us(5);
}
void i2c_ack()
// coloca sinal de reconhecimento (ack) no barramento
{
apaga_sda; // coloca a linha de dados em nvel 0
302
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_us(5);
seta_scl; // coloca a linha de clock em alta impedncia (1)
delay_us(5);
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
seta_sda; // coloca a linha de dados em alta impedncia (1)
delay_us(5);
}
void i2c_nack()
// coloca sinal de no reconhecimento (nack) no barramento
{
seta_sda; // coloca a linha de dados em alta impedncia (1)
delay_us(5);
seta_scl; // coloca a linha de clock em alta impedncia (1)
delay_us(5);
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
}
boolean i2c_le_ack()
// efetua a leitura do sinal de ack/nack
{
boolean estado;
seta_sda; // coloca a linha de dados em alta impedncia (1)
delay_us(5);
seta_scl; // coloca a linha de clock em alta impedncia (1)
delay_us(5);
estado = input(sda); // l o bit (ack/nack)
apaga_scl; // coloca a linha de clock em nvel 0
delay_us(5);
return estado;
}
apaga_scl;
delay_us(5);
}
// ativa sda
seta_sda;
}
27.2 MOD_LCD_SANUSB.c
/************************************************************************/
/* MOD_LCD_SANUSB.C - Biblioteca de manipulao dO mdulo LCD */
/* */
/* http://br.groups.yahoo.com/group/GrupoSanUSB/ */
/* */
/************************************************************************/
//// lcd_ini(); //Deve ser escrita no inicio da funo main()
////
//// lcd_pos_xy(x,y) Seta a posio em que se deseja escrever
////
//// Ex.: lcd_pos_xy(1,2); // x (coluna) y(linha)
//// printf(lcd_escreve,"BIBLIOTECA SANUSB"); //Escreve na linha 2
#ifndef lcd_enable
#define lcd_enable pin_b1 // pino Enable do LCD
#define lcd_rs pin_b0 // pino rs do LCD
byte lcd_le_byte()
// l um byte do LCD (somente com pino RW)
{
byte dado;
// configura os pinos de dados como entradas
input(lcd_d4);
input(lcd_d5);
input(lcd_d6);
input(lcd_d7);
// se o pino rw for utilizado, coloca em 1
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_high(lcd_enable); // habilita display
dado = 0; // zera a varivel de leitura
// l os quatro bits mais significativos
if (input(lcd_d7)) bit_set(dado,7);
if (input(lcd_d6)) bit_set(dado,6);
if (input(lcd_d5)) bit_set(dado,5);
if (input(lcd_d4)) bit_set(dado,4);
// d um pulso na linha enable
output_low(lcd_enable);
output_high(lcd_enable);
// l os quatro bits menos significativos
if (input(lcd_d7)) bit_set(dado,3);
if (input(lcd_d6)) bit_set(dado,2);
if (input(lcd_d5)) bit_set(dado,1);
if (input(lcd_d4)) bit_set(dado,0);
output_low(lcd_enable); // desabilita o display
return dado; // retorna o byte lido
}
output_low(lcd_enable);
}
void lcd_ini()
// rotina de inicializao do display
{
byte conta;
output_low(lcd_d4);
output_low(lcd_d5);
output_low(lcd_d6);
output_low(lcd_d7);
output_low(lcd_rs);
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_low(lcd_enable);
while(read_eeprom(0xfd));
delay_ms(15);
// envia uma seqncia de 3 vezes 0x03
// e depois 0x02 para configurar o mdulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
308
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicializao do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}
output_low(lcd_rs);
// retorna o valor do caractere
return valor;
}
27.3 SanUSB.h
/////////////////////////http://br.groups.yahoo.com/group/GrupoSanUSB////////////
#include <18F2550.h>
#device ADC=10
#fuses HSPLL,PLL5,
USBDIV,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
//#use delay(clock=48000000)//Frequncia padro da USB
#byte OSCCON=0XFD3
#use delay(clock=4000000) // Clock do oscilador interno do processador de 4MHz
#USE RS232 (BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7)
void clock_int_4MHz(void)
{
OSCCON=0B01100110;
while(read_eeprom(0xfd));
}
BIBLIOTECA usb_san_cdc.h:
/////////////////////////////////////////////////////////////////////////
//// usb_san_cdc.h
////http://br.groups.yahoo.com/group/GrupoSanUSB
void usb_cdc_flush_out_buffer(void);
//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE FALSE
#DEFINE USB_CDC_DEVICE TRUE
#define USB_CDC_COMM_IN_ENDPOINT 1
#define USB_CDC_COMM_IN_SIZE 8
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE USB_CDC_COMM_IN_SIZE
/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries. See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __USB_PIC_PERIF__
311
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#define __USB_PIC_PERIF__ 1
#endif
#if __USB_PIC_PERIF__
#if defined(__PCM__)
#error CDC requires bulk mode! PIC16C7x5 does not have bulk mode
#else
#include <pic18_usb.h> //Microchip 18Fxx5x hardware layer for usb.c
#endif
#else
#include <usbn960x.c> //National 960x hardware layer for usb.c
#endif
#include <usb_san_desc.h> //USB Configuration and Device descriptors for this UBS device
#include <usb.c> //handles usb setup tokens and get descriptor reports
struct {
int32 dwDTERrate; //data terminal rate, in bits per second
int8 bCharFormat; //num of stop bits (0=1, 1=1.5, 2=2)
int8 bParityType; //parity (0=none, 1=odd, 2=even, 3=mark, 4=space)
int8 bDataBits; //data bits (5,6,7,8 or 16)
} usb_cdc_line_coding;
int8 usb_cdc_encapsulated_cmd[8];
int8 usb_cdc_put_buffer[USB_CDC_DATA_IN_SIZE];
int1 usb_cdc_put_buffer_free;
#if USB_CDC_DATA_IN_SIZE>=0x100
int16 usb_cdc_put_buffer_nextin=0;
// int16 usb_cdc_last_data_packet_size;
#else
int8 usb_cdc_put_buffer_nextin=0;
// int8 usb_cdc_last_data_packet_size;
#endif
struct {
int1 got;
#if USB_CDC_DATA_OUT_SIZE>=0x100
int16 len;
int16 index;
#else
int8 len;
int8 index;
#endif
312
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
} usb_cdc_get_buffer_status;
int8 usb_cdc_get_buffer_status_buffer[USB_CDC_DATA_OUT_SIZE];
#if (defined(__PIC__))
#if __PIC__
//#locate
usb_cdc_get_buffer_status_buffer=0x500+(2*USB_MAX_EP0_PACKET_LENGTH)+USB_C
DC_COMM_IN_SIZE
#if USB_MAX_EP0_PACKET_LENGTH==8
#locate usb_cdc_get_buffer_status_buffer=0x500+24
#elif USB_MAX_EP0_PACKET_LENGTH==64
#locate usb_cdc_get_buffer_status_buffer=0x500+136
#else
#error CCS BUG WONT LET ME USE MATH IN LOCATE
#endif
#endif
#endif
int1 usb_cdc_got_set_line_coding;
struct {
int1 dte_present; //1=DTE present, 0=DTE not present
int1 active; //1=activate carrier, 0=deactivate carrier
int reserved:6;
} usb_cdc_carrier;
#byte INTCON=0xFF2
#bit INT_GIE=INTCON.7
//handle OUT token done interrupt on endpoint 0 [read encapsulated cmd and line coding data]
void usb_isr_tok_out_cdc_control_dne(void) {
debug_usb(debug_putc,"CDC %X ",__usb_cdc_state);
switch (__usb_cdc_state) {
//printf(putc_tbe,"@%X@\r\n", __usb_cdc_state);
case USB_CDC_OUT_COMMAND:
//usb_get_packet(0, usb_cdc_encapsulated_cmd, 8);
memcpy(usb_cdc_encapsulated_cmd, usb_ep0_rx_buffer,8);
#if USB_MAX_EP0_PACKET_LENGTH==8
__usb_cdc_state=USB_CDC_WAIT_0LEN;
usb_request_get_data();
#else
usb_put_0len_0();
__usb_cdc_state=0;
313
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#endif
break;
#if USB_MAX_EP0_PACKET_LENGTH==8
case USB_CDC_WAIT_0LEN:
usb_put_0len_0();
__usb_cdc_state=0;
break;
#endif
case USB_CDC_OUT_LINECODING:
//usb_get_packet(0, &usb_cdc_line_coding, 7);
//printf(putc_tbe,"\r\n!GSLC FIN!\r\n");
memcpy(&usb_cdc_line_coding, usb_ep0_rx_buffer,7);
__usb_cdc_state=0;
usb_put_0len_0();
break;
default:
__usb_cdc_state=0;
usb_init_ep0_setup();
break;
}
}
default:
usb_request_stall();
break;
}
}
}
//handle OUT token done interrupt on endpoint 3 [buffer incoming received chars]
void usb_isr_tok_out_cdc_data_dne(void) {
usb_cdc_get_buffer_status.got=TRUE;
usb_cdc_get_buffer_status.index=0;
#if (defined(__PIC__))
#if __PIC__
usb_cdc_get_buffer_status.len=usb_rx_packet_size(USB_CDC_DATA_OUT_ENDPOINT);
#else
usb_cdc_get_buffer_status.len=usb_get_packet_buffer(
USB_CDC_DATA_OUT_ENDPOINT,&usb_cdc_get_buffer_status_buffer[0],USB_CDC_DAT
A_OUT_SIZE);
#endif
#else
usb_cdc_get_buffer_status.len=usb_get_packet_buffer(
USB_CDC_DATA_OUT_ENDPOINT,&usb_cdc_get_buffer_status_buffer[0],USB_CDC_DAT
A_OUT_SIZE);
#endif
}
usb_cdc_flush_out_buffer();
}
//send a 0len packet if needed
// else if (usb_cdc_last_data_packet_size==USB_CDC_DATA_IN_SIZE) {
// usb_cdc_last_data_packet_size=0;
// printf(putc_tbe, "FL 0\r\n");
// usb_put_packet(USB_CDC_DATA_IN_ENDPOINT,0,0,USB_DTS_TOGGLE);
// }
else {
usb_cdc_put_buffer_free=TRUE;
//printf(putc_tbe, "FL DONE\r\n");
}
}
void usb_cdc_flush_out_buffer(void) {
if (usb_cdc_put_buffer_nextin) {
usb_cdc_put_buffer_free=FALSE;
//usb_cdc_last_data_packet_size=usb_cdc_put_buffer_nextin;
//printf(putc_tbe, "FL %U\r\n", usb_cdc_put_buffer_nextin);
usb_put_packet(USB_CDC_DATA_IN_ENDPOINT,usb_cdc_put_buffer,usb_cdc_put_buffer_n
extin,USB_DTS_TOGGLE);
usb_cdc_put_buffer_nextin=0;
}
}
void usb_cdc_init(void) {
usb_cdc_line_coding.dwDTERrate=9600;
usb_cdc_line_coding.bCharFormat=0;
usb_cdc_line_coding.bParityType=0;
usb_cdc_line_coding.bDataBits=8;
(int8)usb_cdc_carrier=0;
usb_cdc_got_set_line_coding=FALSE;
usb_cdc_break=0;
usb_cdc_put_buffer_nextin=0;
usb_cdc_get_buffer_status.got=0;
usb_cdc_put_buffer_free=TRUE;
while(read_eeprom(0xfd));
}
char usb_cdc_getc(void) {
char c;
316
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
while (!usb_cdc_kbhit()) {}
c=usb_cdc_get_buffer_status_buffer[usb_cdc_get_buffer_status.index++];
if (usb_cdc_get_buffer_status.index >= usb_cdc_get_buffer_status.len) {
usb_cdc_get_buffer_status.got=FALSE;
usb_flush_out(USB_CDC_DATA_OUT_ENDPOINT, USB_DTS_TOGGLE);
}
return(c);
}
void usb_cdc_putc_fast(char c) {
int1 old_gie;
/*
if (usb_tbe(USB_CDC_DATA_IN_ENDPOINT)) {
if (usb_cdc_put_buffer_nextin)
usb_cdc_flush_out_buffer();
}
*/
if (usb_cdc_put_buffer_free) {
usb_cdc_flush_out_buffer();
}
}
void usb_cdc_putc(char c) {
while (!usb_cdc_putready()) {
if (usb_cdc_put_buffer_free) {
usb_cdc_flush_out_buffer();
}
//delay_ms(500);
//printf(putc_tbe,"TBE=%U CNT=%U
LST=%U\r\n",usb_tbe(USB_CDC_DATA_IN_ENDPOINT), usb_cdc_put_buffer_nextin,
usb_cdc_last_data_packet_size);
317
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
}
usb_cdc_putc_fast(c);
}
#include <ctype.h>
BYTE gethex1_usb() {
char digit;
digit = usb_cdc_getc();
usb_cdc_putc(digit);
if(digit<='9')
return(digit-'0');
else
return((toupper(digit)-'A')+10);
}
BYTE gethex_usb() {
int lo,hi;
hi = gethex1_usb();
lo = gethex1_usb();
if(lo==0xdd)
return(hi);
else
return( hi*16+lo );
}
--max;
len=0;
do {
c=usb_cdc_getc();
if(c==8) { // Backspace
if(len>0) {
len--;
usb_cdc_putc(c);
usb_cdc_putc(' ');
usb_cdc_putc(c);
}
} else if ((c>=' ')&&(c<='~'))
if(len<max) {
318
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
s[len++]=c;
usb_cdc_putc(c);
}
} while(c!=13);
s[len]=0;
}
get_string_usb(s, 5);
i=atoi(s);
return(i);
}
get_string_usb(s, 7);
l=atol(s);
return(l);
}
float get_float_usb() {
char s[20];
float f;
get_string_usb(s, 20);
f = atof(s);
return(f);
}
#endif
27.4 usb_san_desc.h
///////////////////////////////////////////////////////////////////////////
319
APOSTILA DE MICROCONTROLADORES PIC E PEFIFRICOS - tinyurl.com/SanUSB
#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__
#include <usb.h>
//////////////////////////////////////////////////////////////////
///
/// start config descriptor
/// right now we only support one configuration descriptor.
/// the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////
//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor ==37
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==38
USB_CDC_COMM_IN_ENDPOINT | 0x80, //endpoint number and direction
0x03, //transfer type supported (0x03 is interrupt) ==40
USB_CDC_COMM_IN_SIZE,0x00, //maximum packet size supported ==41,42
250, //polling interval, in ms. (cant be smaller than 10) ==43
//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor ==60
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==61
USB_CDC_DATA_OUT_ENDPOINT, //endpoint number and direction (0x02 = EP2
OUT) ==62
0x02, //transfer type supported (0x02 is bulk) ==63
// make8(USB_CDC_DATA_OUT_SIZE,0),make8(USB_CDC_DATA_OUT_SIZE,1),
//maximum packet size supported ==64, 65
USB_CDC_DATA_OUT_SIZE & 0xFF, (USB_CDC_DATA_OUT_SIZE >> 8) & 0xFF,
//maximum packet size supported ==64, 65
250, //polling interval, in ms. (cant be smaller than 10) ==66
//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor ==53
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05) ==54
USB_CDC_DATA_IN_ENDPOINT | 0x80, //endpoint number and direction (0x82 = EP2
IN) ==55
0x02, //transfer type supported (0x02 is bulk) ==56
// make8(USB_CDC_DATA_IN_SIZE,0),make8(USB_CDC_DATA_IN_SIZE,1),
//maximum packet size supported ==57, 58
USB_CDC_DATA_IN_SIZE & 0xFF, (USB_CDC_DATA_IN_SIZE >> 8) & 0xFF,
//maximum packet size supported ==64, 65
250, //polling interval, in ms. (cant be smaller than 10) ==59
};
//define how many interfaces there are per config. [0] is the first config, etc.
const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={2};
const int16
USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTER
FACES][4]=
{
//config 1
//interface 0
//class 1-4
18,23,27,32,
//interface 1
//no classes for this interface
0xFFFF,0xFFFF,0xFFFF,0xFFFF
};
//////////////////////////////////////////////////////////////////
///
/// start device descriptors
///
//////////////////////////////////////////////////////////////////
//the offset of the starting location of each string. offset[0] is the start of string 0, offset[1] is the
start of string 1, etc.
char USB_STRING_DESC_OFFSET[]={0,4,12};
#ENDIF
324