• Nenhum resultado encontrado

TA-PIC18F420

N/A
N/A
Protected

Academic year: 2021

Share "TA-PIC18F420"

Copied!
91
0
0

Texto

(1)

Microgenios

(2)
(3)
(4)
(5)
(6)

administrador FTCbau0164 labXXXX

(7)

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.

(8)

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.

(9)

• 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.

(10)

• 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.

(11)

• 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.

(12)

• 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

(13)

• 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

(14)

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.

(15)

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).

(16)

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

(17)

Memória de Programa

• Em seguida temos os endereços 0008h e 0018h. Estes endereços são chamados de vetores de interrupção.

(18)

Introdução as portas de I/O

• Os registradores PORTB, PORTC e PORTD possuem 8 pinos de I/O cada.

(19)

Introdução as portas de I/O

(20)

Introdução as portas de I/O

(21)

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.

(22)

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.

(23)

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

(24)
(25)

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.

(26)
(27)

1 – Abra o mikroC e vá ao menu

Project > New Project

(28)

2 – Aparecerá a seguinte tela de configuraçã o do projeto.

(29)

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

(30)

5 – Digite o programa.

(31)

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);

} }

(32)
(33)

9 – Abrir o programa pisca_pisca1 em menu File > Import Hex

(34)

10 – No módulo – modo PROG ativado 11 - No PICkit2 clicar no botão WRITE 12 – No módulo – ativar modo RUN

(35)

• No módulo – desativar modo RUN

(36)
(37)

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); }

(38)
(39)

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);

(40)
(41)

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)

(42)

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

(43)

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);

} }

(44)
(45)

Desenvolver um programa para ascender individualmente cada LED através de uma tecla correspondente. Utilize PORTB como teclado e PORTD como LED.

Configuração:

(46)

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;

(47)

FUNÇÃO BUTTON

(48)

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.

(49)

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);

(50)
(51)

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)

(52)

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

(53)

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

(54)

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

(55)

//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");

(56)
(57)

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

(58)

//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);

(59)

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);

(60)

//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); }

(61)
(62)

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.

(63)

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;

(64)

2) Criar um programa para manter o leds do PORTD acesso durante 1000ms, e depois apaguem para ficarem apagados durante 1000ms.

(65)

void main() { trisd = 0; portd = 0; while(1) {{ portd = 0B11111111; delay_ms(1000); portd = 0; delay_ms(1000);

(66)

3) Mude a sequência de acendimento dos LEDs, fazendo com que eles acendam alternadamente (ímpares acendam e pares apaguem). Utilize

(67)

void main() { trisd = 0; portd = 0; while(1) {{ portd = 0B10101010; delay_ms(1000); portd = 0B01010101; delay_ms(1000);

(68)

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.

(69)

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");

(70)
(71)

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

(72)

//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;

} }

(73)
(74)

• Criar um programa para gerar: C – primeiro display, O – segundo display, L – terceiro

(75)

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;

(76)
(77)

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.

(78)

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.

(79)

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)

(80)

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

(81)

//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)

{

(82)
(83)

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

(84)

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.

(85)

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

(86)

//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)

(87)
(88)

Buzzer

• Criar um programa para acionar/desacionar o buzzer a cada 1000ms. Utilize o portc.

(89)

//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 }

(90)
(91)

//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;

Referências

Documentos relacionados