Ir ao conteúdo
  • Cadastre-se

Iury Messias

Membro Júnior
  • Posts

    8
  • Cadastrado em

  • Última visita

Reputação

2
  1. Peço desculpas por não colocar a imagem do circuito funcionando, vou corrigir isto. Acontece que no avanço as barras aparecem perfeitamente, mas não consigo faze-las retornarem, tentei criar uma logica com flags para que por exemplo, quando a variável (level_14 = 1 e level_flag.B4=1) imprimisse um carácter em branco, pois isso significaria decréscimo do nível de combustível, mas esta logica não funcionou. Estou buscando uma forma de fazer com que as barras retrocedam, indicando nível baixo de combustível. Segue abaixo o trecho do código em questão. void comb() { unsigned int i; unsigned char cont, level_1=0x00, level_2=0x00, level_3=0x00, level_4=0x00, level_5=0x00, level_6=0x00, level_7=0x00,level_8=0x00, level_9=0x00, level_10=0x00, level_11=0x00, level_12=0x00, level_13=0x00, level_14=0x00; i = (ADC_Read(5)/0x49); //São 14 niveis, 1023/14 ~= 73, ad/73=14 if(i<=0x01 && i<0x02) level_flags.B1 = 0x01; if(i>=0x02 && i<0x03) level_flags.B2 = 0x01; if(i>=0x03 && i<0x04) level_flags.B3 = 0x01; if(i>=0x04 && i<0x05) level_flags.B4 = 0x01; if(i>=0x05 && i<0x06) level_flags.B5 = 0x01; if(i>=0x06 && i<0x07) level_flags.B6 = 0x01; if(i>=0x07 && i<0x08) level_flags.B7 = 0x01; if(i>=0x08 && i<0x09) level_flag.B0 = 0x01; if(i>=0x09 && i<0x0A) level_flag.B1 = 0x01; if(i>=0x0A && i<0x0B) level_flag.B2 = 0x01; if(i>=0x0B && i<0x0C) level_flag.B3 = 0x01; if(i>=0x0C && i<0x0D) level_flag.B4 = 0x01; if(i>=0x0D && i<0x0F) level_flag.B5 = 0x01; if((level_flags.B1) && (!level_2)) { level_flags.B1 = 0x00; level_1 = 0x01; CustomChar(2,2); } if((level_flags.B2) && (!level_3)) { level_flags.B2 = 0x00; level_2 = 0x01; CustomChar(2,2); CustomChar(2,3); } if((level_flags.B3) && (!level_4)) { level_flags.B3 = 0x00; level_3 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); } if((level_flags.B4) && (!level_5)) { level_flags.B4 = 0x00; level_4 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); } if((level_flags.B5) && (!level_6)) { level_flags.B5 = 0x00; level_5 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); } if((level_flags.B6) && (!level_7)) { level_flags.B6 = 0x00; level_6 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); } if((level_flags.B7) && (!level_8)) { level_flags.B7 = 0x00; level_7 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); } if((level_flag.B0) && (!level_9)) { level_flag.B0 = 0x00; level_9 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); } if((level_flag.B1) && (!level_10)) { level_flag.B1 = 0x00; level_10 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,10); } if((level_flag.B2) && (!level_11)) { level_flag.B2 = 0x00; level_11 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); } if((level_flag.B3) && (!level_12)) { level_flag.B3 = 0x00; level_12 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,12); } if((level_flag.B4) && (!level_13)) { level_flag.B4 = 0x00; level_13 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,13); } if((level_flag.B5) && (!level_14)) { level_flag.B5 = 0x00; level_14 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,13); CustomChar(2,14); } }
  2. Saudações a todos, estou desenvolvendo um aparelho semelhante a um computador de bordo veicular "Mas com poucas funções" para meu veiculo. Basicamente terei cinco parâmetros que serão mostrados no display LCD, são eles: Temperatura do motor, Temperatura externa, Tensão da bateria, Sinal de sonda lambda e Nível de combustível. Minha dificuldade no momento é desenvolver a programação do progresso e retrocesso da barra do nível de combustível, consegui faze-la avançar mas, não consigo faze-la retroceder. No hardware montado no ISIS estou utilizando um pic 16F877A e um display LCD, existe uma botoeira que faz a seleção dos menus. O microcontrolador faz a leitura dos sinais analógicos pelas entradas AN1, AN2 e AN5, que correspondem, respectivamente a: Temperatura externa, Temperatura do motor e nível de combustível. Segue imagens do circuito e o código desenvolvido no MikroC. /* Computador de bordo veicular simples versão 1.0 Microcontrolador: PIC18F877A Clock: 8MHz */ //Configração da pinagem Lcd sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D7 at RD7_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D4 at RD4_bit; // Diração da pinagem do lcd sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D7_Direction at TRISD7_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D4_Direction at TRISD4_bit; //Mapeamento de hardware #define change RB1_bit //Botão para seleção das telas //Definição de flags e constantes #define ntela 5 //Quantidade de telas para o sistema de menus #define flag_option flags.B1 #define lcd_clr flags.B2 #define motor flags.B3 //Prototipos de função void menu_temp_motor(); void menu_temp_ext(); void menu_tensaobat(); void menu_lambda(); void menu_comb(); void temp_celsius(); void temp_celsius_exter(); void voltimetro(); void clear_lcd(); void read_but(); int average_temp(); void comb(); void CustomChar(char pos_row, char pos_char); //Variavaeis globais unsigned short flags = 0x00, screen = 0x01; unsigned short level_flags = 0x00; unsigned short level_flag = 0x00; const char character[] = {31,31,31,31,31,31,31,31}; int result_ADC = 0x00; unsigned long volt = 0x00; float temperatura = 0.0; float current_temp = 0.0; char txt[15]; // Função principal void main() { ADCON0 = 0x01; //AN0 como entrada analogia ADCON1 = 0x00; //PORTA 0,1,2 e 4 como analogico CMCON = 0x07; //Desbilita os comparadores TRISB = 0x01; TRISD = 0x00; //PORTD como saida digital PORTD = 0x00; //Inicai PORTD em 0 Lcd_Init(); //Inicia o display LCD Lcd_Cmd (_LCD_CLEAR); //Limpa o lcd Lcd_Cmd (_LCD_CURSOR_OFF); //Desliga o cursor Lcd_Out (1,1, "Iniciando"); //Mensagem inicial delay_ms(1000); Lcd_Cmd (_LCD_CLEAR); //Limpa lcd while(1) { read_but(); switch(screen) { case 0x01: menu_temp_motor(); break; case 0x02: menu_temp_ext(); break; case 0x03: menu_tensaobat(); break; case 0x04: menu_lambda(); break; case 0x05: menu_comb(); break; } //end switch } //end while } //=============== Desenvolvimento das funções auxiliares ====================== //===============LEITURA DOS BOTÕES =========================================== void read_but() { if(!change) flag_option = 0x01; //Seta a flag de mudança do menu if(change && flag_option) { flag_option = 0x00; //Limpa a flag screen ++; if(screen > ntela) screen = 0x01; lcd_clr = 0x01; //Seta flag de limpeza da tela } } //========================= LIMPEZA DO DISPLAY ================================ void clear_lcd() { if(lcd_clr) { Lcd_Cmd(_LCD_CLEAR); //Limpa display lcd_clr = 0x00; //Limpa a flag } } //================================= MENUS ===================================== void menu_temp_motor() { char i; clear_lcd(); //Seta flag de leitura do ADC 0 Lcd_Chr(1,4,'T'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('M'); Lcd_Chr_Cp('P'); Lcd_Chr_Cp('.'); Lcd_Chr_Cp('M'); Lcd_Chr_Cp('O'); Lcd_Chr_Cp('T'); Lcd_Chr_Cp('O'); Lcd_Chr_Cp('R'); //Lcd_Cmd(_LCD_SHIFT_LEFT); motor = 0x01; //Seta flag de leitura da temperatura do motor temp_celsius(); } void menu_temp_ext() { clear_lcd(); Lcd_Chr(1,3,'T'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('M'); Lcd_Chr_Cp('P'); Lcd_Chr_Cp('.'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('X'); Lcd_Chr_Cp('T'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('R'); Lcd_Chr_Cp('N'); Lcd_Chr_Cp('A'); motor = 0x00; temp_celsius(); } void menu_tensaobat() { clear_lcd(); Lcd_Chr(1,3,'T'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('N'); Lcd_Chr_Cp('.'); Lcd_Chr_Cp('B'); Lcd_Chr_Cp('A'); Lcd_Chr_Cp('T'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('R'); Lcd_Chr_Cp('I'); Lcd_Chr_Cp('A'); voltimetro(); } void menu_lambda() { clear_lcd(); Lcd_Chr(1,5,'L'); Lcd_Chr_Cp('A'); Lcd_Chr_Cp('M'); Lcd_Chr_Cp('B'); Lcd_Chr_Cp('D'); Lcd_Chr_Cp('A'); } void menu_comb() { clear_lcd(); Lcd_Chr(1,3,'N'); Lcd_Chr_Cp('I'); Lcd_Chr_Cp('V'); Lcd_Chr_Cp('E'); Lcd_Chr_Cp('L'); Lcd_Chr_Cp(' '); Lcd_Chr_Cp('C'); Lcd_Chr_Cp('O'); Lcd_Chr_Cp('M'); Lcd_Chr_Cp('B'); Lcd_Chr_Cp('U'); Lcd_Chr_Cp('S'); Lcd_Chr_Cp('.'); Lcd_Chr(2,1,'R'); Lcd_Chr(2,16,'F'); comb(); } //=============================== SENSOR DE TEMPERATURA ======================= void temp_celsius() { result_ADC = average_temp(); //Recebe o valor da média das cem medições de temperatura temperatura = ((result_ADC * 5.0)/1024.0)*100; //Converte para volts, depois para graus Celsius if(temperatura < (current_temp - 0.5) || temperatura > (current_temp + 0.5)) { current_temp = temperatura; FloatToStr(temperatura, txt); //Converte de Float para String Lcd_Chr(2,7,txt[0]); //Imprimi o valor da temperatura no display Lcd_Chr_Cp(txt[1]); Lcd_Chr_Cp(txt[2]); Lcd_Chr_Cp(txt[3]); Lcd_Chr_Cp(txt[4]); } } //======================= FILTRO DE LEITURA DA TEMPERATURA ==================== int average_temp() { char i, o = 0x00; int temp_store = 0x00; for(i=0x00; i<0x64; i++) { if(motor)temp_store = temp_store + ADC_Read(0); else temp_store = temp_store + ADC_Read(1); } return(temp_store/0x64); } //================================ VOLTIMETRO ================================= void voltimetro() { unsigned char mil, cen, dez, uni; volt = adc_read(2); volt = (volt*1400)>>10; //Para valores maiores de tensão, este valor deve ser modificado (ADCx500/1024) para 10V 1000, para 20V 2000 mil = volt/1000; cen = (volt%1000)/100; dez = (volt%100)/10; uni = volt%10; lcd_chr(2,6,mil+48); lcd_chr_cp(cen+48); lcd_chr_cp('.'); lcd_chr_cp(dez+48); lcd_chr_cp(uni+48); lcd_chr_cp('V'); } void comb() { unsigned int i; unsigned char cont, level_1=0x00, level_2=0x00, level_3=0x00, level_4=0x00, level_5=0x00, level_6=0x00, level_7=0x00,level_8=0x00, level_9=0x00, level_10=0x00, level_11=0x00, level_12=0x00, level_13=0x00, level_14=0x00, level_15=0x00; i = (ADC_Read(5)/0x49); if(i<=0x01 && i<0x02) level_flags.B1 = 0x01; if(i>=0x02 && i<0x03) level_flags.B2 = 0x01; if(i>=0x03 && i<0x04) level_flags.B3 = 0x01; if(i>=0x04 && i<0x05) level_flags.B4 = 0x01; if(i>=0x05 && i<0x06) level_flags.B5 = 0x01; if(i>=0x06 && i<0x07) level_flags.B6 = 0x01; if(i>=0x07 && i<0x08) level_flags.B7 = 0x01; if(i>=0x08 && i<0x09) level_flag.B0 = 0x01; if(i>=0x09 && i<0x0A) level_flag.B1 = 0x01; if(i>=0x0A && i<0x0B) level_flag.B2 = 0x01; if(i>=0x0B && i<0x0C) level_flag.B3 = 0x01; if(i>=0x0C && i<0x0D) level_flag.B4 = 0x01; if(i>=0x0D && i<0x0E) level_flag.B5 = 0x01; if(i>=0x0E && i<0x0F) level_flag.B6 = 0x01; if((level_flags.B1) && (!level_2)) { level_flags.B1 = 0x00; level_1 = 0x01; CustomChar(2,2); } if((level_flags.B2) && (!level_3)) { level_flags.B2 = 0x00; level_2 = 0x01; CustomChar(2,2); CustomChar(2,3); } if((level_flags.B3) && (!level_4)) { level_flags.B3 = 0x00; level_3 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); } if((level_flags.B4) && (!level_5)) { level_flags.B4 = 0x00; level_4 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); } if((level_flags.B5) && (!level_6)) { level_flags.B5 = 0x00; level_5 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); } if((level_flags.B6) && (!level_7)) { level_flags.B6 = 0x00; level_6 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); } if((level_flags.B7) && (!level_8)) { level_flags.B7 = 0x00; level_7 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); } if((level_flag.B0) && (!level_9)) { level_flag.B0 = 0x00; level_9 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); } if((level_flag.B1) && (!level_10)) { level_flag.B1 = 0x00; level_10 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,10); } if((level_flag.B2) && (!level_11)) { level_flag.B2 = 0x00; level_11 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); } if((level_flag.B3) && (!level_12)) { level_flag.B3 = 0x00; level_12 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,12); } if((level_flag.B4) && (!level_13)) { level_flag.B4 = 0x00; level_13 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,13); } if((level_flag.B5) && (!level_14)) { level_flag.B5 = 0x00; level_14 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,13); CustomChar(2,14); } if((level_flag.B6) && (!level_15)) { level_flag.B6 = 0x00; level_15 = 0x01; CustomChar(2,2); CustomChar(2,3); CustomChar(2,4); CustomChar(2,5); CustomChar(2,6); CustomChar(2,7); CustomChar(2,8); CustomChar(2,9); CustomChar(2,11); CustomChar(2,13); CustomChar(2,14); CustomChar(2,15); } } void CustomChar(char pos_row, char pos_char) { char i; Lcd_Cmd(64); for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]); Lcd_Cmd(_LCD_RETURN_HOME); Lcd_Chr(pos_row, pos_char, 0); }
  3. Nossa... Show !! Resolvido, muito obrigado por sanarem minhas duvidas.
  4. Muito obrigado, Bommu Perneta, e Isadora Ferraz, fantástico quantas linhas foram poupadas apenas melhorando o código, estou aprendendo aos poucos a programar e suas dicas foram muito valiosas. Eu o refiz da seguinte forma, seguindo as suas orientações: unsigned const char tabela[]={230,150,120,94,78,67,58,52,47,43,39,36,33,30}; int leitura = 0x00; int new_value = 0x00; int freq = 230; void interrupt() { static int pulse; if(T0IF_bit) { T0IF_bit = 0x00; TMR0 = 0x01; if(!--freq) { freq = new_value; pulse = freq/2; } if(pulse) { GPIO.F1 = 0x01; --pulse; }else GPIO.F1 = 0x00; } } void main() { CMCON = 0x07; //Desabilta os comparadores OPTION_REG = 0x88; //0b10001000 Pull-ups desablitadas prescalaer adicionado ao WDT 1:1 ANSEL = 0x01; //RA0 como entrada do conversor A/D frequencia Fosc/2 GIE_bit = 0x01; //Habilita as interrupções globais PEIE_bit = 0x01; //Habilita as interrupções dos perifericos T0IE_bit = 0x01; //Habilita interrupção por estouro do TMR0 TMR0 = 0x01; //Inicia TMR0 em 1 para estouro a cada 256us TRISIO = 0x01; //Habilita GPIO 0 como entrada GPIO = 0x00; //Inicia tudo em low while(1) { for(;;) { leitura = ADC_Read(0); new_value = tabela[leitura/75]; } } } Não, é um pulsador para eletro injetor automotivo. Tem como reduzir mais que isso ? : void interrupt() { static int pulse; if(T0IF_bit) { T0IF_bit = 0x00; TMR0 = 0x01; if(!--freq) { freq = new_value; pulse = freq/2; } if(pulse) { GPIO.F1 = 0x01; --pulse; }else GPIO.F1 = 0x00; } } Mais uma vez muito obrigado a todos.
  5. Saudações a todos, atualmente me deparei com o seguinte problema, estou tentando gerar pulsos de baixa frequência com um PIC12F675, o algoritmo para gerar a frequência eu copie do seguinte post: , a questão é a seguinte, um potenciômetro é utilizado para variar a frequência do pulso, que começa em aproximadamente 16Hz e vai até aproximadamente 130hz, esse potenciômetro esta ligado ao conversor A/D do Pic, quando ele é variado a frequência também varia. Quando eu simulo no ISIS, se o potenciômetro estiver entre 1% a 70% os pulsos acontecem normalmente, acima disso eles entram em desordem. O código que fiz é esse: int leitura = 0x00; //Variavel auxiliar para receber valor do conversor A/D int new_value = 0x00; //Variavel auxiliar para mudar valor da frequencia int freq = 230; //Varia que contem valor inicial da frequencia void interrupt() { static int pulse; //Variavel que controla periodo do pulso if(T0IF_bit) { T0IF_bit = 0x00; //Limpa a flag de estouro do TMR0 TMR0 = 0x01; //Reinicia o TMR0 --freq; if(freq == 0x00) { freq = new_value; pulse = freq/2; } if(pulse) { GPIO.F1 = 0x01; //Leva o GPIO.F1 a nivel logico 1 --pulse; //Decrementa a variavel pulse }else { GPIO.F1 = 0x00; //Leva o GPIO.F1 a nivel logico 0 } } } void main() { CMCON = 0x07; //Desabilta os comparadores OPTION_REG = 0x88; //0b10001000 Pull-ups desablitadas prescalaer adicionado ao WDT 1:1 ANSEL = 0x01; //RA0 como entrada do conversor A/D frequencia Fosc/2 GIE_bit = 0x01; //Habilita as interrupções globais PEIE_bit = 0x01; //Habilita as interrupções dos perifericos T0IE_bit = 0x01; //Habilita interrupção por estouro do TMR0 TMR0 = 0x01; //Inicia TMR0 em 1 para estouro a cada 256us TRISIO = 0x01; //Habilita GPIO 0 como entrada GPIO = 0x00; //Inicia tudo em low while(1) { leitura = ADC_Read(0); if(leitura > 0) new_value = 230; //16Hz if(leitura > 75) new_value = 150; if(leitura > 150) new_value = 120; if(leitura > 225) new_value = 94; if(leitura > 300) new_value = 78; if(leitura > 375) new_value = 67; if(leitura > 450) new_value = 58; if(leitura > 525) new_value = 52; if(leitura > 600) new_value = 47; if(leitura > 675) new_value = 43; if(leitura > 750) new_value = 39; if(leitura > 825) new_value = 36; if(leitura > 900) new_value = 33; if(leitura > 975) new_value = 30; //130Hz } }
  6. Isadora Ferraz de antemão peço desculpas pois digitei "Fernanda" no outro post quando era "Isadora" , mas creio que achei a solução, reanalisando o código eu observei que fiz uma tempestade dentro de um copo d'água pois, declarando a variável frequência como int16 o código que antes estava: frequencia=((float)1/(ss-ps)); pode ser substituído por : frequencia= 1000000/tempo; dai a saída fica : printf(lcd_putc, "Freq. %lu HZ",frequencia); dando o resultado correto da frequência e utilizando 8% da memoria Muito obrigado pela ajuda. .
  7. Obrigado pelas dicas Fernanda, vou corrigir o programa.
  8. Olá amigos do Clube do Hardware, estou desenvolvendo um pequeno projeto para realizar a leitura de frequência por meio do modulo CCP e de um LCD, utilizando o PIC 16f877a, no layout que montei no ISIS uma label HDL gera um pulso de 5000us(2500us em nivel baixo e 2500us em nivel alto) na entrada ccp1 do microcontrolador, o microcontrolador esta configurado para setar o registrador CCP_1 a cada quatro bordas de subida. O problema com qual me deparei é na hora de mostrar o valor da frequência no LCD, o período apareceu sem problema algum, mas a frequência apresenta 0 . O código que estou utilizando no CCS é o seguinte : #include <16f877a.h> #fuses NOWDT, PUT, NOLVP #use delay(clock=4000000) #include <lcd.c> unsigned int16 ps=0; //Guarda a leitura da primeira comparação com 4 pulsos de subida unsigned int16 ss=0; //Guarda a leitura da segunda comparação com 4 pulsos de subida int1 pulso=0; //Controla em que momento acontece a captura int1 trocapulso=0; //Utilizada para visualizaão do periodo que esta na variavel tempo #INT_CCP1 void CCP1_isr(void) { if(pulso==0) //Primeira captura { ps=CCP_1; //O valor da primeira captura é guardado em ps pulso=1; //Muda para captura depois de 4 bordas de subida }else { ss=CCP_1; //A segunda captura depois de 4 bordas de subida é guardada em ss pulso=0; //Muda para 0 para poder realizar uma primeira leitura if(trocapulso==0) //Quando realiza a segunda captura depois de 4 bordas de subida { //Troca-se o valor desta variavel auxiliar trocapulso=1; //Para utilizar na visualização do valor do periodo da onda quadrada } } } void main() { unsigned int16 tempo=0;//Variavel que guardara diferença de tempo entre SS e PS int frequencia; setup_timer_2(T2_DIV_BY_4,255,1); // tmr2 com prescaler de 4 contagem até 255 e potscaler 1:1(255 , 1) setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_ccp1(CCP_CAPTURE_DIV_4); //Modo ccp1 4 bordas de subida enable_interrupts(INT_CCP1); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); lcd_init(); set_timer1(0); while(true) { if(trocapulso==1) { disable_interrupts(GLOBAL); //Desabilita as interrupções para ler valor no LCD tempo=(ss-ps); //Tempo recebe ss-ps que são os valores capturados nas interrupções tempo=tempo/4; lcd_gotoxy(1,1); delay_us(40); printf(lcd_putc,"Periodo %lu us",tempo); // A variavel tempo se divide em 4 porque se passaram 4 peridos no processo de captura delay_ms(100); frequencia=((float)1/(ss-ps)); lcd_gotoxy(2,2); printf(lcd_putc,"Freq. %d HZ",frequencia); delay_us(40); trocapulso=0; //Muda o valor da variavel para obter novas capturas enable_interrupts(GLOBAL); // Uma vez visto o periodo no lcd ativa-se as interrupções } } } Estou anexando uma imagem do ISIS. Se puderem me ajudar a solucionar aonde estou errando é como, eu ficarei muito agradecido.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...