Sei sulla pagina 1di 72

Prof.

Pedro Pedrosa
h"p://buscatextual.cnpq.br/buscatextual/visualizacv.do?id=K4227622E1    
pedrosarf@ifce.edu.br
Prof. Pedro Pedrosa
Ø  Visão Geral
•  Ambiente integrado de desenvolvimento (IDE): compilador PCWH;
•  Plataforma: Windows;
•  Abrangência: séries PIC12, PIC14, PIC16 e PIC18;
•  Previsão: suporte para dsPIC;
•  Módulos:
• PCB: para dispositivos de 12 bits (PIC12 e PIC16C5X);
• PCM: para dispositivos de 14 bits (PIC14000 e PIC16xXXX);
• PCH: para dispositivos de 16 bits (PIC18).
•  Os módulos podem ser adquiridos separados ou em um pacote completo;

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Visão Geral

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Características
•  Compatibilidade com os padrões ANSI (não completamente já que
algumas características são específicas para PICs) e ISO;
•  Grande eficiência no código gerado;
•  Grande diversidade de funções e bibliotecas da linguagem C (padrão
ANSI), tais como:
• Entrada/saída serial, manipulação de strings e caracteres, funções
matemáticas C, etc.

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Barra de ferramentas Menu File

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Barra de ferramentas Menu File
New Cria um novo arquivo

Abre um arquivo para o editor. Opções: Source, Project, Output, RTF, Flow Chart,
Open
Hex ou Text. Atalho: Ctrl+O

Fecha o arquivo atualmente aberto na janela do editor. Note-se que enquanto um


Close arquivo está aberto para edição do PCWH nenhum outro programa pode acessá-
lo. Atalho: Shift+F11

Close All Fecha todos os arquivos abertos no PCWH

Save Salva apenas o arquivo que está sendo editado. Atalho: Ctrl+S

Compele o usuário a editar o nome e o local de armazenamento do arquivo que


Save As
está em uso antes que ele seja efetivamente salvo

Save All Salva todos os arquivos abertos no PCWH

Gera um arquivo criptografado. A diretiva #include do compilador padrão aceita


Encrypt os arquivos com esta extensão e descriptografa durante a leitura. Isto permite
distribuir arquivos sem repassar o código fonte

Print Imprime o arquivo atualmente selecionado

O lado direito do menu apresentará uma lista com os arquivos recentemente


Recent Files
utilizados no PCWH

Exit pedrosarf@ifce.edu.br
Encerra o PCWH Prof. Pedro Pedrosa
Ø  Barra de ferramentas aba Project

Project Abre um arquivo de um projeto existente (.PJT)


Este comando é uma via rápida para iniciar um novo projeto. Uma janela será
aberta com campos a serem preenchidos referentes a configuração de diversas
PIC Wizard
características como definição da pinagem (entrada ou saída, analógicos ou
digitais), interrupções, conversão A/D, comunicação serial, etc.
Também serve para iniciar um novo projeto, tal como o comando anterior, com
24 bit Wizard
a diferença que serve para as famílias PIC24 e dsPIC

Cria um novo projeto com a habilidade de adicionar/remover arquivos-fonte,


Create
incluir definições globais etc

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Barra de ferramentas aba Compile

Compila o programa através de erros, e gera o arquivo “*.hex” para carregar no


Compile
Microcontrolador

aba View

Valid Interrupts Apresenta as interrupções válidas para cada tipo de PIC.


Valid Fuses Apresenta as configurações válidas para cada tipo de PIC

pedrosarf@ifce.edu.br
Apresenta os registros especiais para cada tipo de PIC. Prof. Pedro Pedrosa
Special Register
Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø Regras Básica

•  Toda função em C deve ser iniciada por um abre-chaves ({) e


encerrada por um fecha-chaves (});
•  O nome, os parênteses e as chaves são os únicos elementos
obrigatórios de uma função;
•  Todas as instruções devem estar dentro das chaves;
•  As instruções em C são sempre encerradas por um ponto-e-vírgula(;)
•  Lembre-se de que as chaves também servem para separar um bloco
de instruções.  

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø Sintaxe

void main( ) // primeira função a ser executada


{ // início do corpo da função

<comandos>; // outras funções podem ser


adicionadas

} // término do corpo da função

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Comentários
•  Duas  maneiras:  
–  Uma  linha:  “//”;  
–  Em  bloco:  “/*”  e  “*/”.  

/* UNIVASF – CENEL
Microcontroladores & Microprocessadores
Este é um comentário em bloco
*/

char contador; // Este é um comentário de uma linha


pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Identificadores
•  Palavras  usadas  para  declarar  uma  constante  ou  
uma  variável;  
•  Regras:  
–  Um  idenMficador  não  pode  ter  símbolos  gráficos,  com  
exceção  do  underline  (_);  
–  Não  poder  haver  acentuação  gráfica  (acento  grave,  
acento  agudo,  Ml,  trema,  circunflexo  ou  cedilha);  
–  Um  idenMficador  não  pode  ser  iniciado  por  número;  
–  Não  pode  ser  uma  palavra  reservada.  
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Identificadores

auto return else continue


default switch if extern
float while signed long
register case union static
struct double const void
volatile goto enum unsigned
break short int char
do typedef sizeof for

Obs.: podem existir outros, específicos de cada compilador.


pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Tipos básicos de dados
TAMANHO
TIPO MÍNIMO MÁXIMO
EM BITS
char 8 0 255
8
int 0 255

float, float32 32 -1,5×10-45 3,4×1038


void 0 sem valor sem valor

double:  usada  apenas  em  C  ANSI,  não  usada  nos  PICs  

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Modificadores de tipo
São usados para conferir características especiais aos tipos de
dados básicos

MODIFICADOR DESCRIÇÃO
Representa tanto números positivos
signed
quanto negativos
unsigned Representa números sem sinal
Determina que a variável tenha um
short
tamanho menor que o tipo modificado
Determina que a variável tenha um
long
tamanho maior que o tipo modificado

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Tipos específicos do compilador CCS C
TIPO DESCRIÇÃO
int1 Especifica valores de 1 bit (equivale ao short int)
Especifica valores booleanos de 1 bit (equivale ao
boolean
short int e ao int1)
int8 Especifica valores de 8 bits (equivale ao int)
Especifica valores de 8 bits (equivale ao int e ao
byte
int8)
int16 Especifica valores de 16 bits (equivale ao long int)
int32 Especifica valores de 32 bits

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Resumo dos tipos de dados disponíveis
TAMANHO FAIXA DE
TIPO
EM BITS VALORES
short int, int1, boolean 1 0 ou 1
char 8 0 a 255
signed char 8 -128 a 127
unsigned char 8 0 a 255
int, int8, byte 8 0 a 255
signed int, signed byte 8 -128 a 127
unsigned int, unsigned
8 0 a 255
byte
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Resumo dos tipos de dados disponíveis (contin.)
TAMANHO
TIPO FAIXA DE VALORES
EM BITS
long int , int16 16 0 a 65.535
signed long int 16 -32.768 a 32.767
unsigned long int 16 0 a 65.535
int32 32 0 a 4294967295
-2147483648 a
signed int32 32
2147483647
unsigned int32 32 0 a 4294967295
float
pedrosarf@ifce.edu.br 32 -1,5×1045 a 3,4×1038
Prof. Pedro Pedrosa
Ø  Declaração de variáveis
Duas maneiras:

tipo var_1, var_2, ..., var_n;

OU

tipo var_1;
tipo var_2;
...
tipo var_n;

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Declaração de variáveis
Inicialização de variáveis na declaração:

void main( )
{
int contador = 0; //contador de uso geral
char temp_1, temp_2 = 10; //variáveis auxiliares
...
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Declaração de variáveis
•  As  variáveis  podem  ser  declaradas  em  3  pontos  
disMntos  do  programa:  
–  No  corpo  principal  do  programa  (fora  de  qualquer  
função,  inclusive  da  main( )):  globais  (podem  ser  
acessadas  de  qualquer  ponto  do  programa);  
–  Dentro  de  uma  função  (ou  roMna):  locais  (podem  ser  
acessadas  somente  enquanto  a  roMna  esMver  em  
operação);  
–  Como  um  parâmetro  formal  da  função:  Mpo  especial  de  
variáveis  locais.  
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Declaração de variáveis
#include <16F877A.h>
#FUSES HS, NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP
#use delay(clock=20000000)

int somatorio; //variável global

void soma(int valor) //‘valor’ é parâmetro formal da função soma


{
int conta; //variável local da função soma
somatorio = somatorio + valor; //manipulação da variável global
...
}

void main( )
{
int conta; //variável local da função main
somatorio = 0; //manipulação da variável global
...
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Declaração de constantes
Duas maneiras:

const val1 = 10; #define val1 10


const val2 = -5; #define val2 -5
const val3 = 55.12; OU   #define val3 55.12
const val4 = ‘a’; #define val4 ‘a’
const val5 = “teste”; #define val5 “teste”

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Representação numérica de constantes
As constantes podem ser representadas conforme os
exemplos seguintes:

REPRESENTAÇÃO NUMÉRICA EXEMPLO


Decimal 250
Hexadecimal 0x55
Binário 0b10100011
Octal 073
Caractere ‘&’
String “teste”
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Categorias
•  Atribuição;  
•  AritméMcos;  
•  Relacionais;  
•  Lógicos;  
•  Lógicos  bit  a  bit;  
•  De  memória.  

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Atribuição

Operador de atribuição “=”: atribuição de valores


a variáveis

x = 10;
y = x;

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Aritméticos
Realizam operações matemáticas em relação a um ou mais dados.

OPERADOR AÇÃO
+ Adição

- Subtração

* Multiplicação
/ Divisão
% Resto de divisão inteira
++ Incremento
-- Decremento

y = x++; //salva x em y, depois incrementa x


y = ++x; //incrementa x, depois salva x em y
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Relacionais
Utilizados em testes condicionais para determinar a relação
existente entre dados.

OPERADOR AÇÃO
> Maior que
>= Maior ou igual a
< Menor que
<= Menor ou igual a
== Igual a
!= Diferente de

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Booleanos
Realizam conjunções, disjunções ou negações entre
elementos em um teste condicional.

OPERADOR AÇÃO
&& AND (E)
|| OR (OU)
! NOT (NÃO)
Resultam em V ou F, ex.:
int x, y;
x = 10;
if(x > 5 && x < 15)
{};
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Lógicos Bit a Bit
Realizam operações matemáticas em relação a um ou mais
dados.

OPERADOR AÇÃO
& AND (E)

| OR (OU)

^ XOR (OU exclusivo)


~ NOT (complemento de um)
>> Deslocamento a direita
<< Deslocamento a esquerda

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Bit a Bit
Operador & (E)
Exemplo:

int v1, v2;


v1 = 100;
v2 = v1 & 15;

Decorrência:
100 decimal = 01100100
AND (&)
015 decimal = 00001111
Resultado = 00000100

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Bit a Bit
Operador | (OU)
Exemplo:

int v1, v2;


v1 = 0x20;
v2 = v1 | 0x04;
Decorrência:

20 hexadecimal = 00100000
OR (|)
04 hexadecimal = 00000100
Resultado = 00100100

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Bit a Bit
Operador ^ (XOR)
Exemplo:

int v1, v2;


v1 = 100;
v2 = v1 ^ 99;
Decorrência:

100 decimal = 01100100


XOR (^)
99 decimal = 01100011
Resultado = 00000111

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Bit a Bit
Operador ~ (NOT)
Exemplo:

int v1, v2;


v1 = 1;
v2 = ~ v1;

Decorrência:

1 decimal = 00000001 (8 bits, v1)


Resultado = 11111110 (8 bits, v2)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Lógicos Bit a Bit
Operador << (Deslocamento a esquerda)
Exemplo:

int v1, v2;


v1 = 10;
v2 = v1 << 2;
Decorrência:

10 decimal = 00001010
<<
00010100 (1 vez)
<<
Resultado = 00101000 (2 vezes)
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Lógicos Bit a Bit
Operador >> (Deslocamento a direita)
Exemplo:

int v1, v2;


v1 = 10;
v2 = v1 >> 2;
Decorrência:

10 decimal = 00001010
>>
00000101 (1 vez)
>>

Resultado = 10000010 (2 vezes)


pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Comando if-else
Sintaxe básica:

if (condição)
{
<comandos>;
}
else //uso opcional
{
<comandos>;
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Comando if-else
Estrutura if-else-if:

if (condição_1) <comando_1>;
else if (condição_2) <comando_2>;
else <comando_3>;

if aninhados:

if (condição_1)
{
if (condição_2) <comando_1>;
<comando_2>;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Comando if-else
Exemplo:

if (tecla == 1)
{
led = 1; //condição atendida
}
else
{
led = 0; //condição não atendida
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Comando switch
switch (variável)
{
case <valor_1>:
<comandos>;
break;
...
case <valor_n>:
<comandos>;
break;
default: //é opcional
<comandos>;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Comando switch
sensor = getc( );
switch (sensor)
{
case ‘L’:
liga_lampada( );
break;
case ‘D’:
desliga_lampada( );
break;
default: //é opcional
pisca_lampada( );
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Comando while
Sintaxe:

while (condição) <comando>;

OU

while (condição)
{
<comando_1>;
...
<comando_n>;
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Comando do-while
Sintaxe:

do
{
<comandos>;
} while (condição)

Obs.: A diferença do do-while em relação ao while é que


agora o teste da condição é feito somente após a execução
dos comandos.

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Comando while
Exemplo:

while (tecla == 1) led = 1;


led = 0;

endereco = 0;
do
{
dado = read_adc( );
grava_eeprom_i2c(endereco,dado);
} while(endereco != 0);
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Comando for
Sintaxe:

for (inicialização; condição; incremento/decremento)


{
<comandos>;
}
Exemplo:

for (x = 0; x <= 10; x++)


{
buffer[x] = 0;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Comando goto
Sintaxe:

goto rotulo;
Exemplo:

int conta = 0;
loop:
conta++;
if(conta <= 10)
goto loop;

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Funções
Sintaxe:

tipo_saida nome_da_funcao (tipo_entrada var_entrada)


{
<comandos>;
}
Exemplo:
int soma (int var1, int var2)
{
int res;
res = var1 + var2;
return res;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Funções
#include <18F2550.h> #include <18F2550.h>
#use delay(clock=20000000) #use delay(clock=20000000)

int soma(int v1, int v2); int soma(int v1, int v2)
{
void main( ) return v1+v2;
{ }
int res;
res = soma(10 , 20 ); void main( )
} {
int res;
int soma(int v1, int v2) res=soma(10 , 20);
{ }
return v1+v2;
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#include <stdio.h>

int soma(int v1, int v2)


{
int res = v1+v2;
Ø  Compilar no PC
return res;
}

void main( )
{
int res, a, b;
printf(“ Digite uma numero a:”);
scanf(“%d”, &a);

printf(“ Digite uma numero b:”);


scanf(“%d”, &b);

res=soma(a , b);

printf(“Soma = %d”, res);


} pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Bibliotecas
calc.c Arquivo  
Arquivo  dde  e  
Implementação  
calc.h
declaração  
int soma (int v1, int v2) int soma (int v1, int v2);
{ int subtracao (int v1, int v2);
return v1+v2; int divisao (int v1, int v2);
} int multiplicacao (int v1, int v2);
int subtracao (int v1, int v2)
{
return v1-v2; #include <18F2550.h>
} #include <calc.h>
#use delay(clock=20000000)
Inclui  (int
int divisao a  bv1,
iblioteca  
int v2) com  as  funções  
{ Entre  <  *    >    deve  estar  no  diretório  do   void main( )
return v1/v2; compilador   {
}Entre  “    *    “  deve  estar  no  mesmo  diretório   int res;
do  arquivo  (int
int multiplicacao que  v1,
está  
intav2)
dicionando  a   res=soma(v1, v2);
}
{ biblioteca  
return v1*v2;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Definição
•  Conjunto  de  elementos  do  mesmo  Mpo  agrupados  
em  um  conjunto  e  ordenados  por  um  índice.  

Ø  Criação (Instaciação)

int  vet[30];  
float  vet[20];  
char  vet[10];  
 
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Atribuição
int  vet[30];  
vet[0]=10;  
vet[1]=20;  
vet[2]=vet[0]+vet[1];  
 
   

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Percorrendo vetor completo
int      vet[30];  
int      tam_vet  =30;  
 
for(  int  k=0;    k<  tam_vet  ;  k++)  
 vet  [  k  ]  =  0;  
 
   
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Exemplo 1
int  vet[20];    
int  tam_vet  =20;  
for(int  k=0;  k<  tam_vet  ;k++)  
 vet  [  k  ]  =  k;  
 
   

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Exemplo 2
int  vet[20];    
int  tam_vet  =  20;  
vet  [  0  ]  =  0;  
for(int  k=1;  k<tam_vet;k++)  
 vet  [  k  ]  =  vet[k-­‐1];  
 
 
   
 
   
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
#ASM e #ENDASM
Utilizada para inserir código assembly diretamente em um
programa em C.

Sintaxe:

#asm
<código>
#endasm

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#ASM e #ENDASM
Utilizada para inserir código assembly diretamente em um
programa em C.

Sintaxe:

#asm
<código>
#endasm

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#ASM e #ENDASM
Utilizada para inserir código assembly diretamente em um
programa em C.

Exemplo:

int teste_asm (int a, int b)


#asm
movf a,w
addwf b,w
movwf _return_
#endasm

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#DEFINE
Utilizada para substituir o identificador pelo texto
especificado imediatamente depois dele.
Sintaxe:
#define identificador valor
Exemplos:

#define ESPERA_1 1000


#define tempo_extra delay_ms(1)
#define c6E input(PIN_C6)
#define liga_ByPass output_c(0x80)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#FUSES
Utilizada para programar as opções da palavra de
configuração dos PICs.
Sintaxe:

#fuses opções
Exemplos:

#fuses HS
#fuses WDT
#fuses PUT
#fuses MCLR

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#USE RS232
Ativa o suporte a comunicação serial (RS-232).
Sintaxe:

#use rs232(opções)
Exemplo:

#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


#USE DELAY
Informa ao compilador a velocidade de clock do sistema de
destino.
Sintaxe:

#use delay(clock = valor)


Exemplos:

#use delay(clock=40000000) // clock de 40 MHz


#use delay(clock=40000000, RESTART_WDT) // clock de 40
MHz com WDT

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Próximo assunto:
•  Introdução à Microcontroladores

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa

Potrebbero piacerti anche