Escolar Documentos
Profissional Documentos
Cultura Documentos
◦ Memória de programa;
◦ Memória de dados;
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)
U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
4
REXT 5
RA2/AN2/VREF-/CVREF/C2IN+
11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA
16
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
CEXT 23
RB1/AN10/P1C/C12IN3- RC7/RX/DT
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
C1 4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
XTAL 9
RA7/OSC1/CLKIN RC4/SDI/SDA
15
16
RC5/SDO
C2 21
RB0/AN12/INT RC6/TX/CK
17
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
São divididas em 3 tipos:
Dividida em bancos;
Memória não volátil;
256 bytes;
Reset externo;
Quando aplicado nível baixo ocorre o reinicio do
programa;
Pino 1 – RE3/MCLR
R1
10K
U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA
16
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
Cão de guarda;
Contador de 8 bits;
◦ Estruturada;
◦ Portabilidade;
◦ Reutilização de código;
São Utilizados para:
◦ Documentação do software;
◦ Exclusão de linhas durante a compilação.
/*
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
char 8 0 a 255
int 8 0 a 255
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);
Exemplo:
Representação do numero 50 nas diferentes bases:
◦ 50 - Decimal
◦ 0x32- Hexadecimal
◦ 0b00110010 - Binário
◦ 062- Octal
Declaração:
◦ const int valor1 = 100;
Ou apenas:
int temperatura;
Exemplo:
void main()
{
int valor; //declara a variável local da função main
valor =0; //inicia com 0
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
}
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
++ 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
== Igual a
!= Diferente de
São usados para realizar testes booleanos entre
elementos em um teste condicional
OPERADOR AÇÃO
|| 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)
~ NOT (NÃO)
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 de
comandos no caso de uma determinada condição
ser avaliada como verdadeira.
Forma geral:
◦ if(condição) comando;
Exemplo:
◦ if(temperatura < setPoint) RELE = 1;
Utilizado quando há a necessidade de tomar uma
ação caso a condição for avaliada como falsa.
if (condição) Exemplo:
comandoA;
else if (temperatura < setpoint)
comandoB; 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 forma
elegante, 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
Forma geral:
while(condição)
{
comando1;
comando2;
...
comandoN;
}
Exemplos
x = 0;
while(x<10)
{
LED = 1; while(1);
delay_ms(500);
LED = 0;
delay_ms(500);
while(!RA0);
x++;
}
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 ser
utilizados uma ou mais vezes sem a necessidade de
repetir a digitação do código;
◦ Reutilização de código;
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 #endasm
Permite 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
#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
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
#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;
◦ 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
+ 5V
R1
10K
U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA
16
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
Esquema 1
U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9
RA7/OSC1/CLKIN RC4/SDI/SDA
15 R1
16 330R
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
D1
LED-RED
Esquema 2
+5V
R1
330R
D1
U1 LED-RED
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3 28
RA1/AN1/C12IN1- RB7/ICSPDAT
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA
16
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
PIC16F883
Execute o exemplo 1 e teste no KIT. Verifique
seu funcionamento.
Simular no MPLAB.
Desenvolva uma aplicação onde faça a leitura dos
quatros botões e ligue os LEDS em código binário
para indicar qual tecla foi pressionada.
Quando uma tecla é pressionada gera um
certo ruído:
R7
330R
+5V
U1 R1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G 330R
2 27
RA0/AN0/ULPWU/C12IN0- RB6/ICSPCLK
3
RA1/AN1/C12IN1- RB7/ICSPDAT
28 R2
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11 330R
RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI
6 12
RA4/T0CKI/C1OUT RC1/T1OSI/CCP2
7 13 R3
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA 330R
16
RC5/SDO R4
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT
23 330R
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2-
R5
PIC16F883
330R
R6
330R
R7
330R
Tabela para display cátodo comum
O Exemplo 3 mostra como acionar displays de 7
segmentos.
Desenvolva uma aplicação 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.
Periféricos internos ao microcontrolador
◦ Convencionais ;
◦ Periféricos;
O exemplo 5A exibe a forma de se tratar interrupção com base no
fluxograma de tratamento e o exemplo 5B exibe uma forma
utilizando os recursos do compilador para tratamento da
interrupção.
Os exemplos exibirão como usar a interrupção para a multiplexação
de display de sete segmentos e os LEDS que estão ligados no mesmo
barramento de dados usando a técnica 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 não percebermos o liga e desliga dos displays
trabalharemos com uma freqüência de varredura de
aproximadamente 80 Hz, pois acima de 50 Hz temos a impressão 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 interrupções 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 analógico em digital;
◦ 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.
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 entre
um computador e o microcontrolador. Neste
exemplo será enviado pela serial o valor de tensão
sempre que houver a chegada do caractere ‘T’ pela
serial.
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:
◦ Exemplo: