collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: [Dúvida] Controlo de contagem  (Lida 6888 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: [Dúvida] Controlo de contagem
« Responder #15 em: 26 de Agosto de 2013, 12:20 »
Alterei os operadores no código que postaram e já funciona ;)

Alguém me pode explicar como é que este código evita o boucing e o meu não?

Não sei bem se evita o que eles diziam...acho que só um pouco.
Este principalmente evita que tu mantenhas o botão premido demasiado tempo, evita o tempo que demora o botão a voltar ao sitio. Se resalta varias vezes isto não evita.

O primeiro while, mantem o codigo em espera por um pressão de botão. Apos sair fica registado as variaveis do botões, e em principio so 1 está a high.

O segundo while mantem o codigo em espera até que todos os botões estejam a low, não premidos. Isto evita que mantenhas o dedo a incrementar, e so permite cliques e não manter clicado como um botão de volume.

PS: apesar de tambem uteis, fotos do circuito não são o melhor forma de alguem fora do assunto analisar. Convem sempre um esquema. Experimenta usar o fritzing, é facil e gratis. (a parte dos esquemas)
Pelo que vejo não tens nada que proteja o pin. Se reparares a resistencia não protege o pin. O positivo liga directamente ao pin quando ligas o botão.
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: [Dúvida] Controlo de contagem
« Responder #16 em: 27 de Agosto de 2013, 12:17 »
O "ruído" a que o rglove se refere é o chamado "bouncing", e é um problema sim, e leva a que o software detecte mais cliques do que na realidade ocorreram. Ao carregar ou largar um botão, existe um momento na transição em que os contactos mecânicos "saltitam" e a electrónica como é rápida detecta todas essas transições.

Uma forma simples de dar a volta ao bouncing (fazer o chamado "debouncing") é esperar por uma alteração de estado dos botões, e a seguir esperar 50ms antes de ler o seu estado e considerar esse como o estado actual.

Ou no caso de ser a pessoa  desenhar o esquema, meter um condensadores de 100nF que evita o deboucing.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: [Dúvida] Controlo de contagem
« Responder #17 em: 27 de Agosto de 2013, 13:13 »
O "ruído" a que o rglove se refere é o chamado "bouncing", e é um problema sim, e leva a que o software detecte mais cliques do que na realidade ocorreram. Ao carregar ou largar um botão, existe um momento na transição em que os contactos mecânicos "saltitam" e a electrónica como é rápida detecta todas essas transições.

Uma forma simples de dar a volta ao bouncing (fazer o chamado "debouncing") é esperar por uma alteração de estado dos botões, e a seguir esperar 50ms antes de ler o seu estado e considerar esse como o estado actual.

Ou no caso de ser a pessoa  desenhar o esquema, meter um condensadores de 100nF que evita o deboucing.

Não acho que valha a pena, ocupas mais espaço nas placas, mais componentes, por algo que pode ser muito facilmente tratado em código.

Usando um timer para gerar um contador que é incrementado a cada ms, pode-se fazer algo tão simples quanto isto:
Código: [Seleccione]
if(milis() - buttonsMilis > 10){
buttonsMilis = milis();
getBtnStatus();
}

void getBtnStatus(void){

uint8_t btnNewState = 0; //actual button state as read
static uint8_t btnLastState = 0; //previous button state read
uint8_t encNewState = 0; //actual encoder button state as read
static uint8_t encLastState = 0; //previous encoder button state read
uint8_t pressedState = 0; //Shows what are the pressed buttons after the debouncing

//read the 6 user interface buttons and debounce them (4 buttons + 2 buttons from the encoders)
btnNewState = BTNPIN & ((1<<BTN1)|(1<<BTN2)|(1<<BTN3)|(1<<BTN4));
pressedState = btnNewState & btnLastState;
btnLastState = btnNewState;
buttonState.btn1 = ((pressedState & (1<<BTN1))>>3);
buttonState.btn2 = ((pressedState & (1<<BTN2))>>2);
buttonState.btn3 = ((pressedState & (1<<BTN3))>>1);
buttonState.btn4 = (pressedState & (1<<BTN4));

//read the 4 pins that are used by the 2 rotary encoders
encNewState = ENCBTNPIN & ((1<<ENC1BTN)|(1<<ENC2BTN));
pressedState = encNewState & encLastState;
encLastState = encNewState;
buttonState.encV = ((pressedState & (1<<ENC1BTN))>>3);
buttonState.encI = (pressedState & (1<<ENC2BTN));
}
Avr fanboy

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: [Dúvida] Controlo de contagem
« Responder #18 em: 27 de Agosto de 2013, 14:37 »
Sim, também. Eu tanto faço por software como por hardware. E um 100nF pode ocupar muito espaço, ou não, depende da aplicação ;)
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
Re: [Dúvida] Controlo de contagem
« Responder #19 em: 27 de Agosto de 2013, 23:57 »
Senso esse código ainda é um bocado hardcore para os meus conhecimentos x)

Offline samc

  • Mini Robot
  • *
  • Mensagens: 442
Re: [Dúvida] Controlo de contagem
« Responder #20 em: 28 de Agosto de 2013, 10:38 »
Eu continuo a aconselhar bibliotecas... em todas as funções que são repetitivas e não fazem parte da aplicação em si mais vale utilizar as bibliotecas bem testadas por a comunidade (poupam-nos tempo e mantêm o código mais limpo e restringido ao essencial).

Já quando é para comunicar por serial também não estou com o trabalho de usar o serial.available blá bla bla. Uso a biblioteca SerialCommand.h, faz o parsing de valores, etc.