Microgenios
administrador FTCbau0164 labXXXX
Descrição das funções dos pinos
• O PIC18F452 possui no total de 40 pinos de I/O divididos entre as PORTA, PORTB, PORTC, PORTD e PORTE.
Descrição das funções dos pinos
• Os µC PIC possuem pinos físicos destinados à comunicação de dados com os circuitos
externos. Através desses pinos podemos enviar níveis lógicos (0 ou 1) para, por enviar níveis lógicos (0 ou 1) para, por
exemplo, acender ou apagar um LED, acionar displays, LCD, ler botões e sensores, etc.
• PORTA: encontramos 7 pinos físicos
intitulados de RA0 a RA7 que podem ser utilizados como I/0 de uso geral ou como conversor analógico/digital A/D, além de
Descrição das funções dos pinos
conversor analógico/digital A/D, além de possuir também a função de detecção de baixa tensão (LVD), referência analógica do A/D e contador externo.
• PORT B: encontramos 8 pinos intitulado de RB0 a RB7 configuráveis como I/O de uso
geral. Nesse port podemos trabalhar com três interrupções externas, módulo CCP e pinos de
Descrição das funções dos pinos
interrupções externas, módulo CCP e pinos de gravação e debugger.
• PORT C: encontramos 8 pinos intitulados de RC0 a RC7 configuráveis como I/O de uso
geral, saída do oscilador do timer, módulo CCP, clock e data para os modos SPI, I2C e
Descrição das funções dos pinos
CCP, clock e data para os modos SPI, I2C e UART.
• PORT D: encontramos 8 pinos intitulado de RD0 a RD7 que podem ser configurado como I/O de uso geral ou ser configurado como PSP para ter saída TTL (por exemplo
Descrição das funções dos pinos
para ter saída TTL (por exemplo
• PORT E: podemos utilizá-lo como PORT de I/O de uso geral ou utilizar os pinos de WR e CS
para acesso ao modo paralelo Slave Port (acesso a memória externa por exemplo).
Descrição das funções dos pinos
Memória de Programa
• A memória de programa utilizada no
microcontrolador é do tipo FLASH (sufixo “F”) que permite ser gravada/apagada no mínimo 1000 vezes. Este tipo de memória utilizada é 1000 vezes. Este tipo de memória utilizada é ideal para ser utilizada em desenvolvimento de projetos e até mesmo em produtos finais.
Memória de Programa
• A memória de programa do PIC18F452 incia-se no endereço 0000h e atinge o valor máximo de 7FFFh, ou seja, 32767K byte
(32Kbyte). (32Kbyte).
Memória de Programa
• O endereço inicial 0000h é chamado de vetor reset. A instrução de programa que estiver
nesse endereço de memória será a primeira a ser executada pelo processador do PIC.
ser executada pelo processador do PIC.
• Sempre que energizarmos ou resetarmos o µC, o contador de programa PC apontará sempre para este primeiro endereço de
Memória de Programa
• Em seguida temos os endereços 0008h e 0018h. Estes endereços são chamados de vetores de interrupção.
Introdução as portas de I/O
• Os registradores PORTB, PORTC e PORTD possuem 8 pinos de I/O cada.
Introdução as portas de I/O
Introdução as portas de I/O
Introdução as portas de I/O
• Cada porta de I/O possui três registradores que controlam suas funções: um registrador PORT, LAT e um registrador TRIS.
Introdução as portas de I/O
• Os registradores PORT(PORTA, PORTB, PORTC, PORTD, PORTE), armazena os dados das
portas paralelas (I/O’s) do µC.
• Qualquer escrita realizada em um desses
• Qualquer escrita realizada em um desses registros automaticamente altera todo o conteúdo presente na saída do chip.
Introdução as portas de I/O
• O registrador TRIS é utilizado para configurar cada pino da respectiva porta como entrada ou saída. Além de cada bit desse registrador corresponde a um pino da porta.
corresponde a um pino da porta.
• Se o bit estiver em 1, o pino correspondente esta configurado como entrada de dados, e se estiver em 0 configuramos este pino como
mikroC
• Baixe a versão de demonstração do compilador mikroC através do site do fabricante: www.mikroe.com
• Para criarmos uma aplicação, acompanhe o
• Para criarmos uma aplicação, acompanhe o modelo passo a passo.
1 – Abra o mikroC e vá ao menu
Project > New Project
2 – Aparecerá a seguinte tela de configuraçã o do projeto.
3 – No menu New Projet, preencha o painel de configuração conforme valores seguintes:
Project Name – pisca_pisca1
Project Path – (escolha uma pasta no seu PC) Description – deixar em branco
Device – P18F452 Clock – 008.000000 Oscilador – HS
Oscilador – HS Watchdog – OFF
LVP – OFF (Low Voltagem Programming – desligado) Brown Out – OFF
Debuger – OFF
5 – Digite o programa.
void main() {
trisd = 0; //*configura portd como saída
portd = 0; //*zera todos os pinos como saída while (1)
{
portd = 0B11111111; //*seta todos os pinos do portd
portd = 0B11111111; //*seta todos os pinos do portd
delay_ms(1000); //*tempo de 1 segundo portd = 0; //* zera todo o portd; delay_ms(1000);
} }
9 – Abrir o programa pisca_pisca1 em menu File > Import Hex
10 – No módulo – modo PROG ativado 11 - No PICkit2 clicar no botão WRITE 12 – No módulo – ativar modo RUN
• No módulo – desativar modo RUN
void main() { trisd = 0; trisb = 0; portd = 0; portb = 0; while (1) { portd = 0B11111111; portd = 0B11111111; portb = 0B01010101; delay_ms(1000); portd = 0; portb = 0B10101010; delay_ms(1000); }
void main() { trisd = 0; trisb = 0; portd = 0; portb = 0; while (1) { portd = 0B11111111; delay_ms(1000); delay_ms(1000); portd = 0; portb = 255; delay_ms(1000); portd = 0B01010101; portb = 0B10101010; delay_ms(1000);
Função Button
button(&port,pino,tempo_debouncing, estado_de_ativação_da_tecla)
Onde:
&port – port onde esta ligada a tecla &port – port onde esta ligada a tecla
pino – é o pino do port onde esta ligado a tecla no PIC tempo_debouncing – tempo de correção do efeito
debounce em escala de milisegundos (ms)
Função Button
button(&portb,0,20,0)
porta onde está ligada a tecla
pino onde está delay de 20ms
tecla acionada com nível lógico 0
pino onde está
ligado a tecla, neste caso é o pino RB0
void main() {
trisb.rb0 = 1; //*configura pino RB0 (tecla) como entrada trisd = 0; portd = 0; while(1) { if(button(&portb,0,20,0)) if(button(&portb,0,20,0)) {
portd = ~portd; //*inverte estado do portd delay_ms (200);
} }
Desenvolver um programa para ascender individualmente cada LED através de uma tecla correspondente. Utilize PORTB como teclado e PORTD como LED.
Configuração:
void main() {
trisb.rb0 = 1; //configura pino RB0 (tecla) como entrada
intcon.rbpu = 0; // liga pull-up interno em todos os pinos do PORTB trisd = 0; portd = 0; while(1) { if(button(&PORTB,0,20,0)) portd.rd0 = 1; portd.rd0 = 1; else if (button(&PORTB,1,20,0)) portd.rd1 = 1; else if (button(&PORTB,2,20,0)) portd.rd2 = 1;
FUNÇÃO BUTTON
Desenvolver um programa para acender individualmente cada LED através de uma tecla correspondente. O LED permanecerá 200ms acesso e depois irá apagar. Utilize PORTB como teclado e PORTD como LED.
void main() {
trisb.rb0 = 1; //configura pino RB0 (tecla) como entrada
intcon.rbpu = 0; // liga pull-up interno em todos os pinos do PORTB
trisd = 0; portd = 0; while(1) { if(button(&PORTB,0,20,0)) { else if (button(&PORTB,2,20,0)) { portd.rd2 = 1; delay_ms(2000); portd = 0; } else if (button(&PORTB,3,20,0)) { portd.rd3 = 1; delay_ms(2000); portd = 0; } else if (button(&PORTB,4,20,0)) { portd.rd0 = 1; delay_ms(2000); portd = 0; } else if (button(&PORTB,1,20,0)) { portd.rd1 = 1; { portd.rd4 = 1; delay_ms(2000); portd = 0; } else if (button(&PORTB,5,20,0)) { portd.rd5 = 1; delay_ms(2000);
Os Displays LCD Alfanuméricos
• Para implementar nossos projetos é
interessante a utilização de um display, capaz de tornar mais simples a visualização de
informações e a interação com nosso informações e a interação com nosso equipamento.
• Quantidade de informações: 16 x 2 (dezesseis caracteres em 2 linhas)
Os Displays LCD Alfanuméricos
• Um display LCD desse tipo, possui embutido em seu circuito outro microcontrolador, e para podermos utilizá-lo temos que entender um pouco de seus comandos e funções. Dessa pouco de seus comandos e funções. Dessa forma, da mesma maneira com que
trabalhamos com o PIC, para utilizar um
A função lcd8_config()
Lcd8_config(portcontrole,portdados,RS,EN,RW,D7,D6,D5,D4,D3,D2,D1,D0)
portcontrole e portdados – pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE
PORTB, PORTC, PORTD ou PORTE
RS: pino do portcontrole que determina o bit de instruções ou dado lo LCD
EN: pino do portcontrole que determina o bit de enable do LCD
Utilizar um display de LCD, e desenvolver um programar para gerar a seguinte mensagem na primeira linha: FATEC – Bauru”, e na segunda linha: “Sistemas Biomédicos”. O cursor do LCD deverá ficar apagado.
Configurar: Cristal 8Mhz modo HS DIP1 - chave LCD - ON
//display1 void main() {
trisd = 0; trise = 0;
ADCON1 = 0X06; //configura todos os pinos de A/D como I/O de uso geral
lcd8_config(&porte,&portd,2,1,0,7,6,5,4,3,2,1,0); lcd8_config(&porte,&portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa o LCD lcd8_cmd(lcd_clear); lcd8_cmd(lcd_cursor_off); lcd8_out(1,1,"FATEC - Bauru"); lcd8_out(2,1,"Sistemas Biomedi");
Utilizar um display de LCD, e desenvolver um programar para gerar a seguinte mensagem quando o botão RB0 for pressionado: “FATEC – Bauru” e “Sistemas Biomédicos”. E quando o botão RB1: “BAURU – Bauru” e “fatec fatec”, o texto deverá caminhar para a esquerda. O cursor do LCD deverá ficar apagado.
do LCD deverá ficar apagado.
Configurar: Cristal 8Mhz modo HS DIP1 - chave LCD - ON
//display2 void main() { trisd = 0; trise = 0; ADCON1 = 0X06; trisb.rb0 = 1; intcon.rbpu = 0; lcd8_config(&porte,&portd,2, 1,0, 7,6,5,4,3,2,1,0); lcd8_cmd(lcd_clear); else if (button(&PORTB,1,20,0)) { lcd8_cmd(lcd_clear); lcd8_out(1,1,"BAURU"); lcd8_out(2,1,"fatec fatec"); delay_ms(1000); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_clear); lcd8_cmd(lcd_cursor_off); while(1) { if(button(&PORTB,0,20,0)) delay_ms(150); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_shift_left); delay_ms(150); lcd8_cmd(lcd_shift_left);
Utilizar um display de LCD, e desenvolver um
programar para gerar duas mensagens. A primeira mensagem: “Fatec Bauru Sistemas Biomédicos” e linha 2 – “Automação”, irá movimentar para
esquerda; a segunda mensagem: “PIC18F452” e linha 2 – “Profissional”). O cursor do LCD deverá ficar apagado.
Utilize o comando:
lcd8_cmd(lcd_shift_left);
//exercício5 void main() { trisd = 0; trise = 0; ADCON1 = 0x06; lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); lcd8_cmd(lcd_clear); lcd8_cmd(lcd_cursor_off); while(1) {
lcd8_out(1,1,"Fatec Bauru Sistemas Biomédicos"); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_shift_left); Biomédicos"); delay_ms(10); lcd8_out(2,0,"Automação"); delay_ms(500); lcd8_cmd(lcd_shift_left); delay_ms(500); lcd8_cmd(lcd_clear); lcd8_out(1,1,"PIC18F452"); lcd8_out(2,0,"PROFISSIONAL"); delay_ms(1000); lcd8_cmd(lcd_clear); }
1) Altere a sequência de acendimento dos LEDs de tal forma que acendam um a um e quando chegar no último LED da sequência, retorne ao início. Utilize o PORTD.
void main() { trisd = 0; portd = 0; while(1) { portd.rd0 = 1; delay_ms(1000); portd = 0; portd.rd3 = 1; delay_ms(1000); portd = 0; portd.rd4 = 1; delay_ms(1000); portd = 0; portd.rd5 = 1; delay_ms(1000); portd = 0; portd = 0; portd.rd1 = 1; delay_ms(1000); portd = 0; portd.rd2 = 1; delay_ms(1000); portd = 0; portd.rd6 = 1; delay_ms(1000); portd = 0; portd.rd7 = 1; delay_ms(1000); portd = 0;
2) Criar um programa para manter o leds do PORTD acesso durante 1000ms, e depois apaguem para ficarem apagados durante 1000ms.
void main() { trisd = 0; portd = 0; while(1) {{ portd = 0B11111111; delay_ms(1000); portd = 0; delay_ms(1000);
3) Mude a sequência de acendimento dos LEDs, fazendo com que eles acendam alternadamente (ímpares acendam e pares apaguem). Utilize
void main() { trisd = 0; portd = 0; while(1) {{ portd = 0B10101010; delay_ms(1000); portd = 0B01010101; delay_ms(1000);
4) Utilizar um display de LCD, e desenvolver um programar para gerar a seguinte mensagem
quando o botão RB0 for pressionado:
“Microcontrolador” e “PIC18f452”. E quando o botão RB1: “Família PIC” e “PIC18f452”. O cursor do LCD deverá ficar apagado. Após 2000ms
do LCD deverá ficar apagado. Após 2000ms deverá o LCD será apagado.
void main() { trisd = 0; trise = 0; ADCON1 = 0X06; trisb.rb0 = 1; intcon.rbpu = 0; lcd8_config(&porte,&portd,2, 1,0, 7,6,5,4,3,2,1,0); lcd8_cmd(lcd_clear); lcd8_cmd(lcd_cursor_off); while(1) { if(button(&PORTB,0,20,0)) {{ lcd8_out(1,1,"Microcontrolado"); lcd8_out(2,1,"PIC18F452"); delay_ms(1000); lcd8_cmd(lcd_clear); } else if (button(&PORTB,1,20,0)) { lcd8_out(1,1,"Familia PIC"); lcd8_out(2,1,"PIC18F452");
Criar um programa para testar os displays.
Para funcionamento do Kit PicGenios, acione as chaves de funções:
dis1 - RA2: ativa o primeiro display de 7 segmentos dis1 - RA2: ativa o primeiro display de 7 segmentos dis2 - RA3: ativa o segundo display de 7 segmentos dis3 - RA4: ativa o terceiro display de 7 segmentos dis4 - RA5: ativa o quarto display de 7 segmentos
//display_testa_display void main()
{
ADCON1 = 6; //configura os pinos A/D como I/O PORTA = 0; //resseta todos os pinos do porta TRISA = 0; //define PORT A como saída PORTD = 255; //seta todos os pinos do portd TRISD = 0; //define PORT D como saída PORTD = 0b11111111; //escreve dígito 8.PORT D
PORTA.F3= 1; //liga segundo display delay_ms(500); //intervalo de 0,5 segundos PORTA.F3= 0;
PORTA.F4= 1; //liga terceiro display delay_ms(500); //intervalo de 0,5 segundos PORTA.F4= 0;
PORTA.F5= 1; //liga quarto display
delay_ms(500); //intervalo de 0,5 segundos while(1)
{
PORTA.F2= 1; //liga primeiro display delay_ms(500); //intervalo de 0,5 segundos PORTA.F2= 0;
delay_ms(500); //intervalo de 0,5 segundos PORTA.F5= 0;
} }
• Criar um programa para gerar: C – primeiro display, O – segundo display, L – terceiro
void main() {
ADCON1 = 6; //configura todos os pinos A/D como I/O PORTA = 0; //resseta todos os pinos do porta TRISA = 0; //define PORT A como saída PORTD = 255; //seta todos os pinos do portd TRISD = 0; //define PORT D como saída
PORTD = 0b11111111; //escreve dígito 8. no PORT D while(1)
{
PORTA.F2= 1; //liga primeiro display PORTD = 0b00111001;
delay_ms(500); //intervalo de 0,5 segundos PORTA.F2= 0;
PORTA.F3= 1; //liga segundo display PORTD = 0b0111111;
delay_ms(500); //intervalo de 0,5 segundos PORTA.F3= 0;
PORTA.F4= 1; //liga terceiro display PORTD = 0b00111000;
delay_ms(500); //intervalo de 0,5 segundos PORTA.F4= 0;
Conversor A/D do PIC
• O PIC18F452 possui internamente 8 canais de A/D com resolução de 10 bits cada. Através de um conversor A/D com resolução de 10 bits e tensão de referência de 5V, podemos obter tensão de referência de 5V, podemos obter um valor 4,8876mV.
Conversor A/D do PIC
• Os conversores A/D do nosso
microcontrolador estão ligados nos pinos RA0(AN0), RA1(AN1), RA2(AN2), RA3(AN3), RA5(AN4), RE0(AN5), RE1(AN6), RE7(AN7). RA5(AN4), RE0(AN5), RE1(AN6), RE7(AN7).
• Os registradores que participam da
configuração do conversor A/D são: ADCON0 e ADCON1.
Conversor A/D do PIC
Registrador ADCON0
GO_DONE: bit de status da conversão A/D 0 – conversão A/D não está sendo realizada 1 - conversão A/D está sendo realizada
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO_DONE ---- ADON
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
CHS2 CHS1 CHS0
1 - conversão A/D está sendo realizada ADON: liga ou desliga o A/D
0 – conversor A/D desligado 1 – conversor A/D ligado
CHS2, CHS1, CHS0: bit de seleção de canal A/D
CHS2 CHS1 CHS0 0 0 0 channel 0, (AN0) 0 0 1 channel 1, (AN1) 0 1 0 channel 2, (AN2) 0 1 1 channel 3, (AN3) 1 0 0 channel 4, (AN4)
Conversor A/D do PIC
• Criar um programa para ler o canal AN0 e enviar valor para o LCD.
Ativar: Ativar:
DIP1 - chave 1 - LCD – on DIP2 - chave 9 - AN0 – on
//conversor void main() {
char texto[20]; int leitura_ad = 0;
trisd = 0; //pinos do portd como saida trise = 0; //pinos do porte como saida
ADCON1 = 0b00001110; //configura AN0 analogico e os demais como digital trisa.ra0 = 1; //entrada analogica AN0 configurado como entrada lcd8_config(&porte,&portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa lcd lcd8_config(&porte,&portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa lcd lcd8_cmd(lcd_clear); //apaga display lcd
lcd8_cmd(lcd_cursor_off); //desliag cursor
lcd8_out(1,1,"AN0:"); // escreve primeira linha do lcd while(1)
{
Sensor de temperatura LM35
• O sensor de temperatura LM35 é fabricado pela National Semicondutores.
• Este circuito integrado é um sensor de
temperatura linear cujo valor de saída de temperatura linear cujo valor de saída de 100mV/°C no range de -35°C a + 150°C
Sensor de temperatura LM35
• Para solicitarmos a leitura do A/D do PIC, vamos efetuar a leitura de sensor de
temperatura LM35 conectado ao canal AN1 e de um trimpot conectado ao canal AN0 do
de um trimpot conectado ao canal AN0 do PIC.
Sensor de temperatura LM35
• Criar um programa para ler o sensor de
temperatura, apresentar seu valor no display LCD.
• Ativar
DIP1 – chave 1 – LCD
DIP2 - chave 7 – temperatura DIP2 – chave 9 – AN0
//lm35 void main() {
char texto[10]; int leitura_ad = 0;
trisd = 0; //pinos do portd como saida trise = 0; //pinos do porte como saida
ADCON1 = 0b00000010; //configura AN0 analogico e os demais como digital trisa.ra2 = 1; //entrada analogica AN2 configurado como entrada lcd8_config(&porte,&portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa lcd lcd8_cmd(lcd_clear); //apaga display lcd
lcd8_cmd(lcd_cursor_off); //desliga cursor
lcd8_out(1,1,"LM35: "); // escreve primeira linha do lcd trisc.rc5 = 0; //define pino RC5 como saída
portc.rc5 = 1; //liga resistência while(1)
Buzzer
• Criar um programa para acionar/desacionar o buzzer a cada 1000ms. Utilize o portc.
//buzzer void main() {
TRISC.RC1 = 0; //PORT C configurado como saída while(1)
{
PORTC.RC1 = ~PORTC.RC1; //inversão de estado delay_ms(1000); //delay de 1000 milisegundos }
//lcd_contador void main() {
char *texto="0000";//* define a var. texto como um ponteiro assumindo o valor // micro inicialmente ou em branco " "
char soma=0; //char é um byte, de 0 a 255 char estadoantigo=0;
trisd = 0; //configura todos os pinos do portd como saída trise = 0; //configura todos os pinos do porte como saida
ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral trisb = 255;
Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1); //configura e inicializa LCD no modo 4 bits Lcd_custom_Cmd(Lcd_CLEAR); // apaga display
Lcd_custom_Cmd(Lcd_CURSOR_OFF); // desliga cursor Lcd_custom_Out(1,1,"supervisorio"); Lcd_custom_Out(2,1,"contador"); Lcd_custom_Out(2,1,"contador"); Lcd_custom_Out(2,10,texto); portd=0; while(1) { if (button(&portb,0,30,0)) estadoantigo=1;
if (estadoantigo && button(&portb,0,30,1)) {
portd.f0=~portd.f0; estadoantigo=0;