Você está na página 1de 150

Linguagem C

Aplicaes baseadas no KIT PIC Bsico 28P

Estrutura bsica de um microcontrolador;


O PIC16F883;
MPLAB IDE;
Linguagem C;
Manipulao de I/O;
Timers;
Interrupes;
Conversor A/D;
Comunicao Serial;
Manipulao de memria EEPROM;
Projeto Exemplo;

Basicamente, um microcontrolador constitudo


de quatro partes:
Memria de programa;
Memria de dados;
Unidade lgica Aritmtica (ULA);
Portas de I/O (Entrada e Sada);

O PIC16F883 apresenta a seguintes caractersticas:

28 pinos sendo 24 para I/O;


Freqncia mxima de operao: 20 MHz;
Memria de programa: 4 Kwords;
Memria de dados: 256 bytes;
Memria EEPROM: 256 bytes;
Numero de Interrupes: 15;
3 Timers (2 X 8 bits, 1 X 16 bits);
Comunicao serial: I2C, SPI, EUSART;
11 canais analgicos de 10 bits;
2 comparadores analgicos;
2 mdulos CCP(capture, compare e PWM);
35 instrues.

Freqncia do oscilador principal dividida por 4;


Instrues
mquina;

so

executadas

em

um

Exemplo:
fosc = 4MHz
ciclo de mquina = fosc /4 = 4Mhz / 4 = 1Mhz
tciclo = 1/1Mhz = 1s

ciclo

de

Os microcontroladores PIC possuem alguns modos de


osciladores disponveis para operao.

Tipos de osciladores:

RC - RC externo;
INTOSC - RC interno;
EC - fonte clock externa;
HS - cristal/ressonador de alta frequncia(acima de 4MHZ);
XT - cristal/ressonador de mdia frequncia;
LP - cristal/ressonador de baixa frequncia(32 KHz)

U1
1

REXT

CEXT

2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

U1
1

C1

XTAL
C2

2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

So divididas em 3 tipos:

ROM > Memria de Programa

RAM -> Memria de Dados

EEPROM -> Memria de Armazenamento

Memria do tipo FLASH;


Dividida em duas pginas;
Vetor de reset;
Vetor de interrupo;

Memria do tipo RAM;


Classificada em registradores de uso geral e de uso
especfico;
Dividida em bancos;

Memria no voltil;
Usada para armazenar valores que no podem ser
perdidos;

Escrita e apagada eletricamente;

256 bytes;

Reset externo;
Quando aplicado nvel baixo ocorre o reinicio do
programa;
Pino 1 RE3/MCLR
R1
10K

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

Co de guarda;

Contador de 8 bits;

Utilizado para verificar se o programa travou;

Reseta microcontrolador quando ocorre overflow da


contagem;
Seu valor deve ser reiniciado durando o fluxo do
programa;

Detecta baixa tenso de alimentao;

Tenses configurveis : 4 V ou 2.1 V;

Caso tenso caia abaixo do valor configurado,


ocorrer um reset no software;

Circuito interno que retarda o inicio da execuo


do programa;
Garante estabilizao da tenso de alimentao;
Tempo: cerca 64ms aps o pino MCLR ser
colocado em nvel alto;

Criar projeto, inserir cdigo fonte, compilar e


gravar no KIT.

Caractersticas:
Estruturada;
Alto nvel (comparada ao Assembly);
Facilidade de acesso ao hardware;

Portabilidade;
Curva de aprendizagem reduzida;
Reutilizao de cdigo;

So Utilizados para:

Comentrios de linha simples:

Documentao do software;
Excluso de linhas durante a compilao.

//este um comentrio de linha simples

Comentrios de Mltiplas linhas:


/*
este um
comentrio de
mltiplas linhas
*/

Nomes dados a variveis, funes ou outros elementos;


So compostos por caracteres alfanumricos ou
numricos;
Somente podem ser iniciados por uma letra ou _,
nunca por nmero;
Podem possuir at 32 caracteres;

Exemplo:

temperatura;
_tempo1;
velocidade_angular;

No podem ser utilizadas como identificadores

auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

struct

switch

typedef

union

unsigned

void

volatile

while

Tipo

Tamanho em bits

Intervalo

char

0 a 255

int

0 a 255

float

32

void

-1.5 x 1045 to 3.4 x 1038


Nenhum valor

signed
signed int variavel_x;

unsigned
unsigned int variavel_x

short
short int flag_x;

long
long int variavel_x;

int1: especifica valores de 1 bit (equivale ao short int);

boolean: especifica valores de 1 bit (equivale ao short int e int1);

int8: especifica valores de 8 bits (equivale ao tipo int padro);

byte: especifica valores de 8 bits ( equivale ao int e ao int8);

int16: especifica valores de 16 bits ( equivale ao long int);

int32: especifica valores de 32 bits.

Bases:

Binria;
Octal ;
Decimal;
Hexadecimal:

Exemplo:
Representao do numero 50 nas diferentes bases:

50 - Decimal
0x32- Hexadecimal
0b00110010 - Binrio
062- Octal

Declarao:
const
#define

int valor1 = 100;

valor1 100

So declaradas no inicio do programa, fora de


qualquer funo.

Declarao:

tipo nome_da_varivel;
tipo nome_da_varivel = valor_da_varivel;

Exemplo: declarar a varivel chamada temperatura, sendo de 8 bits no


sinalizada:
unsigned int temperatura;
Ou apenas:
int temperatura;

Iniciando variveis do mesmo tipo em linha nica:


int temp1, temp2, temp3;
ou
int temp1=10, temp2 = 20, temp3 = 30;

So declaradas dentro do corpo de funes ou blocos de cdigo;

Disponveis apenas dentro do bloco ou funo onde foi declarada;

Exemplo:
void main()
{
int valor;
valor =0;

//declara a varivel local da funo main


//inicia com 0

while(true) //loop infinito


{
printf(%d, valor++); //imprime o valor incrementado
//da varivel na serial
}
}

Declaradas fora do corpo de qualquer funo;


Todas as funes podem alterar ou usar o seu valor;

Exemplo:

int valor;
//varivel global
void verifica_valor(void) //funo para verificar o valor do ad lido
{
if(valor < 127)
// se valor for menor que 127
RB0 = 1;
//liga RB0
}
void main()
//funo principal
{
valor = read_adc();
//le valor do ad
verifica_valor();
//chama funo para verificar valor
}

Linguagem C possui grande quantidade de


operadores;

Operadores de alto e baixo nvel;

Tipos:

Atribuio;
Aritmticos;
Relacionais;
Lgicos;
Lgicos bit a bit;

Representado pelo caracter: =;


Utilizado para atribuir um determinado valor a uma
varivel.

Exemplo:

x = 10;
y = x+3;

Realizam operaes matemticas;


OPERADOR

AO

Adio

Subtrao

Multiplicao

Diviso

Resto de diviso inteira

++

Incremento

--

Decremento

operador % :
x = 5%2;

Operador ++;
x = 1;
x++;

Operador --;
x = 10;
x--;

Usados em testes condicionais para determinar


relaes entre dados.
OPERADOR

AO

>

Maior que

>=

Maior ou igual que

<

Menor que

<=

Menor ou igual que

==

Igual a

!=

Diferente de

So usados para realizar testes booleanos entre


elementos em um teste condicional

OPERADOR

AO

&&

AND (E)

||

OR (OU)

NOT (NO)

So utilizados para operaes lgicas entre


elementos ou variveis.
OPERADOR

AO

&

AND(E)

OR(OU)

XOR (OU EXCLUSIVO)

NOT (NO)

>>

Deslocamento direita

<<

Deslocamento esquerda

Abreviao entre a operao e atribuio


Forma expandida

Forma reduzida

x = x + y

x += y

x = x - y

x -= y

x = x * y

x *= y

x = x / y

x /= y

x = x % y

x %= y

x = x & y

x &= y

x = x | y

x |= y

x = x ^ y

x ^= y

x = x << y

x <<= y

x = x >> y

x >>= y

So divididas em dois grupos:

Testes condicionais;

Estruturas de repeties;

Utilizada para executar um comando ou bloco de


comandos no caso de uma determinada condio
ser avaliada como verdadeira.
Forma geral:
if(condio) comando;

Exemplo:
if(temperatura < setPoint) RELE = 1;

Utilizado quando h a necessidade de tomar uma


ao caso a condio for avaliada como falsa.

if (condio)
comandoA;
else
comandoB;

Exemplo:
if (temperatura < setpoint)
rele = 1;
else
rele = 0;

Para executar um bloco de cdigos dentro da declarao if- else:


if(condio)
{
comandoA1;
comandoaA2;
...
comandoAn;
}
else
{
comandoB1;
comandoB2;
...
comandoBn;
}

//bloco de cdigo para a condio verdadeira

//bloco de cdigo para a condio falsa

utilizado para a realizao de comparaes sucessivas de uma forma


elegante, clara e eficiente.
switch(varivel)
{
case constante1:
comandoA;
. . .
break;
case constante2:
comandoB;
. . .
break;
. . .
. . .
default:
comandoX;
}

Exemplo
switch(caracter_recebido)
{
case 1:
LED1 = 1;
break;
case 2:
LED2 = 1;
break;
default:
LED1 = 0;
LED2 = 0;
}

Estrutura de repetio mais utilizada, sendo muito


poderosa na Linguagem C

Forma geral:
for( inicializao;condio;incremento) comando;
Ou
for( inicializao;condio;incremento)
{
Comando1;
Comando2;
. . .
ComandoN;
}

Exemplo
for(x = 0;x <11;x++)
{
printf( %d x 10 = %d,x, x*10);
}

Repete um comando ou um conjunto de instrues


enquanto uma condio for avaliada como
verdadeira.
Forma geral:
while(condio)
{
comando1;
comando2;
...
comandoN;
}

Exemplos
x = 0;
while(x<10)
{
LED = 1;
delay_ms(500);
LED = 0;
delay_ms(500);
x++;
}

while(1);

while(!RA0);

Tem o funcionamento ligeiramente diferente do


while.
Forma geral:
do
{
comandoA;
comandoB;
...
comandoN;
} while (condio);

Exemplo

do
{
led = 1;
delay_ms(500);
led = 0;
delay_ms(500);
x++;
}while(x<10);

Funes so grupos de instrues que podem ser


utilizados uma ou mais vezes sem a necessidade de
repetir a digitao do cdigo;

Em todo programa C existe ao menos uma funo


funo main();

Caractersticas de funes
programa fica mais legvel e melhor estruturado;
Reutilizao de cdigo;
Cada funo tem um nome nico;
Os nomes de funes seguem as mesmas regras de nomenclatura
para variveis;
Podem ter qualquer nome exceto main.

O formato geral de uma funo :

Tipo_da_funo nome_da_funo (parmetros)


{
//bloco de comandos
Comando1;
Comando2;
...
return;
}

Tipo da funo -> especifica o tipo de dado de


retorno;
Nome da funo -> identifica a funo e o nome
utilizado para a chamada da mesma.
Parmetros - > so argumentos onde so
passados para que a funo utilize durante sua
execuo;

Exemplo
int calcula_media(int A, int B)
{
int media;
media = (A + B)/2;
return media;
}

void main (void)


{
int nota_final;
int nota1, nota2;
nota1 = 5;
nota2 = 9;
nota_final = calcula_media(nota1, nota2);
}

O compilador CCS possui varias funes


prontas que auxiliam em:

Manipulao de I/O;
Configurao de registradores;
Leitura do conversor A/D;
Configurao e uso dos timers;
Delays;
PWM;
Matemticas;
.....

output_low()
output_low (PIN_B1); // coloca o pino RB1 em 0
output_high()
Output_high (PIN_A0); // coloca o pino RA0 em 1
output_bit()
Output_bit (pin_A0, 0);// coloca o pino RA0 em 0
output_x()
output_b (0xFF); // escreve o valor 0xFF no PORTB
input()
x = input(PIN_A0); // l o estado do pino RA0
input_x()
x = input_b(); // l o estado do PORTB

delay_cycles()
delay_us (1); // aguarda 1 us.

delay_us()
Delay_us (1); // aguarda 1 us.

delay_ms()
delay_ms (1); // aguarda 1 ms.

setup_adc_ports()
setup_adc_ports (AN0);//define RA0 como entrada analgica

set_adc_channel ()
set_adc_channel(2); //seleciona canal 2 para converso

read_adc ()
valor = read_adc(); //le o resultado da converso

adc_done ()
while (!adc_done());

//fica em loop at o fim da converso

#asm #endasm
Permite a incluso de cdigo assembly.
Exemplo:
#asm
bsf PORTB,3 // estas duas instrues geram um
pulso
nop
bcf PORTB,3 // no pino RB3.
#endasm

#case
Ativa a distino entre caracteres maisculos/minsculos.

#define
Utilizado para substituir valores por identificadores ou at
mesmo macro comandos.
Exemplo:
#define BT1 RB0
#define liga_led RC0 = 1

#include
Insere arquivos externos
Exemplo:
#include <16F883.h>
#include "PIC16F883_SFR.h

#ROM
Armazena valores na EEPROM durante a gravao
Exemplo:
#rom 0x2100 = { 0x00, 0x25};

#fuses
Configura os fusveis de funcionamento
Exemplo:
#fuses

XT,NOMCLR,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP

Alguns Fusveis disponveis para o PIC16F883:

1.00

XT

Crystal osc <= 4mhz

1.00

EC_IO

External clock

1.03

NOWDT

No Watch Dog Timer

1.03

WDT

Watch Dog Timer

1.05

NOMCLR

Master Clear pin used for I/O

1.05

MCLR

Master Clear pin enabled

1.06

PROTECT

Code protected from reads

1.07

NOCPD

No EE protection

1.07

CPD

Data EEPROM Code Protected

1.08

NOBROWNOUT No brownout reset

#ifdef

#endif

Permite compilao condicional


Exemplo:
#define OK
.
.
#ifdef OK
delay_ms(200);
#endif

#INT_XXXX
Indica para o compilador que o trecho a seguir refere-se a
uma rotina de interrupo

Algumas das interrupes reconhecidas so:


INT_EXT (RB0/Int)
INT_TIMER0 (Timer 0)
INT_RB (RB4~7)
INT_EEPROM (EEPROM interna)
INT_AD (Conversor A/D interno)
INT_DEFAULT (Caso entre na rotina de interrupo por engano)

#use delay
Informa o clock do sistema
Exemplo:
#use delay (clock=4000000)

#byte
Permite o acesso a posies de RAM (Registros e memria
geral) pela indicao de seu endereo real
Exemplo:
#byte PORTB = 0x06

#bit
Usado para definir um identificador para um bit de uma
varivel j definida.
Exemplo:
int flags;
#bit ST_BT1 = flag.0

PIC Bsico 28 P

Permitem a comunicao com o mundo exterior;

Organizados por PORTs;

Podem ser definidos como entrada ou sadas


conforme a necessidade;

Dois registradores para manipulao: TRISX e


PORTX;

Configurando direo do PINO:


Registrador TRISX
0 = pino configurado como sada;
1 = pino configurado como entrada;
Exemplo:
TRISA = 0b00000001; //define o RA0 como entrada digital

Lendo o estado do pino:


if(RA0 == 0) //se pino RA0 estiver com valor zero
comandoX; //executa comando x

Lendo estado do PORT inteiro:


int valor;
valor = PORTA;
If(PORTB == 128) //se Pino RB7 igual a 1
comandoY;
//executa comando Y

Hardware:
+ 5V

R1
10K

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

Esquema 1

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

R1
330R

D1
LED-RED

Esquema 2
+5V

R1
330R

D1

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

LED-RED
RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

Execute o exemplo 1 e teste no KIT. Verifique


seu funcionamento.
Simular no MPLAB.

Desenvolva uma aplicao onde faa a leitura dos


quatros botes e ligue os LEDS em cdigo binrio
para indicar qual tecla foi pressionada.

Quando uma tecla pressionada gera um


certo rudo:

Esse rudo pode causar interferncia no


software.

O exemplo 2 exibe como ler uma tecla


usando tcnica de Debounce.

Faa a leitura das 4 teclas usando a tcnica


de DEBOUNCE de teclas. Os botes devero
ter as seguintes funes:
BT1 incrementa valor nos leds;
BT2 decrementa valor nos leds;
BT3 zera valor dos leds;
BT4 inverte estado do RELE;

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

R1
330R

R2
330R

R3
330R

R4
330R

R5
330R

R6
330R

R7
330R

+5V

U1
1
2
3
4
5
6
7
10
9
21
22
23
24

RE3/MCLR/VPP

RB4/AN11/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT

RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+
RA3/AN3/VREF+/C1IN+
RC0/T1OSO/T1CKI
RA4/T0CKI/C1OUT
RC1/T1OSI/CCP2
RA5/AN4/SS/C2OUT
RC2/CCP1/P1A
RA6/OSC2/CLKOUT
RC3/SCK/SCL
RA7/OSC1/CLKIN
RC4/SDI/SDA
RC5/SDO
RB0/AN12/INT
RC6/TX/CK
RB1/AN10/P1C/C12IN3RC7/RX/DT
RB2/AN8/P1B
RB3/AN9/PGM/C12IN2PIC16F883

25
26
27
28
11
12
13
14
15
16
17
18

R1
330R

R2
330R

R3
330R

R4
330R

R5
330R

R6
330R

R7
330R

Tabela para display ctodo comum

O Exemplo 3 mostra como acionar displays de 7


segmentos.

Desenvolva uma aplicao para que o valor no


display seja incrementado ao apertar uma
determinada tecla e decrementado quando
pressionado outra e uma outra tecla para reiniciar
o valor da contagem do display. O valor deve ir de
0 a 9.

Perifricos internos ao microcontrolador

So utilizados para:
Contagem de tempos;
Contagem de eventos;

O PIC16F883 possui 3 timers:


Timer0 - > 8 bits
Timer1 - > 16 bits
Timer2 -> 8 bits

Temporizador/ contador de 8 bits;


Diagrama de Blocos:

Registradores associados:

Temporizador / Contador de 16 bits

Registradores associados:

Temporizador de 8 bits

Registradores associados:

O exemplo 4 exibe como usar o TIMER1 para criar


uma base de tempo para um temporizador.

Utilize o TIMER0 para criar uma base de tempo


para piscar um LED ou mais LEDs, faa o mesmo
utilizando o TIMER2
obs.: Base de tempo de 1 segundo

Eventos assncronos;
Desvia o programa automaticamente para o vetor
de interrupo (0x04);

So classificadas em dois grupos:

Convencionais ;
Perifricos;

O exemplo 5A exibe a forma de se tratar interrupo com base no


fluxograma de tratamento e o exemplo 5B exibe uma forma
utilizando os recursos do compilador para tratamento da
interrupo.
Os exemplos exibiro como usar a interrupo para a multiplexao
de display de sete segmentos e os LEDS que esto ligados no mesmo
barramento de dados usando a tcnica de varredura, ou seja,
acenderemos um display por vez: primeiro o display 1, depois o
display 2 e depois os LEDS e assim repetidamente.
Para que no percebermos o liga e desliga dos displays
trabalharemos
com
uma
freqncia
de
varredura
de
aproximadamente 80 Hz, pois acima de 50 Hz temos a impresso de
todos os displays ligados ao mesmo tempo.

Com base nos exemplos anteriores crie um


contador de segundos usando o TIMER0 para a
varredura dos displays e o TIMER1 para a base de
tempo de um segundo. Utilize interrupes para
esse processo. O contador deve ir de 0 a 59 e
quando chegar em 60 deve-se reiniciar os displays
e incrementar os LEDS.

Converte um sinal analgico em digital;

Resoluo dada por:

Vref : tenso de referncia do conversor


n : numero de bits do conversor

Caractersticas

Conversor de 10 bits;
11 canais disponveis;
Referncia interna;
Referncia externa;
Conversor por aproximaes sucessivas;
Freqncia de converso ajustvel por software;
Interrupo associada ao termino da converso.

Primeiramente configura a direo do pino como


entrada no registrador TRISX correspondente.
Definir o pino como entrada analgica
Registradores:
ANSEL e ANSELH

Exemplo:
TRISA = 0b00000001; //pino RA0 como entrada
ANSEL = 0b00000001; //pino RA0 funcionando como AN0

Clock

Resultado da converso

O exemplo 6 exibe como configurar o conversor


A/D e como obter o resultado da converso. O
Resultado da converso exibido nos LEDS e o
valor de entrada analgica pode ser variado
utilizando o POT1.

Simule um sensor de temperatura com o POT2


obedecendo a seguinte relao:
0 v 0 C
5 V 99C
Exibir o valor da temperatura nos displays.

#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)


Onde configurado o baud rate da comunicao e os
pinos de transmisso e recepo de dados.
Neste caso temos a seguinte configurao:
Baude rate = 9600 bps
Pino de transmisso: RC6
Pino de recepo: RC7

printf
Envia uma string(seqncia de caracteres) pela serial.
Exemplo:
printf(hello world); //imprime na serial a string: hello world

putc
Envia apenas um caractere na serial.
Exemplo:
putc(f);

//imprime na serial o caracter f

gets
L uma string da serial
Exemplo:
char buffer[10]; //declara o vetor buffer para armazenamento da string
gets(buffer);
//aguarda a chegada de string na serial

Getc
L um caracter da serial
Exemplo:]

char c;

//declara a varivel para armazenamento do caractere

c = getc();

// atribui a c quando caracter disponvel na serial

Kbhit
Retorna verdadeiro (1) se chegar um caractere pela
serial e falso(0) enquanto no houver caractere.
Exemplo:
if(kbhit())
{
c = getc();
}

//se caracter na serial


//atribui o valor para c

O exemplo 7 exibe uma comunicao serial entre


um computador e o microcontrolador. Neste
exemplo ser enviado pela serial o valor de tenso
sempre que houver a chegada do caractere T pela
serial.

Desenvolva um sistema onde seja possvel ligar ou


desligar cada LED independentemente atravs de
comandos enviados pelo terminal do computador.

write_eeprom (endereo, valor);


Exemplo:
#define END_VOLUME

10

// endereo na EEPROM

volume++;
//incrementa o valor
write_eeprom(END_VOLUME,volume); //salva na EEPROM endereo 10

read_eeprom (endereo);
Exemplo:
#define END_VOLUME

10

//endereo

volume = read_eeprom (END_VOLUME); //l o valor presente no


//Endereo 10 da EEPROM

O exemplo 8 mostra como armazenar e ler valores


na memria EEPROM. Ser armazenado o valor no
display e quando reiniciar o microcontrolador este
valor ser carregado no display novamente.

Desenvolva uma aplicao onde seja armazenado


na EEPROM o valor de uma Varivel de 16 bits.

O exemplo exibe um controle de temperatura do


tipo ON/OFF. Ser ajustado um valor de set point
no display e o sistema controlar a sada para
manter esta temperatura.
Recursos utilizados:

Conversor A/D para leitura do sensor de temperatura;


Interrupo;
Varredura de displays;
Leitura de teclas;
Acionamento de rele.

Fbio B. de Souza
fabio_souza53@hotmail.com
Cel.: 1195322559

Você também pode gostar