Apresentação curso pic básico fbs eletrônica
-
Upload
fabio-souza -
Category
Documents
-
view
9.014 -
download
12
Transcript of Apresentação curso pic básico fbs eletrônica
Linguagem C
Aplicações baseadas no KIT PIC Básico 28P
Estrutura básica de um microcontrolador; O PIC16F883; MPLAB IDE; Linguagem C; Manipulação de I/O; Timers; Interrupções; Conversor A/D; Comunicação Serial; Manipulação de memória EEPROM; Projeto.
Sistema Decimal◦ Composto por algarismos de 0 a 9 (base 10)
Para representar uma quantidade por exemplo:
764d = 7*102 + 6*101+ 4*100
= 700 + 60+ 4
= 764
Sistema Binário◦ Composto pelo algarismos 0 e 1(base 2).
Para representar uma quantidade utiliza estes dois algarismos, por exemplo:
10101011b = 1*27 + 0*26 +1*25 +0*24 +1*23+0*22 + 1*21 + 1*20
= 128 + 0 + 32 + 0 +8 + 0 + 2 + 1
= 171(base 10)
Sistema Hexadecimal◦ Composto por 16 algarismos (base 16) de 0 a F, ou
seja:
◦ 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Para representar uma quantidade em hexadecimal:
5DCh = 5*162 + D*161 +C*160 0
= 5*256+ 13*16 +12
= 1500 (base 10)
Bit: 0 ou 1;
Nibble: 4bits;
Byte : 8 bits;
Word: 16 bits.
AND ou ‘E’:
OR ou ‘OU’:
NOT ou ‘Não’:
XOR ou ‘OU-EXCLUSIVO’:
Basicamente, um microcontrolador é constituído de quatro partes:
◦ Memória de programa;
◦ Memória de dados;
◦ Unidade lógica Aritmética (ULA);
◦ Portas de I/O (Entrada e Saída);
Von-Neumann
Harvard
O PIC16F883 apresenta a seguintes características:
• 28 pinos sendo 24 para I/O;• Freqüência máxima de operação: 20 MHz;• Memória de programa: 4 Kwords;• Memória de dados: 256 bytes;• Memória EEPROM: 256 bytes;• Numero de Interrupções: 15;• 3 Timers (2 X 8 bits, 1 X 16 bits);• Comunicação serial: I2C, SPI, EUSART;• 11 canais analógicos de 10 bits;• 2 comparadores analógicos;• 2 módulos CCP(capture, compare e PWM);• 35 instruções.
Freqüência do oscilador principal dividida por 4;
Exemplo:fosc = 4MHz
ciclo de máquina = fosc /4 = 4Mhz / 4 = 1Mhz
tciclo = 1/1Mhz = 1µs
Os microcontroladores PIC possuem alguns modos de osciladores disponíveis para operação.
Tipos de osciladores:RC - RC externo;INTOSC - RC interno;EC - fonte clock externa;HS - cristal/ressonador de alta frequência (acima de 4MHZ);XT - cristal/ressonador de média frequência;LP - cristal/ressonador de baixa frequência(32 KHz)
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
CEXT
REXT
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
XTAL
C1
C2
São divididas em 3 tipos:
ROM –> Memória de Programa
RAM -> Memória de Dados
EEPROM -> Memória de Armazenamento
Memória do tipo FLASH;
Dividida em duas páginas;
Vetor de reset;
Vetor de interrupção;
Memória do tipo RAM;
Classificada em registradores de uso geral e de uso específico;
Dividida em bancos;
Memória não volátil;
Usada para armazenar valores que não podem ser perdidos;
Escrita e apagada eletricamente;
256 bytes;
Reset externo;
Quando aplicado nível baixo ocorre o reinicio do programa;
Pino 1 – RE3/MCLR
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
R110K
Cão de guarda;
Contador de 8 bits;
Utilizado para verificar se o programa travou;
Reinicia(RESET) o microcontrolador quando ocorreoverflow da contagem;
Seu valor deve ser reiniciado durando o fluxo doprograma;
Detecta baixa tensão de alimentação;
Tensões configuráveis : 4 V ou 2.1 V;
Caso tensão caia abaixo do valor configurado, ocorrerá um reset no software;
Circuito interno que retarda o inicio da execução do programa;
Garante estabilização da tensão de alimentação;
Tempo: cerca 64ms após o pino MCLR ser colocado em nível alto;
Criar projeto, inserir código fonte, compilar e gravar no KIT.
Características:
◦ Estruturada;
◦ Alto nível (comparada ao Assembly);
◦ Facilidade de acesso ao hardware;
◦ Portabilidade;
◦ Curva de aprendizagem reduzida;
◦ Reutilização de código;
São Utilizados para:◦ Documentação do software;◦ Exclusão de linhas durante a compilação.
Comentários de linha simples:
//este é um comentário de linha simples
Comentários de Múltiplas linhas:
/*
este é um
comentário de
múltiplas linhas
*/
Nomes dados a variáveis, funções ou outros elementos;
São compostos por caracteres alfanuméricos ou numéricos;
Somente podem ser iniciados por uma letra ou ‘_’, nunca por número;
Podem possuir até 32 caracteres;
Exemplo:◦ temperatura;
◦ _tempo1;
◦ velocidade_angular;
Não 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 8 0 a 255
int 8 0 a 255
float 32 -1.5 x 1045 to 3.4 x 1038
void 0 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 padrão);
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:◦ Binária;◦ Octal ;◦ Decimal;◦ Hexadecimal:
Exemplo: Representação do numero 50 nas diferentes bases:◦ 50 - Decimal◦ 0x32- Hexadecimal◦ 0b00110010 - Binário◦ 062- Octal
Declaração:◦ const int valor1 = 100;
◦ #define valor1 100
São declaradas no inicio do programa, fora de qualquer função.
Declaração:◦ tipo nome_da_variável;
◦ tipo nome_da_variável = valor_da_variável;
Exemplo: declarar a variável chamada temperatura, sendo de 8 bits não sinalizada:
unsigned int temperatura;
Ou apenas:
int temperatura;
Iniciando variáveis do mesmo tipo em linha única:
int temp1, temp2, temp3;
ou
int temp1=10, temp2 = 20, temp3 = 30;
São declaradas dentro do corpo de funções ou blocos de código;
Disponíveis apenas dentro do bloco ou função onde foi declarada;
Exemplo:void main()
{
int valor; //declara a variável local da função main
valor =0; //inicia com 0
while(true) //loop infinito
{
printf(“%d”, valor++); //imprime o valor incrementado
//da variável na serial
}
}
Declaradas fora do corpo de qualquer função;
Todas as funções podem alterar ou usar o seu valor;
Exemplo:int valor; //variável global
void verifica_valor(void) //função para verificar o valor do ad lido
{
if(valor < 127) // se valor for menor que 127
RB0 = 1; //liga RB0
}
void main() //função principal
{
valor = read_adc(); //le valor do ad
verifica_valor(); //chama função para verificar valor
}
Linguagem C possui grande quantidade de operadores;
Operadores de alto e baixo nível;
Tipos:◦ Atribuição;◦ Aritméticos;◦ Relacionais;◦ Lógicos;◦ Lógicos bit a bit;
Representado pelo caracter: “=“;
Utilizado para atribuir um determinado valor a uma variável.
Exemplo:◦ x = 10;
◦ y = x+3;
Realizam operações matemáticas;
OPERADOR AÇÃO
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Resto de divisão inteira
++ Incremento
-- Decremento
operador % :x = 5%2;
Operador ++;x = 1;
x++;
Operador --;x = 10;
x--;
Usados em testes condicionais para determinar relações entre dados.
OPERADOR AÇÃO
> Maior que
>= Maior ou igual que
< Menor que
<= Menor ou igual que
== Igual a
!= Diferente de
São usados para realizar testes booleanos entre elementos em um teste condicional
OPERADOR AÇÃO
&& AND (E)
|| OR (OU)
! NOT (NÃO)
São utilizados para operações lógicas entre elementos ou variáveis.
OPERADOR AÇÃO
& AND(E)
| OR(OU)
^ XOR (OU EXCLUSIVO)
~ NOT (NÃO)
>> Deslocamento à direita
<< Deslocamento à esquerda
Abreviação entre a operação e atribuição
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
São divididas em dois grupos:
Testes condicionais;
Estruturas de repetições;
Utilizada para executar um comando ou bloco decomandos no caso de uma determinada condiçãoser avaliada como verdadeira.
Forma geral:◦ if(condição) comando;
Exemplo:◦ if(temperatura < setPoint) RELE = 1;
Utilizado quando há a necessidade de tomar umaação caso a condição for avaliada como falsa.
if (condição)
comandoA;
else
comandoB;
Exemplo:
if (temperatura < setpoint)
rele = 1;
else
rele = 0;
Para executar um bloco de códigos dentro da declaração if- else:
if(condição)
{
comandoA1; //bloco de código para a condição verdadeira
comandoaA2;
...
comandoAn;
}
else
{
comandoB1; //bloco de código para a condição falsa
comandoB2;
...
comandoBn;
}
É utilizado para a realização de comparações sucessivas de uma formaelegante, clara e eficiente.
switch(variável)
{
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 repetição mais utilizada, sendo muito poderosa na Linguagem C
Forma geral:for( inicialização;condição;incremento) comando;
Ou
for( inicialização;condição;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 instruçõesenquanto uma condição for avaliada comoverdadeira.
Forma geral:while(condição)
{
comando1;
comando2;
...
comandoN;
}
x = 0;
while(x<10)
{
LED = 1;
delay_ms(500);
LED = 0;
delay_ms(500);
x++;
}
while(1);
while(!RA0);
Exemplos
Tem o funcionamento ligeiramente diferente do while.
Forma geral:do
{
comandoA;
comandoB;
...
comandoN;
} while (condição);
Exemplo
do
{
led = 1;
delay_ms(500);
led = 0;
delay_ms(500);
x++;
}while(x<10);
Funções são grupos de instruções que podem serutilizados uma ou mais vezes sem a necessidade derepetir a digitação do código;
Em todo programa C existe ao menos uma função –função main();
Características de funções
◦ programa fica mais legível e melhor estruturado;
◦ Reutilização de código;
◦ Cada função tem um nome único;
◦ Os nomes de funções seguem as mesmas regras de nomenclatura para variáveis;
◦ Podem ter qualquer nome exceto main.
O formato geral de uma função é:
Tipo_da_função nome_da_função (parâmetros)
{
//bloco de comandos
Comando1;
Comando2;
...
return;
}
Tipo da função -> especifica o tipo de dado de retorno;
Nome da função -> identifica a função e é o nome utilizado para a chamada da mesma.
Parâmetros - > são argumentos onde são passados para que a função utilize durante sua execução;
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 funções prontas que auxiliam em:
◦ Manipulação de I/O;
◦ Configuração de registradores;
◦ Leitura do conversor A/D;
◦ Configuração e uso dos timers;
◦ Delays;
◦ PWM;
◦ Matemáticas;
◦ .....
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_cycles (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 analógica
set_adc_channel ()◦ set_adc_channel(2); //seleciona canal 2 para conversão
read_adc ()◦ valor = read_adc(); //le o resultado da conversão
adc_done ()◦ while (!adc_done()); //fica em loop até o fim da conversão
#asm #endasmPermite a inclusão de código assembly.
Exemplo:
#asm
bsf PORTB,3 // estas duas instruções geram um
pulso
nop
bcf PORTB,3 // no pino RB3.
#endasm
#case◦ Ativa a distinção entre caracteres maiúsculos/minúsculos.
#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 gravação
Exemplo:
#rom 0x2100 = { 0x00, 0x25};
#fuses◦ Configura os fusíveis de funcionamento
◦ Exemplo: #fuses XT,NOMCLR,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
Alguns Fusíveis disponíveis 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 compilação 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 interrupção
Algumas das interrupções reconhecidas são:
◦ 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 interrupção por engano)
#use delay◦ Informa o clock do sistema
Exemplo:
#use delay (clock=4000000)
#byte ◦ Permite o acesso a posições de RAM (Registros e memória
geral) pela indicação de seu endereço real
Exemplo:
#byte PORTB = 0x06
#bit◦ Usado para definir um identificador para um bit de uma
variável já definida.
◦ Exemplo:
int flags;
#bit ST_BT1 = flag.0
PIC Básico 28 P
Permitem a comunicação com o mundo exterior;
Organizados por PORTs;
Podem ser definidos como entrada ou saídas conforme a necessidade;
Dois registradores para manipulação: TRISX e PORTX;
Configurando direção do PINO:
◦ Registrador TRISX
0 = pino configurado como saída;
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:
R110K
+ 5V
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
R1330R
D1LED-RED
Esquema 1
Esquema 2
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
R1330R
D1LED-RED
+5V
Execute o exemplo 1 e teste no KIT. Verifique seu funcionamento.
Simular no MPLAB.
Desenvolva uma aplicação onde faça a leitura dosquatros botões e ligue os LEDS em código bináriopara indicar qual tecla foi pressionada.
Quando uma tecla é pressionada gera um certo ruído:
Esse ruído pode causar interferência no software.
O exemplo 2 exibe como ler uma tecla usando técnica de Debounce.
Faça a leitura das 4 teclas usando a técnica de DEBOUNCE de teclas. Os botões deverão ter as seguintes funções:
BT1 – incrementa valor nos leds;
BT2 – decrementa valor nos leds;
BT3 – zera valor dos leds;
BT4 – inverte estado do RELE;
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
R1
330R
R2
330R
R3
330R
R4
330R
R5
330R
R6
330R
R7
330R
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
R1
330R
R2
330R
R3
330R
R4
330R
R5
330R
R6
330R
R7
330R
+5V
Tabela para display cátodo comum
O Exemplo 3 mostra como acionar displays de 7segmentos.
Desenvolva uma aplicação para que o valor nodisplay seja incrementado ao apertar umadeterminada tecla e decrementado quandopressionado outra e uma outra tecla para reiniciaro valor da contagem do display. O valor deve ir de0 a 9.
Periféricos internos ao microcontrolador
São 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, faça o mesmo utilizando o TIMER2
obs.: Base de tempo de 1 segundo
Eventos assíncronos;
Desvia o programa automaticamente para o vetor de interrupção (0x04);
São classificadas em dois grupos:
◦ Convencionais ;
◦ Periféricos;
O exemplo 5A exibe a forma de se tratar interrupção com base nofluxograma de tratamento e o exemplo 5B exibe uma formautilizando os recursos do compilador para tratamento dainterrupção.
Os exemplos exibirão como usar a interrupção para a multiplexaçãode display de sete segmentos e os LEDS que estão ligados no mesmobarramento de dados usando a técnica de varredura, ou seja,acenderemos um display por vez: primeiro o display 1, depois odisplay 2 e depois os LEDS e assim repetidamente.
Para que não percebermos o liga e desliga dos displaystrabalharemos com uma freqüência de varredura deaproximadamente 80 Hz, pois acima de 50 Hz temos a impressão detodos os displays ligados ao mesmo tempo.
Com base nos exemplos anteriores crie umcontador de segundos usando o TIMER0 para avarredura dos displays e o TIMER1 para a base detempo de um segundo. Utilize interrupções paraesse processo. O contador deve ir de 0 a 59 equando chegar em 60 deve-se reiniciar os displayse incrementar os LEDS.
Converte um sinal analógico em digital;
Resolução é dada por:
Vref : tensão de referência do conversor
n : numero de bits do conversor
Características
◦ Conversor de 10 bits;
◦ 11 canais disponíveis;
◦ Referência interna;
◦ Referência externa;
◦ Conversor por aproximações sucessivas;
◦ Freqüência de conversão ajustável por software;
◦ Interrupção associada ao termino da conversão.
Primeiramente configura a direção do pino como entrada no registrador TRISX correspondente.
Definir o pino como entrada analógica◦ Registradores:
ANSEL e ANSELH
Exemplo: TRISA = 0b00000001; //pino RA0 como entrada
ANSEL = 0b00000001; //pino RA0 funcionando como AN0
Clock
Resultado da conversão
O exemplo 6 exibe como configurar o conversorA/D e como obter o resultado da conversão. OResultado da conversão é exibido nos LEDS e ovalor de entrada analógica pode ser variadoutilizando o POT1.
Simule um sensor de temperatura com o POT2 obedecendo a seguinte relação:◦ 0 v – 0 °C
◦ 5 V – 99°C
Exibir o valor da temperatura nos displays.
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
Onde é configurado o baud rate da comunicação e os pinos de transmissão e recepção de dados.
Neste caso temos a seguinte configuração:◦ Baude rate = 9600 bps
◦ Pino de transmissão: RC6
◦ Pino de recepção: RC7
printf◦ Envia uma string(seqüência 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 variável para armazenamento do caractere
c = getc(); // atribui a c quando caracter disponível na serial
Kbhit◦ Retorna verdadeiro (1) se chegar um caractere pela
serial e falso(0) enquanto não houver caractere.
◦ Exemplo:if(kbhit()) //se caracter na serial
{
c = getc(); //atribui o valor para c
}
O exemplo 7 exibe uma comunicação serial entreum computador e o microcontrolador. Nesteexemplo será enviado pela serial o valor de tensãosempre que houver a chegada do caractere ‘T’ pelaserial.
Desenvolva um sistema onde seja possível ligar ou desligar cada LED independentemente através de comandos enviados pelo terminal do computador.
write_eeprom (endereço, valor);
◦ Exemplo:
#define END_VOLUME 10 // endereço na EEPROM
volume++; //incrementa o valor
write_eeprom(END_VOLUME,volume);//salva na EEPROM endereço 10
read_eeprom (endereço);
◦ Exemplo:
#define END_VOLUME 10 //endereço
volume = read_eeprom (END_VOLUME); //lê o valor presente no
//Endereço 10 da EEPROM
O exemplo 8 mostra como armazenar e ler valoresna memória EEPROM. Será armazenado o valor nodisplay e quando reiniciar o microcontrolador estevalor será carregado no display novamente.
Desenvolva uma aplicação onde seja armazenado na EEPROM o valor de uma Variável de 16 bits.
Desenvolver um controlador de temperatura do tipo ON/OFF, onde será ajustado um valor para ser mantido no display e o sistema controlará a saída para manter esta temperatura.
Recursos utilizados:◦ Conversor A/D para leitura do sensor de temperatura;
◦ Interrupção;
◦ Varredura de displays;
◦ Leitura de teclas;
◦ Acionamento de rele.