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 » 05 Jan 2015 10:07

Bom dia Ze.
Tentei o seu código mas não há desligamento do PWM. Ele fica direto.
Percebi que voce escreve primeiro conta^=1; Este é reconhecido. Mas depois quando tento escrever o segundo termo de 'conta' , o CCS está reconhecendo como conta^^(=)1; e fica pedindo uma declaração de parêntese que acho ser inexistente. Então resolvi utilizar conta^=1; como no primeiro termo para ele poder compilar. Há algum problema ou diferença em relação ao segundo termo?
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 05 Jan 2015 10:45

sorry. não entendi mesmo lendo algumas vezes. o lance da sintonia, lembra? ...
segundo termo? seria o if (conta==1) ??... tente deixar if (conta) ... ele diz "se conta não for zero" ...

O Bom mesmo é com bit. Veja no help do seu compilador como criar variável tipo bit. Dá pra fazer com struct mas... não sei se é seu momento
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 06 Jan 2015 14:57

ze escreveu:sorry. não entendi mesmo lendo algumas vezes. o lance da sintonia, lembra? ...
segundo termo? seria o if (conta==1) ??... tente deixar if (conta) ... ele diz "se conta não for zero" ...

O Bom mesmo é com bit. Veja no help do seu compilador como criar variável tipo bit. Dá pra fazer com struct mas... não sei se é seu momento


Desculpe a demora meu amigo.

O segundo termo a que me refiro é:
Código: Selecionar todos
conta^²(=)1;
; O CCS além de estar solicitando parentesis, está informando que o expoente '2' é termo ilegal.
Tentei fazer conta^^(=) 1; mas ele fica pedindo esse parentesis que aparentemente é inexistente.
Por isso gostaria de saber se há uma outra maneira de escrever a instrução acima.
Obrigado e abçs.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 06 Jan 2015 15:47

perdão amigo. tive que vasculhar os posts pra ver de onde vc tirou isso e acho que está nos comentários (o que fica depois do //) no caso um ctrl-c ctrl-v (isso pega) que fiz pode ter 'traduzido' errado. sorry. De fato o correto é conta^=1
A propósito comentários depois do // não 'existem' pro compilador, sabia né? /* 100 comentários */
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 06 Jan 2015 18:53

Ok, obrigado Ze, fiz a mudança. Abaixo relaciono as várias mudanças no seu código e os respectivos relatos do que acontece.
Aqui a instrução integral com o codigo que voce fez.
Código: Selecionar todos
 if ( (SW4 && !ISPRESSED_KEY4) )
   {
   
    ISPRESSED_KEY4=TRUE;
       
     
       INT16 time1;
       INT16 time2;
       INT16 time3;
       time1=748;
       time2=430;
       time3=292;
       int RB7;
       int RC2;
       RB7=input(pin_b7);
       RC2=input(pin_c2);
       
      if(cont==1)
     
      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);
            }
        }

Resultado:
Ocorre o loop do liga/desliga PWM. Mas quando aperto B7 novamente nada acontece. O loop não é desligado.

2 - Com RB7 invertido como mencionou(!RB7)
Código: Selecionar todos
 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);
            }
        }


Resultado:
O mesmo do item 1. Loop não desliga.

Tentei zerar vários strings no primeiro bloco: conta^=0, if (conta==0), etc. Sem resultado. O PWM não liga em muitos casos, mas quando liga, não desliga.
ALém disso eu perco o desligamento do pinoB7 e consequentemente o acionamento de B4 para que eu troque de página, como na programação anterior que fiz.

Acredito que estamos perto, mas realmente não tenho conhecimento de C suficiente para resolver essa charada. Só mesmo voces me ajudando.
No aguardo. Abçs.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 07 Jan 2015 08:31

acho que realmente um de nós precisa de mais ajuda que pensamos. Pena que me recuso a conhecer as nuances do ccs senão já teríamos avançado mais. Mas ó, tenta fazer um programa SÓ PRA ALTENAR UM LED NUM PINO p.ex.
Código: Selecionar todos
//meu filho, coloque os #includes aqui por favor
unsigned char led=0; //de novo.. tenta ver como é a sintaxe da variável bit do seu compilador. Tente sbit led;
void main(void){
//ai ai será que vou ter que falar que tem que ajustar o hw?
//sinto muito... em ccs é d+ pra mim
while(TRUE)
{
if((input(pin_b7)==1)) led^=1;//só alterna o bit 0
while(input(pin_b7)==1); //tire o dedo do botão
if (led==1) output_higt(pin_c2);//acende
else  output_low(pin_c2); //apaga
}
}

cara vc nem faz ideia de como isso doeu em mim. Mas faço este sacrifício por ti.
Pra que isso? é pra vc entender que ao alternar o bit ... led^=1 ... vc pode usá-lo como condição ... if (led) ... pra fazer alguma coisa ... output_low(pin_c2) ... ou ...else ... outra ... output_higt(pin_c2)
No seu caso substitua por habilitar() ou inibir() o pwm...(cara NÃO COPIE E COLE isso por favor). Sugiro aguardar uma boa alma especialista em ccs. não necessariamente boa mas é o que não falta.

Sem ofender, claro, mas acho que vc queimou algumas etapas no aprendizado. Mas falta pouco! Próximo passo: dominar o mundo! Bom, pra isso vc não vai poder queimar muitas etapas. pelo menos tente o micromundo...

ah sim, não me importo de ter digitado algo 1/2 errado. é que to 1/2 de ressaca...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 07 Jan 2015 17:27

Nobre e estimado amigo Ze.
Sim, eu já sabia como ligar e desligar um led. O fator complicador é quando se tem que piscar e efetuar o desligamento por um botão. Exatamente o meu caso com o PWM.
Muitos conhecedores de código C pelo que pesquisei pela internet, tem diferentes 'aproaches' para essa tarefa de desligar o pisca pisca. Uns com mais eficiencia, outros com menos e vi alguns códigos que simplesmente não funcionam.

Então percebendo que o meu problema se restringia a arquitetura do PIC, talvez mais do que a linguagem C em si, resolvi passar a tarde inteira estudando um assunto fascinante: 'INTERRUPTS' do pic que os compiladores utilizam na sua própria linguagem.

Foi então depois de ler sobre o assunto, que é profundo por sinal, com várias designações, que consegui finalmente resolver o meu problema ao escrever uma instrução que se mostrou bem sucedida.
Abaixo está o código que redigi. Nunca imaginei que esse mundo dos programadores fosse tão intrincado, complexo, polêmico e durante algum tempo, simplesmente inatingível para mortais que estão ávidos por conhece-lo como eu. Estou começando a ficar viciado nisso e já durmo e acordo pensando em C. Parece uma cachaça.

Consegui. Meu Deus, que trabalho. Mas consegui.

Código: Selecionar todos
BYTE signal = 0;

//#use fast_io(c)
#include <lcd.c>
#int_rb

void button_isr()
{
   delay_ms (20);  //debounce
   if( !input(PIN_B7) && !signal )
      signal = 1;
   else
   
   if( !input(PIN_B7) && signal )
      signal = 0;
}if ( (SW4 && !ISPRESSED_KEY4) )
   {
   
    ISPRESSED_KEY4=TRUE;
       
     
       INT16 time1;
       INT16 time2;
       INT16 time3;
       time1=748;
       time2=430;
       time3=292;
     
       
   if(cont==1)
     
   do
   
   {
      if(signal)
   {
         setup_timer_2(T2_DIV_BY_4,249,1);
         set_pwm1_duty(time1);//enable PWM
         setup_ccp1(CCP_PWM); //enable PWM
         delay_ms(100);
         output_high(pin_c2);
         delay_ms(10);
         setup_ccp1(CCP_OFF);//disable PWM
         delay_ms(1000);
         output_low(pin_c2);
         delay_ms(10);
         
      }
     
   }
   
     while (TRUE);
     
   }
 
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 07 Jan 2015 18:58

ficamos satisfeitos que conseguiu sozinho. e o melhor... já embrenhaste pelas veredas das interrupts. Está no caminho certo.

Bom só pra constar, aquilo não é um pisca led e sim um flip flop por assim dizer. Tipo uma memória de 1 bit. Houve a infeliz coincidência do led piscando mas foi só pra ilustrar.

Enfim meu amigo, que seja esta sua primeira de uma série infindável de vitórias por este micromundo afora!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 07 Jan 2015 19:23

Obrigado pelas palavras Ze. Vindas de voce que é um guru aqui nesse forum, são valiosas lembranças de ensinamento que vou levar daqui para a frente.
Aliás, voce que me chamou de filho... só aceito isso se voce estiver na casa dos 80 anos. Eu tenho 52, papai.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Anterior

Voltar para PIC

Quem está online

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

x