Ir ao conteúdo
  • Cadastre-se

Iury Messias

Membro Júnior
  • Posts

    8
  • Cadastrado em

  • Última visita

posts postados por Iury Messias

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

     

     

    Circuito 2.png

    • Curtir 1
  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);
    }
    

     

    Circuito.png

    • Curtir 1
  3. 7 horas atrás, Isadora Ferraz disse:

    De fato se a proposta é gerar uma forma de onda quadrada com frequência variável em função do resultado do ad, , penso em algo minimalista assim...
     

    
    void interrupt()
    //{
    //if(T0IF_bit) //nem precisa quando se tem só uma interrupt
    {
    T0IF_bit = 0x00; TMR0 = 0x01;
    if(!--freq) GPIO.F1^=1;
    }
    //}

    e no loop
     

    
    for(;;) //ou while(1)
    {
    leitura = ADC_Read(0);
    freq=tabela[leitura/75];
    while(freq);//sincronizado com a interrupt
    }

     

    Mas isso é só pra quando fosse um mc tipo pic10F com 256 bytes e flash. No seu caso nem precisa pois o mc tem memória de sobra.

    Ah o 10f não tem ad? você é que pensa...

    adicionado 6 minutos depois

    ah sim. Acredite se quiser mas tem como reduzir ainda + beirando às raias de duas linhas de programa. Mas não quero lhe causar indigestão...

     

    Nossa... Show !!

     

    7 horas atrás, Isadora Ferraz disse:

    ah sim. Acredite se quiser mas tem como reduzir ainda + beirando às raias de duas linhas de programa. Mas não quero lhe causar indigestão...

    :D:D 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.

    12 horas atrás, Bommu Perneta disse:

    Enfim... melhore teu código...

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

     

    5 horas atrás, Isadora Ferraz disse:

    Estás a fazer um pianinho?

     

    Não, é um pulsador para eletro injetor automotivo.

     

    5 horas atrás, Isadora Ferraz disse:

    Tem como reduzir a parte da interrupt também mas to com preguiça de pensar agora

     

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

     

    protheus 2.png

    Protheus.png

  6. Isadora Ferraz de antemão peço desculpas pois digitei "Fernanda" no outro post quando era "Isadora" :D, 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 :D

     

    Muito obrigado pela ajuda.

     

    .

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

    ISIS.jpg

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!