Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Sumário
1 Introdução 2
1.1 Registradores 3
Registrador TRISIO 3
Registrador GPIO ou PORT 3
1.2 Configurando pinos 3
1.3 COMPARADORES ANALÓGICOS E ADC 4
2 PIC 12F675 5
2.1 Características principais: 5
2.2 Descrição dos pinos 5
2.3 Exemplos de programas 6
1º pisca led 6
2º botão e led 7
3º Um pulso liga, outro pulso desliga 9
4º Comparadores analógicos 10
5º CONVERSOR ANALÓGICO PARA DIGITAL 12
3 PIC 16F628A 14
3.1 Características: 14
3.2 Descrição dos pinos 14
3.3 EXEMPLOS 15
1 - Botão e led 15
2 - Piscar led 18
3 - Piscar led com botão 19
4 - Botão de toque 20
5 - Corredor de leds 21
6 - Contador de 0 á 9 com display 22
7 – LCD 24
2
Introdução
Além de tudo isso os pinos do microcontrolador são configuráveis podendo ser uma
entrada ou uma saída de acordo com a escolha do programador. O importante é entender
que cada pino tem várias funções que podem ser escolhidas para uso. Assim, como exemplo,
um pino pode ser entrada ou saída digital, pode ser entrada para o clock do Timer1, pode ser
3
entrada para o oscilador externo a cristal ou pode ser entrada analógica. Esta configuração
da função que o pino vai assumir é realizada adicionando valores nos registradores internos.
1.1 Registradores
Registrador TRISIO
O TRISIO é o registrador que configura os pinos como entrada ou saída. Com o valor
“0” no respectivo bit o pino se torna saída(Output), com “1” o pino é configurado como
entrada(Input).
O GPIO configura os pinos como ligado (1) ou desligado (0). Em alguns PICs, GPIO é
chamado PORT. Os bits podem ser setados de duas maneiras; GPIO.Bx para setar o bit x ou
ajustando o valor do bit correspondente através dos modos explicados mais adiante.
Para deixar claro; quando o PINO estiver configurado como saída e ligado, uma tensão
próxima a alimentação será emitida com uma capacidade máxima de 25mA, já quando o
pino estiver desligado uma tensão 0 será emitida na saída. Quando o pino está configurado
como entrada ele terá uma alta impedância.
4
GPIO = 0b00010000; //liga a saída , todos pinos foram comandados de uma única vez
GPIO.B2 = 1; //ativa o bit 3
PORTA.RA0 = 1; //ativa o bit 1 do portA
Existem alguns modos de configurar um pino, podendo ser escrito em decimal, binário ou
hexadecimal
//Em binário
GPIO = 0b00000100;
PORTC=0B00110010;
Os três primeiros bits CM0,CM1, e CM2 definem a forma dele trabalhar . Para
desligar a função de comparação basta ativar estes três bits.
CMCON = 0b00000111;
ANSEL = 0;
Todas as outras configurações estão contidas no manual do componente.
5
PIC 12F675
2.1 Características principais:
2.3
6
Exemplos de programas
1º pisca led
Este exemplo faz com que um led ligado no GP0 fique piscando a cada 1 segundo.
U1 R1
7
GP0/AN0
6 330R
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4 D1
GP3/MCLR
3 LED-GREEN
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675
void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas sáidas
Para que este programa funcione corretamente é necessário definir o oscilador interno de
4Mhz e desativar a função de Master clear(MCLR).Estas configurações são feitas na edição
do projeto do compilador MikroC (Project->Edit project).
7
2º botão e led
Este exemplo faz ligar o led quando o botão é pressionado e desliga o mesmo quando o
botão é solto.
vcc
BOTAO1 U1
7
R1
GP0/AN0
6 330R
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2 D1
4
GP3/MCLR
3 LED-GREEN
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675
R2
10k
void main()
8
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas saídas
Uma outra maneira de escrever este mesmo programa é definindo nomes para os pinos com
a função #define. Isso facilita muito o entendimento do programa veja:
void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas saídas
9
#define led gpio.b0 //definição de nomes para pinos
#define botao gpio.b1
void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
led = 0; //desliga led
Exercício1
Criar um programa que tenha dois botões (b1 e b2 ) e dois leds (led1 e led2).
Botão pressionado liga o led. Cada botão irá ligar o seu led.
Você deverá utilizar os seguintes pinos:
b1 e b2 em GP0 e GP1
led1 e led2 em GP4 e GP5
Exercício2
Refaça o programa anterior porém com os leds acendendo quando o botão é solto.
Exercício3
Escreva um programa onde um led liga se dois botões forem pressionados juntos(Lógica E).
Exercício4
Escreva um programa onde um led liga se um ou outro botão for pressionado juntos(Lógica
OU).
4º Comparadores analógicos
10
temperatura passar de um valor este circuito é ideal. Obviamente para este exemplo vamos
precisar de um sensor de temperatura para ler e enviar ao microcontrolador.
RV1
R3
10k
37%
10k
U1
7 vref
GP0/AN0
6
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4
GP3/MCLR
3
GP4/T1G/OSC2/AN3
2 R1
GP5/T1CKI/OSC1 330R
PIC12F675
D1
LED-GREEN
R2
10k
Quando a tensão de saída do potenciômetro for maior que a tensão de referência o led será
acionado.
void main()
{
TRISIO = 0b11111011; //define gp2 como saída
CMCON = 0b00000010; //comparador ligado
ANSEL = 0b00000011; // an0 e an1 como entradas analógicas
led = 0; //desliga led
}
}
11
Exercício5
Inverta o estado de saída do comparador fazendo ele ligar o led quando ficar abaixo do valor
da entrada.
Dica: altere o bit CINV do registrador CMCON.
Exercicio6
Crie um programa para quando a tensão for maior que 3V um led ficará piscando.
Exercício7
12
Para simplificar a programação neste exemplo vamos utilizar a biblioteca ADC que
deve ser marcada na aba lateral direita.
vcc
RV1
29%
10k
U1
7
GP0/AN0
6
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4
GP3/MCLR
3
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675
R4 R3 R2 R1
330R 330R 330R 330R
D4 D3 D2 D1
LED-GREEN LED-GREEN LED-GREEN LED-GREEN
void main()
{
TRISIO = 0b11001001; //define gp1,2,4,5 como saída e gp0 como entrada
CMCON = 0b00000111; //comparador desligado
ANSEL = 0b00000001; // an0 como entradas analógicas
ADC_Init(); // inicializa modulo adc
13
led1 = 0; //desliga leds
led2 = 0;
led3 = 0;
led4 = 0;
if(entrada >= 205) //se a entrada é maior ou igual ao valor liga a saída
led1=1;
else
led1=0;
if(entrada >= 410)
led2=1;
else
led2=0;
if(entrada >= 615)
led3=1;
else
led3=0;
if(entrada >= 820)
led4=1;
else
led4=0;
}
Exercício8
Criar um programa onde a saída gp5 é ativada quando a temperatura for maior que
30°C(considere 3V).
Exercício9
Criar um programa onde as saídas gp4 e gp5 ficarão piscando alternadamente quando a
tensão for menor que 1V.
10- projeto – controle automático de irrigação
Desenvolver um projeto que controlará automaticamente a irrigação de uma horta. Para isto
utilizaremos um sensor de umidade ligado na An0, e uma bomba de água para irrigação. Se o
sensor detectar umidade baixa(<30%) a bomba liga e começa a irrigar a horta. Após 10s a
válvula será desligada e aguarda 10s para ler novamente o sensor de umidade.
14
6º Timer0
É um temporizador e contador de 8 bits(máx 255) com recursos especiais.
No modo temporizador ele é incrementado pelo ciclo de clock utilizando um divisor de
frequência(Prescaler). Já no modo contador ele é incrementado através do pino GP2/T0CKI.
MODO CONTADOR
O TIMER0 funciona como contador, quando você usa como oscilador os pulsos externos
aplicado no pino GP2/T0CKI.
15
T0SE - Seleção da borda de transição do pino GP2/T0CKIN
1 - transição nivel alto-baixo (transição negativa);
0 - transição nivel baixo-alto (transição positiva);
Exemplo de projeto
16
VCC
RESET BOTAO/SENSOR
U1
7
GP0/AN0
6
GP1/AN1/VREF
5
R3 R1 GP2/T0CKI/INT/AN2
4
10k 10k GP3/MCLR
3 R2
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
330R
PIC12F675
D1
LED-GREEN
void main()
{
TRISIO = 0b11011111; //define gp5 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
option_reg = 0b10101000; //clock atraves do gp2, sem prescaler,pullup desabilitado
tmr0=0; //zera timer0
led = 0; //desliga led
while(1)
{
if(tmr0>=10) //se o timer0 for maior ou igual a 10
led=1; //liga o led
else //senão
led=0; //desliga o led
17
tmr0=0; //zera contador
}
Exercício 11
Criar um contador decrescente que comece em 9 e ative uma saída ao atingir 0;
Exercício12
MODO TEMPORIZADOR
O temporizador do TIMER0 funciona quando você usa o oscilador interno do PIC ou o cristal
de quartzo externo.
18
PSA - Habilitação do prescaler (no modo CONTADOR é comum desabilitar);
1 - Desabilitado;
0 - Habilitado;
Geralmente a contagem do tempo é feita pelo estouro do timer0, ou seja , quando ele atige
seu valor máximo e volta para zero( over flow). Assim o tempo pode ser determinado por:
EXEMPLO1:
19
t = 65536us ou 65,536ms
Para ter tempos ainda maiores, como alguns segundos, um dos meios de se conseguir é
utilizando a interrupção.
EXEMPLO2:
Em alguns projetos é necessário criar bases de tempos precisas. Vamos supor que queremos
criar um temporizador de 10ms com o timer0.
Como o valor do timer0 só pode ser inteiro escolhemos 178 e assim teremos:
t = 9,984ms
void main()
{
20
TRISIO = 0b11011111; //define gp5 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
option_reg = 0b10000110; //clock interno, prescaler 1:128,pullup desabilitado
led = 0; //desliga led
tmr0= 178; /*carrega valor de tmr0 10ms = 1us * 128 *(256-TMR0)
78,125 = 256-TMR0
TMR0 = 177,875
*/
while(1)
{
if(tmr0 == 0) // se tmr0 estourou
{
led =!led; //inverte estado do led
tmr0=178; //carrega tmr0 para contar novamente
}
}
7º Timer1
8º Interrupções
9º Watchdog timer e Modo sleep
21
PIC 16F628A
2.4 Características:
2.6 EXEMPLOS
22
1 - Botão e led
O primeiro projeto será simples, possuindo apenas um botão e um led.O led será usado para
representar o estado do botão,isto é, acesso para o botão pressionado e apagado para o
botão solto.
O esquema elétrico está abaixo:
ESQUEMA 1
DEFINIÇÕES:
RA0= ENTRADA
RB5= SAÍDA
Observe que RA0 tem um resistor para o terra (resistor pull down), este tem a função de
manter o pino sempre em nível baixo, e quando o botão é pressionado a entrada vai para
nível alto.
void main()
{
23
CMCON = 0B00000111; // Desativa comparadores internos
// Para poder utilizar as portas RA0, RA1, RA2 e RA3
while(1)
{
if(PORTA.RA0 == 1)
{
}
else
{
}
}
}
Neste exemplo a função PORTA.RA0, efetua a leitura da porta RA0. Se fossemos ler a
entrada RA5 por exemplo, escreveríamos PORTA.RA5.
A função PORTB.RB5 = 1;, coloca a saída RB5 em nível alto,ligando assim o led. Pelo
contrário, a função PORTB.RB5 = 0;, coloca a saída RB5 em nível baixo desligando o led. Da
mesma forma se quisermos acionar a saída RB3, basta escrever PORTB.RB3 = 1;.
A outra forma interessante é nomear os pinos utilizando a função #define, veja abaixo:
24
#define botao PORTA.RA0 // nomeia RA0 como botao
#define led PORTB.RB5 // nomeia RB5 como led
void main()
{
while(1)
{
if(botao == 1)
{
else
{
led = 0; // Envia sinal baixo para o led (Desligar)
}
}
}
Exercício1
Criar um programa que tenha três botões (b1, b2 e b3) e três leds (led1, led2 e led3).
Cada botão irá ligar o seu led.
Você deverá utilizar os seguintes pinos:
b1,b2 e b3 em RA2, RA3 e RA4.
led1, led2, led3 em RB4, RB5 e RB6
2 - Piscar led
25
#define led PORTB.RB5 // nomeia RB5 como led
void main()
{
while(1)
}
}
Importante ressaltar que quando o programa executa a função delay ele não pode realizar
outras funções, exceto se tiver uma interrupção.
Exercício2
b) Criar um programa que faça ligar um led por 0,5 segundos e mantenha-o desligado por
0,1 segundos.
c) Criar um programa que faça dois leds piscarem juntos. Utilizar o RB3 para o segundo led.
26
Pressionando o botão o led pisca, soltando o botão o led apaga.
void main()
{
while(1)
{
if(botao == 1)
{
led = 1; // Envia sinal alto para o led (Ligar)
delay_ms(1000); // Pausa de 1000 mili segundos
led = 0; // Envia sinal baixo para o led (Desligar)
delay_ms(1000); // Pausa de 1000 mili segundos
}
else
{
led = 0; // Envia sinal baixo para o led (Desligar)
}
}
}
Exercício3
Criar um programa que tenha dois botões, sendo que o botao1 ativa o led1 que piscará de
0,5 em 0,5 seg e o botao2 ativa o led2 que piscará de 1 em 1 segundo.
4 - Botão de toque
Neste próximo exemplo, com um toque no botão o led liga com outro toque ele desliga,
veja:
27
#define botao PORTA.RA0 // nomeia RA0 como botao
#define led PORTB.RB5 // nomeia RB5 como led
void main()
{
while(1)
{
if(botao == 1)
{
Exercício4
Criar um programa que ao pressionar o botão ligue todos os pinos ímpares do PORTB.
Ao pressionar novamente todos os pinos devem desligar.
5 - Corredor de leds
Neste exemplo um led fica aceso por vez e é deslocado criando a impressão de
movimento. Utilizaremos o operador <<(deslocamento a esquerda). Também existe o
deslocamento a direita(>>). Utilizamos também a função do compilador PORTX( ), que serve
para escrever um byte completo em uma porta do microcontrolador.
Para este exemplo vamos utilizar outro esquema eletrônico, veja abaixo:
28
int cont = 1; // Cria uma variável do tipo inteiro e armazena 1
void main()
{
while(1)
{
29
Este exemplo não utiliza nenhum botão ou chave e usa todo o PORTB do microcontrolador.
Nele é ligado um display de 7 segmentos de catodo comum que por consequência irá
reproduzir um contador de 0 á 9 que será repetido infinitamente.
Diagrama eletrônico:
30
0b1011011, // número2
0b1001111, // número3
0b1100110, // número4
0b1101101, // número5
0b1111100, // número6
0b0000111, // número7
0b1111111, // número8
0b1100111 // número9
};
void main()
{
while(1)
{
7 – LCD
31
Conhecidos como LCD (liquid crystal display), tem como principal vantagem o baixo consumo
e a exibição de caracteres alfanuméricos em várias linhas e até mesmo de forma gráfica.Este
display possui 2 linhas por 16 colunas
1º exemplo
Este simples programa envia a mensagem “SENAI - 2016” para o LCD.
32
// INICIO CONFIGURAÇÕES DOS PINOS DO LCD 16X2
void main()
{
while(1)
{
Lcd_Out(1,2,"SENAI - 2019");
// Escreve “SENAI – 2019” na 1ª linha a partir da 2ª coluna
}
}
33