Ir ao conteúdo
  • Cadastre-se

Joao Fabri

Membro Pleno
  • Posts

    24
  • Cadastrado em

  • Última visita

posts postados por Joao Fabri

  1. Estou realizando um projeto de conversão AD em que utilizo o RA0 como entrada analogica, porém ao compilar apresenta erro ''unresolved exter 'ADC_Ready'" na linha 0 do codigo fonte...

     

    Alguem pode me ajudar ?

     


    unsigned int valorad = 0;                             // variavel para leitura AD

    unsigned int ADC_Ready (unsigned short )  ;
    void main() 
    {
         ADCON0 = 0b01000000;
         ADCON1 = 0b10000000;
         ANSELH = 0x00;
         ANSEL  = 0x01;
         TRISA  = 0b00001111;
         TRISB  = 0x00;
         TRISC  = 0x00;
         PORTB  = 0x00;
         PORTC  = 0b00001000;
         ANSELH = 0xFF;
         ADC_Init () ;
         while (1)
         {
             Delay_ms(5);
             ADC_Get_Sample(0);
             ADC_Ready (0);
             valorad = ADC_Ready (0) ;
             PORTB = valorad;

         }
         
    }

  2. Boa Noite, desenvolvi um código para quando determinado botão for acionado os LEDS ligados ao PORTB serão acionados de uma sequencia diferente.. o codigo compila e funciona quando gravado no PIC, porém ao desligar a alimentação e ligar novamente o programa foi apagado e não funciona mais nada... Só resolve regravando e assim vai... O que poderia ser ? Segue programa comentado..

     

    #define B1 RA3_bit
    #define B2 RA4_bit
    #define B3 RA5_bit
    #define B4 RE3_bit
    #define LED1 RB0_bit
    #define LED2 RB1_bit
    #define LED3 RB2_bit
    #define LED4 RB3_bit
    #define LED5 RB4_bit
    #define LED6 RB5_bit
    #define LED7 RB6_bit
    #define LED8 RB7_bit

    void interrupt ()                             // função de interrupção
    {
     if (T0IF_bit)                                // Testa Flag estouro TMR0
     {
      T0IF_bit = 0x00;                            // Limpa flag
      TMR0     = 0x69;                            // Reenicia TMR0

      if (B1 == 0)                                // Se B1 for pressionado segue a sequencia de funcionamento
      {                                           // dos leds
       Delay_us (40);
       LED8   = 1;
       Delay_ms(100);
       LED7   = 1;
       Delay_ms(100);
       LED6   = 1;
       Delay_ms(100);
       LED5   = 1;
       Delay_ms(100);
       LED4   = 1;
       Delay_ms(100);
       LED3   = 1;
       Delay_ms(100);
       LED2   = 1;
       Delay_ms(100);
       LED1   = 1;
       Delay_ms(100);
       PORTB  = 0x00;
       }
         if (B2 == 0)                             // Se B2 foi pressionado segue sequencia
      {                                           // de funcionamento dos leds
       Delay_us (40);
       LED1   = 1;
       Delay_ms(100);
       LED2   = 1;
       Delay_ms(100);
       LED3   = 1;
       Delay_ms(100);
       LED4   = 1;
       Delay_ms(100);
       LED5   = 1;
       Delay_ms(100);
       LED6   = 1;
       Delay_ms(100);
       LED7   = 1;
       Delay_ms(100);
       LED8   = 1;
       Delay_ms(100);
       PORTB  = 0x00;
       }
            if (B3 == 0)                         // Se B3 foi pressionado segue a sequencia
      {                                          // de funcionamento dos leds
       Delay_us (40);
       LED5   = 1;
       Delay_ms(100);
       LED4  = 1;
       Delay_ms(100);
       LED6   = 1;
       Delay_ms(100);
       LED3   = 1;
       Delay_ms(100);
       LED7   = 1;
       Delay_ms(100);
       LED2   = 1;
       Delay_ms(100);
       LED8   = 1;
       Delay_ms(100);
       LED1   = 1;
       Delay_ms(100);
       PORTB  = 0x00;
       }
           if (B4 == 0)                        // Se B4 foi pressionado segue sequencia
     {                                         // de funcionamento dos leds
     PORTB = 0xFF;
     Delay_ms(500);
     PORTB = 0x00;
     Delay_ms(500);
     }

     else  PORTB = 0x00;

     }
    }


    void main()
    {
    OPTION_REG    =  0b00001110;                    // TMR0, Prescaller 1:128
    GIE_bit       =  0x01;                          // Habilita interrupção geral
    PEIE_bit      =  0x01;                          // Habilita interrupção por perifericos internos
    T0IE_bit      =  0x01;                          // Habilita interrupção por estouro TMR0
    TMR0          =  0x69;                          // Inicia TMR0 para contagem de 150 (tempo de estouro 20ms)
    ANSEL         =  0x00;                          // todas como pinos digitais
    ANSELH        =  0x00;                          // todos como pinos digitais
    TRISB         =  0x00;
    TRISA         =  0b00111000;
    TRISE.RE3     =  0x01;
    TRISC.RC3     =  0x00;
    PORTA         =  0b00111000;
    PORTB         =  0x00;
    RC3_bit       =  0x01;
    RE3_bit       =  0x01;


    while (1)
    {
      PORTB = 0xFF;                               // enquanto nada acontece todos os LEDS ficam acesos
    }
    }

     

    adicionado 1 minuto depois

    Segue os fusesbits 

    fuses.png

  3. Boa noite, estou gerando um código com o seguinte funcionamento:

    Se minhas três entradas (Segurança, Pressostato, Gatilho) estiverem acionados.

    Quando os três forem acionados, deve ligar relê 1 e relê 2.

    Ao passar um tempo de no máximo 2 segundos o relê 3 deve entrar também.

    Qualquer um das três entradas que saírem os relês devem cair.

    Se segurança estiver despressionado ascende um led indicativo.

    Se pressostato estiver despressionado ascende um led indicativo.

    ***********************************************************

    A logica esta funcionando mas porém estou com muitos atrasos no codigo, os tempos não estão conforme os programados, alguem teria uma dica para melhorar meu código ???

    Segue código comentado:

    #define Gatilho RA0_bit
    #define segurança RA1_bit
    #define Pressostato RA2_bit
    #define rele1 RB0_bit
    #define rele2 RB1_bit
    #define rele3 RB2_bit
    #define led1 RB3_bit
    #define led2 RB4_bit
    #define led3 RB5_bit

    void funcionamento (void);              // função que aciona os reles
    void interrupt ()                       // rotina de interrupção
    {
         if (T0IF_bit)                      // Se houve estouro do TMR0
         {
          T0IF_bit = 0x00;                  // limpa flag
          TMR0     = 0x96;                  // Reinicia TMR0
          funcionamento ();                 // chama função dos relês

         }
    }

    void main()
    {
    unsigned char aux = 0;                  // variavel auxiliar

    OPTION_REG = 0b10001110;                // Desabilita resistor pullup, prescaller 1:128
    GIE_bit    = 0x01;                      // Liga interrupção global
    PEIE_bit   = 0x01;                      // Habilita interrupção por perifericos internos
    T0IE_bit   = 0x01;                      // Habilita interrupção por estouro do tmr0

    TMR0       = 0x96;                      // Inicia tmr0

    ANSEL   = 0x00;                         // todos pinos como digitais
    ANSELH  = 0x00;                         // todos os pinos como digitais
    TRISA   = 0xFF;
    TRISB   = 0x00;
    PORTA   = 0xFF;
    PORTB   = 0x00;

    }

    void funcionamento ()                    // função acionamento dos reles
    {

    unsigned char sett = 0;                  // variavel auxiliar

    if (Pressostato == 1)                    // Se pressostato estiver aberto
    {
     led1 = 1;                               // ascende led1
    }
    else 
    {
    led1 = 0;
    }

    if (segurança ==  1)                   // Se segurança estiver aberto
    {
     led2 = 1;                             // ascende led2
    }
     else 
     {
     led2 = 0;
     }


    if (Gatilho == 0 && segurança == 0 && Pressostato == 0)     // Se todos estiverem pressionados
            {

               rele1 = 1;
               rele2 = 1;
               sett  = 1;
            }
            if (sett == 1 )
            {
            sett  = 0;
            Delay_ms (200);
            rele3 = 1;

            }

          else if  (Gatilho == 1 || segurança == 1 || Pressostato == 1)
          {

          rele1 = 0;
          rele2 = 0;
          rele3 = 0;
          }


    }

     

  4. Bom dia, estou elaborando um código com o PIC 16f883, o código consiste em gerar um PWM no pino CCP1 de 5Khz e com duty cicle incrementado através de BOT1 e BOT2, porém na simulação do protheus nada ocorre, estou tendo um problema com esse mic em desabilitar os comparadores internos, mas não sei se isso interfere em algo nesse codigo. Segue código comentado....

     

     

    #define BOT1 RE3_bit
    #define BOT2 RA3_bit
    #define BOT3 RA4_bit
    #define BOT4 RA5_bit

    unsigned short duty1;


    void main() 
    {

         TRISE.RE3   = 0x01;                             // RE3 como entrada
         TRISA       = 0b00111000;                       // RA3,RA4,RA5 como entrada
         TRISC       = 0x00;                             // Todo PORTC como saida
         PORTE       = 0b00001000;                       // Inicializa RE3 em 1
         PORTA       = 0b00111000;                       // Inicializa os botoem em 1
         PORTC       = 0x00;
         
         PWM1_Init(5000);                                // Inicializa PWM1 com frequencia de 5Khz
         PWM1_Start();                                   // Inicializa PWM1
         PWM1_Set_duty (duty1);                          // Seta o duty cicle com o valor da variavel duty1
         while(1)
    {
         if (BOT1 == 0)                                      // Testa se B1 foi pressionado
         {
          duty1 ++;                                      // Se sim, incrementa duty cicle pwm1
          }
         if (BOT2 == 0)                                      // Testa de B2 foi pressionado
         {
         duty1 --;                                       // Se sim, decrementa duty cicle pwm1
         }

    } // and while


    } // anda main

    adicionado 2 minutos depois

    Segue os Fuses bits

    fuses.png

  5. @Bommu Perneta nossa é verdade, e no meu hardware sem querer eu estava usando o pino G do display no pino RB7 invés de RB6 por isso não ascendia... Cara agora eu tenho uma outra duvida sobre esse meu mic, eu acompanho wr kits no youtube e la ele sempre desliga os comparadores qundo não vai usar através do comando CMCON = 0x07 mas quando vou tentar colocr isso no meu codigo ele da erro, sera que meu mic em questão usa um registrador diferente para tratar os compardores ?? Obrigado

  6. meu codigo esta assim agora, esta funcionando normalmente no protheus a cada pressionada do botão e incrementa um valor no display, porém o led que esta ligado ao pino RB7 nunca acende, este pino independente do de qualquer coisa so esta ficando em nivel baixo... Segue o codigo 

     

     

    #define B1 RE3_bit


     unsigned char catodo, cont = 0x00;       // variaveis auxiliares
     unsigned char segmento[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};   // vetor para display 7seg

     void interrupt ()
     {
     if (T0IF_bit)                                      // testa flag de estouro tmr0
     {
      T0IF_bit = 0;                                     // limpa flag
      TMR0 = 0x00;
      if (B1 == 0)
     {
       cont ++;
       Delay_ms(250);


     }                                    // inicia tmr0 em   160
     }
     }


     

    void main ()
    {
    OPTION_REG =   0b10000111;      // Desabilitando resistores de puldow, oscilador interno, prescaller 1:256
    TMR0  = 0x00;                   // inicia tmr0 em 0
    INTCON.GIE = 1;                 // habilita interrupçao global
    INTCON.PEIE = 1;                // habilita interrupçao por perifericos internos
    INTCON.T0IE = 1;                // habilita interrupçao por estouro timer 0


    TRISE = 0b00001000;
    TRISB = 0b00000000;
    PORTB = 0b00000000;
    PORTE = 0b00001000;
    ANSELH = 0;
     while (1)
    {

        catodo = segmento [cont];         // atribui o vetor segmento com o parametro cont há variavel catodo
        PORTB = catodo;
         if (cont > 9)                    // limite de contagem ate 9
        {
        cont = 0;
        }

    }
    }

  7. Bom dia, estou desenvolvendo um código para incrementar a contagem em um display de 7 segmentos a cada vez que o botão B1 for pressionado, para otimizar meu código eu decidi fazer a varredura dos botões através das interrupções, então em um tempo de aproximadamente 20ms eu testo meu botão B1 através do estouro do TMR0... porém como nunca é do jeito que a gente quer meu código não esta rodando perfeitamente no protheus, alguém sugeri o motivo ? Segue código comentado...

     

    unsigned char catodo, cont = 0x00;       // variaveis auxiliares
     unsigned char segmento[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};   // vetor para display 7seg

     void interrupt ()
     {
     if (T0IF_bit)                                      // testa flag de estouro tmr0
     {
      T0IF_bit = 0;                                     // limpa flag
      TMR0 = 0xA0;                                      // inicia tmr0 em   160

     if (B1 == 0)                                       // se b1 pressionado...
      {
      cont ++;                                          // cont ++
      Delay_ms(150);
      }
      }
      }


     

    void main ()
    {
    OPTION_REG =   0b10000110;      // Desabilitando resistores de puldow, oscilador interno, prescaller 1:256
    TMR0  = 0xA0;                   // inicia tmr0 160
    INTCON.GIE = 1;                 // habilita interrupçao global
    INTCON.PEIE = 1;                // habilita interrupçao por perifericos internos
    INTCON.T0IE = 1;                // habilita interrupçao por estouro timer 0


    TRISE = 0b00001000;
    TRISC = 0b00000000;
    TRISB = 0b00000000;
    PORTB = 0b00000000;
    PORTC = 0b00100000;
    PORTE = 0b00001000;

       while (1)
    {

        catodo = segmento [cont];         // atribui o vetor segmento com o parametro cont há variavel catodo
        PORTB = catodo;
         if (cont > 9)                    // limite de contagem ate 9
        {
        cont = 0;
        }

    }
    }

  8. @Bommu Perneta é esse codigo é da WR Kits, na ocasiao ele usa um 16f628a.. como eu adquiri uma placa para desenvolvimento que contem o 16f883 então preciso me familiarizar com ele... ele tem alguuns fusiveis que ainda n entendi mt bem... essa semana vou gerar mais alguns codigos para treino e se der algo errado de novo voce me socorre kkkkk

  9. @Bommu Perneta  caraca cara você salvou meu código !!!! Não foi bem uma cópia kkk eu entendi e compreendi tudo que contem nele... Então você matou a xarada, não era que o timer não estava estourando e sim que bit não estava invertendo.... espero um dia conseguir visualizar os defeitos no código assim tambem... Valeuuu

    adicionado 1 minuto depois

    @Bommu Perneta so não entendi porque não inverteu, na linguagem C o ~ inverte o valor do bit correto ?

  10. Boa tarde, estou desenvolvendo um código fonte no MICROC utilizando o microcntrolador PIC 16f883 e utilizando as interrupções do TIMER0 para mudar o estado de um pino a cada 1 segundo,  código esta compilando tudo normal mas ao simular no protheus ele apenas muda o estado uma vez e para.

    Fiz também um debbug e vi que o código quando chega no loop infinito o código não sai dali e nunca parte para a interrupção. Segue o código fonte comentado...

     

     

     int contador = 0x00;

     void interrupt ()
     {
        if (T0IF_bit)              // testa se houve estouro do TIMER 0
        {
           contador ++;
           TMR0     = 0x06;        // reinicia contagem do timer
           T0IF_bit = 0x00;        // limpa flag interrupçao
         }

     
     }  // and interrupt
     
     
    void main()
    {
       OPTION_REG = 0x81;             // Desabilita resistor pullup interno,
       GIE_bit    = 0x01;             // Liga interrupçao geral
       PEIE_bit   = 0x01;             // Habilita interrupçao por perifericos internos
       T0IE_bit   = 0x01;             // Habilita interrupçao pelo estouro do TIMER0

       TMR0       = 0x06;             // Inicializa o Timer 0 em 0
       TRISB.RB4  = 0x00;             // Configura RB4 como saida digital
       RB4_bit    = 0x00;             // inicializa RB4 em 0
       
       while(1)
       {
         if (contador == 1000)
         {
            RB4_bit =  ~ RB4_bit;     // inverte valor do bit
            contador = 0x00;          // zera a contagem
         
         }
       
       
       
       } // and while

       } // and main

  11. @albert_emule Boa noite!!

     

    Para ser mais exato preciso de uma fonte de alimentação em que eu consiga variar minha saída em um range de tensão de 0V até 110V com capacidade de até 2 Amperes.

    As cargas que serão testadas por estas fontes são Válvulas solenoide de 24V 42V; Contatores 24V, 42V, 110V e por ai vai, são apenas testes de bobinas dai a pouca necessidade de ser uma fonte de alta potencia.

    Minha ideia inicial era construir uma fonte desta usando a eletrônica puramente, porém com resposta do pessoal acredito que o uso de um bom e velho variac seja a melhor saída rsss

     

     

     

    adicionado 6 minutos depois

    @aphawk Boa noite!!

     

    Confesso ficou bem contraditório...

    Devido em nossa oficina ja ter uma fonte de faça esta variação de saída em um range de tensão de 0V até 110VAC, e por ela possuir um variac aonde as vezes não atende as necessidades quando as tensões exigidas são minimas próximas dos 10V,  por ela ser robusta e grande minha ideia inicial era a de construir uma fonte que faça esta mesma função porém puramente construída com a eletrônica.... porém com as respostas que deram percebi que um bom  circuito com um variac ainda é a melhor opção rssss

    • Curtir 1
  12. @Eletronortico  boa noite!!

     

    Trabalho com manutenção de maquinas de solda, e usamos a fonte para testar válvulas solenoides, contatores e etc...

    Creio eu que uma fonte de 0 a 110VAC por 2A já esta ótimo.

    Em relação ao variac a fonte que temos em nossa oficina é exatamente construída com variac, e por ser imprecisa e ser desameadamente grande queria desenvolver algo eletrônico...

    O que voce me sugere ?

     

    adicionado 2 minutos depois

    @cesardelta1 Boa noite !!

    A fonte que possuímos em nossa oficina possui um variac e por ser grande e as vezes imprecisa eu gostaria de desenvolver algo mais preciso e compacto.

    algo compacto mais eletrônico você tem alguma sugestão ??? 

  13. Boa noite !!

     

    Preciso desenvolver uma fonte de alimentação AC variável, encontrei muitos tópicos relacionados a fontes de alimentações para corrente continua, porém nao encontrei nada a respeito.
    Não é nada complexo apenas ser alimentado com 110VAC e regular estes 110VAC ....

     

    POR FAVOR ME AJUDEM!!!!!!

  14. @Isadora Ferraz joguei este código que você me mandou e nao rodou, minha duvida é porque na video aula que vi o professor usou esta função pronta para conversão AD no MicroC e não precisou chama-la previamente. Segue código fonte dele:

    ,

    #define D1 GPIO.F1
    #define D2 GPIO.F2
    #define D3 GPIO.F4
    #define D4 GPIO.F5

    int leitura = 0;

    void main()
    {
      ANSEL = 1;  // 0b00000001  Seleciona o AN0 como entrada analógica
      ADCON0 = 1; // Seleciona a entrada AN0
      CMCON = 7;
      
      TRISIO = 1; //GPIO.F0 seja uma entrada
      GPIO = 0;   //Inicia tudo em low
      
      while(1)
      {
        leitura = ADC_Read(0);
        
        if(leitura > 0)
        {
          D1 = 0;
          D2 = 0;
          D3 = 0;
          D4 = 0;
        }
        if(leitura > 204)
        {
          D1 = 1;
          D2 = 0;
          D3 = 0;
          D4 = 0;
        }
        if(leitura > 408)
        {
          D1 = 1;
          D2 = 1;
          D3 = 0;
          D4 = 0;
        }
        if(leitura > 612)
        {
          D1 = 1;
          D2 = 1;
          D3 = 1;
          D4 = 0;
        }
        if(leitura > 816)
        {
          D1 = 1;
          D2 = 1;
          D3 = 1;
          D4 = 1;
        }
      
         delay_ms(100); //taxa de atualização do ADC
      } //end while

    } //end main

  15. Boa Noite!

     

    Estou tentando realizar uma conversão AD com o PIC12F675,  usando o compilador MICROC for PIC. porém estou tentando compilar e está apresentando o seguinte erro: 

     

     

    ............................Undeclared identifier 'Adc_Read' in expression .........................

     

    O programa deveria acender 4 leds sequencialmente ao variar a tensão no pino GPIO.F0

     

     Alguém me ajuda a solucionar este erro ??????

     

     

    Segue código fonte:

    #define L1 GPIO.F1
    #define L2 GPIO.F2
    #define L3 GPIO.F4
    #define L4 GPIO.F5
    #define S1 GPIO.F0

    unsigned int leitura = 0;

    void main()

    {
    ANSEL = 0b00000001;
    ADCON0= 0b00000001;
    CMCON = 7;
    TRISIO = 0b00000001;
    GPIO = 0;

    while (1)
    {
          leitura = ADC_Read(0);

    if (leitura > 0)
    L1 = 1;
    L2 = 0;
    L3 = 0;
    L4 = 0;

    if (leitura > 255)
    L1 = 1;
    L2 = 1;
    L3 = 0;
    L4 = 0;

    if (leitura > 510)
    L1 = 1;
    L2 = 1;
    L3 = 1;
    L4 = 0;

    if (leitura > 760)
    L1 = 1;
    L2 = 1;
    L3 = 1;
    L4 = 1;

    Delay_ms(100);
    }
    }

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!