Você está na página 1de 57

Curso bsico de linguagem C para microcontroladores PIC

________________________________________________________________________________

ndice
Linguagem C......................................................................................................

Programao de Microcontroladores em linguagem C......................................

Princpio de programao
- lgebra Booleana..........................................................................................

- Operaes......................................................................................................

- Representao Grfica das Portas Lgicas....................................................

Introduo Linguagem C
- Variveis........................................................................................................

- Tipos de Dados..............................................................................................

- Qualificadores...............................................................................................

- Declarao de variveis.................................................................................

- Operadores matemticos
- Aritmticos.................................................................................................

- Relacionais.................................................................................................

- Operadores Lgicos bit-a-bit......................................................................

- Operadores Lgicos relacionais.................................................................

- Declaraes de controle
- Deciso Comando IF...............................................................................

- Deciso Comando IF-ELSE....................................................................

- Deciso SWITCH-CASE........................................................................

10

- Lao FOR......................................................................................................

11

- Lao WHILE.................................................................................................

11

- Lao DO-WHILE..........................................................................................

12

- Ponteiros........................................................................................................

12

- Matrizes.........................................................................................................

13

O Ambiente MikroC...........................................................................................

14

- Criando um novo projeto...............................................................................

15

- Primeiro Projeto............................................................................................

16

- Gravando o projeto........................................................................................

18

Acionamento de Botes......................................................................................

24

Estudo dos Timers e Interrupes


- Timer 0..........................................................................................................
1

26

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
- Timer 1..........................................................................................................

30

- Timer 2..........................................................................................................

33

Funes...............................................................................................................

38

Debug no MikroC...............................................................................................

39

Display de Cristal Lquido (LCD)......................................................................

42

Converso A/D...................................................................................................

46

Comunicao Serial (USART)...........................................................................

48

EEPRON Interna................................................................................................

53

PWM...................................................................................................................

55

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Linguagem C
uma linguagem de programao de propsito geral, estruturada, imperativa, procedural de
alto e baixo nvel, criada em 1972 por Dennis Ritchie no AT&T Bell Labs, para desenvolver o
sistema operacional UNIX (que foi originalmente escrito em Assembly). Desde ento, espalhou-se
por muitos outros sistemas e tornou-se uma das linguagens de programao mais usadas
influenciando muitas outras linguagens, especialmente o C++, que foi desenvolvida como uma
extenso para C.
Fonte: WIKIPEDIA

Programao de Microcontroladores em linguagem C


Atualmente, a maioria dos microcontroladores existentes nos mercado contam com
compiladores em C para o desenvolvimento de software, pois a linguagem C permite a construo
de programas e aplicaes muito mais complexas do que o Assembly.
O compilador C tem a capacidade de traduzir com alto grau de inteligncia e velocidade o
cdigo em C para o cdigo de mquina, portanto podemos dizer que a linguagem C possui grande
eficincia.
Essa eficincia da linguagem C faz com que o programador preocupe-se mais com a
programao em si e o compilador assume responsabilidades como localizao da memria,
operaes matemticas e lgicas, verificao de bancos de memrias e outros..

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Princpio de Programao
lgebra Booleana
Na matemtica e na cincia da computao, as lgebras booleanas so estruturas algbricas
que captam a essncia das operaes lgicas E, OU e NO (NAD, OR e NOT), bem como das
operaes da teoria de conjuntos soma, produto e complemento.
lgebra Booleana deriva do nome de George Boole, matemtico ingls que foi o primeiro a
defin-las como parte de um sistema de cdigo em meados do sculo XIX. Foram aplicadas pela
primeira vez em eletrnica por Claude Shannon no sculo XX.
Os operadores de lgebra booleana so frequentemente escritos com E, OU ou NO (mais
comuns so os equivalentes em ingls, AND, OR ou NOT). Na descrio de circuitos podem ser
utilizados NAND (NOT AND), NOR (NOT OR) e XOR (OR exclusivo).
Operaes:
OR

AND

NOT

XOR

Representao Grfica das Portas Lgicas:

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
CONT.:

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Introduo Linguagem C
Variveis:
As variveis podem conter letras e nmeros, sempre comeando com letras e no devem ter nome
de palavras reservadas pelo compilador como, por exemplo, for, do, int, etc.
Tipos de Dados:
Dado:

Representa:

-char

Caracteres

-int

Nmeros inteiros

-float e double

Nmeros decimais (ponto flutuante)

-void

Valores nulos

Qualificadores:
Qualificador

Significado

-signed

Sinalizado

-unsigned

No sinalizado

-short

Inteiro menor que o padro

-long

Inteiro maior que o padro

Tipo

Tamanho

Valores

signed char

8 bits

-128 127

(unsigned) char

8 bits

0 255

(signed) short (int)

8 bits

-128 127

unsigned short (int)

8 bits

0 255

(signed) int

16 bits

-32768 32767

unsigned int

16 bits

0 65535

(signed) long (int)

32 bits

-2147483648 2147483647

unsigned long (int)

32 bits

0 4294967295

float

32 bits

(+-) 1,17549435082e-38 (+-) 6,80564774407e38

double

32 bits

(+-) 1,17549435082e-38 (+-) 6,80564774407e38

long double

32 bits

(+-) 1,17549435082e-38 (+-) 6,80564774407e38

* Palavras entre parenteses so opcionais.


6

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Declarao de Variveis:
Um varivel declarada da seguinte forma:
<qualificador> + <tipo de dado> + <nome da varivel> + <valor>;
onde o valor pode ou no ser inicializado.
Exemplos:

unsigned int x = 12345;


int conta;
short x1;

Para atribuir valores s variveis:


conta = 100; (atribui-se o valor 100 varivel conta)
x1 = 15;
(atribui-se o valor 15 varivel x1)
Operadores Matemticos:
Aritmticos:
Operador Descrio

Exemplo

Soma dos argumentos

a+b

Subtrao dos argumentos

a-b

Multiplicao dos argumentos

a*b

Diviso dos argumentos

a/b

Resto da diviso (s pode ser utilizado com valores a % b


inteiros)

++

Soma 1 ao argumento

a++

--

Subtrai 1 ao argumento

a--

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Relacionais:
So utilizados para comparao entre argumentos e retornam uma resposta verdadeira ou falsa.
Como em linguagem C no existe uma varivel booleana para um resultado verdadeiro
ou falso, todo valor igual a 0 ser considerado falso e todo valor diferente de 0 (qualquer valor) ser
considerado verdadeiro.
Operador Descrio

Exemplo

==

Compara se igual a

a == 5

!=

Compara se diferente de

a != 5

>

Compara se maior que

a>5

<

Compara se menor que

a<5

>=

Compara se maior ou igual a

a >= 5

<=

Compara se menor ou igual a

a <= 5

Operadores lgicos bit-a-bit:


Operador Descrio
&

E (AND)

OU (OR)

OU EXCLUSIVO (XOR)

Complemento (NOT)

>>

Deslocamento direita

<<

Deslocamento esquerda

Operadores lgicos relacionais:


Operador Descrio
&&

Comparao lgica E (AND)

||

Comparao lgica OU (OR)

Comparao lgica Complemento (NOT)

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Declaraes de controle:
Deciso Comando IF:
O comando IF utilizado para avaliar uma determinada condio e determinar se ela verdadeira,
caso seja, executa os bloco contido dentro desta condio. Sua forma geral :
if (exp) comando;
Se o resultado da condio referente a expresso (exp) for verdadeiro, o comando ser executado,
caso contrrio, o programa segue sem executar o comando.
if (exp)
{
comando1;
comando2;
}
Para o caso acima, a mesma explicao anterior se encaixa, sendo que agora, se a condio da
expresso for verdadeira, sero executados os comando1 e comando2.
Exemplos:
if (conta>50) conta = 0;
if (conta>50)
{
conta = 0;
conta1++;
}
Deciso Comando IF-ELSE:
Neste caso, a condio IF utilizada da mesma forma acima, sendo que agora, se a condio da
expresso for falsa a condio ELSE ser executada. Sua forma :
if (exp) comando1;
else comando2;
Caso a expresso seja verdadeira, o comando1 ser executado, caso seja falsa, o comando2 ser
executado.
Exemplo:
if (conta>0)
{
conta = 0;
conta1++;
}
9

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
else conta++;
possvel tambm encadear diversos comando IF, como a forma abaixo:
if (exp1) comando1;
else if (exp2)comando2;
else if(exp3) comando3;
....
Deciso SWITCH-CASE:
Quando existem muitos valores para testar de uma s varivel, o comando IF pode ficar meio
confuso ou sem muita eficincia, para isso podemos utilizar o SWITCH-CASE. Segue sua forma:
switch(varivel)
{
case valor1: comando1;
....
break;
case valor2: comando2;
....
break;
....
....
default: comandoN;
....
....
}
Neste caso, a varivel ser testada e se o valor dela for igual a valor1, o comando1 ser executado,
se for igual ao valor2, o comando2 ser executado e assim por diante, agora se o valor for diferente
de qualquer caso (case), o comandoN ser executado.
Exemplo:
switch(conta)
{
case 10 : conta1++;
break;
case 15: conta2++;
break;
case 20: conta1++;
conta2++
break;
default: conta3++;
}
Neste caso, se o valor de conta for igual a 10, conta1 ser incrementado, se o valor for igual a 15, o
valor de conta2 ser incrementado, caso o valor de conta seja igual a 20, tanto conta1 quanto conta2
10

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
sero incrementados, para todos outros valores diferentes, o valor de conta3 ser incrementado.
Lao FOR:
Este um dos comandos de lao (loop ou repetio) disponveis na linguagem C, a sua forma :
for(inicializao;condio(trmino);incremento) comando:
ou,
for(inicializao;condio(trmino);incremento)
{
comando1;
comando2;
}
onde:
inicializao: essa seo conter uma inicializao para a varivel;
condio: responsvel por contar a condio de finalizao do lao;
incremento: aqui pode conter uma ou mais variveis para incremento da varivel.
Exemplo:
int conta;
int a = 0;
for (conta=0;conta<=10;conta++) a = a + conta;
Lao WHILE:
Neste lao, os comandos sero repetidos enquanto a expresso for verdadeira, sua forma :
while (exp)
{
comando;
}
Exemplo:
int x;
while(x<=10) x++;

11

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Lao DO-WHILE:
Este lao uma variao do comando WHILE, sendo que neste caso o comando ser executado
antes de testa se a condio verdadeira. Sua forma :
do
{
comando;
}
while(exp);
O comando ser executado pelo menos uma vez antes de verificar a condio da expresso.
Exemplo:
int x;
int y;
do
{
x++;
} while(y!=1);
Ponteiros:
Podemos dizer que um ponteiro uma varivel onde ser armazenado o endereo de outra varivel,
ou seja, o ponteiro um apontador para uma outra varivel.
A sintaxe para a declarao de uma varivel ponteiro :
TIPO *NOME
onde TIPO um tipo de dados vlido e NOME o nome da varivel. Exemplo:
int *idade;

12

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Exibindo uma string usando um ponteiro:
Uma string uma matriz de caracteres. Podemos usar um ponteiro para exib-la assim:
unsigned char *txt = "Exibindo uma string usando um ponteiro.";
do
{
Usart_Write(*txt); //envia um caracter pela serial
*txt++;
//incrementa o ponteiro
delay_ms(100);
} while (*txt != '\0');
}
Obs.: Ver exemplo serial3, pgina 48.
Matrizes:
Uma matriz uma estrutura de dados que pode armazenar vrios valores do mesmo tipo.
A sintaxe para declarar uma matriz :
TIPO NOME[QUANTIDADE];
onde TIPO o tipo dos dados que sero armazenados na matriz. Todos os dados colocados na
matriz devem ser deste tipo. NOME o nome a ser dado a matriz. Este nome identificar a matriz
no cdigo do programa. E QUANTIDADE a quantidade mxima de itens a ser armazenados.
Exemplos:
int nr_de_livros[50]; //esta matriz pode armazenar at 50 valores do tipo int.
float nota[30]; //esta matriz pode armazenar at 30 valores do tipo float.
Os valores armazenados na matriz so chamados de "elementos da matriz". O primeiro elemento da
matriz indexado como item zero e o ltimo indexado como QUANTIDADE menos 1. Assim,
para nossa matriz nota, mostrada no exemplo acima, o primeiro elemento nota[0] e o ltimo
elemento nota[29].
Voc pode inicializar os elementos de uma matriz na sua declarao usando a sintaxe:
int notas[5] = {60,70,35,50,68};

Obs.: Ver exemplo na pgina 49.

13

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

O Ambiente MikroC
O compilador MikroC foi desenvolvido pela Mikroelektronika e com ele que vamos desenvolver
nossos projetos. Abaixo est a tela inicial do compilador.

14

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Criando um novo projeto:
O mikroC organiza as aplicaes dentro de projetos, onde nele possvel ter vrios arquivos fonte.
A compilao do arquivo fonte somente poder ser realizada se fizer parte de um projeto.
Para criar um projeto basta clicar menu Project e em seguida escolha a opo New Project. A
seguinte tela ser apresentada:

-Em Project Name, deve-se informar o nome do projeto;


-Em Project Path, dever conter o caminho da pasta onde o projeto ser salvo;
-Description opcional e pode-se relatar algo sobre o projeto;
-Em Device, deve-se escolher o dispositivo a ser utilizado no projeto;
-Em Clock, informa-se a freqncia do cristal que ser utilizado na montagem do circuito;
-Em Device Flags, as informao so em relao configurao dos fusveis.

15

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Primeiro Projeto
Definindo o projeto:
-Project Name : PiscaLed
-Project Path : \MikroC\Proj1\
-Description : ....
-Device
: P16F877A
-Clock
: 004.000000
-Device Flags: Default
Circuito:

Estrutura bsica de um programa em C utilizando o compilador mikroC:


void main()
{
//Este o bloco principal do programa e o nico que a linguagem C precisa para funcionar.
}
obs.: Tudo que vem precedido de // chamado comentrio e no interpretado pelo compilador.
Tambm pode-se fazer comentrio assim: /* Isto um comentrio */

16

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Cdigo do Projeto:
void main()
{
PORTD = 0;
TRISD = 0,
while(1)

//Configura os pinos da porta D como sada


//Comeo do loop (infinito)

{
PORTD = ~PORTD;
delay_ms(1000);
}

//Troca situao dos pinos na porta D


//Tempo de atraso de 1 segundo

}
Depois de escrevermos o cdigo, devemos compilar o projeto para que possamos gravar no
microcontrolador. A compilao se d pressionando-se ctrl + F9 ou clicando no menu Project e
escolher a opo Build, conforme abaixo.

17

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Estando o projeto sem erros, as informaes abaixo devem ser mostradas na parte de baixo do
programa.

Gravando o Projeto
Utilizaremos, para gravar o programa no microcontrolador, o programa ICPROG como segue a
figura abaixo:

18

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Antes de gravarmos o programa, precisamos configurar o ICPROG para o correto funcionamento
com a placa CUSCOPIC. Para isso, clica-se em Configurao e escolhe-se a opo 'Hardware' ou,
diretamente, pressiona-se a tecla F3.

A tela de 'Configuraes de Hardware' aparecer. Ento, escolhe-se, em 'Programador:' a opo


'TAIT Serial Programmer', conforme acima e deve-se tambm em 'Comunicao' habilitar a opo
'Iverter MCLR'. Clica-se em 'OK' e o programa ICPROG estar pronto.
Abrindo o programa:
Vamos, ento, escolher o dispositivo a ser gravado na janela destacada em vermelho, conforme
abaixo:

19

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Agora abriremos o programa referente ao nosso projeto. Clica-se em 'Arquivo' e escolhe-se a opo
'Abrir':

Na janela que se abre a seguir, deveremos encontrar o arquivo do nosso projeto, que neste caso o
arquivo 'PiscaLed.hex'. O programa ICPROG ter a aparncia parecida com a figura abaixo:

20

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Identificao dos botes:

-Ler Tudo: Usado para a leitura do contedo gravado no microcontrolador;


-Programar Tudo: Usado para gravarmos o programa no microcontrolador;
-Limpar Tudo: Usado para limparmos o contedo gravado no microcontrolador;
-Verificar: Usado para fazer uma comparao do contedo gravado no microcontrolador com o
programa aberto.
Gravando o programa:
Para gravar o programa no microcontrolador, pressionaremos, ento o boto 'Limpar Tudo', para
certificarmos que o microcontrolador estar pronto para o nosso programa e logo aps, pressiona-se
'Programar Tudo'.

Na janela que mostrada, confirmamos a pergunta clicando em 'Sim'.

21

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Aps a gravao, se tudo estiver correto, a seguinte mensagem aparecer:

Pronto, nosso programa j est no microcontrolador.


Projetos de fixao:
-Este projeto faz piscar o led conectado ao pino 0 da porta D
void main()
{
TRISD.F0 = 0;
while (1)
{
PORTD.F0 = 0;
delay_ms(500);
PORTD.F0 = 1;
delay_ms(500);
}
}

//Configura o pino 0 da porta D com sada

//Faz com que o pino 0 da Porta D tenha nvel lgico 0


//Tempo de atraso de 500ms
//Faz com que o pino 1 da porta D tenha nvel lgico 1
//Tempo de atraso de 500ms

-O projeto abaixo tem a mesma funo, s que utiliza a diretiva #define para identificao,
conforme abaixo:
#define DirLed TRISD.F0 //Identifica a varivel TRISD.F0 como DirLed
#define Led
PORTD.F0 //Identifica a varivel PORTD.F0 como Led
void main()
{
DirLed = 0;
while (1)
{
Led = 0;
delay_ms(500);
Led = 1;
delay_ms(500);
}
}

//Configura o pino 0 da porta D com sada

//Faz com que o pino 0 da Porta D tenha nvel lgico 0


//Tempo de atraso de 500ms
//Faz com que o pino 1 da porta D tenha nvel lgico 1
//Tempo de atraso de 500ms

22

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
obs.: Os registradores especiais, TRISD, PORTD, PORTA, TRISA, INTCON, TMR0 e outros so
tratados, pelo compilador, como variveis, portanto, podemos atribuir valor e trat-los exatamente
como uma varivel qualquer.
Exerccio proposto:
-Fazer um programa onde todos os LEDS sero acesos em seqncia, exemplo: acende LED1,
atraso de 300ms, acende LED2, outro atraso de 300ms e assim por diante at o LED8, em seguida
fazer com que todos apaguem tambm comeando do LED1 e terminando no LED8.

23

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Acionamento de Botes
Definindo o projeto:
-Project Name : Botao
-Project Path : \MikroC\Proj2\
-Description : ....
-Device
: P16F877A
-Clock
: 004.000000
-Device Flags: Default
Circuito:

24

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Cdigo do Projeto:
#define botao PORTD.F0
#define led PORTD.F1
void main()
{
TRISD = 0x01; //Configura o pino 0 da porta D como entrada e o restante como sada
PORTD = 0x00; //Zera toda a porta D
while(1)
//Loop principal
{
if (botao == 1) //Compara o valor do pino 0 ao valor 1 (nvel lgico alto)
led = 1;
//Sendo o valor igual a 1, ento acende o led conectado ao
//pino 1 da porta D.
}
}
Projeto de fixao:
#define botao PORTD.F0
#define led PORTD.F1
void main()
{
TRISD = 0x01;
PORTD = 0x00;

//Configura o pino 0 da porta D como entrada e o restante como sada


//Zera toda a porta D

while(1)
//Loop principal
{
if (botao == 1)
//Compara o valor do pino 0 ao valor 1 (nvel lgico alto)
{
//Sendo o valor igual a 1, executa os comandos do bloco
led = 1;
//Coloca em 1 o pino 1 da porta D, acendendo o LED
delay_ms(1000); //Atraso de 1 segundo
led = 0;
//Coloca em 0 o pino 1 da porta D, apagando o LED
}
}
}

25

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Estudo dos Timers e interrupes


TIMER 0
O Timer 0 um contador interno e pode contar estmulos externos ou contar internamente,
utilizando o oscilador. Ele possui um prescaler de at 1:256 e tem 8 bits, ou seja, para um prescaler
de 1:1, haver um overflow (estouro) a cada 256 contagens (0 255) . Para o controle do Timer 0,
vamos utilizar os registros especiais OPTION_REG e INTCON, como segue:
OPTION_REG
Nome /RBPU INTEDG
Bit

TOCS

TOSE

PSA

PS2

PS1

PS0

TOCS = 1: Incremento a cada transio no pino RA4/T0CKI.


TOCS = 0: Incremento a cada ciclo de mquina.
TOSE = 1: Incremento na borda de descida.
TOSE = 0: Incremento na borda de subida.
PSA = 1: Prescale aplicado ao WDT.
PSA = 0: Prescale aplicado ao TMR0.
PS2

PS1

PS0

TMRO

WDT

1:2

1:1

1:4

1:2

1:8

1:4

1:16

1:8

1:32

1:16

1:64

1:32

1:128

1:64

1:256

1:128

Para utilizarmos a interrupo do TMR0, devemos setar o registro INTCON.T0IE e tambm o


registro INTCON.GIE (interrupo geral). Deste modo, toda vez que houver um estouro do TMR0,
o flag INTCON.T0IF ser setado, devendo ser limpo quando do tratamento da interrupo
INTCON
Nome
Bit

GIE

PEIE

TOIE

INTE

RBIE

T0IF

INTF

RBIF

26

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Contando um tempo com o Timer 0:
Vamos supor que queremos contar um tempo com o timer 0 de 100us e o prescaler seja de 1:1.
Neste caso, s temos a opo 1:1 quando aplicamos o prescaler ao WDT, ento tanto o timer0 como
o WDT estaro com prescaler de 1:1.
Quando fazemos o prescaler igual a 1:1, estamos fazendo com que o TMR0 incremente seu valor
em 1 a cada ciclo de mquina, ou seja, para um cristal de 4MHz, o incremento se dar a cada 1us.
Ento para um tempo de 100us, queremos que o TMR0 seja incrementado 100 vezes.
O estouro do Timer0 ocorre quando o TMR0 chega contagem 256, portanto, no nosso caso,
haver um estouro a cada 256us, mas o que queremos 100us.
Basta, ento inicializarmos o TMR0 com o valor de 256 100 = 156.
Inserindo no cdigo os valores de contagem:
No MikroC, toda vez que ocorre uma interrupo, o programa entra na funo 'interrupt' e nela
sero tratadas as interrupes ocorridas.
void interrupt() {
{
TMR0 = 156;
INTCON = 0x20;
}

// Valor inicial para o Timer0


// Seta T0IE e limpa T0IF

void main() {
OPTION_REG = 0x80;
TMR0 = 156;
INTCON = 0xA0;

// Atribui prescaler de 1:1 ao to TMR0


// Valor inicial para o Timer0
// Habilita a interrupo do TMR0, seta os registros GIE e T0IE

while(1) {}
}
Projeto:
Faamos um LED piscar a cada 1 segundo utilizando o Timer0.
Resoluo:
Ento: 1 segundo = 1000000us ou
1 segundo = 10000 x 100us.

27

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
unsigned int cnt;

//contador para acerto do tempo (ver 'unsigned int' na pg. 4)

void interrupt()
{
cnt++;
TMR0 = 156;
INTCON = 0x20;
}

// Incrementa o valor de cnt a cada interrupo


// Valor inicial para o Timer0
// Seta T0IE e limpa T0IF

void main() {
OPTION_REG = 0x80;
TMR0 = 156;
INTCON = 0xA0;

// Atribui prescaler de 1:1 ao to TMR0


// Valor inicial para o Timer0
// Habilita a interrupo do TMR0, seta os registros GIE e T0IE

TRISD.F0 = 0;
PORTD.F0 = 0;

// Faz pino 0 da porta D como sada


// Limpa o pino 0 da porta D, LED apagado

cnt = 0;
while(1) {
if (cnt >= 10000) // Executa o bloco abaixo SE a varivel cnt for maior ou igual a 10000
{
PORTD.F0 = ~PORTD.F0; //Inverte a situao do pino 0 da porta D.
cnt = 0;
//Zera cnt para um novo ciclo.
}
}
}
Ajustando alguns valores:
Seguindo o exemplo acima, vamos ajustar os valores para um prescaler de 1:32, ento ficaria assim:
Valor Inicial para o TMR0 = 256 157 = 99.
Calculando 157 x 32 = 5024 x 200 = 1004800 us <=> 1,005s
unsigned cnt;
void interrupt() {
cnt++;
TMR0 = 99;
INTCON = 0x20;
}//~

// Incrementa o valor de cnt a cada interrupo


// Valor Inicial para o TMR0
// Seta T0IE e limpa T0IF

void main() {
OPTION_REG = 0x84;
TMR0 = 99;
INTCON = 0xA0;

// Atribui prescaler de 1:32 ao TMR0


// Valor Inicial para o TMR0
// Habilita a interrupo do TMRO
28

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
TRISD.F0 = 0;
PORTD.F0 = 0;
cnt = 0;

// Inicializa cnt

do {
if (cnt == 200) {
PORTD.F0 = ~PORTD.F0;
cnt = 0;
}
} while(1);
}

29

// Inverte os valores do pino 0 da porta D


// Inicializa cnt novamente

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

TIMER 1
O Timer 1 tem suas caractersticas muito parecidas com as do Timer 0, sendo que ele tambm pode
operar como contador ou temporizador, mas agora, com 16 bits.
Desta forma, podemos concluir que um ciclo de contagem do Timer 1 se incia em 0 e termina em
65535 (equivalente aos 16 bits do contador com prescaler de 1:1).
Registradores associados:
Nome

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

INTCON

GIE

PEIE

TOIE

INTE

RBIE

T0IF

INTF

RBIF

PIR1

PSPIF

ADIF

RCIF

RXIF

SSPIF

CCP1IF TMR2IF TMR1IF

PIE1

PSPIE

ADIE

RCIE

RXIE

SSPIE

CCP1IE TMR2IE TMR1IE

TMR1L

Contador 8 bits Parte menos significativa

TMR1H

Contador 8 bits Parte mais significativa

T1CON

T1CKPS1 T1CKPS2 T1OSCEN /T1SYNC TM1CS TMR1ON

Registrador T1CON
T1CKPS0 e T1CKPS1, so utilizados para selecionar 1 dos 4 fatores de prescaler.
T1CKPS1 T1CKPS0 Prescaler
0

1:1

1:2

1:4

1:8

T1OSCEN
1 - Habilita oscilador externo. O pino RC0 e RC1 so configurados como entrada e no podero
ser utilizados como I/O.
0 - Desabilita oscilador externo. RC0 opera como entrada para sinal externo para contagem
(T1CKI), RC1 opera como I/O.
/T1SYNC
1 - Sincronismo desligado.
0 - Sincronismo ligado.

30

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
TMR1CS
1 - Clock externo via RC0/T1CKI.
0 - Clock interno atravs dos ciclos de mquina.
Registrador PIR1
Neste registrador so sinalizados os flgs das interrupes e estouro dos Timer1 e Timer2.
Registrador PIE1
Registrador onde so habilitadas as interrupes.
Calculando o tempo total de estouro do Timer 1:
Na placa em questo, o microcontrolador est trabalhando com um cristal externo de 4MHz, ento o
tempo total do timer 1, utilizando o maior prescaler 1:8 e clock interno pelo ciclo de mquina, ser:

(65536 valor do contador) x (1/(FOSC/4)) x prescaler

No caso, o valor do contador ser 0 (queremos o tempo total), ento:


Tempo = (65636 0) x 1us x 8
Tempo = 524,28ms
Tempo mximo com prescaler 1:1:
Tempo = (65636 0) x 1us x 1
Tempo = 65,535ms
Projeto:
Configurar o timer 1 para fornecer um tempo de 100ms e com isso fazer todos os LED's da porta D
piscarem a cada 1s.
Resoluo:
Como com o prescaler 1:1, conseguiremos no mximo 65,535ms, ento teremos que utilizar um
prescaler de 1:2, ento teremos:
Tempo = (65536 TMR1) x (1/(FOSC/4) x prescaler
100ms = (65536 TMR1) x 1us x 2

31

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

TMR1 = 15536 = 0x3CB0


Cdigo do projeto:
unsigned short cnt;
void interrupt() {
cnt++ ;
PIR1.TMR1IF = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
}
void main() {
PORTD = 0x00;
TRISD = 0;
T1CON = 0x11;
PIR1.TMR1IF = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
PIE1.TMR1IE = 1;
cnt = 0;
INTCON = 0xC0;
do {
if (cnt == 10) {
PORTD = ~PORTD;
cnt = 0;
}
} while (1);

// Limpa o flag TMR1IF


// Inicializa registro do Timer 1

// Inicializa PORTD
// PORTD sada
// Ajuste do Timer1
// Limpa o flag TMR1IF
// Inicializa o registro do Timer1
// Habilita a interrupo do Timer1
// inicializa cnt
// habilita GIE, PEIE
// se cnt 10 (10 x 100ms = 1000ms)
// Troca posio da porta D
// zera cnt

32

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Timer 2
O timer 2 tambm um contador de 8 bits, sendo relacionado somente ao clock interno, a diferena
deste timer que ele no conta de 0 255(8 bits). Quem impe o limite de contagem o valor do
registrador PR2. Ento sempre que o registrador TMR2 tiver o mesmo valor que PR2, o timer
resetado, voltando a zero. Quando isto ocorre, um outro contador que chamamos de postcaler
incrementado e quando houver o trmino do da contagem do postcaler, uma interrupo ser
gerada.
Registradores associados:
Nome

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

INTCON

GIE

PEIE

TOIE

INTE

RBIE

T0IF

INTF

RBIF

PIR1

PSPIF

ADIF

RCIF

RXIF

SSPIF

CCP1IF

TMR2IF

TMR1IF

PIE1

PSPIE

ADIE

RCIE

RXIE

SSPIE

CCP1IE

TMR2IE

TMR1IE

TMR2
T2CON

Contador 8 bits
-

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0

PR2

TMR2ON T2CKPS1 T2CKPS0

Limite de contagem para o timer 2

Registrador T2CON: Seleo do postcaler do timer 2


TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 POTSCALER
0

1:1

1:2

1:3

1:4

1:5

1:6

1:7

1:8

1:9

1:10

1:11

1:12

1:13

1:14

1:15

1:16
33

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
TMR2ON
1 - Timer 2 desativado.
0 - Timer 2 ativado.
Seleo do prescaler:
T2CKPS1 T2CKPS0 PRESCALER
0

1:1

1:4

1:16

1:16

Obs.: As duas ltimas opes so realmente iguais.


Calculando o tempo total de estouro do Timer 2:
Tempo = prescaler x postcaler x PR2 x (1/(FOSC/4))
Tempo = 16 x 16 x 255 x 1us
Tempo = 65,28ms
Projeto 1:
Configurar o timer para piscar os leds da porta D a cada 1 segundo.
Resoluo:
Neste caso, podemos utilizar os valores acima sendo que teremos um estouro do timer a cada
65,28ms. Assim, para que possamos fazer uma contagem de 1 segundo, deveremos multiplicar o
valor por 15 que resultar em 979,2 ms, aproximadamente 0,97 s.
Cdigo do projeto:
unsigned short cnt;
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ;
PIR1.TMR2IF = 0;
TMR2 = 0;
}
}

// incrementa cnt
// limpa flag TMR2IF

34

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
void main() {
cnt = 0;
PORTD = 0xFF;
TRISD = 0;
T2CON = 0xFF;
TMR2 = 0;
PR2 = 0xFF;
PIE1.TMR2IE = 1;
INTCON = 0xC0;

// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2 com o valor 255 (no necessrio
// para este caso, pois ele j tem com default esse
// valor).
// habilita interrupo
// habilita GIE, PEIE

while (1) {
if (cnt == 15) {
PORTD = ~PORTD;
cnt = 0;
}
}

// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt

}
Projeto 2:
Configurar o timer2 para uma interrupo a cada 50ms e fazer piscar os Leds da porta D a cada 1
segundo.
Resoluo:
O valor mximo de estouro para o timer2 de 65,28ms utilizando prescaler e postcaler 1:16, ento
para 50ms temos:

PR2 = 195,31 <=> 195

35

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Cdigo do projeto:
unsigned short cnt;
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ;
PIR1.TMR2IF = 0;
TMR2 = 0;
PR2 = 195;
}
}
void main() {
cnt = 0;
PORTD = 0xFF;
TRISD = 0;
T2CON = 0xFF;
TMR2 = 0;
PR2 = 195;
PIE1.TMR2IE = 1;
INTCON = 0xC0;
while (1) {
if (cnt == 20) {
PORTD = ~PORTD;
cnt = 0;
}
}

// incrementa cnt
// limpa flag TMR2IF

// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2.
// habilita interrupo
// habilita GIE, PEIE
// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt

}
O importante que o valor do PR2 TMR2 seja de 195, ento podemos fazer:
Cdigo:
unsigned short cnt;
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ;
PIR1.TMR2IF = 0;
TMR2 = 55;
PR2 = 200;
}
}

// incrementa cnt
// limpa flag TMR2IF

36

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
void main() {
cnt = 0;
PORTD = 0xFF;
TRISD = 0;
T2CON = 0xFF;
TMR2 = 55;
PR2 = 200;
PIE1.TMR2IE = 1;
INTCON = 0xC0;
while (1) {
if (cnt == 20) {
PORTD = ~PORTD;
cnt = 0;
}
}

// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2.
// habilita interrupo
// habilita GIE, PEIE
// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt

37

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Funes
A linguagem C nos permite montar blocos de comandos para que possamos execut-los
sem a necessidade de repeti-los no bloco principal.
Esses blocos so chamados Funes e so parecidos com as chamadas de sub-rotinas em
assembly.
Nos exemplos anteriores, usamos uma funo para chamar e tratarmos as interrupes, s
que esta funo chamada pelo prprio compilador diratemente.
Como declarar a funo
Tipo + Nome da Funo (parmetro)
Bloco de Execuo
Ex: int.adio (int a, int b)
Return a e b
Chamando a funo:
Int adicao (int a, int b)
{
return a + b;
}
Void main ( )
{
Int c;
TRISD = 0x00;
PORTD = 0x00;
c = adicao (2, 3) ;
While (1 ) {
PORTD = c;
}
}

38

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Debug no MikroC
Clicando no menu Run e escolhendo-se a opo Start Debugger, a janela abaixo ser mostrada

Em Select variable from List, seleciona-se Portd e clica-se em Add,

39

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Repete-se a operao para as variveis a, b e c


Para iniciar a simulao (Debugger) deve-se clicar no boto conforme a figura abaixo ou pode-se
iniciar a simulao simplesmente pressionando-se a tecla F9

40

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
A tecla F7 faz a simulao passo a passo e F6 inicia o modo Run

-Run/Pause Debugger (F6)


-Stop Debugger (Ctrl = F12)
-Step over (F8)
-Step Out (Ctrl + F8)
-Run to cursor (F4)
-Step Into (F7)

41

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Display de Cristal Lquido (LCD)


Pinagem do LCD
Pino

Descrio
1

Gnd

+5V

Ajuste de contraste

Seleo RS: 1 - dado, 0 - escrita

Seleo R/W, 1 leitura, 0 - escrita

Em habilita p/ dado ou escrita em 1 ou transio 1 -> 0, 0 - desabita

7
8
9
Barramento de Dados

10
11
12
13
14

Endereos dos caracteres p/um LCD de 2 linhas e 16 colunas


80

81

82

83

84

85

86

87

88

89

8A

8B

8C

8D

8E

8F

C0

C1

C2

C3

C4

C5

C6

C7

C8

C9

CA

CB

CC

CD

CE

CF

42

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Biblioteca LCD no MikroC para o modo de 4 bits.
LCD_Custon_Config: Inicializa e configura
especificao.
Sintaxe:

LCD_Custon_Config, (char=data.port, char db3, char db2, char db2, char db1, char
d30, char+ctel-port, char res, char rw, char em);
Onde: data port => porta ondeos dados db0,db1, db2 e db3sero conectados
Ctel-port => porta onde os controles r5, w e em do LCD sero conectados
Exemplo: LCD_Custom_Config(&Portd, 3,2,1,0, $Portb, R, 3, 4);

LCD_Custon_Out:
Sintaxe:

a linguagem do microcontrolador conforme

Escreve um texto no LCD na linha e coluna especfica

LCD_Custon_Out (char row, char cal, char text)


Onde: row = linha
Col = coluna
Exemplo: LCD_Custom_Out (1, 3,Hello),

LCD_Custon_Out_CP: Escreve um texto no LCD na posio corrente do cursor


Sintaxe:

LCD_Custon_Out_CP (char text)


Exemplo: LCD_Custon_Out_CP (Aqui),

LCD_Custon_Chr: Escreve um caracter numa linha e numa coluna especfica no LCD


Sintaxe:

LCD_Custon_Chr (char row, char cal, char character)


Exemplo: LCD_Custon_Chr (2, 3,r),

LCD_Custon_Chr_CP: Escreve um caracter na posio corrente do cursor


Sintaxe:

LCD_Custon_Chr_CP (char character)


Exemplo: LCD_Custon_Chr_CP (c),

LCD_ Custon_CMD: Envia um comando p/o LCD


Sintaxe:

LCD_Custon_CMD (char out_char),


Onde: out_char = comando conforme tabela de comandos disponveis:
Exemplo: LCD_Custon_CMD (LCD-Clear),

43

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Comandos Disponveis
Comando

Propsito

LCD_First_Row

Move o cursor p/1a.linha

LCD_Second_Row

Move o cursor p/2a.linha

LCD_Third_Row

Move o cursor p/3a.linha

LCD_Fourth_Row

Move o cursor p/4a.linha

LCD_Clear

Limpa o display

LCD_Return_Home

Move cursor para a primeira coluna da primeira linha

LCD_Cursor_Off

Desliga o cursor

LCD_Underline_On

Liga o Underline no cursor

LCD_Blink_Cursor_On

Liga o modo piscante do cursor

LCD_Move_Cursor_Left

Move o cursor p/a esquerda sem mover o texto

LCD_Blink_Cursor_Right

Move o cursor p/a direita sem mover o texto

LCD_Turn_On

Liga o visor do LCD

LCD_Turn_Off

Desliga o visor do LCD sem perder os dados

LCD_Shift_Left

Move o texto p/a esquerda

LCD_Shift_Right

Move o texto p/a direita

44

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Projeto LCD
Escrever o texto LCD Display Test na primeira linha do display de LCD
Resoluo - Cdigo do Projeto:
char *text = "LCD Display Test";
void main() {
unsigned i;
TRISB = 0;
// PORTB is output
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initialize LCD on PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Turn off cursor
Lcd_Custom_Out(1, 1, text);

// Print text at LCD

while(1) {
Lcd_Custom_Cmd(LCD_RETURN_HOME);
Lcd_Custom_Cmd(LCD_UNDERLINE_ON);
for(i=0;i<=15;i++) {
Lcd_Custom_Cmd(LCD_MOVE_CURSOR_RIGHT);
Delay_ms(100);
}
for(i=0;i<=15;i++) {
Lcd_Custom_Cmd(LCD_MOVE_CURSOR_LEFT);
Delay_ms(100);
}
Lcd_Custom_Cmd(LCD_TURN_OFF);
Delay_ms(500);
Lcd_Custom_Cmd(LCD_TURN_ON);
}
}

45

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Converso A/D
- Biblioteca ADC no MikroC
No MikroC utiliza-se a funo abaixo para leitura do conversor AD do PIC
ADC_Read(channel): Faz a leitura da converso AD no canal especificado
Sintaxe: ADC_Read (unsigned short channel)
Onde channel = canal do provedor AD que desejamos ler
Exemplo:
Int ad
ad= ADC_Ready (0), //l o canal Ado do PIC e armazena o
//valor na variavel ad.
Esta funo retorna um valor sem sinal de 10 bits, ou seja, de 0 1023.
Projeto ADC:
Fazer uma leitura do canal do PICe mostrar os 8 bits menos siginificativos nos LCDs conectados
porta D.
Resoluo:
Primeiramente necessrio configurar o registrador ADCON1. Nele podemos definir o modo de
trabalho dos pinos de A/D, conforme a tabela ADCON1 seguir:
ADCON1
PCFG
<3 0>
0000
0001
0010
0011
0100
0101
0111
1000
1001
1010
1011
1100
1101
1110
1111

AN7

AN6

AN5

AN4

AN3

AN2

AN1

AN0

VREF+

A
A
D
A
D
D
D
A
D
D
D
D
D
D
D

A
A
D
A
D
D
D
A
D
D
D
D
D
D
D

A
A
D
A
D
D
D
A
A
A
A
D
D
D
D

A
A
A
A
D
D
D
A
A
A
A
A
D
A
A

A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+

A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-

A
A
A
A
A
A
D
A
A
A
A
A
A
D
D

A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

VDD
AN3
VDD
AN3
VDD
AN3
AN3
VDD
AN3
AN3
AN3
AN3
VDD
AN3

46

VREF
VSS
VSS
VSS
VSS
VSS
VSS
AN2
VSS
VSS
AN2
AN2
AN2
VSS
AN2

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Queremos, ento, utilizar a converso no canal 0 (RA0), ento atribumos o ADCON1 com o valor
1110 ou 14 ou ainda OxOE.
Cdigo:
unsigned int ad;
void main() {
ADCON1 = 0x0E; // Configure analog inputs and Vref
TRISA = 0xFF; // PORTA is input
TRISD = 0x00; // Pins RB7, RB6 are outputs
do {
ad = Adc_Read(0); // Get results of AD conversion
PORTD = ad;
// Send lower 8 bits to PORTD
} while(1);
}
Projeto ADC 2:
Mostrar o valor da converso no LCD
Cdigo:
unsigned int ad;
char txt[7];
void main() {
ADCON1 = 0x0E; // Configure analog inputs and Vref
TRISA = 0xFF; // PORTA is input
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initialize LCD on PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Turn off cursor
do {
ad = Adc_Read(0); // Get results of AD conversion
IntToStr(ad,txt);
Lcd_Custom_Out(1, 1, "AD = ");
Lcd_Custom_Out(1, 5, txt);

// Print text at LCD

} while(1);
}

47

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

Comunicao Serial (USART)


USART= Universal Synchronous Asynchronous Receiver Transmitter
Biblioteca USART no MIKROC
Usart_init: Inicializa o modo de comunicao serial informando o Band-Rate (Taxa de
Comunicao) utilizado para a comunicao
Sintaxe: Usart_init (BaudRate)
Exemplo: Usart_init (9600), inicializa a serial com taxa de 9600 bps.
Usart_Data_Ready: Verifica se existe algum byte no buffer de recepo serial, retornando 1 se
existir e 0 se no existir nenhum byte.
Sintaxe: var = Usart_Data_Ready( ),
onde var = varivel.
Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer, executa a expresso abaixo:
{
.....expresso......
}
Usart_Read: L o valor armazenado no buffer de recepo serial.
Sintaxe: recepo = Usart_read( );
Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer, executa a expresso abaixo:
{
receive = Usart_Read(); //armazena o byte recebido na varivel
//receive.
}
Usart_Write: transmite um byte pela serial.
Sintaxe: Usart_Write (byte chr),
Exemplo: Usart_Write('A'); ou Usart_Write (61); // escreve o caracter A na serial.

48

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Projeto Serial:
1-) Enviar o caracter A pela serial.
Resoluo:
Neste caso, vamos atuar sobre o boto conectado ao pino 0 da porta D e a cada atuao, o caracter
A ser enviado para a serial.
Utilizamos, agora, uma maneira diferente de verificar o acionamento de um boto que atravs da
biblioteca UTIL e o comando BUTTON, conforme segue:
Sintaxe: unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time,
unsigned short active_state);
Exemplo: if (Button(&PORTD,0,1,1))
{
...comando.....
}
Para o exemplo acima, conclui-se que se o boto conectado ao pino 0 da porta D, por um tempo de
1 ms, o estado do pino mudar para nvel lgico 1 e o que est entre chaves ser executado.
Cdigo:
void main() {
// Initializa o mdulo USART (8 bit, baud rate 9600, no parity bit..)
Usart_Init(9600);
while (1) {
if (Button(&PORTD,0,100,1)) //Se o boto conectado ao pino 0 da Porta D, o comando
//abaixo ser executado.
Usart_Write('A'); //Envia o caracter A pela serial.
}
}
Obs.: Faa uma experncia modificando para baixo o tempo de 100ms.
Projeto Serial 2:
2-) Receber um caracter do PC e envi-lo novamente pela serial, alm de acender o LED1 se o
caracter for ae apagar o led se o caracter for b.

49

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Cdigo:
unsigned short i;
void main() {
TRISD = 0x00;
PORTD = 0x00;
// Initializa USART (8 bit, baud rate 9600, no parity bit..)
Usart_Init(9600);
do {
if (Usart_Data_Ready()) {
i = Usart_Read();
Usart_Write(i);
if (i=='a') PORTD.F0 = 1;
if (i=='b') PORTD.F0 = 0;
}
} while (1);
}

// Se algum dado for recebido


// L o dado recebido
// Envia o dado pela serial novamente
//Se o caracter for 'a', acende o LED 1
//Se o caracter for 'b', apaga o LED 1

Projeto Serial 3:
3-) Enviar a palavra MICROCONTROLADOR pela serial.
Resoluo:
No MikroC, no existe uma maneira de enviarmos uma string, somente podemos enviar 1 caracter
por vez, portanto podemos enviar assim:
Usart_Write('M');
Usart_Write('I');
Usart_Write('C');
......
Ou podemos utilizar uma maneira mais usual que a utilizao de ponteiros que ser mostrada no
cdigo abaixo:
No caso de ponteiros, podemos dizer que cada caracter ser colocado numa posio do ponteiro,
ou seja, o caracter M ser colocado ou estar apontando para a posio 0, o caracter I ser
colocado ou estar apontando para aa posio 1 e assim por diante at o final, sendo que a ltima
posio ser ocupada por um valor nulo e essa ser a finalizao do ponteiro.
M

\0

10

11

12

13

14

15

16

50

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Cdigo:
unsigned char *txt = "MICROCONTROLADOR";
void main()
{
// Initializa USART (8 bit, baud rate 9600, no parity bit..)
Usart_Init(9600);
do
{
Usart_Write(*txt);
*txt++;
delay_ms(100);
} while (*txt != '\0');
}

//envia um caracter pela serial


//incrementa o ponteiro
//Verifica a finalizao do ponteiro

Projeto Serial 4:
4-) Receber do PC a string LD1 e acender o LED1 e se a string for DL1, apagar o LED1.
Resoluo:
Neste caso utilizaremos uma matriz com 4 posies ou 4 endereos (rec[4]) onde sero
armazenados os valores recebidos pela serial, lembrando que necessrio sempre inicializarmos
com 0 o posicionamento. No caso, a varivel i ser a responsvel pelo posicionamento da matriz.
Cdigo:
char rec[4];
short i;
void trata_serial()
{
if ((rec[0] == 'L') && (rec[1] == 'D') && (rec[2] == '1')) // Faz a comparao dos valores
// armazenados na Matriz 'rec'
PORTD.F0 = 1;
if ((rec[0] == 'D') && (rec[1] == 'L') && (rec[2] == '1'))
PORTD.F0 = 0;
}
void main()
{
TRISD = 0x00;
PORTD = 0x00;

51

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
// Initializa USART (8 bit, baud rate 9600, no parity bit..)
Usart_Init(9600);
i=0;
while(1) {
if (Usart_Data_Ready())
//Se existir um caracter no buffer da serial
{
rec[i] = Usart_Read(); //O caracter ser lido e colocado na matriz 'rec'
i++;
//Incrementa o valor da posio da matriz
if (rec[i-1] == 0x0D) {
//Verifica se o valor armazenado na Matriz
// 0x0D (Cdigo hexa para o ASCII <enter>)
trata_serial();
// Sendo 0x0D, vai para a funo trata_serial
//for(i=0;i<=3;i++) // 'Limpa' a Matriz
// rec[i] = '\0';
i=0;
// Reinicializa o posicionamento da matriz
}
}
}
}

52

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

EEPRON Interna
Biblioteca EEPRON
EEPRON_Read: L um byte da memria EEPRON
Sintaxe: Varivel = EEPRON_Read (byte adress),
OBS: O PIC 16F877A tem 256 bytes de memria EEPRON
Exemplo: tmp = EEPRON_Read(0); //L a posio 0 e carrega o valor na varivel tmp
EEPRON_Write: Escreve um byte na memria EEPRON
Sintaxe: EEPRON_Write (byte adress, byte dado)
Exemplo: EEPRON_Write (0, 100); // escreve o valor 100 no endereo 0 da memria EEPRON.
Projeto EEPRON:
1-) Escrever o valor 61 ('caracter a) no endereo 0 da memria EEPRON, aps ler o valor e
escrever no LCD.
Cdigo:
void main()
{
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initializa o LCD na PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Desliga o cursor
EEPROM_Write(0,0x61);

// Escreve o cdigo 0x61 ('caracter 'a') na EEPROM do PIC

Lcd_Custom_Out(1,1,"Leitura EEPROM"); //Escreve na primeira linha do LCD


while(1) {
if (button(&PORTD,0,100,1)) //Se o boto no pino 0 da porta D for acionado
{
Lcd_Custom_Chr(2, 1, EEPROM_Read(0)); // Faz a leitura no endereo 0
// da EEPROM do PIC e
// escreve o contedo na
// linha 2 do LCD
}
}
}

53

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Projeto EEPRON 2:
2-) Receber da serial um caracter, escrever no endereo 10 da memria EEPRON, ler este valor da
memria, escrever no LCD e envia-lo serial.
Cdigo:
unsigned short i;
void main()
{
Usart_Init(9600);
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initializa LCD na PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Desliga o cursor
Lcd_Custom_Out(1,1,"Leitura EEPROM");

//Escreve na primeira linha do LCD

while(1) {
if (Usart_Data_Ready())
// Se existir um caracter no buffer da serial
{
i = Usart_Read();
// Faz a leitura do buffer e armazena na varivel i
Usart_Write(i);
// Escreve o contedo da varivel i na Serial
EEPROM_Write(10,i); // Escreve o contedo da varivel i na EEPROM
}
if (button(&PORTD,0,100,1))
//Se o boto no pino 0 da porta D for acionado
{
Lcd_Custom_Chr(2, 1, EEPROM_Read(10)); //Escreve na segunda linha
//do LCD o valor armazenado
//no endereo 10 da EEPROM.
}
}
}

54

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________

PWM - (Pulse Width Modulation)


A modulao PWM (modulao por largura de pulso) consiste basicamente na aplicao de uma
onda quadrada de amplitude igual VCC e freqncia alta substituindo a tenso contnua. A tenso
mdia varia em funo do tempo em que a onda fica em nvel alto (VCC) e do tempo em que a
onda fica em nvel bsico (0V).
A relao entre o tempo em que a onda fica em nvel alto e o perodo total conhecido como Duty
Cycle que normalmente expresso em percentual. Portanto para um Duty Cycle de 50 %, metade
do tempo a onda se mantm em nvel alto e a outra metade do tempo a onda se mantm em nvel
baixo. Por exemplo, uma modulao de amplitude 5V e Duty Cycle de 50 %. Tem o mesmo efeito
de uma tenso contnua de 2,5 V que a tenso mdia para este caso.

Biblioteca PWM no MikroC


PWM_init: Inicializa o mdulo PWM informando a freqncia de operao.
Sintaxe: PWM_init (Unsigned long Freq)
Exemplo: PWM_init(5000); // inicializa o mdulo PWM com frequncia de 5KHz.
PWM_Change_Duty: Altera o valor do Duty-Cycle.
Sintaxe: PWM_Change_Duty (Unsigned Char Duty)
Duty uma valor do tipo char, portanto de 0 255, onde 255 representa 100 % de Duty
Cycle .
Exemplo: PWM_Change_Duty (192); //configura o Duty-Cycle p/ 75 %.
PWM_Start: Inicializa a gerao do PWM.
Sintaxe: PWM_Start( );

55

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
PWM_Stop: Interrompe a gerao do PWM.
Projeto PWM:

Controlar o brilho de um Led, ligado ao CCP1 (RC2), utilizando PWM e variando o Duty-Cycle de
0 a 100 %.
Cdigo:
void main()
{
unsigned i;
i = 0;
Pwm_Init(5000);
Pwm_Start();

//Indica ao mdulo PWM o funcionamento com frequencia de 5KHz


//Inicializa o Modo PWM

while(1){
Pwm_Change_Duty(i); //Modifica o Duty_cycle
i++;
if (i>=100) i = 0;
delay_ms(50);
}
}
56

Curso bsico de linguagem C para microcontroladores PIC


________________________________________________________________________________
Projeto PWM 2:
Controlar o brilho do Led utilizando PWM e variando o Duty-Cycle de acordo com a leitura do A/D
e mostrar no LCD o valor do Duty.
Cdigo:
unsigned int ad;
char txt[7];
void main()
{
ADCON1 = 0x0E; // Configura as entradas analgicas e referncia
TRISA = 0xFF; // Faz PORTA como entrada
Pwm_Init(10000); //Indica ao mdulo PWM o funcionamento com frequencia de 10KHz
Pwm_Start();
//Inicializa o modo PWM
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initializa LCD na PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Desliga o cursor
while(1) {
ad = ADC_Read(0); //Faz a leitura da converso AD e armazena na varivel 'ad'.
Pwm_Change_Duty(ad/4);
// Modifica o Duty_cycle
ad = ((ad /4) * 100) / 255;
IntToStr(ad,txt);
// converte a varivel inteira 'ad' na varivel texto txt
// (matriz)
Lcd_Custom_Out(1, 1, "Duty = "); // Escreve na linha 1 do LCD
Lcd_Custom_Out(1, 7, txt);
// Escreve o valor de Duty no LCD
}
}

57

Você também pode gostar