Ir ao conteúdo
  • Cadastre-se

Thiago Felipe Soares Gonçalves

Membro Pleno
  • Posts

    82
  • Cadastrado em

  • Última visita

posts postados por Thiago Felipe Soares Gonçalves

  1. Boa noite, estou com o seguinte problema eu tenho uma variável tipo float, porém preciso transformar ela para int e depois para hexadecimal com 16 bit separando os 8 bits mais significativos dos 8 bit menos significativos.

     

    O que quero fazer é uma interrupção pelo Timer1 com base num tempo calculado pelo meu programa dentro do main.

     

            float T1 = 0.00;                               // Variável de tempo

            T1 = (rad*8333.33)/3.14;                // Calcula o tempo de espera para o chaveamento

     

    Com base no tempo calculado em T1 preciso transformá-lo em um inteiro que seria o tempo em micro segundos arredondado para então transformá-lo em hexadecimal com 16 bits separando os 8 bits mais significativos dos 8 bits menos significativos para então armazená-los em.

     

            TMR1H = 0xEF;
            TMR1L = 0xB9;

     

    Espero que possam me ajudar a resolver esse problema, agradeço muito atenção.

  2. Opa realmente estava invertido, porém ainda faltava configurar os registradores corretamente, segue o código:

     

    void Interrupt()
    {
        if (TMR1IF_bit)
        {
           TMR1IF_bit = 0x00;
           TMR1H = 0x0B;
           TMR1L = 0xDC;


           RC3_bit = ~RC3_bit;
        }
    }

    void main()
    {
        CMCON0 = 0x07;
        T1CON = 0x31;
        INTCON = 0xC0;


        TMR1IF_bit = 0x00;
        TMR1H = 0x0B;
        TMR1L = 0xDC;
        TMR1IE_bit = 0x01;

     

        TRISC = 0x00;
        RC3_bit = 0x00;
        RC4_bit = 0x00;
      
        while(1)
        {
           RC4_bit = 0x01;
           delay_ms(1000);
           RC4_bit = 0x00;
           delay_ms(1000);
        }
    }

     

    Obrigado pela ajuda.

  3. Boa Tarde, estou com o seguinte problema estou tentando fazer uma interrupção por timer1 que conta até 500 ms. O código não funciona, mas não consigo achar o erro. Segue ele:

     

    void interrup()
    {
        if(TMR1IF_bit)
        {
            TMR1IF_bit = 0x00;
            TMR1L = 0x0B;
            TMR1H = 0xDC;
            RC4_bit = ~RC4_bit;
        }
    }

    void main() 
    {
        CMCON0 = 0x07;
        CMCON1 = 0x02;
        
        INTCON = 0xC0;
        TMR1IE_bit = 0x00;
        
        TMR1L = 0x0B;
        TMR1H = 0xDC;
        T1CON = 0b00110001;
        
        TRISC = 0x00;
        RC3_bit = 0x00;
        RC4_bit = 0x00;
        
        while(1)
        {
            RC3_bit = 0x01;
            delay_ms(1000);
            RC3_bit = 0x00;
            delay_ms(1000);
        }
    }

     

    Na simulação ele não inverte o estado do pino RC4.

     

     

  4. Realmente, colocando o valor numérico do canal que quero usar, funcionou o código ficou assim:

     

    #define LED1 PORTC.F2
    #define LED2 PORTC.F3
    #define LED3 PORTC.F4

    int AD = 0;
    int AD2 = 0;

    void main() 
    {

        CMCON0 = 0x07;
        ADCON1 = 0x00;

        TRISA = 0xFF;
        TRISC = 0x00;
        
        ANSEL = 0x03;

        PORTA = 0x00;
        PORTC = 0x00;
        
        while(1)
        {
            LED3 = 0x00;
            delay_ms(500);
            
            ADCON0 = 0x01;              // Habilita o canal AN0
            delay_us(100);                  // Tempo necessario para set o canal
            AD = ADC_Read(0);         // Lê a porta analogica AN0

            ADCON0 = 0x05;              // Habilita o canal AN1
            delay_us(100);                  // Tempo necessario para set o canal
            AD2 = ADC_Read(1);       // Lê a porta analogica AN1

            if(AD >= 512)
            {
                LED1 = 0x01;
            }
            else
            {
                LED1 = 0x00;
            }
            if(AD2 >= 512)
            {
                LED2 = 0x01;
            }
            else
            {
                LED2 = 0x00;
            }
            
            LED3 = 0x01;
            delay_ms(500);
        }
    }

  5. Estou tentando ler o sinal de dois sensores cada um em uns dos canais do PIC16F688, usando as entradas analógicas AN0 e AN1, segue o código.

     

    #define POT PORTA.F0
    #define SENSOR PORTA.F1
    #define LED1 PORTC.F2
    #define LED2 PORTC.F3
    #define LED3 PORTC.F4

    int AD = 0;
    int AD2 = 0;

    void main() 
    {
        ANSEL = 0x03;
        CMCON0 = 0x07;

        TRISA = 0xFF;
        TRISC = 0x00;

        PORTA = 0x00;
        PORTC = 0x00;
        
        while(1)
        {
            LED3 = 0x00;
            delay_ms(500);
            
            ADCON0 = 0x01;
            AD = ADC_Read(POT);
            delay_ms(100);

     

            ADCON0 = 0x05;
            AD2 = ADC_Read(SENSOR);
            delay_ms(100);

     

            if(AD >= 512)
            {
                LED1 = 0x01;
            }
            else
            {
                LED1 = 0x00;
            }
            if(AD2 >= 512)
            {
                LED2 = 0x01;
            }
            else
            {
                LED2 = 0x00;
            }
            
            LED3 = 0x01;
            delay_ms(500);
        }
    }

     

    A ideia é simples, ele deveria ler os dois sensores comparar os valores de AD e AD2 nos ifs e acender o LED referente aquele sensor. O que acontece na simulação o AD do POT acende os dois LEDs e o AD2 do SENSOR não funciona.

  6. Depois de ler mais a fundo o datasheet descobri que é necessário configurar as flags do registrado ANSEL para 0x00. O código fica assim:

     

    bit control;

     

    void interrupt()
    {
       if(INTF_bit)
       {
           control = ~control;
           INTF_bit = 0x00;

           if(control) RC1_bit = 0x01;
           else RC1_bit = 0x00;
       }
    }

     

    void main()
    {
       CMCON0 = 0x07;
       ANSEL = 0x00;

     

       GIE_bit = 0x01;
       INTE_bit = 0x01;
       INTEDG_bit = 0x00;

     

       TRISA = 0b00000100;
       TRISC = 0b00000000;


       PORTA = 0b00000100;
       PORTC = 0b00000000;

     

       control = 0x00;

     

       while(1)
       {
          RC0_bit = 0x01;
          delay_ms (2000);
          RC0_bit = 0x00;
          delay_ms (2000);
       }
    }

     

  7. Estou com um problema ao tentar fazer uma interrupção externa no PIC16F688, segue o codigo:

     

    bit control;

    void interrupt()
    {
       if(INTF_bit)
       {
           control = ~control;
           INTF_bit = 0x00;
           
           if(control) RC1_bit = 0x01;
           else RC1_bit = 0x00;
       }
    }

    void main() 
    {
       CMCON0 = 0x00;
       CMCON1 = 0x00;
       
       INTCON = 0b11010000;
       
       INTEDG_bit = 0x00;
       
       TRISA = 0b00000100;
       TRISC = 0x00;
       PORTA = 0b00000100;
       PORTC = 0x00;
       
       control = 0x00;
       
       while(1)
       {
          RC0_bit = 0x01;
          delay_ms (2000);
          RC0_bit = 0x00;
          delay_ms (2000);
       }
    }

     

    Tentei simular no Proteus mas não funcionou. A ideia é um led acender e apagar com delay de 2 segundos e ao aperta o botão que esta no pino RA2/INT ele deveria acender o segundo led e ao pressionar novamente apagar-lo. porém não funciona o cogido para o PIC16F688, mas para o PIC16F648 funcionou direito.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!