Programação Aplicada à
Automação
Sumário
Microgenios
Descrição das funções dos pinos Memória de Programa
Introdução as portas de I/O
Criação de um projeto no MICROC O registrador TRIS O registrador PORT O registrador ADCON1 Operadores Programas Exercícios propostos 2
Microgenios
PIC18F452 Microchip
DESCRIÇÃO DAS FUNÇÕES DOS
PINOS
Descrição das funções dos pinos
• O PIC18F452 possui no total de 40 pinos deI/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
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 possuir também a função de detecção de baixa tensão (LVD), referência analógica do A/D e contador externo.
Descrição das funções dos pinos
• 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 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 UART.
Descrição das funções dos pinos
• 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
interfaciamento com microprocessador).
• 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 nomicrocontrolador é do tipo FLASH (sufixo “F”) que permite ser gravada/apagada no mínimo 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).
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.
• Sempre que energizarmos ou resetarmos o µC, o contador de programa PC apontará sempre para este primeiro endereço de memória.
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 PORTDpossuem 8 pinos de I/O cada.
Introdução as portas de I/O
• O PORTE possui 3 pinos de I/O.Introdução as portas de I/O
• O PORTA 6 pinos de I/O.Introdução as portas de I/O
• Cada porta de I/O possui três registradoresque 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 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.
• Se o bit estiver em 1, o pino correspondente esta configurado como entrada de dados, e se estiver em 0 configuramos este pino como
CRIAÇÃO DE UM PROJETO NO MICRO
C
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 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. 32
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
Watchdog – OFF
LVP – OFF (Low Voltagem Programming – desligado) Brown Out – OFF
Debuger – OFF
5 – Digite o programa.
//pisca_pisca1.c 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
delay_ms(1000); //*tempo de 1 segundo portd = 0; //* zera todo o portd; delay_ms(1000);
8 – Abrir PICKit 2 – verifique comunicação
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 • No PICkit2 clicar no botão ERASE
O registrador PORT
OPERADORES
Programas
Led2 Pisca_pisca2 Pisca_pisca3 Pisca_pisca4 Decremento Incremento / decrementoIncremento / decremento pulo 2 Inverte
//led2 void main() { trisd = 0; portd = 0; while(1) { portd = 0B10101010; delay_ms (1000); portd = 0; portd = 0B01010101; delay_ms(1000); portd = 0; } } 52
//pisca_pisca2.c void main() { trisd = 0; trisb = 0; portd = 0; portb = 0; while (1) { portd = 0B11111111; portb = 0B01010101; delay_ms(1000); portd = 0; portb = 0B10101010; delay_ms(1000); } } 54
//pisca_pisca3 void main() { trisd = 0; trisb = 0; portd = 0; portb = 0; while (1) { portd = 0B11111111; delay_ms(1000); portd = 0; portb = 255; delay_ms(1000); portd = 0B01010101; portb = 0B10101010; delay_ms(1000); } } 56
58 //pisca_pisca4.c void main() { trisd = 0; trisb = 0; portd = 255; portb = 255; while (1) { portd = 0B01111111; delay_ms(100); portd = 0B10111111; delay_ms(100); portd = 0B11011111; delay_ms(100); portd = 0B11101111; delay_ms(100); portd = 0B11110111; delay_ms(100); portd = 0B11111011; delay_ms(100); portd = 0B11111101; delay_ms(100); portd = 0B11111110; delay_ms(100); portd = 0B11111111; delay_ms(100); portb = 0B01111111; delay_ms(100); portb = 0B10111111; delay_ms(100); portb = 0B11011111; delay_ms(100); portb = 0B11101111; delay_ms(100); portb = 0B11110111; delay_ms(100); portb = 0B11111011; delay_ms(100); portb = 0B11111101; delay_ms(100); portb = 0B11111110; delay_ms(100); portb = 0B11111111; delay_ms(100); portb = 255; portd = 255; } }
//pisca_pisca_decr.c void main() { int x; trisd = 0; portd = 255; while (1) { x = 0B00000001; portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); x = x<<1; 60 portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); x = x<<1; portd = x; delay_ms(300); } }
//pisca_pisca_decre1 void main() { int x; int i; trisd = 0; portd = 255; while (1) { x = 0B00000001; for(i=1;i <=8; i++) { portd = x; delay_ms(300); x = x<<1; } } } 62
//pisca_pisca_incr void main() { int x; int i; trisd = 0; portd = 255; while (1) { x = 0B10000000; for(i=1;i <=8; i++) { portd = x; delay_ms(300); x = x>>1; } } } 64
//pisca_pisca_inc void main() { int x; int i; trisd = 0; trisb = 0; portd = 0; portb = 0; while (1) { x = 0B10000000; for(i=1;i <=8; i++) { portd = x; delay_ms(50); x = x>>1; } 66 portd = 0; x = 0B00000001; for(i=1;i <=8; i++) { portb = x; delay_ms(50); x = x<<1; } portb =0; } }
68 //pisca_pisca_incoulo2 void main() { int x; int i; trisd = 0; portd = 0; while (1) { x = 0B10000000; for(i=1;i <=8; i++) { portd = x; delay_ms(50); x = x >> 2; } x = 0B00000001; for(i=1;i <=8; i++) { portd = x; delay_ms(50); x = x << 2; } } }
//inverte void main() { trisd = 0; portd = 0B10101010; while(1) {
portd = ~portd; //*inverte estado do portd delay_ms (200);
} }
Exercício Proposto 1
Programa para fazer os leds piscarem de modo sequencial entre as duas fileiras. A fileira led 1 está conectada no PORTD, a fileira led 2 está conectada no PORTB. O DIP switch da fileira de leds 1 e 2 deve estar na posição on o restante na posição off.
Sendo:
portd = 0b00000001 portb = 0b10000000;
//ledseq void main() {
int i; //declara a variavel inteira
trisb = 0; //define o PORTB como saida trisd = 0; //define o PORTD como saida portb = 0; //coloca o PORTB em nivel baixo portd = 0; //coloca o PORTD em nivel baixo while(1)
{
portd = 0b00000001; //somente o pino rd0 em nivel alto for(i = 0; i < 8; i++)
{
delay_ms(100); //aguarda 100 ms
portd = portd << 1; //desloca um bit p/esq }
portb = 0b10000000; //somente o pino rb7 em nive alto for(i = 0; i < 8; i++)
{
delay_ms(100); //aguarda 100 ms
Exercício Proposto 2
Programa para fazer cada 4 leds piscarem de modo alternado entre as duas fileiras. A fileira led 1 está conectada no PORTD, a fileira led 2
está conectada no PORTB. O DIP switch da fileira de leds 1 e 2 deve estar na posição on o restante na posição off.
Sendo:
portd = 0b00001111 portb = 0b11110000;
//ledalter void main() {
trisb = 0; //define o PORTB como saida trisd = 0; //define o PORTD como saida
portb = 0; //coloca o PORTB em nivel baixo portd = 0; //coloca o PORTD em nivel baixo while(1)
{
portd = 0b00001111; //rd0 rd1 rd2 rd3 em alto portb = 0b11110000; //rb7 rb6 rb5 rb4 em alto delay_ms(200); //aguarda 200 ms
portd = ~portd; //inverte o PORTD portb = ~portb; //inverte o PORTB delay_ms(200); //aguarda 200 ms }