Ir ao conteúdo
  • Cadastre-se

Código para gerar frequência de um 1Khz


Posts recomendados

Quero gerar uma frequência de 1 khz , porém ao simular no proteus tenho medido umafrequência de 14khz ao invés de uma de 1 khz!

 

 

 
#INCLUDE <16F628A.h>
#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOLVP                   
#FUSES NOCPD
#use fast_io( B)
 
#use delay(clock=4000000)
 
#int_TIMER1
 
 
void freqch_5(void)
   {
      set_timer1(65411 - get_timer1());
      
     
            output_toggle(PIN_B3);
         
   }
   
      void main()
        {
            set_tris_b(0b00000100);
            
            while(1)
               {
                  output_low (PIN_B3);
                  setup_timer_1 (T1_INTERNAL | T1_DIV_BY_4);   
                  set_timer1 (65411);   // SE ESSA LINHA SAIR TERÁ LGUM PROBLEMA  ?                        
                  enable_interrupts(INT_TIMER1);               
                  enable_interrupts(global);
                  
                        while(input(Pin_B2)==1)
                           {
                              freqch_5();
                            }
               }
        }
Link para o comentário
Compartilhar em outros sites

Foi um dos primeiros artigos que pesquisei na internet , mas com  o código acima não consegui gerar a frequência que desejo (1khz) , já pesuisei em vários lugares e nada me ajudou a resolver esse problema.

Agradeço a ajuda !

Gostaria de saber se tem algo errado no meu código?


Foi um dos primeiros artigos que pesquisei na internet , mas com  o código acima não consegui gerar a frequência que desejo (1khz) , já pesuisei em vários lugares e nada me ajudou a resolver esse problema.

Agradeço a ajuda !

Gostaria de saber se tem algo errado no meu código?

Link para o comentário
Compartilhar em outros sites

@fabiano aladin,o código abaixo gera 1KHZ,mas foi testado no Proteus.

O pino MCLR foi usado e ligado a nível lógico alto.

#INCLUDE <16F628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOPROTECT#FUSES NOLVP                   #FUSES NOCPD#FUSES NOMCLR #use fast_io( #use delay(clock=4000000) #int_TIMER1  void freqch_5(void)   {      set_timer1(65128 - get_timer1());                 output_toggle(PIN_B3);            }         void main()        {            setup_comparator(NC_NC_NC_NC);                    set_tris_b(0b00000100);            output_low(PIN_B3);             setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);               set_timer1 (65128);                                    enable_interrupts(INT_TIMER1);                           enable_interrupts(global);                        while(1)               {                }        }

 

Gostaria de saber se tem algo errado no meu código?

 

O trecho dentro do WHILE não é necessário pois a interrupção tem prioridade sobre a execução do programa,alem doque,voce deve inicializar o Hardware apenas uma vez no código que postou.

Link para o comentário
Compartilhar em outros sites

O que vém a ser a linha setup_comparator(nc_nc_nc_nc)?

obrigado pela ajuda ! 

onde posso buscar mais informações para eu poder gerar e entender como fazer  o que preciso?


O que vém a ser a linha setup_comparator(nc_nc_nc_nc)?

obrigado pela ajuda ! 

onde posso buscar mais informações para eu poder gerar e entender como fazer  o que preciso?

 

@fabiano aladin,o código abaixo gera 1KHZ,mas foi testado no Proteus.

O pino MCLR foi usado e ligado a nível lógico alto.

#INCLUDE <16F628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOPROTECT#FUSES NOLVP                   #FUSES NOCPD#FUSES NOMCLR #use fast_io( #use delay(clock=4000000) #int_TIMER1  void freqch_5(void)   {      set_timer1(65128 - get_timer1());                 output_toggle(PIN_B3);            }         void main()        {            setup_comparator(NC_NC_NC_NC);                    set_tris_b(0b00000100);            output_low(PIN_B3);             setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);               set_timer1 (65128);                                    enable_interrupts(INT_TIMER1);                           enable_interrupts(global);                        while(1)               {                }        }

O trecho dentro do WHILE não é necessário pois a interrupção tem prioridade sobre a execução do programa,alem doque,voce deve inicializar o Hardware apenas uma vez no código que postou.

 

O que vém a ser a linha setup_comparator(nc_nc_nc_nc)?

obrigado pela ajuda ! 

onde posso buscar mais informações para eu poder gerar e entender como fazer  o que preciso?

Link para o comentário
Compartilhar em outros sites

Aguarde o usuario @aphawk e @MatheusLPS pois eles sabem responder melhor doque eu detalhes de como inicar a programação de um modo geral e o @MatheusLPS utiliza bastante o compilador CCS e assim pode te dizer mais detalhes das diretrizes usados neste compilador,tipo setup_comparator(nc_nc_nc_nc),mas voce deve ler o datasheet do PIC que for usar,assim saberá inicializar melhor o micro.

Link para o comentário
Compartilhar em outros sites

pessoal muito obrigado pela ajuda , também descobri que seu colocar while(1){freqch_5()} minha frequencia vai para 5k , e se eu colocar if(input(pin_b2)==1){output_toggle(pin_b3)}, minha frequencia cai para 977hz , alguém sabe me explicar porque acontece isso?

e onde vejo como colocar comando para botões nesse código e permanecer a frequência sem cair?

e agradeço a ajuda de todos!

Link para o comentário
Compartilhar em outros sites

@fabiano aladin

 

Como o colega @vtrx, informou, a linha setup_comparator(nc_nc_nc_nc), desabilita os comparadores.

 

 

também descobri que seu colocar while(1){freqch_5()} minha frequencia vai para 5k 

 

Por que você deseja fazer isso?

 

A interrupção já está configurada. O timer1 já está no ponto para chamar essa rotina no tempo certo.

 

e se eu colocar if(input(pin_b2)==1){output_toggle(pin_b3)}, minha frequencia cai para 977hz , alguém sabe me explicar porque acontece isso?

 

Explique melhor qual a sua intenção. Seria apertar um botão e ele gerar a sinal no pino B3? E se você soltar o botão, ele parar de gerar o sinal?

 

Outra coisa, eu recomendaria você usar o gerador PWM desse PIC para gerar esse sinal. Ele consegue gerar com uma precisão maior.

 

EDIT:

 

Não gosto de usar o #use fast_io.

 

Contanto que você está 100% certo que seu código manipula os pinos de I/O nas direções de todas as portas que você usou o fast_io através do set_tris_b, você estará OK. MAS se você codificou errado um pino para entrada quando deveria ser uma saída (por exemplo, durante a 4 ª revisão do código.. tarde da noite) ou se decidiu trocar pinos de lugar durante o projeto do PCB, você terá uma boa perda de tempo, irá puxar seus cabelos modificando o código.
 
Deixe o compilador lidar com a direção das portas, ele faz isso de forma automática. É uma coisa a menos a se preocupar. O resultado na execução usando o fast_io torna o programa ligeiramente mais rápido e ocupa pouco menos espaço, mas você pode não se beneficiar tanto dele.

 

Falou

Link para o comentário
Compartilhar em outros sites

@fabiano aladin

 

Como o colega @vtrx, informou, a linha setup_comparator(nc_nc_nc_nc), desabilita os comparadores.

 

 

 

Por que você deseja fazer isso?

 

A interrupção já está configurada. O timer1 já está no ponto para chamar essa rotina no tempo certo.

 

 

Explique melhor qual a sua intenção. Seria apertar um botão e ele gerar a sinal no pino B3? E se você soltar o botão, ele parar de gerar o sinal?

 

Outra coisa, eu recomendaria você usar o gerador PWM desse PIC para gerar esse sinal. Ele consegue gerar com uma precisão maior.

 

EDIT:

 

Não gosto de usar o #use fast_io.

 

Contanto que você está 100% certo que seu código manipula os pinos de I/O nas direções de todas as portas que você usou o fast_io através do set_tris_b, você estará OK. MAS se você codificou errado um pino para entrada quando deveria ser uma saída (por exemplo, durante a 4 ª revisão do código.. tarde da noite) ou se decidiu trocar pinos de lugar durante o projeto do PCB, você terá uma boa perda de tempo, irá puxar seus cabelos modificando o código.
 
Deixe o compilador lidar com a direção das portas, ele faz isso de forma automática. É uma coisa a menos a se preocupar. O resultado na execução usando o fast_io torna o programa ligeiramente mais rápido e ocupa pouco menos espaço, mas você pode não se beneficiar tanto dele.

 

Falou

O projeto é para soar um alarme e vai ter mais frequências , por isso precisso do botão ,para quando for apertado determinado botão  vai soar um alarme específico , e como tem mais frequências e todas meio complexas varei por interrupção , pwm não vai me ajudar !

Por isso precisso resolver antes de tudo o problema com o botão!

Agradeço a juda de todos ! 

Minha dúvida é como sanar   oproblema do botão?

Link para o comentário
Compartilhar em outros sites

tem mais frequências e todas meio complexas varei por interrupção , pwm não vai me ajudar !

 

Agora fiquei curioso! Poste, se possível essas frequências. Que te garanto que por PWM é mais fácil e preciso.

 

No mais sobre o botão, caso queira continuar com o Timer1, faça algo do tipo:

 

Não testei.

#INCLUDE <16F628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOPROTECT#FUSES NOLVP#FUSES NOCPD#FUSES NOMCLR #use fast_io(#use delay(clock=4000000) #int_TIMER1 #define botao_1 PIN_A0#define botao_2 PIN_A1#define botao_3 PIN_A2//etc..... int16 preload = 65128; //Inicia em 1Khz void freqch_5(void){   set_timer1(preload - get_timer1());   output_toggle(PIN_B3);} void main(){    setup_comparator(NC_NC_NC_NC);    set_tris_b(0b00000100);    output_low(PIN_B3);    setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);    set_timer1 (preload);    enable_interrupts(INT_TIMER1);    enable_interrupts(global);    While (1)    {        if (input(botao_1))        {            preload = 65128;        }        else if(input(botao_2))        {            preload = proxima_frequencia;  //Coloque o valor desejado        }        else if(input(botao_3))        {            preload = proxima_frequencia;   //Coloque o valor desejado        }                //etc....     }}
Link para o comentário
Compartilhar em outros sites

 

Agora fiquei curioso! Poste, se possível essas frequências. Que te garanto que por PWM é mais fácil e preciso.

 

No mais sobre o botão, caso queira continuar com o Timer1, faça algo do tipo:

 

Não testei.

#INCLUDE <16F628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOPROTECT#FUSES NOLVP#FUSES NOCPD#FUSES NOMCLR #use fast_io(#use delay(clock=4000000) #int_TIMER1 #define botao_1 PIN_A0#define botao_2 PIN_A1#define botao_3 PIN_A2//etc..... int16 preload = 65128; //Inicia em 1Khz void freqch_5(void){   set_timer1(preload - get_timer1());   output_toggle(PIN_B3);} void main(){    setup_comparator(NC_NC_NC_NC);    set_tris_b(0b00000100);    output_low(PIN_B3);    setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);    set_timer1 (preload);    enable_interrupts(INT_TIMER1);    enable_interrupts(global);    While (1)    {        if (input(botao_1))        {            preload = 65128;        }        else if(input(botao_2))        {            preload = proxima_frequencia;  //Coloque o valor desejado        }        else if(input(botao_3))        {            preload = proxima_frequencia;   //Coloque o valor desejado        }                //etc....     }}

Obrigado pela ajuda!

As frequências vou scanear e postar aqui.

E como você chegou ao valor de preload? estou desde ontem tentando chegar esse valores e não consigo , já vasculhei todo site Clube do Hardware e também minhas apostilas e internet , e todas não conseguir chegar a esse valor .

Poderia me mostrar como fez ?

Olhei de uma ponta a outra aqui e não achei o resultado ideal.

Link para o comentário
Compartilhar em outros sites

Para todos que estão com a mesma dificuldade que eu , achei uma fórmula que resolveu meu problema.

 

    timer 1 =  65536  - {  tempo q se deseja achar/(1/fosc/4) x prescaler   }

 

 

   preload  =  timer1  -  65536

 

 

tá indo imagens das ondas e d fórmula!

 

 

 


 

 

Agora fiquei curioso! Poste, se possível essas frequências. Que te garanto que por PWM é mais fácil e preciso.

 

No mais sobre o botão, caso queira continuar com o Timer1, faça algo do tipo:

 

Não testei.

Não consigo fazer com que  botão desligue o circuito.Tá aqui as ondas.

 

post-516771-0-69329100-1400260142_thumb.

post-516771-0-35269000-1400260265_thumb.

post-516771-0-87752300-1400260472_thumb.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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!