Você está na página 1de 23

Programao para Pic CCS primeira parte

Compilador um programa de computador (ou um grupo de


programas) que, a partir de um cdigo fonte escrito em uma
linguagem, cria um programa semanticamente equivalente, porm
escrito em uma outra linguagem, cdigo objeto. usado para os
programas que traduzem o cdigo fonte de uma linguagem de alto
nvel para uma linguagem de baixo nvel (por exemplo, Assembly ou
cdigo de mquina).
Diretivas - so comandos que no so compilados, sendo dirigidos
ao pr-processador, que executado pelo compilador antes da
execuo do processo de compilao propriamente dito. Portanto, o
pr-processador modifica o programa fonte, entregando para o
compilador um programa modificado. Todas as diretivas de
compilao so iniciadas pelo caractere # char.
Pr-processador C um programa que examina o programa
fonte escrito em C e executa certas modificaes no mesmo,
baseados nas diretivas de compilao.
Arquivos de cabealhos So aqueles que sempre terminam com
.h . A extenso .h vem de header(cabealho em ingls). Esses
arquivos no possuem cdigos completos das funes. Eles s
contm prottipos de funes.

1- DIRETIVAS DE PR-PROCESSAMENTO
Diretiva #include:
#include <16f84a.h> - Causa a incluso de um programa-fonte em
outro. Ela diz ao compilador para incluir, na hora da compilao, um
arquivo especificado. <16f84a.h>
Diretiva #fuses:
#fuses XT,PUT,NOWDT uma diretiva que configura os fusibits
do PIC, essa diretiva informa qual oscilador o PIC vai utilizar, se e
vai ter o reset WDT, entre outras funes, os fusibits muda de PIC
para PIC, antes de configurar essa diretiva tem que verificar seu
datasheet para saber quais fusibits o PIC possui.
Diretiva #device:
#device ADC = 10 Essa diretiva ativa o conversor AD. Ela diz ao
compilador para usar uma converso em 10 bits. Um nmero vai
depender do PIC utilizado.
Diretiva #use delay:
#use delay(clock = 4M) Essa diretiva indica a velocidade de
processamento do PIC. Ela importante pois a partir dela que o
PIC faz seus clculo de tempo.
Diretiva #byte:
#byte trisa = 0x85 E uma diretiva para criao de varivel,
atribuindo a varivel um endereo de memria. Pode-se criar um
nome e atribuir o endereo de um registrador do PIC, utilizando
esse nome no programa indicando o registrador endereado.
Diretiva #bit:
#bit ra4 = 0x06.4 uma diretiva para criao de uma varivel,
atribuindo a varivel um endereo de um bit expecfico onde se
encontra o registrador indicado. utilizado quando se quer
monitorar o bit do registrador indicado.
Diretiva #define:
#define acende output_high - uma diretiva para criao de
constante atribuindo um valor ou um comando. Essa diretiva e para
chamar um comando usando apenas um nome, ou atribuir um valor
fixo a uma constante.
Diretiva #define use_portb_lcd TRUE :
#define use_portb_lcd TRUE Diretiva necessria para usar o
LCD no portb, j que as funes para o LCD so para o portd.
Diretiva #use fast_io(x):
#use fast_io(b) Essa diretiva indica que o programador ir
configurar o registrador TRIS manualmente. Uma vez configurado
no se muda mais no decorrer do programa. a diretiva mais
enxuta, proporcionando um cdigo mais eficiente.

Diretiva #use standard_io(x):


#use standard_io(b) Essa diretiva uma diretiva padro do
compilador, o programador declarando ou no, o programa por
defalt, j configura o programa. Nessa diretiva no h a
necessidade de configurar os TRIS. Quem configura so as funes
no decorrer do programa.
Diretiva #use fixed_io(x):
#use fixed_io(b_output = pin_b0,pin_b1,pin_b2,...) Essa
diretiva s configura o TRIS como sada, e o programador tem que
indicar os pinos que se vai utilizar.
Diretiva com ponteiros So diretivas que apontam para um
endereo. Exemplo:
#define TRISA (*int) 0x85 Essa diretiva cria uma varivel de
nome TRISA, declara que um dado do tipo inteiro e atribui um
endereo 0x85. Na funo ela deve ser chamada da seguinte
forma:
*TRISA obrigatrio o uso do asterisco antes do nome, esse
asterisco que vai apontar para o endereo especificado na diretiva.
A diretiva #define, uma das mais importantes, porque ela pode
criar uma constante. Ex.: #define numero 255. Ela pode ser usada
no lugar de um comando. Ex.: #define Liga output_high. Ou como
vimos acima como ponteiro. Exemplo: #define TRISA(*int) 0x85.

Programao para Pic CCS segunda parte

2 - TIPOS DE DADOS
Constante um valor reservado na memria de dados (RAM) fixo.
Exemplos:
Const int numero = 255; uma constante do tipo de dados inteiro de
nome numero com valor de 255 ou em binrio 11111111. Com ponto e
vrgula no final.
#define numero 255 Define uma constante de nome numero do tipo de
dado inteiro, automtico e atribui o valor de 255.

Variveis um valor reservado na memria de dados(RAM), que


pode se modificar ao longo do programa.
TIPOS DE DADOS (variveis)
TIPO DE DADO TAMANHO VALOR DESCRIO
Int1 1 bit 0e1 Inteiro de 1 bit
Short
Int 8 bit 0 a 255 Inteiros de 8 bits
Int8
Int16 16 bit 0 a 65.535 Inteiros de 16 bits
Long
Int32 32 bit 0 a 4.294.967.295 Inteiro de 32 bits
Float 32 bit +1.175x10^-38 Ponto flotuante
+3.402x10^-38
Char 8 bits 0 a 255 Caracter
Void - - -
Signed Int8 8 bits -128 a +127 Inteiro com sinal
Signed Int16 16 bits -32768 a +32767 Inteiro longo com sinal
Signed Int32 32 bits -2^31 a +(2^31-1) Inteiro 32 bit com sinal

CRIAO DE UMA VARIVEL


TIPO_DE_DADO NOME;
EX.: Int8 Nome;

VALORES PARA EXIBIO EM SISTEMAS


123 Decimal
0123 Octal (0)
0x123 Hexadecimal (0x)
0b010010 Binrio (0b)
x Caractere
\010 Caractere octal
xA5 Caractere hexadecimal
IDENTIFICAO DOS DADOS
Int8 Usa-se a letra U e I
Long Usa-se a letra UL
Signed INT16 Usa-se L
Float Usa-se F
Char Usa-se C
\n Salta uma linha
\r Retorno do cursor
\t Tabulao
\b Backspace

2- FUNES
Uma funo basicamente um bloco de cdigos que realiza uma certa
tarefa. Quando queremos realizar aquela tarefa, simplesmente fazemos
uma chamada de funo para a funo correspondente.
Uma funo pode precisar que o programador d certos dados para
realizar a tarefa; esses dados so chamados argumentos. A funo
tambm pode retornar um valor, que pode indicar se a tarefa foi realizada
com sucesso, por exemplo; esse valor o valor de retorno.
A funo na Linguagem C ela declarada da seguinte forma:
Nome seguido de parnteses e finalizado com ponto e vrgula.
Ex.: printf( argumento );

A funo onde vai englobar outra funo tem que colocar entre chaves.
Ex.: while(true)
{ output_b(0xff);
}
Todo programa em C tem que ter por obrigao uma funo principal,
onde vai englobar as demais, essa funo chama-se main.
Ex.: void main(void ) {
while(true) {
output_b(0x00); } }

Estrutura mnima para criao de um programa em C

Inicializao
Diretivas de pr-processamento
Chamada da funo main( )
Configurao dos pinos(entrada ou sada)
Declarao das variveis

Loop Infinito
Leitura das entradas
Processamento dos dados
Atualizao das sadas
Programao para Pic CCS Terceira parte

4 - SADA DE DADOS

FUNES DE BIT para sada de dados


Bit_clear(varivel,bit); - Essa funo coloca zero em um nico bit, que
deve ser declarado. Exemplo:
Void main(void)
{ int nome;
Bit_clear(nome,2); // coloca zero no bit 2 da varivel nome
}

Bit_set(varivel,bit); - Essa funo coloca 1 um em um bit, que deve ser


declarado. Exemplo:
Void main(void)
{ int nome;
Bit_set(nome,3); // colaca 1 um no bit 3 da varivel nome
}

Output_low(pin_xx); Essa funo coloca zero no pino declarado. Exemplo:


Void main(void)
{ output_low(pin_b2); //coloca zero no pino 2 (dois) do portb.
}

Output_high(pin_xx); Essa funo coloca um no pino declarado. Exemplo:


Void main(void)
{ output_high(pin_b2); // coloca um no pino 2(dois) do portb.
}

Output_bit(pin_x,valor); Essa funo coloca um valor que pode ser 0 ou 1


no pino declarado. Exemplo:
Void main(void)
{ output_bit(pin_b1,0); // coloca zero no pino 1 do portb.
}
Output_toggle(pin_xx); Inverte o valor do bit declarado. Exemplo:
Void main(void)
{ output_high(pin_b0); // coloca zero no pino 0 do portb
Outpu_toggle(pin_b0); // inverte o valor do pino, ficando 1 no pino 0 .
}

Output_float(pin_xx); - No coloca nenhum estado lgico nesse pino,


uma aplicao para essa funo seria evitar um curto acidental nesse pino
em que ele declara. A sada neste pino fica em coletor aberto, com alta
impedncia. Exemplo:
Void main(void)
{ output_float(pin_b4); // pino 4 do portb em coletor aberto.
}

FUNES DE BYTE para sada de dados


Output_x(valor); - Essa funo configura todos os pinos de sada de um
port. Exemplo:
Void main(void)
{ output_b(0xff); // ele coloca todos os pinos do portb em 1 (um).
}

Set_tris_x(valor); - Essa funo configura o registrador tris como entrada


ou sada. Exemplo:
Void main(void)
{ set_tris_b(0x00); // configura todos os pinos do portb como sada.
}

Swap(varivel); Essa funo troca os nible de lugar, os quatro bits menos


significativos vo para o lugar dos quatro bits mais significativos. Exemplo:
Void main(void)
{ #byte portb = 0x06
output_b(0b11110000);
Swap(portb); // Essa funo inverte de (11110000) para (00001111)
}
5 - ENTRADA DE DADOS

FUNES DE BIT para entrada de dados


Bit_test(varivel,bit); Essa funo testa um bit da variavel, essa funo
usada junto com a estrutura condicional IF. Exemplo:
Void main(void)
{ #byte portb = 0x06; // essa outra forma de criar variavel indicando um
endereo

If(bit_test(portb,4) == 1) // verifica se o bit 4 da varivel portb 1 um


Bit_set(portb,0); // caso verdadeiro ele coloca 1 um no bit 0 do da varivel portb
}

Input_state(pin_xx); - Essa funo l o pino declarado, geralmente usado


junto com a estrutura condicional IF. Exemplo:
Void main(void)
{ if (input_state(pin_b2); // l o pino 2 do portb
Output_b(0xff); // caso a entrada seja 1 todo o portb fica em 1.
}
Input(pin_xx); - Essa funo l o pino declarado. Geralmente usado junto
com a estrutura condicional IF. Exemplo:
Void main(void)
{ if (input(pin_b2))
Output_b(0xff); / /caso o pino 2 do portb for verdadeiro ele executa essa funo.
Ela basicamente igual a funo input_state(pin_b2);.

}
FUNES DE BYTE para entrada de dados
Input_x( ); - Essa funo L todo o port, com seus 8 bits. Exemplo:
Void main(void)
{ input_b( ); // l todos os pinos do portb.
}

Get_tris_x( ); - Essa funo ele pega o valor do TRIS declarado. Exemplo:


Void main(void)
{
Set_tris_a(0xff);
Int valor;
delay_ms(500);
get_tris_a();
valor = get_tris_a();
output_b(valor); // o valor do trisa que 0xff.
}

FUNO DE TEMPO
Delay_us(valor); Funo de tempo em microssegundos.
Delay_ms(valor); Funo de tempo em milissegundos.

FUNO DE RETORNO
Return(variavel); Essa funo retorna um valor. Exemplo:
Int acender(int m)
{ m++;
Return(m); // retorna o valor da varivel m.
Programao para Pic CCS quarta parte

6 - FUNES DE LOOP INFINITO


While(true)
{
Cdigo;
}

For( ; ; )
{
Cdigo;
}

Do
{
Cdigo;
}while(true);

Inicio:
Cdigo;
Goto inicio;

7- LCD ( diretivas e funes relacionado ao lcd )


Diretiva
#define use_portb_lcd true (tem que ser colocada antes da biblioteca
lcd.c)
#include <lcd.c> // inclui a biblioteca lcd

Funes usadas
Lcd_init( ); // inicializa o LCD.
Lcd_gotoxy(x,y); Posiciona o cursor nas coordenadas x= coluna, y= linha.
Lcd_getc(x,y); // Captura um caractere nessa posio.
Printf(lcd_putc,Mensagem); // escreve uma mensagem no LCD.
Lcd_putc(Mensagem); // escreve uma mensagem no LCD.
Dentro do espao entre aspas( espao ), a pessoa pode colocar os
seguintes caracteres:
TABELA DOS SMBOLOS
Simb Exemplo Significado
\f \f mensagem Comando para limpar a tela antes da
mensagem
\n \n mensagem Comando para pular uma linha antes da
mensagem
\b \b mensagem Comando para voltar um caractere
\t \t mensagem Comando para tabulao antes da
mensagem
%c mensagem %c, Comando para imprimir uma varivel do
varivel; TIPO CHAR
%s mensagem %s, Comando para imprimir uma varivel do
varivel; TIPO STRING
%u mensagem %u, Comando para imprimir uma varivel do
varivel; TIPO INTEIRO sem sinal
%d mensagem %d, Comando para imprimir uma varivel do
varivel; TIPO INTEIRO com sinal
%Lu mensagem %Lu, Comando para imprimir uma varivel do
varivel; TIPO INTEIRO LONGO sem sinal
%Ld mensagem %Ld, Comando para imprimir uma varivel do
varivel; TIPO INTEIRO LONGO com sinal
%x mensagem %x, Comando para mostrar o valor da varivel
varivel; da tabela ASCII em hexadecimal
\x mensagem Comando que mostra o valor
\xHEX correspondente na tabela ASCII
%f mensagem %f Comando para imprimir uma varivel do
,varivel; TIPO FLOAT
%.2f mensagem %.2f , Comando para imprimir e limitar as casas
varvel; decimais em duas do TIPO FLOAT
Programao para Pic CCS Quinta parte

8 - KEYPAD (Diretivas e funes para o teclado)


Diretiva
#define use_portb_kbd true (tem que ser colocada antes da biblioteca
kbd.c)
#include <kbd.c> // inclui a biblioteca do teclado 3x4

Funes usadas
kbd_init( ); // inicializa o teclado.
kbd_getc( ); // Captura um caractere .
Observao: Essa biblioteca exige um bom tratamento de Debouce, para
evitar que ela leia um valor errado. indicado que se utilize uma estrutura
condicional IF, para testar o valor armazenado na varivel. Exemplo:
#include <18f4550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

void main(void)
{ char k; // varivel criada para armazenamento da
tecla precionada
lcd_init(); // inicializa o lcd
kbd_init(); // inicializa o keypad (teclado)

lcd_putc("\Digite:\n");

while(TRUE) // Loop infinito


{
k=kbd_getc(); // captura a tecla

if(k!=0) // testa a tecla


{ delay_ms(50);
if(k!=0) // tratamento de debouce
lcd_putc(k);
delay_ms(50);
}

}
}
Exemplo:

Outra observao todos os pinos tem que ter o resistor de pullups, no


teclado.
Descrio Teclado:
A = pino rd1, B = pino rd2, C = pino rd3, D = pino rd4
Descrio do LCD:
RB0 = E
RB1 = RS
RB2 = RW

9 - INTERRUPES

Existem vrios tipos de interrupes, vamos falar da INT_RA, INT_RB e


INT_RC e as interrupes INT_EXT, INT_EXT1, INT_EXT2 e INT_EXT3.
#INT_RA, #INT_RB e #INT_RC
Essas interrupes so utilizadas, quando se quer interromper o programa
em execuo, at aparecer um operador do equipamento em que se esta
utilizando. Ela so desativa se resetar o PIC, nesse caso deve-se usar o
Master Clear.
Diretivas para essas interrupes:
#INT_RA vai do A0 ao A5
#INT_RB vai do B4 ao B7
#INT_RC vai do C4 ao C7
Funes utilizadas:
ENABLE_INTERRUPTS(INT_XX); // O XX PODE SER O RA, RB OU RC.
ENABLE_INTERRUPTS(GLOBAL); // HABILITA A CHAVE GERAL DAS INTERRUPES
#INT_EXT, #INT_EXT1, #INT_EXT2 e #INT_EXT3
Essas interrupes so utilizadas, quando se quer uma interrupo
temporria ou enquanto durar a interrupo.
Diretivas para essas interrupes:
#INT_EXT
#INT_EXT1
#INT_EXT2
#INT_EXT3

Funes utilizadas:
EXT_INT_EDGE(0,L_TO_H); // O ZERO REPRESENTA QUE ESTA USANDO A #INT_EXT
ENABLE_INTERRUPTS(INT_XX); // O XX PODE SER O EXT, EXT1, EXT2 OU EXT3.
ENABLE_INTERRUPTS(GLOBAL); // HABILITA A CHAVE GERAL DAS INTERRUPES
EXEMPLO:
#include <16f628a.h>
#fuses XT
#use delay(clock = 4M)

#INT_RB // chamada da interrupo


void teste(void)
{
output_high(pin_a0);
delay_ms(500);
output_low(pin_a0);
delay_ms(500);
}

void main(void)
{
while(true)
{
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
}
}

Observao a funo de interrupo vem logo abaixo da diretiva


correspondente.

Programao para Pic CCS Sexta parte

10 - CANAL ANALGICO

Conversor A/D - um circuito eletrnico que pega uma amostra do sinal


que varia em sua entrada, o divide em partes menores. O tamanho destas
partes varia conforme a resoluo utilizada. Exemplo. Se o conversor for
de 8 bits ou um byte ele vai dividir em 256 partes, lembrando que 2
elevado a potncia 8 igual a 256. Ele pega a amostra do sinal a cada
intervalo de tempo, esse tempo varia conforme a velocidade do oscilador,
da ele vai armazenar os valores em binrio em seus registradores,
ADRESH e ADRESL.
DIRETIVAS:
#device ADC = 8 // se o conversor for 8 bits.
#device ADC = 10 // se o conversor for de 10 bits.
#INT AD = // interrupo do canal analgico.
Obs.: A diretiva #device ADC deve ser declarada logo abaixo da diretiva
#include < PIC.h>

FUNES UTILIZADAS:
SETUP_ADC_PORTS(ANX); // REFERE-SE A UMA PORTA
SETUP_ADC_PORTS(ALL_ANALOG); // REFERE-SE A TODAS AS PORTAS
SETUP_ADC_PORTS(ANX_TO_ANY|VSS_VREF); // Utiliza como tenso de
refncia.

SETUP_ADC(ADC_CLOCK_INTERNAL); // configura o clock como interno.


SET_ADC_CHANNEL(X); // seta o canal utilizado.
READ_ADC( ); // L o valor do canal.

11 - Memria EEPROM

O PIC16F84A tem uma memria de dados EEPROM 8 bits e 64 posies.


Sendo uma memria no voltil, os dados armazenados nele so mantidas
na ausncia de tenso. O acesso a essa memria executada pelos
registros SFRs: EECON1, EECON2, EEDATA e EEADR. Esta memria
permite at 1.000.000 ciclos de apagamento / gravao. Pode ler /
escrever individualmente em cada uma das 64 localizaes da memria.
Dando um total de 64 bytes.
Quando uma operao de gravao realizada, o circuito interno do PIC
se encarrega de apagar a posio onde se deseja escrever. A durao de
um ciclo completo de apagamento / escrita de um byte na EEPROM
geralmente de cerca de 4 ms.
A memria EEPROM de leitura e gravao.
Durante a operao normal, a memria no est mapeada diretamente no
espao de arquivo de registro. Uma vez que seja indiretamente abordados
atravs dos registros Especiais. H quatro SFRs usados para ler e escrever
essa memria. Estes registos so:
EECON1
EECON2 (no um registo fisicamente implementado)
EEDATA
EEADR
EEDATA mantm os dados de 8 bits para leitura / escrita.
EEADR armazena o endereo da localizao EEPROM. Sendo acessado
dispositivos PIC16F84A tem 64 bytes de EEPROM de dados com um
intervalo de endereos a partir de 0h a 3Fh.
A memria EEPROM permite ler e escrever no byte. A gravao apaga
automaticamente a localizao e grava os novos dados (apagar antes de
escrever), a EEPROM. O tempo de gravao controlado por um
temporizador no chip. O tempo de escrita variar com a tenso e
temperatura, bem como de chip para chip. Quando o dispositivo
protegido pelo cdigo, a CPU pode continuar a ler e escrever a memria
EEPROM de dados.
EECON1 REGISTER (ADDRESS 88h)
EEIF: Bandeira - bit que interrompe a operao.
1 = A operao de gravao concludo (deve ser cancelado em software)
0 = A operao de escrita no est completa ou no foi iniciado.
WRERR: bit sinalizador de erro.
1 = A operao de gravao foi encerrado prematuramente.
(qualquer MCLR Reset ou qualquer WDT Repor durante a operao
normal)
0 = A operao de gravao concluda.
WREN: Habilitar bit
1 = Permite ciclos de escrita.
0 = Inibe a escrever para o EEPROM.
WR: Escrever bit de Controle.
1 = inicia um ciclo de gravao. O bit desmarcada por hardware, uma vez
que a gravao est completa. O bit WR s pode ser definido (no
apuradas) em software.
0 = Write ciclo para a EEPROM est completa.
RD: bit Controle de leitura.
1 = Inicia EEPROM, ler RD. cancelado em hardware. O bit RD s pode ser
definido (no desmarcada) em software.
0 = no iniciar uma EEPROM ler.

Funes usadas no compilador:


Write_eeprom(endereo,valor);
Read_eeprom(endereo);

VISITE NOSSOS SITES:


http://alexsandrolima.com/
http://video.alexsandrolima.com/
http://loja.alexsandrolima.com/
https://apoia.se/alt
https://alexsandrolimatutoriais.blogspot.com.br/