Moderadores: andre_luis, 51, guest2003, Renie
static bit bpwm=0;
if (!SW4) bpwm^⁼1;
if (bpwm) setup_ccp1(CCP_PWM); //enable PWM
else setup_ccp1(CCP_OFF);
const unsigend int times [6] = {249,748,143,430,97,292};
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;
}
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...
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);
}
}
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 ).unsigned char bpwm=0;
if (!SW4) bpwm^⁼0xff; //isso é um toggle
if (bpwm) fazisso();
else fazaquilo();
picman62 escreveu:E naõ é onda triangular não. Quero a mais pura onda quadrada. Ela aparece no proteus como quero. Onde voce onda triangular?
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
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?
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.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!
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++;
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
}
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);
}
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante