Escolar Documentos
Profissional Documentos
Cultura Documentos
Curso Básico de Linguagem C para Microcontroladores PIC. Índice
Curso Básico de Linguagem C para Microcontroladores PIC. Índice
Curso Básico de Linguagem C para Microcontroladores PIC. Índice
________________________________________________________________________________
Índice
Linguagem C...................................................................................................... 3
Programação de Microcontroladores em linguagem C...................................... 3
Princípio de programação
- Álgebra Booleana.......................................................................................... 5
- Operações...................................................................................................... 5
- Representação Gráfica das Portas Lógicas.................................................... 5
Introdução à Linguagem C
- Variáveis........................................................................................................ 6
- Tipos de Dados.............................................................................................. 6
- Qualificadores............................................................................................... 6
- Declaração de variáveis................................................................................. 7
- Operadores matemáticos
- Aritméticos................................................................................................. 7
- Relacionais................................................................................................. 7
- Operadores Lógicos bit-a-bit...................................................................... 8
- Operadores Lógicos relacionais................................................................. 8
- Declarações de controle
- Decisão – Comando IF............................................................................... 9
- Decisão – Comando IF-ELSE.................................................................... 9
- Decisão – SWITCH-CASE........................................................................ 10
- Laço FOR...................................................................................................... 11
- Laço WHILE................................................................................................. 11
- Laço 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 Botões...................................................................................... 24
Estudo dos Timers e Interrupções
- Timer 0.......................................................................................................... 26
1
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
- Timer 1.......................................................................................................... 30
- Timer 2.......................................................................................................... 33
Funções............................................................................................................... 38
Debug no MikroC............................................................................................... 39
Display de Cristal Líquido (LCD)...................................................................... 42
Conversão A/D................................................................................................... 46
Comunicação Serial (USART)........................................................................... 48
EEPRON Interna................................................................................................ 53
PWM................................................................................................................... 55
2
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Linguagem C
Fonte: WIKIPEDIA
3
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Princípio de Programação
Álgebra Booleana
Operações:
4
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
CONT.:
5
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Introdução à Linguagem C
Variáveis:
As variáveis podem conter letras e números, sempre começando com letras e não devem ter nome
de palavras reservadas pelo compilador como, por exemplo, for, do, int, etc.
Tipos de Dados:
Dado: Representa:
-char Caracteres
-int Números inteiros
-float e double Números decimais (ponto flutuante)
-void Valores nulos
Qualificadores:
Qualificador Significado
-signed Sinalizado
-unsigned Não sinalizado
-short Inteiro menor que o padrão
-long Inteiro maior que o padrão
6
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Declaração de Variáveis:
Operadores Matemáticos:
Aritméticos:
7
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Relacionais:
São utilizados para comparação entre argumentos e retornam uma resposta verdadeira ou falsa.
Como em linguagem C não existe uma variável 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 Descrição
& E (AND)
| OU (OR)
^ OU EXCLUSIVO (XOR)
~ Complemento (NOT)
>> Deslocamento à direita
<< Deslocamento à esquerda
Operador Descrição
&& Comparação lógica E (AND)
|| Comparação lógica OU (OR)
! Comparação lógica Complemento (NOT)
8
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Declarações de controle:
O comando IF é utilizado para avaliar uma determinada condição e determinar se ela é verdadeira,
caso seja, executa os bloco contido dentro desta condição. Sua forma geral é:
if (exp) comando;
Se o resultado da condição referente a expressão (exp) for verdadeiro, o comando será executado,
caso contrário, o programa segue sem executar o comando.
if (exp)
{
comando1;
comando2;
}
Para o caso acima, a mesma explicação anterior se encaixa, sendo que agora, se a condição da
expressão for verdadeira, serão executados os comando1 e comando2.
Exemplos:
if (conta>50) conta = 0;
if (conta>50)
{
conta = 0;
conta1++;
}
Neste caso, a condição IF é utilizada da mesma forma acima, sendo que agora, se a condição da
expressão for falsa a condição ELSE será executada. Sua forma é:
if (exp) comando1;
else comando2;
Caso a expressão seja verdadeira, o comando1 será executado, caso seja falsa, o comando2 será
executado.
Exemplo:
if (conta>0)
{
conta = 0;
conta1++;
}
9
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
else conta++;
É possível também encadear diversos comando IF, como a forma abaixo:
if (exp1) comando1;
else if (exp2)comando2;
else if(exp3) comando3;
....
Decisão SWITCH-CASE:
Quando existem muitos valores para testar de uma só variável, o comando IF pode ficar meio
confuso ou sem muita eficiência, para isso podemos utilizar o SWITCH-CASE. Segue sua forma:
switch(variável)
{
case valor1: comando1;
....
break;
case valor2: comando2;
....
break;
....
....
default: comandoN;
....
....
}
Neste caso, a variável 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 básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
serão incrementados, para todos outros valores diferentes, o valor de conta3 será incrementado.
Laço FOR:
Este é um dos comandos de laço (loop ou repetição) disponíveis na linguagem C, a sua forma é:
for(inicialização;condição(término);incremento) comando:
ou,
for(inicialização;condição(término);incremento)
{
comando1;
comando2;
}
onde:
inicialização: essa seção conterá uma inicialização para a variável;
condição: responsável por contar a condição de finalização do laço;
incremento: aqui pode conter uma ou mais variáveis para incremento da variável.
Exemplo:
int conta;
int a = 0;
Laço WHILE:
Neste laço, os comandos serão repetidos enquanto a expressão for verdadeira, sua forma é:
while (exp)
{
comando;
}
Exemplo:
int x;
while(x<=10) x++;
11
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Laço DO-WHILE:
Este laço é uma variação do comando WHILE, sendo que neste caso o comando será executado
antes de testa se a condição é verdadeira. Sua forma é:
do
{
comando;
}
while(exp);
O comando será executado pelo menos uma vez antes de verificar a condição da expressão.
Exemplo:
int x;
int y;
do
{
x++;
} while(y!=1);
Ponteiros:
Podemos dizer que um ponteiro é uma variável onde será armazenado o endereço de outra variável,
ou seja, o ponteiro é um apontador para uma outra variável.
TIPO *NOME
int *idade;
12
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Uma string é uma matriz de caracteres. Podemos usar um ponteiro para exibí-la assim:
Matrizes:
Uma matriz é uma estrutura de dados que pode armazenar vários valores do mesmo tipo.
A sintaxe para declarar uma matriz é:
TIPO NOME[QUANTIDADE];
onde TIPO é o tipo dos dados que serão 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 código do programa. E QUANTIDADE é a quantidade máxima 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.
Você pode inicializar os elementos de uma matriz na sua declaração usando a sintaxe:
int notas[5] = {60,70,35,50,68};
13
Curso básico 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 básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
O mikroC organiza as aplicações dentro de projetos, onde nele é possível ter vários arquivos fonte.
A compilação 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 opção “New Project”. A
seguinte tela será apresentada:
15
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Primeiro Projeto
Definindo o projeto:
Circuito:
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 comentário e não é interpretado pelo compilador.
Também pode-se fazer comentário assim: /* Isto é um comentário */
16
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código do Projeto:
void main()
{
PORTD = 0;
TRISD = 0, //Configura os pinos da porta D como saída
Depois de escrevermos o código, devemos compilar o projeto para que possamos gravar no
microcontrolador. A compilação se dá pressionando-se “ctrl + F9” ou clicando no menu Project e
escolher a opção Build, conforme abaixo.
17
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Estando o projeto sem erros, as informações abaixo devem ser mostradas na parte de baixo do
programa.
Gravando o Projeto
18
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Abrindo o programa:
Vamos, então, escolher o dispositivo a ser gravado na janela destacada em vermelho, conforme
abaixo:
19
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Agora abriremos o programa referente ao nosso projeto. Clica-se em 'Arquivo' e escolhe-se a opção
'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 aparência parecida com a figura abaixo:
20
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Gravando o programa:
Para gravar o programa no microcontrolador, pressionaremos, então o botão 'Limpar Tudo', para
certificarmos que o microcontrolador estará pronto para o nosso programa e logo após, pressiona-se
'Programar Tudo'.
21
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Projetos de fixação:
-Este projeto faz piscar o led conectado ao pino 0 da porta D
void main()
{
TRISD.F0 = 0; //Configura o pino 0 da porta D com saída
while (1)
{
PORTD.F0 = 0; //Faz com que o pino 0 da Porta D tenha nível lógico 0
delay_ms(500); //Tempo de atraso de 500ms
PORTD.F0 = 1; //Faz com que o pino 1 da porta D tenha nível lógico 1
delay_ms(500); //Tempo de atraso de 500ms
}
}
-O projeto abaixo tem a mesma função, só que utiliza a diretiva #define para identificação,
conforme abaixo:
void main()
{
DirLed = 0; //Configura o pino 0 da porta D com saída
while (1)
{
Led = 0; //Faz com que o pino 0 da Porta D tenha nível lógico 0
delay_ms(500); //Tempo de atraso de 500ms
Led = 1; //Faz com que o pino 1 da porta D tenha nível lógico 1
delay_ms(500); //Tempo de atraso de 500ms
}
}
22
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
obs.: Os registradores especiais, TRISD, PORTD, PORTA, TRISA, INTCON, TMR0 e outros são
tratados, pelo compilador, como variáveis, portanto, podemos atribuir valor e tratá-los exatamente
como uma variável qualquer.
Exercício proposto:
-Fazer um programa onde todos os LEDS serão acesos em seqüência, 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 também começando do LED1 e terminando no LED8.
23
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Acionamento de Botões
Definindo o projeto:
Circuito:
24
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código do Projeto:
void main()
{
TRISD = 0x01; //Configura o pino 0 da porta D como entrada e o restante como saída
PORTD = 0x00; //Zera toda a porta D
Projeto de fixação:
void main()
{
TRISD = 0x01; //Configura o pino 0 da porta D como entrada e o restante como saída
PORTD = 0x00; //Zera toda a porta D
25
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
TIMER 0
OPTION_REG
INTCON
26
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
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 opção 1:1 quando aplicamos o prescaler ao WDT, então tanto o timer0 como
o WDT estarão 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 máquina, ou seja, para um cristal de 4MHz, o incremento se dará a cada 1us.
Então 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, então inicializarmos o TMR0 com o valor de 256 – 100 = 156.
No MikroC, toda vez que ocorre uma interrupção, o programa entra na função 'interrupt' e nela
serão tratadas as interrupções ocorridas.
void interrupt() {
{
TMR0 = 156; // Valor inicial para o Timer0
INTCON = 0x20; // Seta T0IE e limpa T0IF
}
void main() {
while(1) {}
Projeto:
Resolução:
27
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
unsigned int cnt; //contador para acerto do tempo (ver 'unsigned int' na pág. 4)
void interrupt()
{
cnt++; // Incrementa o valor de cnt a cada interrupção
TMR0 = 156; // Valor inicial para o Timer0
INTCON = 0x20; // Seta T0IE e limpa T0IF
}
void main() {
cnt = 0;
while(1) {
if (cnt >= 10000) // Executa o bloco abaixo SE a variável cnt for maior ou igual a 10000
{
PORTD.F0 = ~PORTD.F0; //Inverte a situação do pino 0 da porta D.
cnt = 0; //Zera cnt para um novo ciclo.
}
}
}
Seguindo o exemplo acima, vamos ajustar os valores para um prescaler de 1:32, então 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++; // Incrementa o valor de cnt a cada interrupção
TMR0 = 99; // Valor Inicial para o TMR0
INTCON = 0x20; // Seta T0IE e limpa T0IF
}//~
void main() {
OPTION_REG = 0x84; // Atribui prescaler de 1:32 ao TMR0
TMR0 = 99; // Valor Inicial para o TMR0
INTCON = 0xA0; // Habilita a interrupção do TMRO
28
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
TRISD.F0 = 0;
PORTD.F0 = 0;
do {
if (cnt == 200) {
PORTD.F0 = ~PORTD.F0; // Inverte os valores do pino 0 da porta D
cnt = 0; // Inicializa cnt novamente
}
} while(1);
}
29
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
TIMER 1
O Timer 1 tem suas características muito parecidas com as do Timer 0, sendo que ele também 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:
Registrador T1CON
T1OSCEN
1 - Habilita oscilador externo. O pino RC0 e RC1 são configurados como entrada e não poderão
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 básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
TMR1CS
Registrador PIR1
Neste registrador são sinalizados os flgs das interrupções e estouro dos Timer1 e Timer2.
Registrador PIE1
Na placa em questão, o microcontrolador está trabalhando com um cristal externo de 4MHz, então o
tempo total do timer 1, utilizando o maior prescaler 1:8 e clock interno pelo ciclo de máquina, será:
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.
Resolução:
Como com o prescaler 1:1, conseguiremos no máximo 65,535ms, então teremos que utilizar um
prescaler de 1:2, então teremos:
31
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código do projeto:
void interrupt() {
cnt++ ;
PIR1.TMR1IF = 0; // Limpa o flag TMR1IF
TMR1H = 0x3C; // Inicializa registro do Timer 1
TMR1L = 0xB0;
}
void main() {
PORTD = 0x00; // Inicializa PORTD
TRISD = 0; // PORTD é saída
T1CON = 0x11; // Ajuste do Timer1
PIR1.TMR1IF = 0; // Limpa o flag TMR1IF
TMR1H = 0x3C; // Inicializa o registro do Timer1
TMR1L = 0xB0;
PIE1.TMR1IE = 1; // Habilita a interrupção do Timer1
do {
if (cnt == 10) { // se cnt é 10 (10 x 100ms = 1000ms)
PORTD = ~PORTD; // Troca posição da porta D
cnt = 0; // zera cnt
}
} while (1);
}
32
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Timer 2
O timer 2 também é um contador de 8 bits, sendo relacionado somente ao clock interno, a diferença
deste timer é que ele não conta de 0 à 255(8 bits). Quem impõe o limite de contagem é o valor do
registrador PR2. Então 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 término do da contagem do postcaler, uma interrupção será
gerada.
Registradores associados:
33
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
TMR2ON
1 - Timer 2 desativado.
0 - Timer 2 ativado.
Seleção do prescaler:
Projeto 1:
Resolução:
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.
Código do projeto:
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ; // incrementa cnt
PIR1.TMR2IF = 0; // limpa flag TMR2IF
TMR2 = 0;
}
}
34
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
void main() {
cnt = 0; // inicializa cnt
PORTD = 0xFF; // Inicializa PORTD
TRISD = 0; // PORTD é saída
T2CON = 0xFF; // Ajustes do Timer2
TMR2 = 0; // Inicializa registro do Timer2
PR2 = 0xFF; // Inicializa PR2 com o valor 255 (não é necessário
// para este caso, pois ele já tem com default esse
// valor).
PIE1.TMR2IE = 1; // habilita interrupção
INTCON = 0xC0; // habilita GIE, PEIE
Projeto 2:
Configurar o timer2 para uma interrupção a cada 50ms e fazer piscar os Leds da porta D a cada 1
segundo.
Resolução:
O valor máximo de estouro para o timer2 é de 65,28ms utilizando prescaler e postcaler 1:16, então
para 50ms temos:
35
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código do projeto:
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ; // incrementa cnt
PIR1.TMR2IF = 0; // limpa flag TMR2IF
TMR2 = 0;
PR2 = 195;
}
}
void main() {
cnt = 0; // inicializa cnt
PORTD = 0xFF; // Inicializa PORTD
TRISD = 0; // PORTD é saída
T2CON = 0xFF; // Ajustes do Timer2
TMR2 = 0; // Inicializa registro do Timer2
PR2 = 195; // Inicializa PR2.
PIE1.TMR2IE = 1; // habilita interrupção
INTCON = 0xC0; // habilita GIE, PEIE
O importante é que o valor do PR2 – TMR2 seja de 195, então podemos fazer:
Código:
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ; // incrementa cnt
PIR1.TMR2IF = 0; // limpa flag TMR2IF
TMR2 = 55;
PR2 = 200;
}
}
36
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
void main() {
cnt = 0; // inicializa cnt
PORTD = 0xFF; // Inicializa PORTD
TRISD = 0; // PORTD é saída
T2CON = 0xFF; // Ajustes do Timer2
TMR2 = 55; // Inicializa registro do Timer2
PR2 = 200; // Inicializa PR2.
PIE1.TMR2IE = 1; // habilita interrupção
INTCON = 0xC0; // habilita GIE, PEIE
37
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Funções
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 são chamados Funções e são parecidos com as chamadas de sub-rotinas em
assembly.
Nos exemplos anteriores, usamos uma função para chamar e tratarmos as interrupções, só
que esta função é chamada pelo próprio compilador diratemente.
Bloco de Execução
Return a e b
Chamando a função:
Void main ( )
{
Int c;
TRISD = 0x00;
PORTD = 0x00;
c = adicao (2, 3) ;
While (1 ) {
PORTD = c;
}
}
38
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Debug no MikroC
Clicando no menu “Run” e escolhendo-se a opção “Start Debugger”, a janela abaixo será mostrada
39
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
40
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
A tecla “F7” faz a simulação passo a passo e “F6” inicia o modo “Run”
41
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Pinagem do LCD
Pino Descrição
1 Gnd
2 +5V
3 Ajuste de contraste
4 Seleção RS: 1 - dado, 0 - escrita
5 Seleção R/W, 1 – leitura, 0 - escrita
6 Em – habilita p/ dado ou escrita em 1 ou transição 1 -> 0, 0 - desabita
7
8
9
10 Barramento de Dados
11
12
13
14
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 básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
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 db3serão conectados
Ctel-port => porta onde os controles r5, w e em do LCD serão conectados
Exemplo: LCD_Custom_Config(&Portd, 3,2,1,0, $Portb, R, 3, 4);
43
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Comandos Disponíveis
Comando Propósito
44
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Projeto LCD
void main() {
unsigned i;
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 básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Conversão A/D
Projeto ADC:
Fazer uma leitura do canal do PICe mostrar os 8 bits menos siginificativos nos LCD’s conectados à
porta D.
Resolução:
ADCON1
PCFG AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF
<3 0> -
0000 A A A A A A A A VDD VSS
0001 A A A A VREF+ A A A AN3 VSS
0010 D D D A A A A A VDD VSS
0011 A A A A VREF+ A A A AN3 VSS
0100 D D D D A D A A VDD VSS
0101 D D D D VREF+ D A A AN3 VSS
0111 D D D D D D D D - -
1000 A A A A VREF+ VREF- A A AN3 AN2
1001 D D A A A A A A VDD VSS
1010 D D A A VREF+ A A A AN3 VSS
1011 D D A A VREF+ VREF- A A AN3 AN2
1100 D D D A VREF+ VREF- A A AN3 AN2
1101 D D D D VREF+ VREF- A A AN3 AN2
1110 D D D A D D D A VDD VSS
1111 D D D A VREF+ VREF- D A AN3 AN2
46
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Queremos, então, utilizar a conversão no canal 0 (RA0), então atribuímos o ADCON1 com o valor
1110 ou 14 ou ainda OxOE.
Código:
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:
Código:
void main() {
ADCON1 = 0x0E; // Configure analog inputs and Vref
TRISA = 0xFF; // PORTA is input
do {
ad = Adc_Read(0); // Get results of AD conversion
IntToStr(ad,txt);
} while(1);
}
47
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer, executa a expressão abaixo:
{
.....expressão......
}
Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer, executa a expressão abaixo:
{
receive = Usart_Read(); //armazena o byte recebido na variável
//receive.
}
48
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Projeto Serial:
Resolução:
Neste caso, vamos atuar sobre o botão conectado ao pino 0 da porta D e a cada atuação, o caracter
“A” será enviado para a serial.
Utilizamos, agora, uma maneira diferente de verificar o acionamento de um botão que é através 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 botão conectado ao pino 0 da porta D, por um tempo de
1 ms, o estado do pino mudará para nível lógico 1 e o que está entre chaves será executado.
Código:
void main() {
while (1) {
if (Button(&PORTD,0,100,1)) //Se o botão conectado ao pino 0 da Porta D, o comando
//abaixo será executado.
Usart_Write('A'); //Envia o caracter “A” pela serial.
}
}
Projeto Serial 2:
2-) Receber um caracter do PC e enviá-lo novamente pela serial, além de acender o LED1 se o
caracter for “a”e apagar o led se o caracter for “b”.
49
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código:
unsigned short i;
void main() {
TRISD = 0x00;
PORTD = 0x00;
do {
if (Usart_Data_Ready()) { // Se algum dado for recebido
i = Usart_Read(); // Lê o dado recebido
Usart_Write(i); // Envia o dado pela serial novamente
if (i=='a') PORTD.F0 = 1; //Se o caracter for 'a', acende o LED 1
if (i=='b') PORTD.F0 = 0; //Se o caracter for 'b', apaga o LED 1
}
} while (1);
}
Projeto Serial 3:
Resolução:
No MikroC, não 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 utilização de ponteiros que será mostrada no
código abaixo:
No caso de ponteiros, podemos dizer que cada caracter será “colocado” numa posição do ponteiro,
ou seja, o caracter “M” será colocado ou estará apontando para a posição 0, o caracter “I” será
colocado ou estará apontando para aa posição 1 e assim por diante até o final, sendo que a última
posição será ocupada por um valor nulo e essa será a finalização do ponteiro.
M I C R O C O N T R O L A D O R \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
50
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Código:
void main()
{
// Initializa USART (8 bit, baud rate 9600, no parity bit..)
Usart_Init(9600);
do
{
Usart_Write(*txt); //envia um caracter pela serial
*txt++; //incrementa o ponteiro
delay_ms(100);
} while (*txt != '\0'); //Verifica a finalização 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.
Resolução:
Neste caso utilizaremos uma matriz com 4 posições ou 4 endereços (rec[4]) onde serão
armazenados os valores recebidos pela serial, lembrando que é necessário sempre inicializarmos
com 0 o posicionamento. No caso, a variável i será a responsável pelo posicionamento da matriz.
Código:
char rec[4];
short i;
void trata_serial()
{
if ((rec[0] == 'L') && (rec[1] == 'D') && (rec[2] == '1')) // Faz a comparação dos valores
// armazenados na Matriz 'rec'
PORTD.F0 = 1;
void main()
{
TRISD = 0x00;
PORTD = 0x00;
51
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
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 posição da matriz
if (rec[i-1] == 0x0D) { //Verifica se o valor armazenado na Matriz é
// 0x0D (Código hexa para o ASCII <enter>)
trata_serial(); // Sendo 0x0D, vai para a função trata_serial
//for(i=0;i<=3;i++) // 'Limpa' a Matriz
// rec[i] = '\0';
i=0; // Reinicializa o posicionamento da matriz
}
}
}
}
52
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
EEPRON Interna
Biblioteca EEPRON
Exemplo: EEPRON_Write (0, 100); // escreve o valor 100 no endereço 0 da memória EEPRON.
Projeto EEPRON:
1-) Escrever o valor 61 ('caracter “a”) no endereço 0 da memória EEPRON, após ler o valor e
escrever no LCD.
Código:
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
while(1) {
if (button(&PORTD,0,100,1)) //Se o botão no pino 0 da porta D for acionado
{
Lcd_Custom_Chr(2, 1, EEPROM_Read(0)); // Faz a leitura no endereço 0
// da EEPROM do PIC e
// escreve o conteúdo na
// linha 2 do LCD
}
}
53
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Projeto EEPRON 2:
2-) Receber da serial um caracter, escrever no endereço 10 da memória EEPRON, ler este valor da
memória, escrever no LCD e envia-lo à serial.
Código:
unsigned short i;
void main()
{
Usart_Init(9600);
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 variável i
Usart_Write(i); // Escreve o conteúdo da variável i na Serial
EEPROM_Write(10,i); // Escreve o conteúdo da variável i na EEPROM
}
54
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
A modulação PWM (modulação por largura de pulso) consiste basicamente na aplicação de uma
onda quadrada de amplitude igual à VCC e freqüência alta substituindo a tensão contínua. A tensão
média varia em função do tempo em que a onda fica em nível alto (VCC) e do tempo em que a
onda fica em nível básico (0V).
A relação entre o tempo em que a onda fica em nível alto e o período total é conhecido como Duty
Cycle que é normalmente expresso em percentual. Portanto para um Duty Cycle de 50 %, metade
do tempo a onda se mantém em nível alto e a outra metade do tempo a onda se mantém em nível
baixo. Por exemplo, uma modulação de amplitude 5V e Duty Cycle de 50 %. Tem o mesmo efeito
de uma tensão contínua de 2,5 V que é a tensão média para este caso.
Sintaxe: PWM_Start( );
55
Curso básico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Projeto PWM:
Controlar o brilho de um Led, ligado ao CCP1 (RC2), utilizando PWM e variando o Duty-Cycle de
0 a 100 %.
Código:
void main()
{
unsigned i;
i = 0;
while(1){
Pwm_Change_Duty(i); //Modifica o Duty_cycle
i++;
if (i>=100) i = 0;
delay_ms(50);
}
56
Curso básico 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.
Código:
void main()
{
ADCON1 = 0x0E; // Configura as entradas analógicas e referência
TRISA = 0xFF; // Faz PORTA como entrada
while(1) {
ad = ADC_Read(0); //Faz a leitura da conversão AD e armazena na variável 'ad'.
Pwm_Change_Duty(ad/4); // Modifica o Duty_cycle
ad = ((ad /4) * 100) / 255;
IntToStr(ad,txt); // converte a variável inteira 'ad' na variável 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