Código correto CCS Compiler

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Código correto CCS Compiler

Mensagempor picman62 » 02 Jan 2015 08:49

Sim, Andre, experimentei. Ele faz a condição certinho só que obedece a instrução uma única vez e desliga. O que quero é que ele fique em loop até que seja pressionado o botão SW1 novamente. E quando em loop, sem o 'break'. ele não obedece ao comando do SW1.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 02 Jan 2015 11:23

também não sei se entendi mas vejamos se captei...
eu (eu) usaria uma variável tipo bit .. tipo assim sei lá entende...
Código: Selecionar todos
static bit bpwm=0;

no loop
Código: Selecionar todos
if (!SW4) bpwm^⁼1;
if (bpwm) setup_ccp1(CCP_PWM);  //enable PWM
else setup_ccp1(CCP_OFF);
ou seja a cada pressionada habilito-desabilito o pwm
e não sei pra que matriz bidimensional e na ram
eu (eu) faria
Código: Selecionar todos
const unsigend int times [6] = {249,748,143,430,97,292};

na flash
agora sim vou avisar: ctrl-c ctrl-v não deve dar certo hein. eu e ccs ... nada a ver

Não me entendo a mim próprio, imagina você.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 02 Jan 2015 23:53

Desculpem a demora em responder. Hoje foi um dia terrível.
Ze, realmente o CCS não reconhece a sua static bit.

Mas eu de tanto escrever e reescrever esse código, cheguei a uma instrução interessante. Tenho B4 para fazer os scrolls no LCD e o B7 para acionar o PWM. Consegui que apertando o botão B7 duas vezes ele ligue e desligue o PWM. Maravilha? Nem tanto...
O que necessito é que haja um loop ligando e desligando o PWM e depois quando aperto finalmente algum botão, esse maldito loop pare. Isso eu ainda não consegui.
Gostaria que voces desse uma olhada no ultimo update do meu código e me digam como fazer para apertando o B7 ou o B4 (já estou aceitando qualquer um), encerre essa instrução e eu possa apertando de novo B4 ir à próxima pagina do LCD começar de novo com outro sinal de PWM.
Estou fazendo o 'do ' abaixo, mas ele não consegue parar o loop.
Obrigado.

Código: Selecionar todos
unsigned int conta=0;

if ( (SW4 && !ISPRESSED_KEY4) )// incrementa valor padrao em passos de 10 unidades
   {
     
     ISPRESSED_KEY4=TRUE;
     
     
      if(cont==1)
     
   while(TRUE)
   {
       if((input(pin_b7)==1) & (conta==0))
   
   
       conta++;
       while(true)
       {
       output_high(pin_c2);
       delay_ms(1);
       setup_timer_2(T2_DIV_BY_4,249,1);
       set_pwm1_duty(748)
       setup_ccp1(CCP_PWM); //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);//disable PWM
       delay_ms(2200);
       
       while(input(pin_b7)==0);
       
       
     
       
       if((input(pin_b7)==1) & (conta==1))
 
       

       do
       {
        conta++;
        output_low(pin_c2);
        delay_ms(1);
        setup_ccp1(CCP_OFF);
        (input(pin_b7)==0 );
       }
        while(input(pin_b7)==1 );
   
        conta=0;
   
   }
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 03 Jan 2015 07:09

Acabei de encontrar uma postagem em um forum americano sobre o loop do PWM on and off e aguem lá disse que é meio problemático fazer isso. Foi sugerido que seja habilitado o PWM constantemente e se escreva o código apenas para desligá-lo pelo tempo necessário. Vou tentar escrever o código para o meu caso baseado nessa informação e retorno aqui para voces darem uma olhada. Já viram que meu sábado será 'daqueles'...
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 03 Jan 2015 11:48

Claro, porque não pensamos nisso antes ?
Ao invéz de habilitar/desabilitar o PWM, apenas manipule o seu duty-cicle, colocando-o em Zero quando não quiser pulsos na saída...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 03 Jan 2015 14:03

andre_teprom escreveu:Claro, porque não pensamos nisso antes ?
Ao invéz de habilitar/desabilitar o PWM, apenas manipule o seu duty-cicle, colocando-o em Zero quando não quiser pulsos na saída...


Boa tarde Andre. Pois é.

O que fiz segue abaixo. É uma estratégia para fugir da famigerada função de colocar o PWM em loop de on/off e depois não conseguir sair.

Fiz o seguinte:

Código: Selecionar todos
if ( (SW4 && !ISPRESSED_KEY4) )
   {
   
    ISPRESSED_KEY4=TRUE;
       
     
       time1=748;
       time2=430;
       time3=292;
     
      if(cont==1)
   
     
     
      while(true)
      {
       setup_timer_2(T2_DIV_BY_4,249,1);
      setup_ccp1(CCP_PWM); //enable PWM
     
      for (time1=0; time1<748; time1+=748)
     
      {
           
       set_pwm1_duty(time1);//enable PWM
       delay_ms(500);
      }
       
       for (time1=748; time1>1; time1-=748)
     
      {
       set_pwm1_duty(time1);//enable PWM
       delay_ms(100);
     
      }
       
      }


Agora o que não entendo são duas coisas, e espero que voce me explique.

1 - Como voce ve, coloquei um delay de 500ms para fazer o 'build up' da onda e um delay de 100ms para ficar em zero. Então pela lógica, no proteus, ele teria que mostrar o pulso 'ativado' por meio segundo (tempo mais longo) e desativado por 100ms(tempo mais curto). Mas acontece O CONTRÁRIO! O pulso fica ativado por um tempo mais curto do que o desativado.
Porque??

2 - Percebo quando o pulso está em duty '0', uns pequenos 'grãos e picos minúsculos. Isso é ruído mesmo, ou apenas sujeira do proteus?

Abçs.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 03 Jan 2015 17:06

Algumas questões/observações :

  • A variável time1 é char, unsigned char ou int ? Isso faz toda diferença na avaliação da expressão time1>1 no for.
  • Não é aconselhável inicializar os módulos no meio do programa ( ex.: setup_timer_2(T2_DIV_BY_4,249,1) ). Faça isso na inicialização e logo em seguida ajuste o Duty-cycle para Zero, caso deseje incializar desligado. Isso porque em geral alguns módulos dos uC tem um comportamento distinto logo após serem configurados ( apesar de que isso não deve ser o seu caso ).
  • Voce está tentando modular uma saida em forma triangular; e ainda com um Delay dentro dela ? Acho que não entendi a funçao disso.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 03 Jan 2015 23:05

Andre, time1 é uma unsigned int16. Porque os valores que estou utilizando são maiores do que 255, concorda?
E naõ é onda triangular não. Quero a mais pura onda quadrada. Ela aparece no proteus como quero. Onde voce onda triangular?
Em relação ao delay, é porque quero emitir um pulso durante um tempo x e aguardar um tempo y.
Mas voce viu minha pergunta sobre os tempos que parecem estar invertidos no simulador do proteus?

Quanto ao setup timer_2 que voce mencionou para utilizar na inicialização, não funcionou no meu caso porque como já disse, estou fazendo um 'toggle' com o botão B4, em que aciono tres textos no display. Se colocar essa função antes do while true, quando ocorre a inicialização da minha programação, ele apresenta alguns textos, diz 'bem vindo' e fica em loop com a mensagem para selecionar a minha escolha. Então aperto B4 e aparece a opção do primeiro texto. Aperto B7 e o PWM inicializa.
Se colocar o 'setup timer_2' antes do while true, a programação pula a mensagem de aguardando a escolha e já tem start com o PWM, sem apertar botão algum. Isso não é desejado por mim.

O que preciso fazer agora é dar uma arrumada no código.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 04 Jan 2015 07:57

saidera...
ctrl-c ctrl-v está enraizado mesmo hein...
a variável não precisa ser bit. pode ser char mesmo
Código: Selecionar todos
unsigned char bpwm=0;
if (!SW4) bpwm^⁼0xff; //isso é um toggle
if (bpwm) fazisso();
else fazaquilo();

pra matar o pwm de vez sugiro que p.ex. desabilite o pino - deixe como io - e como entrada TRISx=1 chute... sei lá
boa sorte!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor andre_luis » 04 Jan 2015 08:32

picman62 escreveu:E naõ é onda triangular não. Quero a mais pura onda quadrada. Ela aparece no proteus como quero. Onde voce onda triangular?


Eu não mencionei exatamente "forma de onda triangular" mas apenas "modulação triangular".
Repare que de acordo com a lógica abaixo, a largura do pulso deveria ao menos em teoria decrementar um pouco a cada 0,5 segundos:

cpp code
for (time1=0; time1<748; time1+=748) 
{
set_pwm1_duty(time1);
delay_ms(500);
}

picman62 escreveu:Quanto ao setup timer_2 que voce mencionou para utilizar na inicialização, não funcionou no meu caso porque como já disse, estou fazendo um 'toggle' com o botão B4, em que aciono tres textos no display. Se colocar essa função antes do while true, quando ocorre a inicialização da minha programação, ele apresenta alguns textos, diz 'bem vindo' e fica em loop com a mensagem para selecionar a minha escolha


Muito estranho isso acontecer, uma vez que a única ação do setup timer_2() é apenas carregar o valor do TIMER2 no registrador...

picman62 escreveu:Mas voce viu minha pergunta sobre os tempos que parecem estar invertidos no simulador do proteus?


Uma das razões que mencionei para tentar colocar a função setup timer_2() no início, foi justamente o fato que mencionei anteriormente. Alguns módulos de hardware possuem um comportamento distinto logo após serem configurados; e isso não é restrito á apenas o PIC16F, mas outros uC também tem comportamentos parecidos. Embora já tivesse mencionado anteriormente que possivelmente isso poderia não ser a causa do problema, o objetivo era apenas nos cercarmos dessas incógnitas; trata-se apenas de uma 'boa-prática' em programação, deixar a configuração dos módulos concentradas na rotina de inicialização ( ex.: init() ), ainda mais porque estamos utilizando uma API do CCS que não sabermos internamente o que mais ela realiza internamente.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 04 Jan 2015 09:35

picman62 escreveu:
ze escreveu:saidera...
ctrl-c ctrl-v está enraizado mesmo hein...
a variável não precisa ser bit. pode ser char mesmo
Código: Selecionar todos
unsigned char bpwm=0;
if (!SW4) bpwm^⁼0xff; //isso é um toggle
if (bpwm) fazisso();
else fazaquilo();

pra matar o pwm de vez sugiro que p.ex. desabilite o pino - deixe como io - e como entrada TRISx=1 chute... sei lá
boa sorte!


Ze, obrigado pela informação. Vou tentar aqui. Na verdade ctrl-c ctrlv está enraizada, porque preciso dela para entender o código já que sou iniciante nisso. Há pouco mais de tres semanas atrás eu não sabia nem o que era INT, while(true), void. Nada. Nunca havia visto isso na minha vida. Até que comprei um PIC programado em HEX para um circuito que estou montando de um turco e o PIC aparentemente deu defeito. Comuniquei isso ao turco e o filho da mãe não quis trocar porque disse que eu é quem tinha danificado. Então, resolvi ir a luta e aprender o mais rápido possível sobre o assunto, para que possa recuperar eu mesmo a programação.
Mas uma boca tem tamanho e não posso enfiar algo que é bem maior do que ela goela abaixo. Estou caminhando o mais rápido que posso, lendo tudo o que posso sobre isso.
Vou tentar o que disse e retorno mais tarde.
Abçs.
Editado pela última vez por picman62 em 04 Jan 2015 10:02, em um total de 1 vez.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 04 Jan 2015 10:02

Andre, a minha estratégia foi fazer o duty cycle variar até zero e instantaneamente até 748 que foi o valor calculado para um duty de 75% que é o que desejo. Dessa maneira ele simularia o efeito de ligar/desligar o PWM como pretendo.

Em tentativa e erro cheguei a esse valor de delay para simular o on/off. Ocorre que percebo um pontinho, ou granulado na tela do osciloscopio do proteus quando o pulso ainda não foi enviado. Isso não ocorria quando fiz a programação de PWM on e off anteriormente. Pode ser um defeito do próprio proteus talvez.
Outra coisa, claramente, o osciloscopio do proteus não está obedecendo aos tempos reais de 100ms e 500ms. Ele dá um tempo bem maior. Isso é normal e se deve apenas à taxa de sampling do programa virtual?
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 04 Jan 2015 11:45

Ze, abaixo a nova estrutura com a inserção do seu codigo sugerido. Veja se cometi algum erro e se a inserção do que voce sugeriu está correta.
Código: Selecionar todos
if ( (SW4 && !ISPRESSED_KEY4) )
   {
   
    ISPRESSED_KEY4=TRUE;
       
     
       INT16 time1;
       INT16 time2;
       INT16 time3;
       time1=748;
       time2=430;
       time3=292;
     
      if(cont==1)
     
   
       while(SW4)
   {
     
       setup_timer_2(T2_DIV_BY_4,249,1);
       set_pwm1_duty(time1);//enable PWM
       setup_ccp1(CCP_PWM); //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);//disable PWM
       delay_ms(1000);
     
       if (!SW4)
       {
       bpwm^=(0xff); //isso é um toggle
       
       }
       if (bpwm)
       {
       setup_ccp1(CCP_OFF);
   }
       else
       cont++;

Infelizmente, ele não consegue desligar o loop.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 04 Jan 2015 14:41

Bem, depois de inúmeras cabeçadas, consegui um código que parece estável.
A programação inicializa e fica esperando eu apertar B4 para aparecer o primeiro texto. Eu aperto e a tela surge. Então aperto B7 e inicializa o PWM. Depois aperto uma segunda vez B7 e o PWM interrompe. Então aperto B4 novamente e troca o texto.

É exatamente isso que quero com um único elemento que falta: o loop.

No momento o PWM inicializa e para, porque há o comando de PWM off no final. O problema é que não consigo colocar isso em loop, sem comprometer as outras instruções. Esse loop tem que acontecer indefinidamente até que aperte B7 novamente como na programação abaixo que está sem loop.

Alguém consegue uma luz para qual instrução de código devo acrescentar e onde?
Obrigado amigos.
Código: Selecionar todos
 
       INT16 time1;
       INT16 time2;
       INT16 time3;
       time1=748;
       time2=430;
       time3=292;
     
       if(cont==1)
     
       while(true)
       {
       
       if(input(pin_b7)==1 & (conta==0))//aperta B7 primeira vez e init PWM
       {
       conta++;
 
       output_high(pin_c2);
       delay_ms(1); // Aguarda soltar o pin_c2
       setup_timer_2(T2_DIV_BY_4,249,1);
       set_pwm1_duty(time1);
       setup_ccp1(CCP_PWM); //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);//disable PWM
       delay_ms(1000);
       
       while(input(pin_b7)==1);
       }
     
       if(input(pin_b7)==1 & (conta==1)) //se apertar B7 de novo... deliga PWM, case estivesse no loop.
       
      {
       conta++;
       output_low(pin_c2);
       delay_ms(1);
       setup_ccp1(CCP_OFF);
       
       while(input(pin_b4)==1);//aguarda soltar B4
       conta=0;
       }   
       break;//destrava tudo para que apertando B4 novamente role o texto 
       }
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 04 Jan 2015 19:05

não gosto de colocar exemplo com a sintaxe do ccs. Nada pessoal. Questão de princípios. Mas vamos tentar algo assim
Código: Selecionar todos
unsigned int conta=0;
for(;;)//while(true)
       {
       if (RB7) conta^=1;//if((input(pin_b7)==1) conta^⁼1;//inverte (se bem que é !RB7 caso o botão esteja no gnd)
       if (conta==1)
          {
          output_low(pin_c2);
          delay_ms(1);
          setup_ccp1(CCP_OFF);
         }
      else
         {
        RC2=1;//output_high(pin_c2);
        delay_ms(1); // Aguarda soltar o pin_c2
        setup_timer_2(T2_DIV_BY_4,249,1);
        set_pwm1_duty(time1);
        setup_ccp1(CCP_PWM); //enable PWM
        delay_ms(100);
        setup_ccp1(CCP_OFF);//disable PWM
        delay_ms(1000);
        }
    }

Devido ao excesso de acúmulo de juventudes, confesso que estou com dificuldade em parear as ideias com pessoas ainda em tenra idade. Portanto nem sei se estou conseguindo me sintonizar convosco. Enfim... somar é a proposta
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x