Página 1 de 1

Problemas com "bouncing" PIC12F675

MensagemEnviado: 18 Fev 2009 20:36
por AlexsanderM
Boa noite!

Pessoal tenho uma dúvida noob quanto ao bouncing.
Tenho uma aplicação bem simples onde o PIC tem duas opções pra execução de duas rotinas. Pra evitar problemas de criação de flags de estado anterior e td mais já optei por uma chave-alavanca assim quando a chave tá pra um lado executa uma rotina e quando tá pra outro executa a outra. Feito isso ele só irá executar uma nova depois que for desligado e religado. Pra isso eu criei um while(1) lá depois da análise da posição da chave pra "prender" o bixo lá.. hehe

Não acredito que esse tipo de "boot" seja a maneira mais ortodoxa de se fazer isso mas foi a maneira que eu encontrei. Estranhamente algumas vezes depois de executar a primeira rotina, ele executa a rotina seguinte mesmo "fisicamente" não estando satisfeita akela condição. Eu acredito que isso seja bouncing.. será que é?? Oq vcs acham???

Pra resolver isso eu botei um while no final de cada uma das duas rotinas.
Mas isso me incomoda pq.. é meio anti-profissional não é??

Acredito que seja bouncing... Oq vcs acham?
Vou postar essa parte do código q falei aki:

Código: Selecionar todos
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);

   if(!chave_modo_pro_ativada) {       //  (V!=0):
      LED_modo_PRO_desativado;         // apaga "LED PRO" e acende "LED Normal"
         delay_us(250);                // evita leituras consecutivas
      LED_modo_normal_ativado;

      Modo_Normal();       // primeira rotina
   }

   if (chave_modo_pro_ativada) {       //  (V=0):
      LED_modo_normal_desativado;      // apaga "LED Normal" e acende "LED PRO"
         delay_us(250);                // evita leituras consecutivas
      LED_modo_PRO_ativado;

      Modo_PRO();          // segunda rotina
   }

   //while(1); // isso impedia uma nova execução antes de um boot
               // mas agora essa linha está no final de cada uma das duas rotinas.. oq funciona mas gera 2 warnings ao invés de um...

} // fim main


Pessoal me dá uma luz aê pq sou iniciante meeesmo.
Vlw!

Re: Problemas com "bouncing" PIC12F675

MensagemEnviado: 18 Fev 2009 23:25
por Renie
Olá Alexsander,

Eu não uso C, mas, não ví no seu código as configurações dos ports!

[]'s
Renie

MensagemEnviado: 19 Fev 2009 07:58
por ffcprog
Alex, eu não sei qual o compilador que esta utilizando.
Mais o mikroC e alguns outros.

C você criar uma rotina.

void papagirl(voi){.....


e depois chamar a rotina apenas assim, papagirl; . O compilador descarta aquela rotina naquele ponto de chamada, você deve colocar o parenteses na frente da chamada "papagirl();".

Sabe o porque /?,,, nem eu,, só sei que ele precisa, a não ser que você utilize definição de nome para uma rotina.

ffcprog

MensagemEnviado: 19 Fev 2009 09:17
por AlexsanderM
Renie escreveu:não ví no seu código as configurações dos ports!


Vou postar o codigo td então, só vou poupar vcs das minhas rotinas.. até pq não tem nada de mais nelas além de liga -> delay -> desliga.

Código: Selecionar todos
#include <12F675.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES CPD                      //Data EEPROM Code Protected
#FUSES PROTECT                  //Code protected from reads
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BANDGAP_HIGH         
#use delay(clock=4000000)

#define chave_modo_pro_ativada       !input(PIN_A3)       // chave seletora fechada V=0 (pino 4)

#define LED_modo_PRO_ativado         output_high(PIN_A2)  // sinaliza com LED o modo PRO de 40min (pino 5)
#define LED_modo_PRO_desativado      output_low(PIN_A2)   // (chave seletora ativada) (pino 5)

#define LED_modo_normal_ativado      output_high(PIN_A0)  // sinaliza com LED o modo normal de 28min (pino 7)
#define LED_modo_normal_desativado   output_low(PIN_A0)   // (chave seletora desativada) (pino 7)


void Modo_Normal() {
    [...]
    while(1); // impede início da próxima rotina antes de um boot (liga/desl)
}

void Modo_PRO() {
    [...]
    while(1); // impede início da próxima rotina antes de um boot (liga/desl)
}


void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);

   if(!chave_modo_pro_ativada) {       //  (V!=0):
      LED_modo_PRO_desativado;         // apaga "LED PRO" e acende "LED Normal"
         delay_us(250);                // evita leituras consecutivas
      LED_modo_normal_ativado;

      Modo_Normal();       // primeira rotina
   }

   if (chave_modo_pro_ativada) {       //  (V=0):
      LED_modo_normal_desativado;      // apaga "LED Normal" e acende "LED PRO"
         delay_us(250);                // evita leituras consecutivas
      LED_modo_PRO_ativado;

      Modo_PRO();          // segunda rotina
   }

   //while(1); // isso impedia uma nova execução antes de um boot
               // mas agora essa linha está no final de cada uma das duas rotinas..
               // oq funciona mas gera 2 warnings ao invés de um...

} // fim main


ffcprog escreveu:Sabe o porque /?,,, nem eu,,


kkk Muito bem observado sinhô, mas não é uma rotina é uma constante, eu que não tinha ponhado meus #defines alí.. Quanto ao meu compilador, é akele amado por todos aki, o CCS.

Abraços!

Re: Problemas com "bouncing" PIC12F675

MensagemEnviado: 19 Fev 2009 09:45
por amboni
sempre usei nas minhas entradas de botao e chave um filtro de debounce e nunca tive problemas... aperta o botao... depois se continuar apertado por alguns milissegundos confirma a posição....

da pra fazr por delay... mais eu faço pro decremento de um valor padrao... ai se o botao estiver apertado entra na rotina de tratamento do botao e vai decrementando ate ficar em zero.... assim o teu uC nao fica travado ali esperando o botao por alguns ms...


acho que é isso...
valeu

Re: Problemas com "bouncing" PIC12F675

MensagemEnviado: 19 Fev 2009 21:29
por AlexsanderM
amboni escreveu:eu faço pro decremento de um valor padrao... ai se o botao estiver apertado entra na rotina de tratamento do botao e vai decrementando ate ficar em zero.... assim o teu uC nao fica travado ali esperando o botao por alguns ms...


Cara excelente idéia! Você usa o Timer pra não ter que usar delay? Pode me explicar melhor? Muito obrigado!

Abraço

Re: Problemas com "bouncing" PIC12F675

MensagemEnviado: 20 Fev 2009 07:46
por amboni
sempre fiz desta forma... pra testes sempre coloco um led na minha "main" com o timer zero piscando a cada 100ms... pra ver como esta rodando o programa... se ele esta travando em algum lugar.... ate hj nunca tive problemas...


Código: Selecionar todos
//------------------------------------------------------------------------------
// ENTRADA 1 - SELECIONA MODO
//------------------------------------------------------------------------------
        if (!ENTRADA1)     // pino do pic                               
            {
            IF(!(BT_ENTRADA1_PRESS))   // flag
            {
               IF(FILTRO1!=0)      // valor do debounce
               {
                  FILTRO1--;
               }
               ELSE
               {
               BT_ENTRADA1_PRESS=1;
               MODO=0;                              //  flag que indicara no software seo botao foi apertado ou nao
               }
            }
        }
      else
            {
               MODO=1;   
               FILTRO1=DEBOUNCE;
               BT_ENTRADA1_PRESS=0;
            }

MensagemEnviado: 20 Fev 2009 10:10
por AlexsanderM
amboni, muito obrigado cara! Seu código é muito bom!

Eu demorei uma meia hora pra entender ele mas agora tá blz hehe
Mas ainda não sei como encontrar o valor do debounce pra uma int. Quando se usa delay fica extremamente visual a rotina.

Eu sei que o pic leva em torno de 1ms pra entrar numa rotina, 1ms pra executar cada comando e mais 1ms pra sair... É mais ou menos por aí?

O tamanho do meu bounce no osciloscópio é de pouco menos de 1ms.. Como eu configuro o valor do debounce?

Muito obrigado
Abraço

MensagemEnviado: 20 Fev 2009 10:56
por Djalma Toledo Rodrigues
Sugestão:

ms = mili segundo
us = micro segundo

MensagemEnviado: 20 Fev 2009 14:36
por amboni
AlexsanderM escreveu:amboni, muito obrigado cara! Seu código é muito bom!

Eu demorei uma meia hora pra entender ele mas agora tá blz hehe
Mas ainda não sei como encontrar o valor do debounce pra uma int. Quando se usa delay fica extremamente visual a rotina.

Eu sei que o pic leva em torno de 1ms pra entrar numa rotina, 1ms pra executar cada comando e mais 1ms pra sair... É mais ou menos por aí?

O tamanho do meu bounce no osciloscópio é de pouco menos de 1ms.. Como eu configuro o valor do debounce?

Muito obrigado
Abraço







Código: Selecionar todos
#DEFINE DEBOUNCE 100                    // VALOR CARREGADO DE DEBOUNCE

INT          FILTRO1=DEBOUNCE;
INT          FILTRO2=DEBOUNCE;
INT          FILTRO3=DEBOUNCE;
INT          FILTRO4=DEBOUNCE;
INT          FILTRO5=DEBOUNCE;
INT          FILTRO6=DEBOUNCE;
INT          FILTRO7=DEBOUNCE;
INT          FILTRO8=DEBOUNCE;
INT          FILTRO9=DEBOUNCE;
INT          FILTRO10=DEBOUNCE;



no caso estou usando 10 entradas via botão....

tem outra coisa legal que pode se fazer leitura de botoes via um a/d... com resistores em serie.... vamos dizerq eu vc tem 8 botoes... cada botao vai ter um valor de leitura... vc fica comparando e testando os valores... assim seu debounce pode ficar a varredura do a/d....


valeu

Re: Problemas com "bouncing" PIC12F675

MensagemEnviado: 20 Fev 2009 15:20
por Djalma Toledo Rodrigues
AlexsanderM escreveu:... quanto ao bouncing....

O melhor circuito para De bouncing é o Flip Flop R S
Pode implementar no uC se dispuser de dois pinos I/O livres.

MensagemEnviado: 20 Fev 2009 21:00
por AlexsanderM
amboni: Valeu cara! vou dar uma estudada a mais no código assim que tiver um tempo livre. Flw!

Djalma: Obrigado pela dica! Tinha ouvido falar alguma coisa a respeito, mas vou ter que estudar um pouco mais disso. Só me corrija se eu estiver errado: "bounce" é o fenômeno, "debounce" ou "debouncing" é o método utilizado para amenizar/corrigir tal fenômeno. É isso?

Obrigado a todos, teh +

MensagemEnviado: 21 Fev 2009 12:50
por Djalma Toledo Rodrigues
Isso , debouncing é o processo.