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 ciclo de

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

Os microcontroladores PIC possuem alguns modos de osciladores disponveis para operao.


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)

Tipos de osciladores:

U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18

REXT

CEXT

U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18

C1

XTAL C2

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 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 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:

Documentao do software; Excluso de linhas durante a compilao.

Comentrios de linha simples:


//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 continue enum

break default extern

case do float

char double for

const else goto

if
struct void

int
switch volatile

long
typedef while

register
union

return
unsigned

Tipo char int float void

Tamanho em bits 8 8 32 0

Intervalo 0 a 255 0 a 255 -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 x = x + y x = x - y x = x * y x = x / y x = x % y x = x & y x = x | y Forma reduzida x += y x -= y x *= y x /= y x %= y x &= y x |= y

x = x ^ y
x = x << y x = x >> y

x ^= y
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.
Exemplo:
if (temperatura < setpoint) rele = 1; else rele = 0;

if (condio) comandoA; else comandoB;

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 1.00 1.03 1.03 1.05 1.05 1.06 1.07 1.07 1.08 XT EC_IO NOWDT WDT NOMCLR MCLR PROTECT NOCPD CPD Crystal osc <= 4mhz External clock No Watch Dog Timer Watch Dog Timer Master Clear pin used for I/O Master Clear pin enabled Code protected from reads No EE protection Data EEPROM Code Protected

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 1 2 3 4 5 6 7 10 9 21 22 23 24

U1
RE3/MCLR/VPP 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 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 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18

R1
330R

D1
LED-RED

Esquema 2
+5V

R1
330R

U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18

D1
LED-RED

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 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 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 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 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 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; c = getc(); //declara a varivel para armazenamento do caractere // 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