Gostaria da ajuda de voces para solucionar um probleminha de rotina de instrução.
Fiz o seguinte código abaixo para iniciar 3 pulsos de PWM em tempos diferentes para cada 'cont' de display. Ou seja, quando pressiono o botão do input B4, é mudado a página do display e quando pressiono B7 a primeira vez o PWM inicia. Quando pressiono B7 a segunda vez, PWM para. Então apertooo B4 e mudo de página.
Isso foi criado com interrupts e funciona bem.
Obs. Está incluso só o 'cont1', mas são 3 conts(3 mudanças de página no LCD).
- Código: Selecionar todos
void button_isr()
{
if( !input(PIN_B7) && !signal )
signal = 1;
else
if( !input(PIN_B7) && signal )
signal = 0;
void main()
{
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge( H_TO_L );
output_drive(pin_c2);
INT SW4;
while(true)
{
ISPRESSED_KEY4=TRUE;
if(cont==1)
do // interrupts to loop state of PWM and out of it
{
if(signal) // if PWM is sent through C2 pin
{
setup_timer_2(T2_DIV_BY_4,249,1);
set_pwm1_duty(748);//enable PWM
setup_ccp1(CCP_PWM); //enable PWM
delay_ms(100);
setup_ccp1(CCP_OFF);//disable PWM
delay_ms(500);
}
}
while(input(pin_b4)==1); //if SW4 is pressed while in SW1
}
}
O problema é que criei um código com contador de frequencia, bargraph e led.Esse código está funcionando bem. Quando insiro esse código na rotina com o PWM, o PWM não funciona mais em loop e os dois timers iniciam em tempos diferentes. Não sei o que houve. O que preciso é que os dois iniciem ao mesmo tempo e o PWM fique no loop de on/off até ser desligado juntamente com o contador, bargraph e led pelo pressionamento do botão B7 pela segunda vez.
Portanto com certeza é uma questão de chaves inseridas corretamente e comandos de instrução corretos, que não estou conseguindo identificar.
O comando 'do ...if(signal)' funcionava para o PWM, mas agora quando coloco os dois (PWM e TIMER1) o PWM não funciona.
Abaixo está o código completo somente dessa porção da programação inteira do PIC. Está incluso somente o TIMER1, pois não sei como inserir o primeiro código do PWM acima que estava funcionando.
Será que alguém consegue identificar o porque e fazer a instrução certa para que funcione como necessito?
Obrigado.
- Código: Selecionar todos
if ( (SW4 && !ISPRESSED_KEY4) )
{
ISPRESSED_KEY4=TRUE;
if((cont==1)||(cont==2)||(cont==3))
do
{
if(signal)
{
set_timer1(0);
setup_timer_1(t1_external | T1_DIV_BY_1);
delay_ms(1000);
setup_timer_1(T1_DISABLED);
value=get_timer1();
if(cont==1)
printf (lcd_putc,"\fF1= %LU\r\n",value);
A=value/200;
B=value/300;
C=value/400;
D=value/10000;
if(cont==2)
printf (lcd_putc,"\fF2= %LU\r\n",value);
A=value/360;
B=value/460;
C=value/560;
D=value/10000;
if(cont==3)
printf (lcd_putc,"\fF3= %LU\r\n",value);
A=value/520;
B=value/1200;
C=value/2000;
D=value/10000;
if(value>=counter-3 && value<=counter+2)
bargraph(A); //print line 2 with the bargraph output
else if ((value>=counter-6 && value<counter-2) || (value>=counter+5 && value<counter+20))
bargraph(B);
else if((value>=counter-15 && value<counter-6) || (value>=counter+20 && value<=counter+35))
bargraph(C);
else
bargraph(D);
if(value>=counter-3 && value<=counter+2)
do
{
output_high(pin_c1);
delay_ms(10);
output_low(pin_c1);
delay_ms(10);
}
while(signal);
if((value>=counter-6 && value<counter-2) || (value>=counter+5 && value<counter+20))
do
{
output_high(pin_c1);
delay_ms(90);
output_low(pin_c1);
delay_ms(90);
}
while(signal);
if((value>=counter-15 && value<counter-6) || (value>=counter+20 && value<=counter+35))
do
{
output_high(pin_c1);
delay_ms(160);
output_low(pin_c1);
delay_ms(160);
}
while(signal);
if(value<counter-15 || value>counter+35)
do
{
output_low(pin_c1);
}
while(signal);
}
if(!signal) // if PWM is sent through C2 pin
{
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
if(cont==1)
lcd_putc("F1");
if(cont==2)
lcd_putc("F2");
if(cont==3)
lcd_putc("F3");
lcd_gotoxy(7,2);
printf(lcd_putc," %04LU ",counter);
break;
}
}
while(input(pin_b4)==1); //if SW4 is pressed while in SW1
}