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 » 28 Dez 2014 14:34

andre_teprom escreveu:
picman62 escreveu:Criei uma INT value_batt. Essa int é de 8 bits, ou seja, valor de 0 a 255 certo?


Não conheço bem esse tipo INT que voce usou, mas apenas o char ( 8 bits ) e o int ( 16 bits ), em se tratando do CCS rodando num PIC da família 16F. Não tenho certeza, mas acho que o Ze já comentou algo sobre o fato de voce não estar usando unsigned.

Isso significa que um tipo de magnitude de 8 bits, iria assumir valores de -127 até 128, ou seja, o valor de "150" seria entendido como um valor negativo ( na verdade, seria -106 = (-1)*|256-150+1| ).

Resumindo, se não for utilizar valores negativos, passe a utilizar apenas variaveis do tipo unsigned.


Andre, estou usando sim, veja:
Código: Selecionar todos
unsigned int value_batt;


O fato é que tudo funciona normalmente com somente dois 'ifs'. Se colocar o terceiro dá pau. Já tentei de tudo, colocar, o value entre > e <, >=, valor de low battery menor, >0, < 110, etc. Nada funciona. Simplesmente low battery não aparece nem com tensão de 1V. Vamos ver se voce e o ZE conseguem descobrir. Será um bug?
No momento tenho
Código: Selecionar todos
 case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
               
           
             if (ISPRESSED_KEY1 )
                printf(lcd_putc,"\f");
                lcd_gotoxy(3,1);
               
   
             if (value_batt>150)
                lcd_putc("BATTERY FULL");
           
             if (value_batt>=130 <=150)
                lcd_putc("BATTERY HALF");
             
             if (value_batt<120)
                lcd_putc("BATTERY LOW");
           
           
               break;


E na tensão mais baixa aparece: 'battery halfBA' quando tinha que ser BATTERY LOW.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 28 Dez 2014 15:20

erro de principiante. Falta um operador "e" && pra delimitar faixas
tenta a sorte...
Código: Selecionar todos
case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
               
           
             if (ISPRESSED_KEY1 )
                printf(lcd_putc,"\f");
                lcd_gotoxy(3,1);
               
   
             if (value_batt>150)
                lcd_putc("BATTERY FULL");
           
             if ((value_batt<150) && (value_batt>130)) //<<<----------------------------- &&
                lcd_putc("BATTERY HALF");
             
             if (value_batt<120)
                lcd_putc("BATTERY LOW");
           
           
               break;

sorry, muitas páginas, nem vi e nem lembrei que já tinha esquema.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 28 Dez 2014 18:09

ze escreveu:erro de principiante. Falta um operador "e" && pra delimitar faixas
tenta a sorte...
Código: Selecionar todos
case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
               
           
             if (ISPRESSED_KEY1 )
                printf(lcd_putc,"\f");
                lcd_gotoxy(3,1);
               
   
             if (value_batt>150)
                lcd_putc("BATTERY FULL");
           
             if ((value_batt<150) && (value_batt>130)) //<<<----------------------------- &&
                lcd_putc("BATTERY HALF");
             
             if (value_batt<120)
                lcd_putc("BATTERY LOW");
           
           
               break;

sorry, muitas páginas, nem vi e nem lembrei que já tinha esquema.


ZE, já havia tentado o operador && e não havia funcionado também. Mas pode ser que tenha alocado ele no lugar errado. Vou tentar novamente e daqui a pouco posto o resultado. Obrigado.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 28 Dez 2014 18:31

Faz o seguinte: Abandona temporariamente a lógica pretendida do if no programa, e debuga a variável value_batt, seja por printf ou lcd_putc, mas joga no Display o valor dessa variável - devidamente formatada - e vai ajustando o trimpot do RA0 bem devagar, e acompanha essa variação no LCD, pra ver se varia de acordo, ou se pára em algum valor limite. O fato é que precisamos confiar ao menos em alguma parte do programa pra ter certeza que esteja funcionando, e daí avançar pro restante.

Pessoalmente, acredito que voce não esteja dando tempo suficiente pra conversão terminar, mas é apenas um palpite, e precisamos do resultado do teste acima pra confirmar ou derrubar essa hipótese.
"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 » 28 Dez 2014 18:51

ZE: Incrivel. Havia posto o && na posição que está abaixo há horas atrás e não havia funcionado. Agora que voce voltou a mencionar, eu refiz na mesma posição e funcionou! Cara voce deve ter alguma mandinga.
Código: Selecionar todos
 case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
               
           
             if (ISPRESSED_KEY1 )
                printf(lcd_putc,"\f");
                lcd_gotoxy(3,1);
               
   
             if (value_batt>140)
                lcd_putc("BATTERY FULL");
           
             if (value_batt>=20 && value_batt<=140)
                lcd_putc("BATTERY HALF");
             
             if (value_batt<20)
                lcd_putc("BATTERY LOW");
           
           
               break;


ANDRE: Vou fazer o que sugeriu. No momento, perceba pelo código que postei que a distancia do low batt e do half batt estão muito maiores que em relação ao full bat. O que está ocorrendo é que o full bat deixa de ser a partir de 2.42V. Entra o half batt mas para em 2.37. E a partir daí é tudo low batt. Ou seja, pela distancia que pus (20 a 150, o half batt deveria atuar por muito mais tempo, mas não está acontecendo isso. Também, se fizer um valor abaixo de 20, não altera mais nada. Vou fazer o que voce disse e retorno em seguida.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 28 Dez 2014 20:58

Observei na primeira versão do programa que voce postou lá no início, que voce havia usado a seguinte função:
setup_adc_ports(AN0);

Entretanto, essa função é utilizada para definir quais são as referencias para o conversor A/D, como por exemplo:
  • AN0_AN1_VREF_VREF
  • AN0_AN1_VSS_VREF
  • AN0_AN1_AN3
  • ...
Não sei exatamente o que significa utilizar apenas o argumento AN0, como voce colocou.
Dá uma olhada no manual do CCS, e confirma se é necessário alimentar algum dos pinos da PortaA ( ex.: AN3 ) para prover essa referencia do conversor, ou se por default - como voce fez - se estaria utilizando o proprio VCC.

A propósito, não é uma boa prática usar o mesmo VCC do botão para a referencia do AD, pois cada vez que voce o pressionar, irá causar um disturbio no barramento de 5v e isso será imediatamente lido pelo AD na forma de uma referencia que deveria estar estabilizada. Pra minimizar isso, coloque capacitores de uns 100nF nas chaves e fisicamente bem próximo do VCC do uC ( ou apenas garanta um certo Delay entre o pressionamento/liberação do botão, e a leitura do AD ).
"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 » 28 Dez 2014 23:29

Andre, parabéns, acho que voce matou a charada.

Eu havia realmente habilitado somente o A0 como ADC. Pensava que como só iria utilizar esse pino, não era necessário habilitar os outros. Aí li essa sua última postagem sobre os outros pinos de referência. Então rodei o picwizard de novo e no setor de analógicos, vi uma série de opções para os outros pinos. Pela lógica escolhi o A0, VREF, VREF que se não me engano correspondem aos pinos A2 e A3. Incluí esse string no lugar do anterior.
Código: Selecionar todos
setup_adc_ports(AN0_VREF_VREF);
   setup_adc(  ADC_CLOCK_INTERNAL  );


Na mesma hora notei que as tensões já permitiam uma flexibilidade que não havia antes e foi só ajustar os valores que correspondessem as minhas necessidades. Ficou assim:
Código: Selecionar todos
case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
               
           
                if (ISPRESSED_KEY1 )
                    printf(lcd_putc,"\f");
                    lcd_gotoxy(3,1);
               
   
                if (value_batt>124)
                   lcd_putc("BATTERY FULL");
           
                if (value_batt>=112 && value_batt<=124)
                   lcd_putc("BATTERY HALF");
             
                if (value_batt<112)
                   lcd_putc("BATTERY LOW");
           
           
               break;


Cara, voce com essa tacada e o ZE com a lembrança do && foram fundamentais para que eu conseguisse finalmente acertar o medidor de bateria. Volto a enfatizar a importância de ter voces dois por aqui nesse forum que é de imensa utilidade para iniciantes em programação como eu. Quem sabe um dia eu não estarei assim como voces ajudando outros que possam também passar por problemas semelhantes.

Fica uma dúvida. Será necessário alimentar esses pinos no circuito real, já que o esquema original não há nenhuma indicação desse fato ou foi somente para ajustar na programação do próprio PIC, sem necessidade de me preocupar com isso?
Abçs a voces e novamente meus big thanks.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 29 Dez 2014 08:54

Sabendo-se que não tenho interesse em conhecer os comandos do ccs, vejamos...
sim, caso use referências externas, vc vai ter que "alimentar" os pinos com vcc e gnd (podem ser outros valores-observe os limites no datasheet) o que se traduz na prática o mesmo efeito de vc configurar como referência interna no vcc e gnd. Neste caso , sugiro usar esta configuração interna mesmo. Referências externas são boas pra aplicações onde são necessárias precisão e estabilidade maiores. Você vai ter que dominar algo mais do que sw, como p.ex. técnica de elaboração de pci e alguns etc. Creio não ser o seu caso neste momento.

Mas enfim que bom que pudemos colaborar nesta sua introdução ao micromundo.

Pra concluir, sugiro veementemente que tente entender um pouco do circuito dos pics passando os olhos pelo datasheet. Vai te deixar mais eficiente nos eventuais desafios vindouros além de criar mais sinapses de conhecimento no seu cérebro. Neste caso, sugiro também usar um compilador que lhe dê acesso aos circuitos (hw) dos pics pra VOCÊ domá-lo (e não o compilador).

Sucessos e Feliz Ano Novo!
Editado pela última vez por ze em 29 Dez 2014 09:03, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor andre_luis » 29 Dez 2014 09:02

picman62 escreveu:Cara, voce com essa tacada e o ZE com a lembrança do && foram fundamentais para que eu conseguisse finalmente acertar o medidor de bateria. Volto a enfatizar a importância de ter voces dois por aqui nesse forum que é de imensa utilidade para iniciantes em programação como eu. Quem sabe um dia eu não estarei assim como voces ajudando outros que possam também passar por problemas semelhantes.


Essa é a espectativa, que voce aprenda hoje e possa ajudar outros amanhã, já que aqui no Brasil temos poucas opções como essa reunindo muitos cabeças da área que também me ajudam muito por aqui.

picman62 escreveu:Fica uma dúvida. Será necessário alimentar esses pinos no circuito real, já que o esquema original não há nenhuma indicação desse fato ou foi somente para ajustar na programação do próprio PIC, sem necessidade de me preocupar com isso?


Com certeza, será necessário na montagem física sim, esses pinos aí tem de ficar dedicados á essa função.
Apenas outra dica....ao invéz de utilizar direto um VCC como referencia externa, procura diminuir atravez de um Zener, para por exemplo, seilá, uns 4,7v pois mesmo que o VCC sofra algum disturbio devido á alguma chave, rele, etc, a referencia de 4,7v estaria garantida estável, e a leitura do AD estaria mais confiável.
"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 ze » 29 Dez 2014 09:10

estava editando quando andré postou. Boa dica do zener. Basta lembrar que ele varia um pouco com a temperatura. Neste caso basta usar um tl431 p.ex. Mas repito que não é seu momento de complicar.
Posso me despedir agora??
abçs!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 29 Dez 2014 12:17

OK, ZE e Andre, dúvida esclarecida. E obrigado pela dica do ZENER.

Bem, novamente obrigado pela valiosa ajuda e FELIZ ANO NOVO! Que tudo de positivo aconteça para vocês. Em breve prometo que volto.
(Pensaram que haviam se livrado de mim assim tão fácil?)
while (true) {}

:mrgreen:
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 01 Jan 2015 18:10

Olá pessoal, feliz ano novo a todos.
Bem voltei com uma outra dúvida.
Estou quebrando a minha cabeça para resolver a questão de um loop de PWM.

É o seguinte:
Após resolver o problema do leitor de bateria que gentilmente e competentemente o Andre e o Ze me ajudaram, caí dentro para escrever o código do PWM. Estudei tudo que pude ler e estou conseguindo enviar corretamente, assim espero eu.
Pressionando o botão SW1 várias vezes, eu incremento os textos que aparecem no display até o estado da bateria. Ou seja, são 4 apertadas de botão que passam os 3 textos até aparecer o leitor de bateria. Na quinta apertada, o display retorna ao texto 1. Pois bem. O que quero fazer é que uma vez com o display mostrando qualquer um dos textos, ao apertar SW4(B7), este dispare o PWM na frequencia e duty que programei. Essa parte está ok. Fiz a programação de 3 frequencias independentes, criando tres INT16 time1, time2, time3 para que através do CCP1 não sejam confundidos com PWM1, 2 ou 3, pois além desse pic só ter dois módulos de PWM, eu só vou utilizar o CCP1 para isso.

Ao ficar apertando o sw1 para escolher o texto relacionado a aquela frequencia e uma vez apertando o sw4, o PWM é enviado e quando apertar o sw1 de novo, este interrompe o PWM ao mesmo tempo que troca a página do texto. E de novo se apertar o sw4 novamente, o PWM é enviado na frequencia correspondente desse novo texto, e assim por diante.
O meu problema é que não consigo fazer o código correto para que isso aconteça. Se faço o loop para que o sinal seja continuamente enviado, quando aperto SW1, para sair, o loop não obedece e continua em infinito. Já tentei colocar cont, is pressed, etc. tudo dentro do while e nada funciona. Ao apertar o sw1, não há mudança de página e consequentemente interrupção do sinal PWM.
Mestres, por favor, abaixo o código que fiz. Onde está o erro?
Para facilitar, não incluo as instruções para sair dos loops infinitos, porque nenhuma delas funcionou.
Muito obrigado antecipadamente.

Código: Selecionar todos
 if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3)|| (SW4 && !ISPRESSED_KEY4) )
   {
   
   DELAY_MS(10);
             
   if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000

   {
   
    counter=5000;
     
   if(cont >= 1) counter=2500;
   if(cont >= 2) counter=10000;
   if(cont >= 4) counter=1000;
 
   if(++cont >= 5) cont = 1;
   
 
   ISPRESSED_KEY1=TRUE ;
   
   }
     
   if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
   {
   counter+=10;               
   ISPRESSED_KEY2=TRUE;
 
                 
   }
                       
   if ( (SW3 && !ISPRESSED_KEY3) )
   {
                       
   counter-=15;
   ISPRESSED_KEY3=TRUE;

   }
         
   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);
       setup_ccp1(CCP_PWM); //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);//disable PWM
       delay_ms(1000);
       
   }
     
       if (cont==2)
     
       while(sw4)
  {
       
       setup_timer_2(T2_DIV_BY_4,143,1);
       set_pwm1_duty(time2);
       setup_ccp1(CCP_PWM);  //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);
       delay_ms(1000);//disable PWM
       
  }
       if(sw4)
       
       while (cont==3)
  {
       
       setup_timer_2(T2_DIV_BY_4,97,1);
       set_pwm1_duty(time3);
       setup_ccp1(CCP_PWM);  //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);
       delay_ms(1000);//disable PWM
     

   
   }
   
   
       
       /*INT16 times [3][2] = {249,748,143,430,97,292};
       if (cont==1)
       for (int cont=1; cont>=3; cont++)
       setup_timer_2(T2_DIV_BY_4,times[cont],1);
       set_pwm1_duty(times[cont]);
       setup_ccp1(CCP_PWM);  //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);
       delay_ms(2200);//disable PWM*/
       
   }   
   
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 01 Jan 2015 20:00

picman62,


Dessa vez te confesso que não entendi claramente a necessidade, por mais que tenha relido a descrição do problema acima. Também olhando o código, está começando a ficar difícil analizar, pois voce está escrevendo as rotinas inline, ou seja, sem criar funções; e pra debugar tem de olhar o fechamento de cada conjunto de chaves.

Tenta fazer um diagrama, tipo fluxograma, ou então ir agrupando o código em camadas, pra que fique mais fácil fazer a análise, ok ?
"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 » 01 Jan 2015 21:05

Boa noite Andre!
Muito boa idéia . Vou fazer sim.
Seguinte.
Tenho um circuito que é baseado no 16f877a. Tenho um LCD Com textos que já programei e botões no PORTB que já estão 75% programados. São 5 ao todo. B4, B5 e B6 já estão programados. São o toggle do display, incremento de valor e decremento de valor respectivamente. O B7 é o input que aciona o pino C2 CCP1 para o PWM. E por último que também será o último a programar é o pino de reset do MCLR.
Pois bem Tenho 3 textos no display que demandam emissão de PWM em frequencias diferentes mas em momentos diferentes. Os botões que fazem o toggle dos textos, incrementos e incrementos estão funcionando perfeitamente.
Aqui está o módulo correspondente:
Código: Selecionar todos
 while (true)
   {
   SW1=INPUT(PIN_B4); // Positive inputs
   SW2=INPUT(PIN_B5);
   SW3=INPUT(PIN_B6);
   SW4=INPUT(PIN_B7);
               
   SET_ADC_CHANNEL(0);     // INPUT AN0
   DELAY_MS(10);
                   
   if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3)|| (SW4 && !ISPRESSED_KEY4) )
   {
   
   DELAY_MS(10);
             
   if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 5000,8000,12000
   {
   counter=5000;
     
   if(cont >= 1) counter=8000;
   if(cont >= 2) counter=12000;
   if(cont >= 4) counter=5000;
 
   if(++cont >= 5) cont = 1;
   ISPRESSED_KEY1=TRUE ;
   
   }
     
   if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
   {
   counter+=10;               
   ISPRESSED_KEY2=TRU
   }
                       
   if ( (SW3 && !ISPRESSED_KEY3) ) // incrementa valor padrao em passos de 10 unidades
   {
                       
   counter-=15;
   ISPRESSED_KEY3=TRUE;

   }
         


E aqui está o switch que foi feito para acionar os toggles dos botões:

Código: Selecionar todos
switch(cont)
                   
   {
            case 1:
         
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               lcd_putc("texto1");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %04LU ",counter);
               
               break;
                       
            case 2:
                           
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               lcd_putc("texto2");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %04LU ",counter);
               
               break;
               case 3:
                         
             if (ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               lcd_putc("texto3");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %05LU ",counter);
                         
               break;                           
               case 4:
               
               set_adc_channel(0);
               value_batt = read_adc();
                         
                if (ISPRESSED_KEY1 )
                    printf(lcd_putc,"\f");
                    lcd_gotoxy(3,1);               
   
                if (value_batt>130)
                   lcd_putc("BATTERY FULL");
           
                if (value_batt>=114 && value_batt<=130)
                   lcd_putc("BATTERY HALF");
             
                if (value_batt<114)
                   lcd_putc("BATTERY LOW");         
           
               break;
              }
                     
               delay_ms(10);  // Required for button() function
                    }


Então aproveitando o
Código: Selecionar todos
if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3)|| (SW4 && !ISPRESSED_KEY4) )

Fiz as instruções para o PWM em SW4 como mostrei no post anterior. Estou preso no loop infinito sem saber como sair para que o botão do pino B4 quando for apertado, quebre o loop de envio de PWM ao mudar a tela do texto do LCD e novamente pressionando B7, um novo sinal de PWM seja enviado em loop quebrado pelo próximo toggle do botão e assim, sucessivamente.
Enquanto aguardava a resposta de voces aqui no forum, encontrei um artigo bastante interessante sobre 'arrays' de INTs em C que refuzem dramaticamente espaço de código programado. Então decidi a partir do artigo, montar o meu array para o caso que necessito. Não preciso dizer que de primeira não funcionou, mas estou próximo, porque o CCS aceitou o que programei sem erros. Só falta acertar o código e saber onde precisamente inserir.
Esse é o código com array que escrevi:

Código: Selecionar todos
if ( (SW4 && !ISPRESSED_KEY4) )
   {
   
    ISPRESSED_KEY4=TRUE;
     
    INT16 times [3][2] = {249,748,143,430,97,292};
       cont=1;
       if (cont++)
      // for (int cont=1; cont<=3; cont++)
       
       
       setup_timer_2(T2_DIV_BY_4,times[cont],1);
       cont=0;
       set_pwm1_duty(times[cont]);
       cont=1;
       setup_ccp1(CCP_PWM);  //enable PWM
       delay_ms(100);
       setup_ccp1(CCP_OFF);
       delay_ms(2200);//disable PWM*


Esse array é matricial e me poupa um enorme espaço de texto. É só comparar com as instruções que postei no post anterior. Em chaves, já estão os valores das tres frequencias e dos tres duty cycles correspondentes e na ordem para serem utilizados. Segundo o artigo, os conts é que definem a ordem de contador para fazer o que quero. Ou seja, apertando B4(SW1) segue-se para o próximo texto e apertando B7(SW4), o pwm passa a atuar com a frequencia correspondente ao texto.
Só que não funcionou, porque não sei qual valor de cont utilizar e como colocar esse bloco aí em cima funcional para o meu caso. Mas é visível que em um único bloco se escreve o código dos 3 blocos como visto em meu post anterior.
Será que esse array daria conta do meu caso? Se sim, como colocar esse bloco de instruções funcionando para o caso citado?
Obrigado e abçs.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 01 Jan 2015 23:38

picman62 escreveu:Fiz as instruções para o PWM em SW4 como mostrei no post anterior. Estou preso no loop infinito sem saber como sair para que o botão do pino B4 quando for apertado, quebre o loop de envio de PWM


Bom, ainda não analizei em detalhes, mas já experimentou o comando break para sair do while infinito ?
"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

AnteriorPróximo

Voltar para PIC

Quem está online

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

x