Problemas com "bouncing" PIC12F675

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problemas com "bouncing" PIC12F675

Mensagempor AlexsanderM » 18 Fev 2009 20:36

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!
Avatar do usuário
AlexsanderM
Bit
 
Mensagens: 17
Registrado em: 06 Out 2008 21:56
Localização: Joinville - SC

Re: Problemas com "bouncing" PIC12F675

Mensagempor Renie » 18 Fev 2009 23:25

Olá Alexsander,

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

[]'s
Renie
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor ffcprog » 19 Fev 2009 07:58

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
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor AlexsanderM » 19 Fev 2009 09:17

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!
Avatar do usuário
AlexsanderM
Bit
 
Mensagens: 17
Registrado em: 06 Out 2008 21:56
Localização: Joinville - SC

Re: Problemas com "bouncing" PIC12F675

Mensagempor amboni » 19 Fev 2009 09:45

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
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Re: Problemas com "bouncing" PIC12F675

Mensagempor AlexsanderM » 19 Fev 2009 21:29

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
Avatar do usuário
AlexsanderM
Bit
 
Mensagens: 17
Registrado em: 06 Out 2008 21:56
Localização: Joinville - SC

Re: Problemas com "bouncing" PIC12F675

Mensagempor amboni » 20 Fev 2009 07:46

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;
            }
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor AlexsanderM » 20 Fev 2009 10:10

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
Avatar do usuário
AlexsanderM
Bit
 
Mensagens: 17
Registrado em: 06 Out 2008 21:56
Localização: Joinville - SC

Mensagempor Djalma Toledo Rodrigues » 20 Fev 2009 10:56

Sugestão:

ms = mili segundo
us = micro segundo
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor amboni » 20 Fev 2009 14:36

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
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Re: Problemas com "bouncing" PIC12F675

Mensagempor Djalma Toledo Rodrigues » 20 Fev 2009 15:20

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.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor AlexsanderM » 20 Fev 2009 21:00

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 +
Avatar do usuário
AlexsanderM
Bit
 
Mensagens: 17
Registrado em: 06 Out 2008 21:56
Localização: Joinville - SC

Mensagempor Djalma Toledo Rodrigues » 21 Fev 2009 12:50

Isso , debouncing é o processo.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x