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*/
}