Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Pic C
Apostila Pic C
Apostila Pic C
APOSTILA DE:
PROGRAMAO DE
MICROCONTROLADORES PIC
USANDO LINGUAGEM C
MICROCONTROLADORES PIC EM C
INTRODUO ....................................................................................................................... 2
1. INTRODUO AOS MICROCONTROLADORES ...................................................... 3
1.1.
O que um Microcontrolador? ................................................................................. 3
1.2.
Qual a diferena do Microcontroladores e dos Microprocessadores? ...................... 3
1.3.
O que significa PIC? ................................................................................................. 3
1.4.
Programao do PIC ................................................................................................. 5
1.5.
O que o MpLab?..................................................................................................... 6
2. O PIC 16F877A ................................................................................................................ 7
2.1. NOMENCLATURA DOS PINOS ........................................................................... 8
2.2. QUE SCHMITT-TRIGGER?.............................................................................. 10
2.3. GERADOR DE RELGIO OSCILADOR ......................................................... 12
2.4.
Oscilador XT........................................................................................................... 12
2.5.
Oscilador RC........................................................................................................... 13
3. AMBIENTE INTEGRADO DE DESENVOLVIMENTO (IDE) .................................. 16
3.1. CRIAO DE UM PROJETO:.............................................................................. 17
4. INTRODUO LINGUAGEM C O PRIMEIRO PROGRAMA........................... 25
5. USO DO MPSIM PARA SIMULAO ....................................................................... 29
6. AS VARIVEIS NO COMPILADOR CCS .................................................................. 43
6.1. O que so Variveis? .............................................................................................. 43
6.2.
Tipos de variveis ................................................................................................... 43
6.3. OS MODIFICADORES.......................................................................................... 43
6.4.
Declarao de Variveis ......................................................................................... 44
6.5.
Inicializando Variveis ........................................................................................... 45
6.6.
Variveis Locais e Globais ..................................................................................... 46
6.7.
Constantes ............................................................................................................... 46
Exerccios 6.1:..................................................................................................................... 47
7. OPERADORES EM C.................................................................................................... 48
7.1.
O Operador de Atribuio....................................................................................... 48
7.2.
Os Operadores Aritmticos..................................................................................... 48
7.3.
Operadores Relacionais e Lgicos.......................................................................... 50
7.4.
Operadores de Incremento e Decremento............................................................... 51
7.5.
Operadores Aritmticos de Atribuio ................................................................... 52
7.6.
Operadores Bit a Bit................................................................................................ 53
7.7.
Interface com os interruptores ................................................................................ 55
Exerccios 7.1: .............................................................................................................. 59
8. TEMPORIZAO NO PIC ........................................................................................... 61
8.1. A funo Delay:...................................................................................................... 61
8.2.
Interrupo Temporizador: ..................................................................................... 64
8.3.
O temporizador TIMER 0....................................................................................... 64
Exerccios 8.1: .............................................................................................................. 68
9. SINAIS ANALGICOS NO PIC................................................................................... 70
9.1. CONCEITOS BSICOS DOS CONVERSORES ................................................. 70
9.2.
Tratamento de Entradas Analgicas no PIC ........................................................... 72
Exemplo 9.2: ....................................................................................................................... 74
Exerccios:........................................................................................................................... 76
10.
COMUNICAO SERIAL ....................................................................................... 79
10.1.
Comunicao Serial Sncrona x Comunicao Serial Assncrona...................... 79
10.2.
O RS232 no PIC.................................................................................................. 80
EXEMPLO:........................................................................................................................ 81
Exerccios: ....................................................................................................................... 82
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
INTRODUO
Esta pequena apostilha esta orientada para os profissionais tcnicos que
necessitam de conhecimentos bsicos do PIC. Abordaremos noes da estrutura
do PIC16F877A e depois nosso foco ser o estudo da linguagem C para
microcontroladores.
A linguagem C provavelmente a linguagem mais conhecida e tem muitas
vantagens sobre a linguagem assembler no nvel tcnico.
Primeiramente trataremos sobre a instalao dos programas necessrios
para poder trabalhar. O compilar CCS ser o escolhido e o entorno ou editor ser o
MatLab V 7.4.
Uma vez com nosso ambiente instalado abordaremos as caractersticas
bsicas do PIC 16F877A. importante mencionar que usaremos o mdulo de
desenvolvimento SD-1700 que atualmente esta descontinuado, mas considerado
pelo autor como uma excelente ferramenta.
O estudo da linguagem C ser focado compreenso das funes bsicas e
sua relao com o circuito de teste. Com esses espera-se que o leitor consiga
entender a infinita utilizada destes magnficos dispositivos.
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
1.1.
O que um Microcontrolador?
1.2.
1.3.
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
1.4.
Programao do PIC
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
O que o MpLab?
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
2. O PIC 16F877A
Dentro de todos os PICs este um dos que apresenta mais recursos e se
adpata as necessidades de nosso curso, entre suas caratersticas principais
podemos citar:
33
portas
configurveis
como entrada
ou sada.
15
interrupes
disponveis.
Memria
de
programao
EPROM
FLASH,
que
permite
a
gravao
rpida
do
programa
diversas vezes no mesmo chip, sem a necessidade de apag-lo por meio de
luz ultravioleta, como acontece nos microcontroladores de janela;
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
2.1.
Nome do Pino
I/O/P
TIPO
OSC1/CLKIN
Nm.
Pino
13
Descrio
ST/CMOS
OSC2/CLKOUT
14
MCLR/Vpp
I/P
ST
Vss
12/31
GND
Vdd
11/32
Alimentao positiva
PORTA (I/O digitais bidirecionais e sistema analgico)
RA0/AN0
I/0
TTL
RA1/AN1
I/0
TTL
RA2/AN2/VREF/CVREF
4
-
I/0
-
TTL
-
RA3/AN3
/VREF+
5
-
I/0
-
TTL
-
RA4/TOCKI
/C10OUT
6
-
I/0
-
ST
-
RA5/SS/AN4
/C2OUT
I/0
TTL
RB0/INT
33
I/O
TTL/ST(1)
RB1
34
I/O
TTL
RB2
35
I/O
TTL
RB3/PGM
36
TTL
RB4
37
TTL
RB5
38
TTL
RB6/PGC
39
RB7/PGD
40
I/O
Microcontroladores - PIC
TTL/ST
TTL/ST(2)
MICROCONTROLADORES PIC EM C
PORTC (I/Os digitais bidirecionais):
RC0/T1OSO
/TICK1
15
I/O
ST
RC1/T1OSI
/CCPS
16
I/O
ST
RC2/CCP1
17
I/O
ST
RC2: I/O digital ou entrada do Capture1 ou sadas para
Compare1/PWM1.
RC3/SCK/SCL
18
I/O
ST
RC4/SDI/DAS
23
I/O
ST
RC5/SDO
24
I/O
ST
RC6/TX/CK
25
I/O
ST
RC7/RX/DT
26
I/O
ST
RD0/PSP0
19
I/O
TTL/ST(3)
RD1/PSP1
20
I/O
TTL/ST(3)
RD2/PSP2
21
I/O
TTL/ST(3)
RD3/PSP3
22
I/O
TTL/ST(3)
RD4/PSP4
27
I/O
TTL/ST(3)
RD5/PSP5
28
I/O
TTL/ST(3)
RD6/PSP6
29
I/O
TTL/ST(3)
RD7/PSP7
30
I/O
TTL/ST(3)
RE0/RD/AN5
I/O
TTL/ST(3)
RE0/RD/AN6
I/O
TTL/ST(3)
RE0/RD/AN7
10
I/O
TTL/ST(3)
Legenda:
I =Input (entrada)
I/O = Input/OutPut (entrada ou sada)
- = no utilizado
ST = Entrada tipo Schmitt trigger
Microcontroladores - PIC
O = Output(sada)
P = Power(Alimentao)
TTL = Entrada tipo TTL
MICROCONTROLADORES PIC EM C
Notas:
(1): Esta entrada do tipo ST, somente quando configurado como interrupo
externa.
(2): Esta entrada do tipo ST, somente durante o modo de programao serial.
(3): Esta entrada do tipo ST, quando configurado como I/O de uso geral e TTL
quando usado em modo de porta paralela.
(4): Esta entrada ST quando em modo RC e CMOS nos demais casos.
2.2.
QUE SCHMITT-TRIGGER?
Verifica-se pelo grfico que a transio de nvel lgico baixo (LOW) para alto (HIGH)
muito longa, implicando na oscilao da sada da porta lgica "NO" medida
que o sinal de entrada passa pelo intervalo indefinido (1 ou 0), transportando para
sada o mesmo efeito.
Microcontroladores - PIC
10
MICROCONTROLADORES PIC EM C
Analisando o grfico da figura anterior observa-se que a sada muda de nvel lgico
alto (HIGH) para baixo (LOW) quando a tenso de transio superior a VT +
(Positive-going threshold - limiar de tenso positiva de transio).
Microcontroladores - PIC
11
MICROCONTROLADORES PIC EM C
2.3.
2.4.
Oscilador XT
O oscilador de cristal est contido num envlucro de metal com dois pinos onde foi
escrita a freqncia a que o cristal oscila. Dois condensadores cermicos devem
ligar cada um dos pinos do cristal massa. Casos h em que cristal e
condensadores esto contidos no mesmo encapsulamento, tambm o caso do
ressonador cermico ao lado representado. Este elemento tem trs pinos com o
pino central ligado massa e os outros dois pinos ligados aos pinos OSC1 e OSC2
do microcontrolador. Quando projetamos um dispositivo, a regra colocar o
oscilador to perto quanto possvel do microcontrolador, de modo a evitar qualquer
interferncia nas linhas que ligam o oscilador ao microcontrolador.
Microcontroladores - PIC
12
MICROCONTROLADORES PIC EM C
2.5.
Oscilador RC
Microcontroladores - PIC
13
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
14
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
15
MICROCONTROLADORES PIC EM C
16
MICROCONTROLADORES PIC EM C
3.1.
CRIAO DE UM PROJETO:
Nesta sesso sero explicados os passos para poder criar um projeto:
Abrir o MPLAB
Microcontroladores - PIC
17
MICROCONTROLADORES PIC EM C
Criar um projeto novo usando o assistente (Wizard), para isto clicar no menu
Project / Project Wizard .... como mostrado na seguinte figura.
Avanar
Microcontroladores - PIC
18
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
19
MICROCONTROLADORES PIC EM C
Incrementar algum arquivo existente no projeto em caso de ter. Para este curso por
enquanto no incrementaremos nenhum arquivo e clicaremos em avanar
diretamente.
Microcontroladores - PIC
20
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
21
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
22
MICROCONTROLADORES PIC EM C
At aqui o seu projeto esta vazio sem nenhum programa. O programa criado ainda
no esta associado ao projeto.
Com o mouse sobre Source Files clicar no boto direito do mouse, depois
clicar na opo Add Files.
Microcontroladores - PIC
23
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
24
MICROCONTROLADORES PIC EM C
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
#bit
#bit
botao = portb.0
led = portb.1
void main ()
{
set_tris_a(0b11111111);
set_tris_b(0b11111001);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
RESTART_WDT();
if(!botao)
led = 1;
else
led=0;
}
}
Microcontroladores - PIC
25
MICROCONTROLADORES PIC EM C
<16f877A.h>
delay(clock=4000000, RESTART_WDT)
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
porta = 0x05
portb = 0x06
Microcontroladores - PIC
26
MICROCONTROLADORES PIC EM C
#byte
#byte
#byte
portc = 0x07
portd = 0x08
porte = 0x09
botao = portb.0
led = portb.1
Esta funo permite direcionar as I/O. Deve de ser usado com o comando
fast_io e quando as portas de I/O esto acessveis, para isto deve ser usada a
diretiva #BYTE para o acesso da porta. Cada bit no valor representa um pino. O
1(um) representa entrada e o zero sada.
Exemplo:
SET_TRIS_B( 0x0F ); similar a SET_TRIS_B( 0b00001111 )
// B7,B6,B5,B4 are outputs
// B3,B2,B1,B0 are inputs
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
Microcontroladores - PIC
27
MICROCONTROLADORES PIC EM C
led=0;
O comando if (em portugus se) utilizado para avaliar a condio que esta
entre parnteses. Em caso de que esta condio seja verdadeira o comando
seguinte ser executado. Em caso de ser falsa (else) o comando depois da
instruo else ser executado. Neste exemplo o a varivel booleana boto esta
negada (!botao) quer disser se o boto estivesse em estado zero a condio ser
falsa e o led ser igual a 1. Em caso que o boto seja 1 a condio ser falsa e o
led ser igual a zero.
Trabalho 4.2: Responda as seguintes perguntas:
No programa do exemplo 1 disser como esta configurado o pino portb.4?.
uma entrada ou uma sada e por qu?
A varivel led esta associada a que pino do PIC?. Responder com o nmero
do pino.
Porque no exemplo 1 foram consideradas 5 portas?. Explicar olhando o
desenho do PIC.
No programa em que linha decide o tipo de PIC a ser usado?
Que mudaria no programa para que quando boto = 1 o led seja 1?
Incremente no exemplo1 a varivel botao1 e led1. Quando boto1 seja igual
a 1 led1 dever de ser zero e quando boto1 seja zero, led1 ser 1.
Esquematize o circuito eletrnico para testar este programa. Utilize um
oscilador de cristal e lembre que o limite de corrente oscila entre os 20mA
por cada pino de sada. A tenso de alimentao do PIC de 5 v. Instale um
boto que aoi ser pressionado reiniciar o PIC (reset).
At aqui se espera que o leitor consiga associar o pino do PIC s portas
mencionadas no programa, e que possa entender este exemplo que mesmo sendo
bsico o incio do aprendizado de um recurso sem limites. At a prxima aula
onde aprenderemos a simular programas sem a necessidade de um hardware.
Microcontroladores - PIC
28
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
29
MICROCONTROLADORES PIC EM C
Exerccios 5.1:
1. Incremente a palavra Brasil depois da linha de programa while(TRUE) e
compile o projeto.
2. Em que linha se apresentou o erro?. Verifique a barra de indicao inferior na
janela do Mplab que mostra a linha e a coluna na qual se encontra o cursor.
3. Porque ao incrementar esta palavra provocou ao compilador o erro?
Nos programas comum o uso de comentrios para poder incrementar um
comentrio necessrio escrever while(TRUE) //Brasil. Estes caracteres //
antecedem a um comentrio de linha simples. So utilizados para descrever o
funcionamento ao final de cada linha de cdigo.
4. Agora hora de aprender a usar as ferramentas deste utilitrio, no seguinte
grfico podemos observar que temos 7 botes que controlam a simulao.
Microcontroladores - PIC
30
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
31
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
32
MICROCONTROLADORES PIC EM C
33
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
34
MICROCONTROLADORES PIC EM C
Exerccios 5.4:
1. Inserir na janela watch o byte portb em binrio e simular novamente o
programa observando detalhadamente os resultados.
Microcontroladores - PIC
35
MICROCONTROLADORES PIC EM C
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
Microcontroladores - PIC
36
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
37
MICROCONTROLADORES PIC EM C
/********************************************************
*
CEFETES
* Prof: Marco Antonio
* Exemplo 1: Estrutura Bsica de um programa em C
* Materia: Microcontroladores
* Data: Agosto 2006
********************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIO DAS VARIVEIS INTERNAS DO PIC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
<16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses
xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use
delay(clock=4000000, RESTART_WDT)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao das variveis
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Neste bloco esto definidas as variveis globais do programa.
//Este programa no utiliza nenhuma varivel de usurio
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definio de constantes facilita a programao e a manuteno.
//Este programa no utiliza nenhuma constante de usurio
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Declarao dos flags de software
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definio de flags ajuda na programao e economiza memria RAM.
//Este programa no utiliza nenhum flag de usurio
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao dos port's
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit BotaoSA14_b1 = portb.1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
38
MICROCONTROLADORES PIC EM C
#bit HabLed = porta.4
#bit HabBotao = portb.7
#bit
Led0 = portd.0
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Microcontrolador
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b00100000);
set_tris_b(0b00001111);
set_tris_c(0b10011001);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
HabLed =1;
HabBotao=1;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Loop principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
if(BotaoSA14_b1)
// testa boto
Led0 = 1;
// Se boto = 0, ento led = 1
else
Led0=0;
// caso contrrio, led = 0
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
39
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
40
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIO DAS VARIVEIS INTERNAS DO PIC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
<16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit
Botao7 = portb.1
#bit
BotaoDesLiga = portb.2
#bit
Botao9 = portb.3
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit
HabLed = porta.4
#bit
HabBotao = portb.6
#bit
#byte
Led0 = portd.0
Display = portd
Microcontroladores - PIC
41
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Microcontrolador
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b00100000);
set_tris_b(0b00001111);
set_tris_c(0b10011001);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
HabLed =1;
HabBotao=1;//rb7
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Loop principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
if(Botao9)
// testa boto
portd = 0b01101111;
if(Botao7)
// testa boto
portd = 0b00000111;
if(BotaoDesLiga)
portd = 0b00000000;
// caso contrrio, led = 0
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
42
MICROCONTROLADORES PIC EM C
6.1.
O que so Variveis?
Para voc poder manipular dados dos mais diversos tipos, necessrio poder
armazen-los na memria e poder referenci-los quando for preciso. para isso
que existem as variveis, que nada mais so do que um espao reservado na
memria, e que possuem um nome para facilitar a referncia. As variveis podem
ser de qualquer tipo visto nesta aula: int, char, float, double, etc.
Como o prprio nome diz, as variveis podem ter o seu contedo alterado durante a
execuo do programa, ou seja, o programador tem a liberdade de atribuir valores
ao decorrer da execuo.
6.2.
Tipos de variveis
O C tem 5 tipos bsicos: char, int, float, void, double. Destes no todos os tipos
fazem parte do compilador CCS. O double o ponto flutuante duplo e pode ser
visto como um ponto flutuante com muito mais preciso. O void o tipo vazio, ou
um "tipo sem tipo". A aplicao deste "tipo" ser vista posteriormente. Na seguinte
tabela observaremos os tipos de dados do compilador CCS.
Type-Specifier
int1
int8
int16
int32
char
float
short
Int
long
byte
bit
void
6.3.
Num bits
1
8
16
32
8
32
1
8
16
8
1
0
Coment
Define a 1 bit number
Defines an 8 bit number
Defines a 16 bit number
Defines a 32 bit number
Defines a 8 bit character
Defines a 32 bit floating point number
By default the same as int1
By default the same as int8
By default the same as int16
OS MODIFICADORES
Microcontroladores - PIC
43
MICROCONTROLADORES PIC EM C
que no caso do compilador CCS cria uma varivel de apenas um bit. Uma
especificao long int criar uma varivel de 16 bits
O modificador unsigned serve para especificar variveis sem sinal. Um
unsigned int ser um inteiro que assumir apenas valores positivos. A
representao de nmeros negativos feita tomando o bit MSB (Most Significant Bit
ou bit mais significativo) da varivel para representar o sinal: bit MSB =1, sinal
negativo, bit MSB = 0, sinal positivo. Note que devido ao fato de utilizar um bit para
representao do sinal, a magnitude absoluta de representao do tipo modificado
ser metade da magnitude do tipo no modificado.
Assim, um tipo de dados signed int pode representar valores entre -128 e
+127, em vez de 0 a 255.
Todos os tipos, exceto o Float, por defeito so unsigned; porem pode estar
precedido por unsigned ou signed. Na seguinte tabela mostramos alguns exemplos
de combinaes possveis dos tipos de dados do compilador CCS.
Tipo
6.4.
Intervalo
Num de bits
Inicio
Fim
char
255
unsigned char
255
signed char
-128
127
255
255
-128
127
long int
16
65.535
16
-32.768
32.767
16
65.535
32
4.294.967.295
Signed int32
32
-2,147.483.648
2,147.483.647
float
32
3,4E-38
3.4E+38
Declarao de Variveis
Microcontroladores - PIC
44
MICROCONTROLADORES PIC EM C
float aux;
unsigned int i;
char carac;
Ou vrias do mesmo tipo em uma nica linha:
int id, obj, n, t;
char c1, c2, c3;
Onde tipo pode ser qualquer tipo vlido da linguagem C, e nome_da_variavel deve
ser um nome dado pelo programador, sendo o primeiro caractere uma letra ou um
"_", e os demais, letras, nmeros ou "_".
num
peso
aluno_1
_carac
Id_obj
AUX
6.5.
-idade
id@al
Inicializando Variveis
Microcontroladores - PIC
45
MICROCONTROLADORES PIC EM C
6.6.
int main()
{
int contador=0; //contador uma varivel local
num= 10;
printf("%d", n);
return 0;
}
Assim como as variveis locais, veremos as variveis globais com mais detalhes na
aula sobre funes.
6.7.
Constantes
46
MICROCONTROLADORES PIC EM C
Exerccios 6.1:
1. Qual a faixa numrica de uma varivel int? E de um unsigned int?
2. Qual a diferena de um signed int para um int?
3. Por que a declarao de uma varivel como unsigned redundante?
4. O que so variveis e qual sua utilidade?
5. Qual a diferena entre as variveis locais e globais?
8. O que so constantes? D exemplos.
9. Assinale a alternativa que possui um nome de varivel CORRETO:
$num
-temp
_carac_
3aux
Microcontroladores - PIC
47
MICROCONTROLADORES PIC EM C
7. OPERADORES EM C
J aprendemos sobre a estrutura bsica de um programa em C, sobre os tipos de
dados que C pode manipular, sobre o que so variveis e constantes. Na aula de
hoje voc aprender a criar expresses em C com o uso de operadores, sejam
eles aritmticos, lgicos, relacionais, etc. Mostraremos vrios exemplos e
finalizaremos a aula com exerccios.
Ento, p na tbua!
7.1.
O Operador de Atribuio
Os Operadores Aritmticos
48
MICROCONTROLADORES PIC EM C
Exemplo
- unrio
Multiplicao
3*5, num*i
Diviso
2/6, n/(2+5)
5%2, n%k
Adio
8+10, exp+num
Subtrao
3-6, n-p
Microcontroladores - PIC
49
MICROCONTROLADORES PIC EM C
Este apenas um de vrios problemas que podem ser resolvidos com o uso do
operador %.
7.3.
Menor que
<=
>
Maior que
>=
==
Igual
!=
Diferente
/*
Incluso
de
stdio.h
Microcontroladores - PIC
50
MICROCONTROLADORES PIC EM C
Os operadores lgicos so 3:
Operador Ao
Formato da expresso
&&
and (e lgico)
p && q
||
or (ou lgico)
p || q
51
MICROCONTROLADORES PIC EM C
ou depois da varivel:
n++;
A diferena que, se o operador precede o operando (++n), o incremento ou
decremento realizado antes do valor da varivel ser usado. E se o operador vem
depois do operando (n++), o valor da varivel poder ser usado antes de acontecer
a operao de incremento ou decremento. Veja estes dois exemplos:
Exemplo 1:
n= 5;
p= ++n;
printf("%d ",p); /* imprime na tela: 6 */
Exemplo 2:
n= 5;
p= n++;
printf("%d ",p); /* imprime na tela: 5 */
No exemplo 1, a varivel n incrementada de 1 ANTES de seu valor ser atribudo a
p. No exemplo 2, o valor de n atribudo a p antes de acontecer a operao de
incremento. Essa a diferena de se colocar esses operadores antes ou depois da
varivel.
7.5.
52
MICROCONTROLADORES PIC EM C
x+=10
x= x-10
x-=10
x= x*10
x*=10
x= x/10
x/=10
x= x%10
x%=10
Ao
and ("e" lgico)
or ("ou" lgico)
exclusive or ("ou exclusivo")
complemento de 1
deslocamento direita
deslocamento esquerda
Microcontroladores - PIC
53
MICROCONTROLADORES PIC EM C
Para saber como se comportam os operadores bit a bit, segue abaixo uma tabela
verdade dos operadores, com exceo dos operadores de deslocamento:
p q p&q p|q p^q ~p
0 0 0
0 1 0
1 0 0
1 1 1
O operador & compara os dois operandos bit a bit e cada bit do resultado 1
somente quando os dois bits do operando for 1. Caso contrrio, 0.
O bits do resultado de uma operao | bit a bit s ser 1 quando um dos dois bits,
ou os dois, forem 1. Na operao ^ s ser 1 quando os bits dos operandos forem
diferentes. Se forem iguais (0^0 ou 1^1) ser 0.
O operador de complemento (~) um operador unrio que inverte os bits do
operando. 1 vira 0 e 0 vira 1.
Vejamos um exemplo mais claro. Digamos que as variveis inteiras x e y recebem
os valores 8 e 9, respectivamente:
x= 8;
y= 9;
/* 8 em binrio 1000 */
/* 9 em binrio 1001 */
1000
1001
---1001
1000
1001
---0001
x | y:
x ^ y:
~x:
1000
----
Microcontroladores - PIC
54
MICROCONTROLADORES PIC EM C
~y:
0111
1001
---0110
0100
0010
=> resultado: 4
=> resultado: 2
y<<1
x<<1
10010
10000
=> resultado: 18
=> resultado: 16
Voc deve ter notado que deslocar um bit direita o mesmo que dividir o nmero
por 2. Deslocar 2 bits direita o mesmo que dividir o nmero por 4, e assim por
diante.
Deslocar um bit esquerda, porm, o mesmo que multiplicar o nmero por 2.
Deslocar 2 bits esquerda significa multiplicar por 4, e assim por diante.
Em um determinado ponto do curso, criaremos uma calculadora bit a bit, onde
vocs podero estudar melhor essas operaes.
7.7.
55
MICROCONTROLADORES PIC EM C
portas de alta impedncia especialmente problemtico, uma vez que o valor lgico
da porta poder oscilar continuamente entre nvel lgico alto e baixo.
Microcontroladores - PIC
56
MICROCONTROLADORES PIC EM C
Exemplos:
1. Resolver o seguinte problema: Fazer
o Projeto, para o controle da Bomba
B1, sendo que o nvel sempre estar
entre S1 e S2 (sensores bia).
Quando o nvel atinge o motor S2 o
seu contato fecha, e quando o nvel
atinge S1 este tambm fecha, sendo
que S2, j esta fechado porque o nvel
esta sobre S2.
Para poder ter uma noo, de como poderia ser o circuito eletrnico,
apresentado o esquemtico deste. O motor no pode ser ligado diretamente
pelo PIC, por enquanto consideraremos que um Led (LMOTOR)representando o
Motor.
Microcontroladores - PIC
57
MICROCONTROLADORES PIC EM C
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
#bit
#bit
#bit
LMotor = portb.0
S1 = portb.2
S2 = portb.3
void main ()
{
set_tris_a(0b11111111);
set_tris_b(0b11110110);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
if((!S1)&&(!S2))
LMotor =1;
if((S1)&&(S2))
LMotor = 0;
}
}
Microcontroladores - PIC
58
MICROCONTROLADORES PIC EM C
Exerccios 7.1:
1) Para que serve o operador de atribuio?
2) Assinale a expresso aritmtica com resultado CORRETO:
a) 2+3*5 = 30
b) 5*2/2 = 5
c) 4+6-8/2 = 6
d) (-3)*4 = 12
3) As expresses a seguir tm como resultado VERDADEIRO (1) ou FALSO (0)?
a) 1 > 2
b) 2 >= 1
c) 3 != 3
d) 'c' == 'c'
4) Fazer um projeto para que a presso do vapor sempre permanea entre uma
faixa especfica (histerese), sabendo que a histerese do pressostato calibrada
no instrumento. Os nveis do tanque sempre devem de estar entre S1 e S2,
sabendo que a bomba 1 tem uma partida simples. V2 s abrira quando a
presso esteja entre os nveis de histereses determinado.
.
Ilustrao 32: Exerccio 7.4, controle de presso
Microcontroladores - PIC
59
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
60
MICROCONTROLADORES PIC EM C
8. TEMPORIZAO NO PIC
Los temporizadores los encontramos en muchos lugares de nuestra vida
diaria, generalmente integrados en aparatos domsticos. Por ejemplo en los hornos
de microondas para controlar el tiempo de calentamiento de nuestros alimentos, o
en las lavadoras de ropa para seleccionar el tiempo lavado.
Tambin a escala industrial las aplicaciones de los temporizadores son
mltiples. Los hay para controlar el tiempo de arranque de algn proceso, se usan
en mquinas herramientas, en dosificadores, fotografa, etc. La lista es interminable.
Neste captulo aprenderemos a usar temporizadores, so duas formas
bsicas: usando a funo delay e interrupes. A funo delay no permite a
execuo de outras funes no decorrer do tempo, j usando interrupes isto no
acontece. Desta forma, as interrupes tm muitas vantagens sobre a funo
Delay.
8.1.
A funo Delay:
Esta funo criar cdigo para executar uma demora do tempo especificado.
O tempo especificado em milisegundos. Esta funo trabalha executando um
nmero preciso de instrues para causar a demora pedida.
O tempo de demora pode ser mais longo do que o pedido se uma interrupo
for chamada durante a espera do tempo. O tempo gastado na interrupo no
conta para o tempo de demora.
Sintaxes da funo: delay_ms(time);
Parmetros: time se for varivel de 0 a 255 se for constante de 0 a 65635.
Exemplo 8.1:
conveniente observar que neste exemplo o watch dog timer esta ativado,
neste caso ser necessrio resetar o WDT para que o PIC no seja resetado e
comece a ser executada a primeira linha do programa. Para isto usada a funo
RESTART_WDT().
Alem da funo Delay, existem outras funes que ainda no foram vistas.
Trata-se das funes output_high(PIN_B0) e output_low(PIN_B0).
A funo output_high(PIN_B0), utilizada para setar (ou seja, colocar em
nvel lgico 1) um pino do microcontrolador. Isto significa que o pino RB0 (da porta
B) ser setado.
Note que PIN_B0 um smbolo predefinido para especificar o pino RB0.
Este smbolo esta localizado no arquivo de cabealho do processador 16f877A.h.
Microcontroladores - PIC
61
MICROCONTROLADORES PIC EM C
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definies para uso de Rotinas de Delay
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
Microcontroladores - PIC
62
MICROCONTROLADORES PIC EM C
#byte
#byte
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programao e
//futuras alteraes do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E
//FUTURAS ALTERAES DO HARDWARE.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Microcontrolador
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b11111111);
set_tris_b(0b11111000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Loop principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
output_high(PIN_B1);
delay_ms(1000);
output_low(PIN_B1);
delay_ms(1000);
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*************************************
Microcontroladores - PIC
63
MICROCONTROLADORES PIC EM C
8.2.
Interrupo Temporizador:
8.3.
O temporizador TIMER 0
Microcontroladores - PIC
64
MICROCONTROLADORES PIC EM C
/********************************************************
*
CEFETES
* Prof: Marco Antonio
* Exemplo 8.2: Pisca - Pisca, usando interrupo Timer 0
* Materia: Eletrnica Digital
* Data: Setembro 2005
********************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIO DAS VARIVEIS INTERNAS DO PIC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
<16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
65
MICROCONTROLADORES PIC EM C
#fuses
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definies para uso de Rotinas de Delay
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use
delay(clock=4000000, RESTART_WDT)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao das variveis
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Neste bloco esto definidas as variveis globais do programa.
//Este programa no utiliza nenhuma varivel de usurio
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definio de constantes facilita a programao e a manuteno.
//Este programa no utiliza nenhuma constante de usurio
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Declarao dos flags de software
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definio de flags ajuda na programao e economiza memria RAM.
int conta;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao dos port's
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programao e
//futuras alteraes do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E
//FUTURAS ALTERAES DO HARDWARE.
#bit led = portb.0
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes do Microcontrolador
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#int_timer0
void trata_t0()
{
Microcontroladores - PIC
66
MICROCONTROLADORES PIC EM C
//reinicia o timer 0 em 131 menos a contagem que j passou
set_timer0 (131-get_timer0());
conta++;
//se j ocorreram 125 interrupes
if (conta ==125)
{
conta=0;
led = !led; //inverte o led
}
}
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
//configura o timer 0 para o clock interno e prescaler dividindo por 32
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_32 );
SET_TIMER0(131); //INICIA O TIMER 0 EM 131
//HABILITA INTERRUPES
ENABLE_INTERRUPTS (GLOBAL | INT_TIMER0);
// configura os TRIS
set_tris_a(0b11111111);
set_tris_b(0b11111000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Loop principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
67
MICROCONTROLADORES PIC EM C
Exerccios 8.1:
1) Qual a diferena entre usar a funo Delay e a interrupo do TMR0?
2) Fazer um semforo, primeiro usando a funo Delay e depois usando a
interrupo TMR0. Simular e testar na bancada.
3) Utilizando seu conhecimento em temporizadores, automatizar o sinal de
trnsito. Simular e testar na bancada.
Red = O:2/00
Green = O:2/06
Amber = O:2/05
8 sec.
4 sec.
Green = O:2/02
Amber = O:2/01
Red = O:2/04
1s
8 sec.
4 sec.
1s
Como o quintal era grande pediu para usar um diodo lazer para
construir um sensor de barreira, s que o lazer no podia estar ligado
constantemente, devia ficar ligado o 10% do perodo a uma freqncia
de 1 KHz.
Para o receptor oriento trabalhar com uma resistncia LDR que tem
maior rea sensora.
O alarme no poderia disparar imediatamente ao ser cortada a
barreira, dever esperar segundo para ter certeza que se trata de
um ladro.
Boa sorte galera. Vocs tero que montar o projeto.
Microcontroladores - PIC
68
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
69
MICROCONTROLADORES PIC EM C
9.1.
Uma entrada analgica de tenso para que possa entrar no CLP, PIC ou
computador precisa ser amostrada e convertida num valor numrico atravs de um
conversor A/D.
A seguinte figura mostra como muda a tenso contnua sobre o tempo.
Existem trs amostras indicadas na figura. O processo de amostragem dos dados
no instantneo, existe um tempo inicial e final. O tempo requerido para a amostra
chamado de tempo de amostragem.
70
MICROCONTROLADORES PIC EM C
Ilustrao 36: Amostragem de um sinal com freqncia muito maior a frequencia de amostragem
Exerccios 9.1:
a) Sendo que o range de uma entrada analgica de um CLP de 0 a10V, e o
conversor tivesse uma resoluo de 10 bits. Qual seria o valor do nmero
resultante para uma entrada de 5 volts?
b) No desenho temos um potencimetro que atua como sensor do brao
Mecnico construdo por alunos do CEFETES/AN3 2003, este potencimetro
representa a posio do brao, sendo que a posio do brao de 0 a 100%.
E o potencimetro na posio 0% tem uma tenso de sada de 1V e
na de 100% uma tenso de 4.5 V, e esta tenso representa a entrada
analgica do PIC na varivel SenAnalog1 (0/4095-10bits e de 0 a 5V), disser
qual ser a variao de SenAnalog1.
Microcontroladores - PIC
71
MICROCONTROLADORES PIC EM C
9.2.
Microcontroladores - PIC
72
MICROCONTROLADORES PIC EM C
#define AN0_AN1_AN4_VREF_VREF
0x0C // A0 A1 A5 Ref=A2,A3
#define AN0_AN1_VREF_VREF
0x0D // A0 A1 Ref=A2,A3
#define AN0
0x0E // A0
#define AN0_VREF_VREF
0x0F // A0 Ref=A2,A3
#define ANALOG_RA3_REF
0x1
//!old only provided for compatibility
#define A_ANALOG
0x2
//!old only provided for compatibility
#define A_ANALOG_RA3_REF
0x3
//!old only provided for compatibility
#define RA0_RA1_RA3_ANALOG 0x4
//!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_REF 0x5
//!old only provided for compatibility
#define ANALOG_RA3_RA2_REF
0x8 //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2
0x9 //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2_REF_RA3
0xA //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2_REF_RA3_RA2 0xB //!old only provided for compatibility
#define A_ANALOG_RA3_RA2_REF
0xC //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_RA2_REF
0xD //!old only provided for compatibility
#define RA0_ANALOG
0xE //!old only provided for compatibility
#define RA0_ANALOG_RA3_RA2_REF
0xF //!old only provided for compatibility
setup_adc (opes);
Microcontroladores - PIC
73
MICROCONTROLADORES PIC EM C
Retorna: o valor da converso analgica digital para o caso do PIC 16F877A, retorna um valor de 16
bits.
Funo: Esta funo faz a leitura do valor digital do conversor analgico digital.
Examples:
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
value = read_adc();
Exemplo 9.2:
Neste exemplo existe um sinal analgico variando de 0 a 5v entrando no pino
RA0. Se a tenso for menor que 1v um led dever indicar que a tenso esta baixa,
se a tenso estiver entre 1 e 4 volts um outro led indicar que a tenso esta mdia,
e se a tenso estiver entre 4 e 5v um outro led indicar que a tenso esta alta.
Este programa foi feito com a inteno de servir como modelo para o
desenvolvimento de outros projetos.
Como o PIC16F877A tem uma resoluo de 10 bits para os sinais analgicos
ento na escala da converso variar de 0 a 1023.
Quando se trata de converso analgico-digital comum usar
escalonamentos, existe uma forma de transformar valores a outras escalas.
Relembremos um pouco de instrumentao:
EscNova OffsetEscNova
-------------------------------------- =
SpanEscNova
EscVelha OffsetEscVelha
--------------------------------------SpanEscVelha
/********************************************************
*
CEFETES
* Prof: Marco Antonio
* Exemplo 4: Converso analgica digital
* Materia: Eletrnica Digital
* Data: Julho 2006
********************************************************/
#include
<16f877A.h>
#device adc=10
Microcontroladores - PIC
// microcontrolador utilizado
74
MICROCONTROLADORES PIC EM C
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use
delay(clock=4000000, RESTART_WDT)
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
float conversao = 0;
// armazena o resultado da converso AD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit LedTensaoBaixa = portb.0
#bit LedTensaoMedia = portb.1
#bit LedTensaoAlta = portb.2
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
// configura os tris
set_tris_a(0b11011111);
de I/O
set_tris_b(0b00000000);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
RESTART_WDT();
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
// rotina principal
// incia o watch-dog timer
conversao = read_adc();
// inicia converso AD
conversao = (conversao * 5); // faz regra de 3 para converter o valor,
conversao = (conversao / 1023); // das unidades de AD em Volts.
Microcontroladores - PIC
75
MICROCONTROLADORES PIC EM C
if (conversao<=1)
LedTensaoBaixa = 1;
else
LedTensaoBaixa = 0;
if ((conversao<=4)&&(conversao>=1))
LedTensaoMedia = 1;
else
LedTensaoMedia = 0;
if ((conversao<=5)&&(conversao>=4))
LedTensaoAlta = 1;
else
LedTensaoAlta = 0;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Exerccios:
1. Construir uma rampa de acelerao, para acionamento da bomba do
problema 2, mostrada no grfico abaixo:
Microcontroladores - PIC
76
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
77
MICROCONTROLADORES PIC EM C
mA
Curva Caracterstica
do Sensor
20
VARIVEL
DO PROCESSO
0%
100%
Nvel
4-20mA
4-20mA
LT
Tanque
CP
Y0
SET - POINT
VARIVEL
MANIPULADA OU
DE CONTROLE
INVERSOR
WEG
B1
Assuma que a fonte de corrente varivel esta instalada na entrada AN0 atravs de
uma resistncia de 250 ohms e que a sinal do PDT esta instalado na entrada AN1
tambm com uma resistncia de 250 ohms. A velocidade da bomba no variada
pelo uC, mas o controle de liga e desliga sim.
Microcontroladores - PIC
78
MICROCONTROLADORES PIC EM C
10.COMUNICAO SERIAL
Em muitas aplicaes microcontroladas, pode ser necessrio realizar a
comunicao entre o microcontrolador e um ou mais dispositivos externos.
Esses dispositivos podem estar localizados tanto na mesma placa do circuito,
como fora dela, a metros ou mesmo dezenas de quilmetros de distncia.
A escolha do sistema de comunicao mais adequado para realizar a tarefa
depende de diversos fatores, como: velocidade, imunidade a rudos, custo, etc. As
duas formas conhecidas so a comunicaes seriais e a paralela.
Na comunicao paralela enviamos uma palavra por vez ao longo de um
barramento composto por vrios sinais. A comunicao com impressoras
tipicamente uma comunicao paralela. A velocidade alta, porm as distncias
so curtas. Alm do envio dos dados deve-se tambm enviar sinais de controle.
Na comunicao serial o dado enviado bit por bit. O cabo que conecta os
dispositivos pode ser mais longo, em virtude de caractersticas especiais do sinal
que transmitido.
10.1. Comunicao Serial Sncrona x Comunicao Serial Assncrona
Diversos protocolos de comunicao operam sobre comunicao serial:
redes de campo, comunicao com modens, etc...
Existem dois modos de comunicao serial: Sncrono e Assncrona.
Comunicao Serial Sncrona
Neste modo de comunicao o transmissor e o receptor devem ser
sincronizados para a troca de comunicao de dados. Geralmente uma
palavra de SINCRONISMO utilizada para que ambos ajustem o relgio
interno. Aps a sincronizao os bits so enviados seqencialmente, at uma
quantidade pr-combinada entre os dispositivos.
Comunicao Serial Assncrona
Esta a forma mais usual de transmisso de dados. No existe a
necessidade de sincronizao entre os dispositivos, uma vez que os
caracteres so transmitidos individualmente e no em blocos como na
comunicao sncrona. A transmisso de cada caractere precedida de um
bit de start e terminada por 1 (1/2 ou 2) bit(s) de stop.
O PIC 16F877A suporta duas formas de comunicao serial :
Comunicao assncrona universal (formato RS232) SCI ou USART;
Comunicao sncrona entre dispositivos SPI;
Microcontroladores - PIC
79
MICROCONTROLADORES PIC EM C
Notem que neste frame existe um bit de start, 8 bits de dados, um bit de
paridade e um bit de parada. A paridade pode ser par ou mpar. Quando a paridade
par o bit de paridade gerado de modo que o nmero de 1s resultante na palavra
mais o bit de paridade sejam pares.
Por exemplo, se a palavra 10001010 est sendo transmitida, ou recebida, o
bit de paridade deve ser 1, para que o conjunto palavra + bit de paridade tenha
sempre um nmero par de 1s. Se a paridade usada for mpar o bit de paridade no
exemplo anterior ser zero.
No processo de transmisso assncrona, os dispositivos envolvidos no
processo de comunicao devem ter a mesma taxa de transmisso e recepo.
Microcontroladores - PIC
80
MICROCONTROLADORES PIC EM C
EXEMPLO:
Neste exemplo esta sendo usada uma entrada analgica de 0 a 5V e o seu
valor transferido atravs do RS232 a um computador. No computador pode-se
desenvolver um programa para poder trocar dados com o programa do PIC. Mas
tambm podemos usar o hiperTerminal que um acessrio do Windows para
comunicao serial. Basta ir a:
Iniciar\Programas\Acessrios\Comunicaes\Hiperterminal
O programa exige que o operador digite uma letra d para que o PIC possa
transmitir a informao.
/********************************************************
*
CEABRA
* Prof: Marco Antonio
* Exemplo 4: Converso analgica digital e comunicao via RS232
* Matria: Eletrnica Digital
* Data: Outubro 2005
********************************************************/
#include
<16f877A.h>
#device adc=10
// microcontrolador utilizado
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use
#use
delay(clock=4000000, RESTART_WDT)
rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
porta = 0x05
portb = 0x06
Microcontroladores - PIC
// tamanho do filtro
// armazena o resultado da converso AD
81
MICROCONTROLADORES PIC EM C
#byte
#byte
#byte
portc = 0x07
portd = 0x08
porte = 0x09
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
setup_vref(VREF_LOW|6);
// configura os tris
set_tris_a(0b11011111);
de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
while(TRUE)
// rotina principal
{
RESTART_WDT();
// incia o watch-dog timer
Comando=getc();
if (Comando=='d')
{
conversao = read_adc();
// inicia converso AD
conversao = (conversao * 5); // faz regra de 3 para converter o valor,
conversao = (conversao / 1023); // das unidades de AD em Volts.
printf("Voltimetro: %f\r\n", conversao);
delay_ms(1000);
}
// printf("Voltimetro: %c\r\n", Comando);
// delay_ms(3000);
}
}
Exerccios:
1) Olhando o help do CCS explicar detalhadamente o programa feito no
exemplo.
2) Pesquisar e mostrar a diferencia entre o RS485 e RS232.
3) Montar o circuito do exemplo explicado neste captulo.
Microcontroladores - PIC
82
MICROCONTROLADORES PIC EM C
/********************************************************
*
CEABRA
* Prof: Marco Antonio
* Exemplo 3: Controle de nvel num tanque
*
Uma bomba acionada quando o tanque esta vazio
*
e quando este esteja cheio, a bomba desliga. Dois sensores
*
so instalados, sensor de tanque cheio e tanque vazio.
* Materia: Eletrnica Digital
* Data: Outubro 2005
********************************************************/
#include
/*#fuses
xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
dos fusve*/
#fuses xt,WDT,NOPROTECT,put, NOLVP
// configurao
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programao e
//futuras alteraes do hardware.
#bit
#bit
Tanque_Vazio = portb.1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A
PROGRAMAO E
//FUTURAS ALTERAES DO HARDWARE.
#bit
Bomba = portb.2
Microcontroladores - PIC
MICROCONTROLADORES PIC EM C
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b11111111);
set_tris_b(0b00000011);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Loop principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
IF ((Tanque_Vazio==0) && (Tanque_Cheio==0))
Bomba=1;
IF ((Tanque_Vazio==1) && (Tanque_Cheio==1))
Bomba=0;
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
84
MICROCONTROLADORES PIC EM C
Exemplo4:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Programao em C - Recursos Bsicos de programao
*
Exemplo 4
*
*
*
*
CENTRO DE TREINAMENTO - MOSAICO ENGENHARIA
*
*
* TEL: (0XX11) 4992-8775
SITE: www.mosaico-eng.com.br
*
E-MAIL: mosaico@mosaico-eng.com.br *
**************************************
* VERSO : 1.0
*
* DATA : 05/06/2003
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
*
*
*
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Microcontroladores - PIC
85
MICROCONTROLADORES PIC EM C
// Este software est preparado para ler quatro botes e tocar o buzzer com
//durao variavel conforme a tecla pressionada, alm de acender o led
//indicando a ltima tecla pressionada.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIO DAS VARIVEIS INTERNAS DO PIC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fusesxt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
fusveis
// configurao dos
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definies para uso de Rotinas de Delay
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao dos port's
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
Microcontroladores - PIC
86
MICROCONTROLADORES PIC EM C
#use
#use
#use
#use
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Declarao dos flags de software
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definio de flags ajuda na programao e economiza memria RAM.
#bit
#bit
#bit
#bit
botao1_press = status_leds.0
botao2_press = status_leds.1
botao3_press = status_leds.2
botao4_press = status_leds.3
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ENTRADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programao e
//futuras alteraes do hardware.
#bit
#bit
#bit
botao3 = status_botoes.2
// Estado do boto 3
// 1 -> Liberado
// 0 -> Pressionado
#bit
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A
PROGRAMAO E
//FUTURAS ALTERAES DO HARDWARE.
Microcontroladores - PIC
87
MICROCONTROLADORES PIC EM C
#bit
buzzer = porta.5
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tabela de Valores
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
byte const tabela[16] =
{16,32,32,48,64,80,96,112,128,144,160,176,192,208,224,240};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configurao do Microcontrolador
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// A rotina principal simplesmente limpa o WDT, pois toda a lgica do
// programa tratada dentro das interrupes.
void main()
{
// configura microcontrolador
setup_adc_ports (no_analogs);
setup_counters(rtcc_internal , rtcc_div_8);
setup_timer_2 (t2_div_by_16,per,1);
// configura os tris
set_tris_a(0b11011111);
set_tris_b(0b11110000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=(0b00000000);
portb=(0b00000000);
portc=(0b00000000);
portd=(0b00000000);
porte=(0b00000000);
// habilita a interrupo de TMR0
enable_interrupts(GLOBAL|INT_RTCC);
#priority timer0,timer2
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
}
}
// rotina principal
// incia o watch-dog timer
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Microcontroladores - PIC
88
MICROCONTROLADORES PIC EM C
*
Rotina de Tratamento de interrupo de TMR0
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Esta interrupo ocorrer a cada 2048us.
// O filtro dos botes tem durao de 40ms (2048us x 20) e so decrementados a
cada interrupo.
// Esta interrupo responsvel por converter os pinos dos botes em entrada,
salvar a condio
// dos botes em varivel temporria e converter os pinos em sada novamente.
#int_rtcc
void trata_int_tmr0(void)
{
set_tris_b(0b00001111);
// configura os pinos como
entrada para testar os botes
delay_cycles(4);
// aguarda 4 ciclos de mquina para a
estabilizao do portb
status_botoes = portb;
// l o status dos botoes, salva
em varivel temporria
status_botoes = (status_botoes & 0x0f); // zera a parte alta do
registrador
set_tris_b(0b00000000);
// configura os pinos como
sada para controle dos leds
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tratamento do Boto 1
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
if (!botao1)
{
filtro1--;
if (filtro1 == 0)
{
botao1_press = 1;
// testa boto 1
// boto 1 est pressionado ?
// Sim, ento decrementa o filtro
// acabou o filtro do boto 1 ?
// marca que o boto est
pressionado
}
}
else
{
filtro1 = t_filtro;
botao1_press = 0;
// boto 1 liberado
// inicia o filtro do boto 1
// marca que o boto foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tratamento do Boto 2
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
if (!botao2)
{
filtro2--;
Microcontroladores - PIC
// testa boto 2
// boto 2 est pressionado ?
// Sim, ento decrementa o filtro
89
MICROCONTROLADORES PIC EM C
if (filtro2 == 0)
{
botao2_press = 1;
pressionado
}
}
else
{
filtro2 = t_filtro;
botao2_press = 0;
// boto 2 liberado
// inicia o filtro do boto 2
// marca que o boto foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tratamento do Boto 3
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
if (!botao3)
{
filtro3--;
if (filtro3 == 0)
{
botao3_press = 1;
// testa boto 3
// boto 3 est pressionado ?
// Sim, ento decrementa o filtro
// fim do filtro do boto 3 ?
// marca que o boto est
pressionado
}
}
else
{
filtro3 = t_filtro;
botao3_press = 0;
// boto 3 liberado
// inicia o filtro do boto 3
// marca que o boto foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tratamento do Boto 4
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
if (!botao4)
{
filtro4--;
if (filtro4 == 0)
{
botao4_press = 1;
// testa boto 4
// boto 4 est pressionado ?
// Sim, ento decrementa o filtro
// fim do filtro do boto 4 ?
// marca que o boto est
pressionado
}
}
else
{
filtro4 = t_filtro;
Microcontroladores - PIC
// boto 4 liberado
// inicia o filtro do boto 4
90
MICROCONTROLADORES PIC EM C
botao4_press = 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Atualiza Leds conforme botes pressionados
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
portb = status_leds;
// atualiza os leds
if (status_leds == 0)
{
per = 0xff;
setup_timer_2 (t2_div_by_16,per,1);
disable_interrupts (INT_TIMER2);
buzzer = 0;
}
else
{
per = (tabela[status_leds]);
// consulta tabela e inicializa
timer2.
setup_timer_2 (t2_div_by_16,per,1);
enable_interrupts (INT_TIMER2);
// habilita interrupo de
timer2.
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina de Tratamento de interrupo de TMR2
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Est interrupo s ir ocorrer quando alguma tecla estiver pressionada,
// o periodo de ocorrncia depende do boto ou da conbinao de botes
pressionados,
// ela ir inverter o pino de I/O do buzzer a cada interrupo.
#int_timer2
void trata_int_tmr2(void)
{
if (buzzer != 0)
{
buzzer = 0;
}
else
{
buzzer = 1;
}
}
Microcontroladores - PIC
91
MICROCONTROLADORES PIC EM C
/********************************************************
*
CEABRA
* Prof: Marco Antonio
* Exemplo 4: Conversa analgica digital e comunicao va RS232
* Materia: Eletrnica Digital
* Data: Outubro 2005
********************************************************/
#include
<16f877A.h> // microcontrolador utilizado
#device adc=10
#fusesxt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
fusveis
// configurao dos
t_filtro 500
float conversao = 0;
char Comando;
#use
#use
#use
#use
#use
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
// tamanho do filtro
// armazena o resultado da converso AD
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como
Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
// configura os tris
set_tris_a(0b11011111);
pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
Microcontroladores - PIC
92
MICROCONTROLADORES PIC EM C
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
while(TRUE)
// rotina principal
{
RESTART_WDT();
// incia o watch-dog timer
Comando=getc();
if (Comando=='d')
{
conversao = read_adc();
// inicia converso AD
conversao = (conversao * 5); // faz regra de 3 para converter o
valor,
conversao = (conversao / 1023); // das unidades de AD em Volts.
printf("Voltimetro: %f\r\n", conversao);
delay_ms(1000);
}
// printf("Voltimetro: %c\r\n", Comando);
// delay_ms(3000);
}
}
Microcontroladores - PIC
93
MICROCONTROLADORES PIC EM C
Microcontroladores - PIC
94
MICROCONTROLADORES PIC EM C
/********************************************************
*
CEABRA
* Prof: Marco Antonio
* Exemplo 5: Uso dos LCDs
* Materia: Eletrnica Digital
* Data: Setembro 2005
********************************************************/
#include
#fusesxt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
fusveis
// configurao dos
fast_io(a)
fast_io(b)
fast_io(c)
fast_io(d)
fast_io(e)
#byte
#byte
#byte
#byte
#byte
porta = 0x05
portb = 0x06
portc = 0x07
portd = 0x08
porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SADAS
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit rs = porte.0
// via do lcd que sinaliza recepo de dados ou
comando
#bit enable = porte.1
// enable do lcd
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina que envia um COMANDO para o LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void comando_lcd(int caracter)
{
rs = 0;
// seleciona o envio de um comando
portd = caracter;
// carrega o portd com o caracter
enable = 1 ;
// gera pulso no enable
delay_us(1);
// espera 3 microsegundos
enable = 0;
// desce o pino de enable
delay_us(40);
Microcontroladores - PIC
95
MICROCONTROLADORES PIC EM C
return;
// retorna
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina que envia um DADO a ser escrito no LCD
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void escreve_lcd(int caracter)
{
rs = 1;
// seleciona o envio de um comando
portd = caracter;
// carrega o portd com o caracter
enable = 1;
// gera pulso no enable
delay_us(1);
// espera 3 microsegundos
enable = 0;
// desce o pino de enable
delay_us(40);
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Funo para limpar o LCD
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void limpa_lcd()
{
comando_lcd(0x01);
// limpa lcd
delay_ms (2);
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializao do Display de LCD
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
comando_lcd(0x30);
display
delay_ms(4);
comando_lcd(0x30);
display
delay_us(100);
comando_lcd(0x30);
display
comando_lcd(0x38);
7x5, 2 linhas
limpa_lcd();
Microcontroladores - PIC
// limpa lcd
96
MICROCONTROLADORES PIC EM C
comando_lcd(0x0c);
comando_lcd(0x06);
return;
// retorna
}
void main()
{
// configura microcontrolador
setup_adc_ports (no_analogs);
setup_counters (rtcc_internal, WDT_2304MS);
// configura os tris
set_tris_a(0b11011111);
pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
// inicializa os ports
// limpa porta
// limpa portb
// limpa portc
// limpa portd
// limpa porte
inicializa_lcd();
// configura o lcd
while(TRUE)
// rotina principal
{
RESTART_WDT();
// incia o watch-dog timer
comando_lcd(0x80);
// posiciona o cursor na linha 0,
coluna 0
printf (escreve_lcd, " Marco Antonio");
// imprime mensagem no lcd
comando_lcd(0xC2);
// posiciona o cursor na linha 1,
coluna 2
printf (escreve_lcd, " CEFETES ");
// imprime mensagem no lcd
}
}
Microcontroladores - PIC
97