Ir ao conteúdo
  • Cadastre-se

Lucas Pereira de Souza

Membro Pleno
  • Posts

    78
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. O post de Lucas Pereira de Souza em calcular defasagem de sinal no pic18f4550 foi marcado como solução   
    No fim consegui fazer  a leitura do sinal, utilizei o modo ccp em borda de subida de borda de descida, sendo assim o timer1 armazena o tempo do pulso na interrupção do modulo ccp, veja:
    void interrupt()
    {
      //BORDA DE DESCIDA
      if(CCP1IF_bit == 1 &&  CCP1M0_bit == 1 && CCP1M1_bit == 0 && CCP1M2_bit == 1 && CCP1M3_bit == 0)
      {
      CCP1IF_bit = 0;    // LIMPAR FLAG DE INTERRUPCÃO
      CCP1IE_bit = 0;    // DESABILITAR INTERRUPCÃO
     
      CCP1M0_bit = 0;    // CCP MODO DE EM BORDA DE DESCIDA
      CCP1M1_bit = 0;
      CCP1M2_bit = 1;
      CCP1M3_bit = 0;
     
      CCP1IE_bit = 1;    // HABILITAR INTERRUPCÃO
     
      TMR1H  = 0x00;
      TMR1L  = 0x00;
      TMR1ON_bit = 1;    // LIGAR O TIMER1
      }
      //BORDA DE SUBIDA
      else if(CCP1IF_bit == 1 && CCP1M0_bit == 0 && CCP1M1_bit == 0 && CCP1M2_bit == 1 && CCP1M3_bit == 0)
      {
       CCP1IF_bit = 0;    // LIMPAR FLAG DE INTERRUPCÃO
       TMR1ON_bit = 0;    // TIMER1 DESLIGADO
       CCP1IE_bit = 0;    // DESABILITA INTERRUPCÃO
       CCP1M0_bit = 1;    // CCP MODO DE EM BORDA DE SUBIDA
       CCP1M1_bit = 0;
       CCP1M2_bit = 1;
       CCP1M3_bit = 0;
       
       CCP1IE_bit = 1;    // HABILITA INTERRUPCÃO
       
       tempo_H = CCPR1H;
       tempo_L = CCPR1L;
      }
  2. O post de Lucas Pereira de Souza em Ajude em circuito impresso foi marcado como solução   
    Maravilha camarada, não conhecia essa placa de composite valeu pela dica.
  3. O post de Lucas Pereira de Souza em Conversor AD com PIC16F676 foi marcado como solução   
    aí valeu por tentar ajudar eu,
     
    Fiquei se matando aqui até conseguir puts alegria consegui configurar o conversor AD, quando eu terminar o projetinho do voltimetro vou postar ele no forum para a galera ver veja como o código ficou polido agora:
     
    // Voltimetro de Bancada digital
    // Autor: Lucas Pereira de Souza Pinto   DATA: 21/04/2015
    // Projeto com crystal de 20mhZ
    // TOSC = 1/FOSC
    // FOSC: Frequêcia do oscilador
    // TOSC: Oscilador interno
    // Formula para o timer  Tempo_requerido = (4)*[(1)/(FOSC)]*Prescaler*(8bits_our_16bits - Carga_do_timer)
    // Cálculos para este projeto
    // Ciclo de maquina = (1/20mhZ)*4 = 200*10^-9S ou 0,2uS//200uS
    // 500000*10^-6 = (0,2*10^-6)*(8)*(65536 - Q)
    //Include
    #include <stdio.h>
    #include <stdlib.h>
    #include <pic16f676.h>
    //#include <xc.h>
    #define _XTAL_FREQ 20000000         // cristal de 20 Mhz
    //#define delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
    //define delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

    //CONFIG
    #pragma config FOSC = HS            // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
    #pragma config WDTE = OFF           // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = OFF          // Power-up Timer Enable bit (PWRT disabled)
    #pragma config MCLRE = OFF          // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR)
    #pragma config BOREN = OFF          // Brown-out Detect Enable bit (BOD disabled)
    #pragma config CP = OFF             // Code Protection bit (Program Memory code protection is disabled)
    #pragma config CPD = OFF            // Data Code Protection bit (Data memory code protection is disabled)
    //Definições
    #define A       PORTCbits.RC0
    #define B       PORTCbits.RC1
    #define C       PORTCbits.RC2
    #define D       PORTCbits.RC3
    #define Q1      PORTCbits.RC4
    #define LED     PORTCbits.RC5
    //Protótipos de Funções
    void bank(char num);                     //Protótipo da função do banco para acesso do banco da memória
    void delay_mS_125();                     //Protótipo da função Timer1 125mS
    void delay_ms_5();                       //Protótipo da função Timer1 5mS
    void delay_ms_1();                       //Protótipo da função Timer1 1mS
    void pic_init();                         //Protótipo para iniciar o pic
    void config_AD();                        //Protótipo para configurar conversor AD
    int  read_AD();                          //Protótipo para conversão AD
    void Dysplay_7_segmentos(char digito);   //Protótipo para display 7 Segmentos
    void interrupt  interrup(void)           // Vetor nterrupção
    {
    }
    int main()
    {
        pic_init();                         //START PIC
        config_AD();                        //CONFIG AD
        float var = 0;                     //VARIAVEl GLOBAL
        while(1)
        {   
            var = ((float)read_AD());
            var = var*5;
            var = var/1023;
            if(var > 2.5)
            {
                LED = 1;
            }
            else
            {
                LED = 0;
            }
        }//End_while
    }//End_main
    //Trabalhos das funções
    void delay_mS_125()
    {
           //start
           TMR1H = 0x31;                   //Timer 1 para 125mS
           TMR1L = 0x2D;
           T1CONbits.TMR1ON = 1;
           while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
           T1CONbits.TMR1ON = 0;
           PIR1bits.TMR1IF = 0;
           PIR1bits.T1IF = 0;
           TMR1H = 0x00;
           TMR1L = 0x00;
    }
    void delay_ms_5()
    {
           //start
           TMR1H = 0xF3;                   //Timer 1 para 5mS
           TMR1L = 0xCA;
           T1CONbits.TMR1ON = 1;
           while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
           T1CONbits.TMR1ON = 0;
           PIR1bits.TMR1IF = 0;
           PIR1bits.T1IF = 0;
           TMR1H = 0x00;
           TMR1L = 0x00;
    }
    void delay_ms_1()
    {
           //start
           TMR1H = 0xFF;                   //Timer 1 para 5mS
           TMR1L = 0xC1;
           T1CONbits.TMR1ON = 1;
           while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
           T1CONbits.TMR1ON = 0;
           PIR1bits.TMR1IF = 0;
           PIR1bits.T1IF = 0;
           TMR1H = 0x00;
           TMR1L = 0x00;
    }
    void pic_init()
    {
            CMCON = 0b00000111;             //Desliga todos os comparadores
            bank(1);                        //Seleciona banco 1 da memória
            TRISA = 0b00000001;             //RA0 como entrada e as demais como saída
            TRISC = 0x00;                   //PORTC todos como saída
            bank(0);                        //Seleciona banco 0 da memória
            //TIMER1
            INTCONbits.GIE = 1;             //GIE:Global Habilitar Interrupção global
            INTCONbits.PEIE = 1;            //Habilitar Interrupção periférico
            //PIE1 ? PERIPHERAL INTERRUPT ENABLE REGISTER 1 (ADDRESS: 8Ch)
            PIE1bits.TMR1IE = 0;            //TMR1 Desabilitar estouro do Timer1
            PIE1bits.T1IE = 0;
            //PIR1 ? PERIPHERAL INTERRUPT REGISTER 1 (ADDRESS: 0Ch)
            PIR1bits.TMR1IF = 0;            //TMR1IF: TMR1 Flag de estouro
            PIR1bits.T1IF = 0;
            //T1CON ? TIMER1 CONTROL REGISTER (ADDRESS: 10h)
            T1CONbits.T1CKPS0 = 1;          //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
            T1CONbits.T1CKPS1 = 1;          //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
            T1CONbits.TMR1CS = 0;           //TMR1CS: Timer1 Clock Source Select bit
            T1CONbits.TMR1ON = 0;           //TIMER 1 DESABILITADO
            T1CONbits.TMR1ON = 0;           //TIMER 1 OFF
    }
    void Dysplay_7_segmentos(char digito)
    {
        switch(digito)
        {
            case 0://escreve 0
                A=0;B=0;C=0;D=0;
                break;
            case 1://escreve 1
                A=1;B=0;C=0;D=0;
                break;
            case 2://escreve 2
                A=0;B=1;C=0;D=0;
                break;
            case 3://escreve 3
                A=1;B=1;C=0;D=0;
                break;
            case 4://escreve 4
                A=0;B=0;C=1;D=0;
                break;
            case 5://escreve 5
                A=1;B=0;C=1;D=0;
                break;
            case 6://escreve 6
                A=0;B=1;C=1;D=0;
                break;
            case 7://escreve 7
                A=1;B=1;C=1;D=0;
                break;
            case 8://escreve 8
                A=0;B=0;C=0;D=1;
                break;
            case 9://escreve 9
                A=1;B=0;C=0;D=1;
                break;
        }
    }
    void bank(char num)
    {
        //Banco 0
        if(num == 0)
        {
            STATUSbits.RP0 = 0;
        }
        //Banco 1
        else if(num == 1)
        {
            STATUSbits.RP0 = 1;
        }
    }
    void config_AD()
    {
        //CONFIGURAÇÃO DO REGISTRADOR ADCON0
        ADCON0bits.ADFM = 1;        //Justificar resultado para direita
        ADCON0bits.VCFG = 0;  //Tensão de referência do pic padrão 5V
        ADCON0bits.CHS0 = 0; //Seleção do canal (AN0)
        ADCON0bits.CHS1 = 0; //Seleção do canal (AN0)
        ADCON0bits.CHS2 = 0; //Seleção do canal (AN0)
        ADCON0bits.ADON = 1; //Conversor Analógico - Digital ligado
        //CONFIGURAÇÃO DO REGISTRADOR ADCON1
        ADCON1bits.ADCS0 = 1; //Clock do conversor analógico digital FOSC/8
        ADCON1bits.ADCS1 = 0; //Clock do conversor analógico digital FOSC/8
        ADCON1bits.ADCS2 = 0; //Clock do conversor analógico digital FOSC/8
        //CONFIGURAÇÃO DO REGISTRADOR ANSEL
        ANSELbits.ANS0 = 1;     //Apenas RA0 como analógica
        ANSELbits.ANS1 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS2 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS3 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS4 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS5 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS6 = 0;     //Apenas RA0 como analógica
        ANSELbits.ANS7 = 0;     //Apenas RA0 como analógica
        //CONFIGURAÇÃO DO REGISTRADOR PIE1
        PIE1bits.ADIE = 0;      //Interrupçao do para conversor A/D desligado
        //CONFIGURAÇÃO DO REGISTRADOR PIR1
        PIR1bits.ADIF = 0;      //Flag de interrupção para conversor A/D, limpa por software  
    }
    int read_AD()
    {
        int result_AD;                              //Declaração variavel local
        ADCON0bits.GO = 1;                          //Inicia conversão
        while(ADCON0bits.GO);                       //aguarda conversão
        delay_ms_1();                               //delay_1ms
        result_AD = (((int)ADRESH)<<8)|(ADRESL);    //Obtem o valor da conversão
        return result_AD;                           //Retorna para result_AD
    }

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!