Baixe o app para aproveitar ainda mais
Prévia do material em texto
CEETEPS Introdução à Linguagem C para Microcontroladores PIC Prof. Fabiano Magalhães Galvão galvão.professor@gmail.com SÃO PAULO 2012 2 REV 0.1 31/05/12 Introdução à Linguagem C para Microcontroladores PIC Compilador MicroC, 8.2.0.0 Autor: Prof. Fabiano M. Galvão Email: galvão.professor@gmail.com 3 REV 0.1 31/05/12 SUMARIO 1 INTRODUÇÃO ........................................................................................... 5 2 INTRODUÇÃO À LINGUAGEM C .............................................................. 6 2.1 Tipos e declaração de variáveis ................................................................... 6 2.2 Constantes simbólicas .................................................................................. 7 2.3 Operador de Atribuição ( = ) ......................................................................... 7 2.4 Operadores Aritméticos ................................................................................ 7 2.5 Operadores Incremental “ ++ ” e Decremental “ - - ” ..................................... 7 2.6 Operadores Relacionais ............................................................................... 8 2.7 Operadores Lógicos Relacionais .................................................................. 8 2.8 Operadores Lógicos bit-a-bit ......................................................................... 8 3 ESTRUTURAS DE CONTROLE ................................................................ 8 3.1 Do – while ..................................................................................................... 9 3.2 While ............................................................................................................. 9 3.3 For ................................................................................................................ 9 3.4 If – else ......................................................................................................... 9 3.5 If .................................................................................................................. 10 3.6 Botaoitch – case ......................................................................................... 10 4 EXERCÍCIOS ........................................................................................... 11 4.1 Botão e Led ................................................................................................ 11 4.2 Delay ........................................................................................................... 12 4.3 Pisca Port D com tempo programável ........................................................ 13 4.4 Rotação de Bits........................................................................................... 14 4.5 Motor de Passo ........................................................................................... 15 4.6 Botão com Filtro (Debounce) ...................................................................... 17 4.7 Buzzer ......................................................................................................... 18 4.8 Display 7 Segmentos – 01 x Display ........................................................... 19 4 REV 0.1 31/05/12 4.9 Display 7 segmentos – 04 x Display (Implementando!) .............................. 20 4.10 LCD – Exemplo 1 .................................................................................... 20 4.11 LCD – Exemplo 2 .................................................................................... 21 4.12 PWM ........................................................................................................ 24 4.13 ADC ......................................................................................................... 25 4.14 Interrupções (Implementando!) ................................................................ 26 4.15 Timers (Implementando!) ......................................................................... 27 5 PROJETO ................................................................................................ 27 5 REV 0.1 31/05/12 1 INTRODUÇÃO Abordo nesta apostila conteúdo necessário para que o aluno dê seus primeiros passos na programação em Linguagem C para microcontroladores. Todos os exemplos desta apostila foram criados para o Kit Didático montado em sala de aula com o microcontrolador PIC16F877A. O compilador utilizado é o MikroC versão 8.2.0.0 fornecido pela empresa Mikroeletronica. 6 REV 0.1 31/05/12 2 INTRODUÇÃO À LINGUAGEM C A Linguagem C é utilizada para programação de microcontroladores assim como a linguagem assembly. A vantagem sobre a linguagem assembly é que este último é muito custoso sua programação, já a linguagem C, possui sintaxes muito mais simples, porém, poderosa o que nos beneficia com menor tempo de programação. Além disso, uma programação feita para um tipo de microcontrolador é fácil migrar para outro microcontrolador de outra família ou fabricante, o que em assembly tornaria muito difícil essa migração pois cada fabricante de microcontrolador tem uma linguagem assembly diferente. 2.1 Tipos e declaração de variáveis Segue tabela de variáveis que podem ser declaradas. TYPE SIZE RANGE unsigned char 8 bit 0 .. 255 signed char 8 bit -128 .. 127 signed short int 8 bit -128 .. 127 unsigned short int 8 bit 0 .. 255 signed int 16 bit -32768 .. 32767 unsigned int 16 bit 0 .. 65535 signed long int 32 bit -2147483648 .. 2147483647 unsigned long int 32 bit 0 .. 4294967295 float 32 bit ±1.17549435082e-38 .. ±6.80564774407e+38 double 32 bit ±1.17549435082e-38 .. ± 6.80564774407e+38 long double 32 bit ±1.17549435082e-38 .. ± 6.80564774407e+38 Exemplo: unsigned short int tempo, conta_peca, x; unsigned char texto1, texto2; unsigned short int y = 128; char *mensagem1 = “ ETEC – SP ” 7 REV 0.1 31/05/12 2.2 Constantes simbólicas Sintaxe: #define nome valor Exemplos: #define PORD LCD #define ON 1 #define OFF 0 #define PORTB.F0 tecla1 2.3 Operador de Atribuição ( = ) Exemplos: conta_pecas = 0; i = 12; Max = 15; Min = 0; 2.4 Operadores Aritméticos Operador Operação + Adição - Subtração * Multiplicação / Divisão % Módulo (Resto da divisão de números inteiros) 2.5 Operadores Incremental “ ++ ” e Decremental “ - - ” ++ var equivale à var = var + 1 var ++ equivale à var = var + 1 -- var equivale à var = var – 1 var -- equivale à var = var – 1 Veja os exemplos: Int a, b, c, i = 3; // a = ?, b = ?, c = ?, i = 3; a = i++; // a = 3, b = ?, c = ?, i = 4 b = ++i; // a = 3, b = 5, c = ?, i = 5 c = --i; // a = 3, b = 5, c = 4, i = 4 8 REV 0.1 31/05/12 2.6 Operadores Relacionais Operador Operação > Compara se maior que < Compara se menor que >= Compara se maior ou igual a <= Compara se menor ou igual a == Compara se igual a != Compara se diferente de 2.7 Operadores Lógicos Relacionais Operador Operação && AND || OR ! NOT 2.8 Operadores Lógicos bit-a-bit Operador Operação & AND | OR ^ OU EXCLUSIVO (XOR) ~ Complemento (NOT) >> Deslocamento à direita << Deslocamento à esquerda 3 ESTRUTURAS DE CONTROLE Serve para executar um bloco, ou ainda, não executar um bloco de programação conforme condição imposta. Você ainda pode repetir o mesmo bloco n vezes. 9 REV 0.1 31/05/12 3.1 Do – while Exemplo: do { PORTD++; DELAY_MS(1000); }while (PORTD<0XFF);3.2 While Exemplo: While (TECLA) { LED = 0; } 3.3 For Sintaxe: For (inicialização da variável; condição; incremento) { Bloco de funções } Exemplo: For ( i=0; i<=3; i++) { LED = 1; DELAY_MS(1000); } 3.4 If – else Exemplo: 10 REV 0.1 31/05/12 if (!BOTAO1) { LED1 = 1; } else LED1=0; 3.5 If Exemplo: if (!BOTAO1) { LED1 = 1; } 3.6 Switch – case Switch (i) { case 0 : return 0x3F; case 1 : return 0x06; case 2 : return 0x5B; case 3 : return 0x4F; case 4 : return 0x66; case 5 : return 0x6D; case 6 : return 0x7D; case 7 : return 0x07; case 8 : return 0x7F; case 9 : return 0x6F; } //case end 11 REV 0.1 31/05/12 4 EXERCÍCIOS 4.1 Botão e Led /* Botao.c Descrição: Firmware que acende um led ao pressionar um botão. Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define BOTAO1 portb.f0 //SAIDAS #define LED1 portd.f0 //Subrotinas (Funções) void Config () // Configuração dos ports em uso e inicialização de variáveis. { TRISB=0b00000001; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) TRISD=0; // Todos os pinos configurados como saída do PORTD PORTD=0X00; // inicialização do PORTD } void main() { config (); //Chama e executa a função "config" while(1) // Loop infinito { if (!BOTAO1) LED1 = 1; //Ao pressionar o botão o led acende se não, o led apaga else LED1=0; } } /* Exercícios: Obs: Para todos os exercícios não esqueça de configurar os ports utilizados. 1) Inverta a lógica do led; 2) Analise as linhas de programação a seguir e explique o como o circuito se comportará: if (BOTAO1) LED1 = 1; else LED1=0; 3)Acrescente mais 3 botões, totalizando 4, com as seguintes funções BOTAO1: Ao pressionar liga o LED1; BOTAO2: Ao pressionar desliga o LED2; BOTAO3: Ao pressionar liga os LEDS 3 e 4; BOTAO4: Liga TODO o PORTD. */ 12 REV 0.1 31/05/12 4.2 Delay /*Delay.c Descrição: Delay (Atraso). Ao pressionar o botão BOTAO1, o led 1 acenderá por 3 segundos e apagará Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define BOTAO1 portb.f0 //SAIDAS #define LED1 portd.f0 //Subrotinas (Funções) void Config () { TRISB=0b00000001; TRISD=0; PORTB=0X00; PORTD=0X00; } main() { config (); while(1) { if (!BOTAO1) { LED1 = 1; DELAY_MS(3000); } else LED1=0; } } /* Exercícios; 1) Altere os tempos; 2) Faça um pisca-pisca com o led; 3) Faça o PORTD inteiro piscar. Consulte o esquemático antes de programar, pois, você precisará utilizar um Display de 7 segmentos para visualizar; 4) Analise o trecho do programa a seguir e implemente-o no exercício 3: while (!BOTAO1) { PORTD = ~PORTD; delay_ms (500); } 5) Mantenha o led piscando e crie duas teclas, UP e DOWN, para aumentar ou diminuir a freqüência do led. */ 13 REV 0.1 31/05/12 4.3 Pisca Port D com tempo programável /*Pisca_port.c Descrição: Pisca o port d com o tempo programado entre os valores MAX e MIN. Data: 27/03/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define TCL_DOWN portb.f0 #define TCL_UP portb.f1 //SAIDAS #define LED1 portd.f0 //CONSTANTES #define MAX 1000 #define MIN 100 //VARIÁVEIS GLOBAIS unsigned int tempo; //Subrotinas (Funções) void Config () { TRISB=0b00000011; TRISD=0; PORTB=0X00010000; //Liga Transistor do Display 1 PORTD=0XFF; tempo = 500; } main() { config (); while(1) { PORTB.F4 = ~PORTB.F4; vdelay_ms(tempo); 14 REV 0.1 31/05/12 if(!TCL_UP) { delay_ms(10); if(!TCL_UP) { tempo = tempo-100; if(tempo<MIN) tempo = MIN; } } if(!TCL_DOWN) { delay_ms(10); if(!TCL_DOWN) { tempo = tempo+100; if(tempo>MAX) tempo = MAX; } } }//FIM DO LOOP INFINITO }//FIM DO MAIN /* Exercícios; 1) Estude o programa e altere os tempos máximo e minimo; */ 4.4 Rotação de Bits /* Rotacao-bit.c Descrição: Rotaciona os bits para esquerda e direita ao pressionar as teclas TCL1 e TCL2. Data: 22/03/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define TCL1 portb.f0 #define TCL2 portb.f1 //SAIDAS //VARIAVEIS unsigned short shifter; //Subrotinas (Funções) void Config () // Configuração dos ports em uso e inicialização de variáveis. { 15 REV 0.1 31/05/12 TRISB=0b00001111; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) TRISD=0; // Todos os pinos configurados como saída do PORTD PORTD=0X00; // inicialização do PORTD PORTB=0B00010000; SHIFTER =0x01; } void main() { config (); //Chama e executa a função "config" while(1) // Loop infinito { while(!TCL1) { if(shifter==0b10000000) { PORTD = shifter; SHIFTER=1; delay_ms(250); } else { PORTD = shifter; shifter <<= 1; delay_ms(250); } } if(!TCL2) { if(shifter==0b00000001) { PORTD = SHIFTER; SHIFTER=0b10000000; DELAY_MS(250); } else { PORTD = shifter; shifter >>= 1; delay_ms(250); } } } //fim do loop infinito } //fim do main /* Exercícios; 1) Crie botões UP e Down para alterar a freqüência de rotação dos bits. Defina também um valor máximo e um valor mínimo para a freqüência de rotação. */ 4.5 Motor de Passo /* Motordepasso.c Descrição: Ao pressionar a tecla TCL1 o motor gira no sentido horário. Ao pressionar a tecla TCL2 o motor gira no sentido anti-horario. Data: 27/01/12 16 REV 0.1 31/05/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define TCL1 portb.f0 #define TCL2 portb.f1 //SAIDAS unsigned short shifter; //Subrotinas (Funções) void Config () // Configuração dos ports em uso e inicialização de variáveis. { TRISB = 0b00001111; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) TRISC = 0; // Todos os pinos configurados como saída do PORTD PORTC = 0b00000011; // inicialização do PORTD PORTB = 0B00010000; // inicialização do PORTB Shifter = 0b00000011; // inicialização da variável shifter } void main() { config(); //Chama e executa a função "config" while(1) // Loop infinito { while(!TCL1) //Shift à esquerda { shifter <<= 1; if(shifter==0b00011000) { shifter=0b00001001; } if(shifter==0b00010010) { shifter=0b00000011; } portc=shifter; delay_ms(500); } while(!TCL2) //Shift à direita { shifter >>= 1; if(shifter==0b00000001) { shifter=0b00001001; } if(shifter==0b00000100) { shifter=0b00001100; } portc=shifter; delay_ms(500); } } //fim do loop infinito 17 REV 0.1 31/05/12 }// fim do main /* Exercícios 1)Implemente as seguintes funções BOTAO3: Aumenta velocidade. BOTAO4: Diminui velocidade do motor. Obs: Crie uma variável 2)Descubra quantos passos são necessários para o motor completar 1 (uma) volta e modifique o programa anterior para que o motor dê apenas uma volta ao pressionar os botões BOTAO1 e BOTAO2;*/ 4.6 Botão com Filtro (Debounce) /* Debounce.c Descrição: Botão com filtro debounce. Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define BOTAO1 portb.f0 #define BOTAO2 portb.f1 #define BOTAO3 portb.f2 #define BOTAO4 portb.f3 //SAIDAS #define LED1 portd.f0 #define LED2 portd.f1 #define LED3 portd.f2 #define LED4 portd.f3 void Config () { TRISB=0b00001111; TRISD=0; PORTD=0X00; } main() { config (); while(1) { if (!BOTAO1) { delay_ms(200); if(!BOTAO1) LED1 = 1; else LED1 = 0; } else LED1=0; if (!BOTAO2) { delay_ms(200); if(!BOTAO2) LED2 = 1; else LED2 = 0; } 18 REV 0.1 31/05/12 else LED2=0; if (!BOTAO3) { delay_ms(250); if(!BOTAO3) LED3 = 1; else LED3 = 0; } else LED3=0; if (!BOTAO4) { delay_ms(250); if(!BOTAO4) LED4 = 1; else LED4 = 0; } else LED4=0; } } /* Exercícios; 1) Crie uma constante para substituir o tempo do filtro Debounce; 2) Altere o tempo do filtro Debounce e explique seu efeito. */ 4.7 Buzzer /* buzzer.c Descrição: Ao pressionar um botão o Buzzer toca. Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define BOTAO1 portb.f0 #define BOTAO2 portb.f1 //SAIDAS #define BUZZER porta.f5 //Subrotinas (Funções) void Config () { TRISA=0b11011111; TRISB=0b00000011; TRISD=0; PORTA=0; //Clear PORTA PORTB=0X00; //Clear PORTB PORTD=0B00000000; //Clear PORTD ADCON1=7; // Configura RA0, RA1 e RA3 como Analogicos e RA2, RA4, RA5, RE0...RE2 como Digitais } 19 REV 0.1 31/05/12 main() { config (); while(1) { BUZZER=0; if (!BOTAO1) { BUZZER = 1; DELAY_MS(2000); } while (!BOTAO2) { BUZZER = 0; DELAY_US(250); BUZZER =1; DELAY_US(250); }// t_on = 250us //t_off= 250us //t_on + t_off = 0,5ms = 2kHz. } } /* Exercícios; 1)Altere a frequência para 3kHz. Demonstre os cálculos. 2)Altere os tempos t_on e t_off sendo que t_on ≠ t_off mas a freqüência continue 3kHz. */ 4.8 Display 7 Segmentos – 01 x Display /* 7SegDisplay.c Descrição: Contador em um Display de 7 segmentos. Data: 30/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ void config() { INTCON = 0; // Desabilita interrupções GIE, PEIE,INTE,RBIE,T0IE PORTB = 0B00010000; // Liga o Display 1. TRISB = 0; PORTD = 0; TRISD = 0; } unsigned short mascara(unsigned short num) { botaoitch (num) { case 0 : return 0x3F; case 1 : return 0x06; case 2 : return 0x5B; case 3 : return 0x4F; 20 REV 0.1 31/05/12 case 4 : return 0x66; case 5 : return 0x6D; case 6 : return 0x7D; case 7 : return 0x07; case 8 : return 0x7F; case 9 : return 0x6F; } //case end }//~ unsigned short i; void main() { Config(); do { for (i = 0; i <= 9u; i++) { PORTB = 0; // Desliga todos os displays de 7 segmentos PORTD = mascara(i); // Busca valor para disponibilizar no PORTD PORTB = 0B00010000; // Liga um Display de 7 segmentos Delay_ms(500); } } while (1); //Fim do loop infinito } /* Exercícios 1)Implemente contagem de 0x0 a 0xF; 2)Implemente um contador que incrementa seu valor (0x0 à 0xF) ao pressionar a tecla BOTAO1 e decrementa ao pressionar a tecla BOTAO2. 3)Igual ao exercício anterior, contudo, utilize o debounce para programação das teclas. */ 4.9 Display 7 segmentos – 04 x Display (Implementando!) Programa em desenvolvimento. 4.10 LCD – Exemplo 1 /*Lcd.c Descrição: Rotinas para escrever no LCD. Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ //ENTRADAS #define BOTAO1 portb.f0 #define BOTAO2 portb.f1 //SAIDAS #define BUZZER porta.f5 21 REV 0.1 31/05/12 //Variáveis // "0123456789abcdef" char *texto = " E T E C - S P "; //Subrotinas (Funções) void config() { TRISA = 0b11011111; TRISB = 0b00000011; TRISD = 0; TRISE = 0; ADCON1=7; // Configura RA0, RA1 e RA3 como Analógicos e RA2, RA4, RA5, RE0...RE2 como Digitais PORTA = 0; PORTB = 0; PORTD = 0; PORTE = 0; //Limpa todos os Ports utilizados //Configura LCD Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); Lcd8_Init(&PORTE, &PORTD); Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor } void tela_inicial() { Lcd8_Out(1, 1,"Kit PIC 16F877A"); Lcd8_Out(2, 1,"Prof. Fabiano G."); delay_ms(1000); Lcd_Cmd(Lcd_CLEAR); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void main() { config (); tela_inicial(); Lcd8_Out(1, 2, texto); // Escreve na coluna 1, linha 2. //01234567890abcdef Lcd8_Out(2, 1, "*ELETRONICA !!!*"); // Escreve na linha 2, coluna 1 } /* Exercícios 1) Faça um programa que informe qual tecla foi pressionada. */ 4.11 LCD – Exemplo 2 /*lcd-teclas.c Descrição: LCD e teclas. Data: 27/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 22 REV 0.1 31/05/12 */ //DECLARAÇÃO DE VARIÁVEIS //1234567890ABCDEF char *msg_teclapress1 = "Voce pressionou"; char *msg_teclapress2 = "a tecla:"; unsigned short int flag_tela_princ, tecla_press; //ENTRADAS #define BOTAO1 portb.f0 #define BOTAO2 portb.f1 #define BOTAO3 portb.f2 #define BOTAO4 portb.f3 //SAIDAS #define LED1 portd.f0 #define LED2 portd.f1 #define LED3 portd.f2 #define LED4 portd.f3 //Subrotinas (Funções) void Config () { TRISA = 0b11011111; TRISB = 0b00000011;TRISD = 0; TRISE = 0; ADCON1=7; // Configura RA0, RA1 e RA3 como Analogicos e RA2, RA4, RA5, RE0...RE2 como Digitais PORTA = 0; //Clear PORTA PORTB = 0; //Clear PORTB PORTD = 0; //Clear PORTD PORTE = 0; //Clear PORTE //Configura LCD Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); Lcd8_Init(&PORTE, &PORTD); Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor //Inicialização de variáveis flag_tela_princ = 0; tecla_press = 0; } void teclado () { if (!BOTAO1) { delay_ms(1); if(!BOTAO1) { tecla_press = 1; lcd8_cmd(lcd_clear); Lcd8_Out(2, 14, " 1 "); } } if (!BOTAO2) 23 REV 0.1 31/05/12 { delay_ms(1); if(!BOTAO2) { tecla_press = 1; lcd8_cmd(lcd_clear); Lcd8_Out(2, 14, " 2 "); } } if (!BOTAO3) { delay_ms(1); if(!BOTAO3) { tecla_press = 1; lcd8_cmd(lcd_clear); Lcd8_Out(2, 14, " 3 "); } } if (!BOTAO4) { delay_ms(1); if(!BOTAO4) { tecla_press = 1; lcd8_cmd(lcd_clear); Lcd8_Out(2, 14, " 4 "); } } } void tela_principal() { //1234567890ABCDEF Lcd8_Cmd(Lcd_CLEAR); Lcd8_Out(1, 1, "E T E C - S P"); // Escreve na linha 1, coluna 2 Lcd8_Out(2, 1, "Press. uma tecla"); flag_tela_princ = 1; } void tela_tecla_press() { Lcd8_Out(1, 1, msg_teclapress1); // Escreve na linha 1, coluna 1 Lcd8_Out(2, 1, msg_teclapress2); // Escreve na linha 2, coluna 1 } main() { config (); //1234567890BCDEF" Lcd8_Out(1, 1,"Kit PIC 16F877A"); Lcd8_Out(2, 1,"Prof. Fabiano G"); delay_ms(1000); while(1) { if(!flag_tela_princ) tela_principal(); teclado (); 24 REV 0.1 31/05/12 if(tecla_press) { tela_tecla_press(); delay_ms (1500); tecla_press = 0; flag_tela_princ = 0; } } } 4.12 PWM /* PWM.C Descrição: Exemplo de acionamento Data: 26/01/12 Autor: Fabiano M. Galvão PIC16F877A Compilador MikroC for Pic 8.2.0.0 */ unsigned short duty_atual, duty_anterior; void InitMain() { PORTB = 0; TRISB = 0b00001111; // Configuração dos pinos do PortB PORTD = 0; TRISD = 0; ADCON1 = 7; // Configura RA0, RA1 e RA3 como Analógicos e RA2, RA4, RA5, // RE0...RE2 como Digitais PORTC = 0; TRISC = 0; PWM1_Init(5000); //Inicializa PWM à 5kHz. } void main() { int duty_atual; initMain(); duty_atual = 127; // Inicializa PWM com duty = 50% duty_anterior = 0; // Variável que armazena valor do duty anterior PWM1_Start(); // Liga PWM1 while (1) { if (Button(&PORTB, 0,1,0)) //Sintaxe: "Button(&Portx, pino, debounce, ativo em 0 ou 1)" duty_atual++ ; //Incrementa duty if (Button(&PORTB, 1,1,0)) duty_atual-- ; //Decrementa duty 25 REV 0.1 31/05/12 if (Button(&PORTB, 2,1,0)) duty_atual = 100; //Duty cycle = 39% if (Button(&PORTB, 3,1,0)) duty_atual = 250; //Duty cycle = 98% if (duty_anterior != duty_atual) { PWM1_Change_Duty(duty_atual); duty_anterior = duty_atual; PORTD = duty_anterior; } Delay_ms(200); // slow down change pace a little } //Fim do loop infinito } //Fim do Main /* Exercícios 1)Altere o debounce e explique o que você notou de diferente. 2)Altere o pino de saída do PWM e a sua frequência. 3) Sabendo que o comando "PWMx_Change_Duty" altera o duty cicle e que o parâmetro está entre 0 e 255, ou seja, 0 = 0%, 127 = 50% e 255 = 100%, faça um programa que ao pressionar: BOTAO3, duty cycle = 33% BOTAO4, duty cycle = 75% As teclas BOTAO1 e BOTAO2 devem continuar com a mesma função. Mostre os cálculos ao professor. 4) Acrescente um comando para desligar o PWM. Procure o comando na aba Qhelp, lado superior esquerdo do ambiente de programação. */ 4.13 ADC /* * Project name: ADC_on_LCD (Displaying ADC result on LCD) * Copyright: (c) MikroElektronika, 2005-2008. * Description: This code demonstrates how to use library function ADC_read, and library procedures and functions for LCD display (4 bit interface). * Test configuration: MCU: PIC16F877A Dev.Board: EasyPIC5 Oscillator: HS, 08.0000 MHz Ext. Modules: LCD BOTAO: mikroC v8.0 * NOTES: None. */ unsigned char ch; 26 REV 0.1 31/05/12 unsigned int adc_rd; char *text; long tlong; void main() { TRISA = 0B00000011; TRISE = 0; INTCON = 0; // disable all interrupts ADCON1 = 0X84;//0x84;//0x82; // configure VDD as Vref, and analog channels //Configura LCD Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); Lcd8_Init(&PORTE, &PORTD); Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor lcd8_cmd(lcd_clear); text = "mikroElektronika"; // assign text to string LCD8_Out(1,1,text); // print string a on LCD, 1st row, 1st column text = "LCD example"; // assign text to string LCD8_Out(2,1,text); // print string a on LCD, 2nd row, 1st column Delay_ms(2000); lcd8_cmd(lcd_clear); text = "voltage:"; // assign text to string while (1) { adc_rd = ADC_read(0); //0 = Canal AN0 // get ADC value from 2nd channel LCD8_Out(2,1,text); // print string a on LCD, 2nd row, 1st column tlong = (long)adc_rd * 5000; // covert adc reading to milivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // extract volts digit LCD8_Chr(2,9,48+ch); // write ASCII digit at 2nd row, 9th column LCD8_Chr_CP('.'); ch = (tlong / 100) % 10; // extract 0.1 volts digit LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point ch = (tlong / 10) % 10; // extract 0.01 volts digit LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point ch = tlong % 10; // extract 0.001 volts digit LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point LCD8_Chr_CP('V'); Delay_ms(1); } } 4.14 Interrupções (Implementando!) Programa em desenvolvimento. 27 REV 0.1 31/05/12 4.15 Timers (Implementando!) Programa em desenvolvimento. 5 PROJETO Neste capítulo, os alunos devem apresentar um projeto utilizando-se dos conceitos adquiridos no desenvolvimento da disciplina. O projeto será constituído por: 1. Documentação contendo descrição de projeto, fluxograma, esquema elétrico, programa fonte e outros que julgar necessário; 2. O programa fonte deverá ser entregue digitalmente ao professor sem erros de compilação. Será avaliado a documentação e o funcionamento do projeto na prática.
Compartilhar