Skocz do zawartości
Komentator

Kurs FPGA - #9 - drgania styków, automaty cd.

Pomocna odpowiedź

html_mig_img
Kolejnym projektem realizowanym podczas kursu podstaw FPGA będzie jeszcze większy automat skończony. Tym razem wykorzystamy przyciski, więc konieczne będzie również eliminowanie zjawiska drgań styków.Oprócz tego zajmiemy się podziałem projektu na moduły. Dzięki czemu kod będzie czytelniejszy.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

Może i nie jestem specjalistą od HDL, ale kopiuj-wklej to paskudny nawyk podczas pisania programów. Proponuję więc mały konkurs:

Kto wymyśli jak elegancko pozbyć się koszmarnego powtarzania fragmentu:

            if flaga_nacisniecia_SW1 = 1 and przycisniecie_SW1='0' then 
              Stan <= S2;
              flaga_nacisniecia_SW1 := 0;
           elsif flaga_nacisniecia_SW2 = 1 and przycisniecie_SW2='0' then
              Stan <= S0;
              flaga_nacisniecia_SW2 := 0;  
           else
              Stan <= S1;
           end if; 
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

To samo(??) na arduino, fajna sprawa, realizuje dopiero po puszczeniu przycisku:

#define PinP 10
#define led 13
boolean wcisnieto=false;
boolean przycisk=false;
boolean stanled=false;

void setup() {
 pinMode(led, OUTPUT);
 pinMode(PinP, INPUT_PULLUP);

}

void loop() {
 // put your main code here, to run repeatedly:
deb();
}

void deb(){

 if(digitalRead(PinP) == LOW){
 wcisnieto=true;
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){
 wcisnieto=false;
 przycisk=true;
}
if(przycisk==true){
 digitalWrite(led, stanled);
 stanled = !stanled;
 przycisk=false;
}
}
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

SOYER, dokładnie tak, w tym przykładzie stany zmieniają się dopiero po puszczeniu przycisku.

Udostępnij ten post


Link to post
Share on other sites

Moim zdaniem propozycja Soyera w żaden sposób nie eliminuje problemu drgania styków, z którym możemy się spotkać gdy przycisk puścimy. Po puszczeniu przycisku może być on właśnie w niestabilnym położeniu. Należy odczekać "określony czas" i dokonać ponownego sprawdzenia. Myślę, że to o to chodzi w temacie "eliminacja drgania styków".

Pozdrawiam,

Udostępnij ten post


Link to post
Share on other sites

Belferek, niestety masz w pełni rację - ale eliminacja drgań styków to ogólnie dość trudny, a do tego często nie rozumiany temat (nawet przez osoby prowadzące konkurencyjne blogi/fora).

Tutaj chyba powinniśmy pisać o FPGA, chociaż może to i ciekawy temat żeby opisać na czym ten problem polega i jak sobie z nim radzić.

Udostępnij ten post


Link to post
Share on other sites

Temat jest uniwersalny bo na każdej platformie sprzętowej mamy z nim do czynienia, no ale to artykuł o FPGA i niech tak zostanie.

Udostępnij ten post


Link to post
Share on other sites

Namieszałem moją odpowiedzą. "Przytaknąłem", że stan zmienia się w momencie puszczenia przycisku (bo tak działa program z kursu), a nie zerknąłem w kod umieszczony w poście. Oczywiście w tym wklejonym fragmencie drgania styków nie są eliminowane 😉

Udostępnij ten post


Link to post
Share on other sites

Przedtem zdawałem sobie sprawę, że nie ma opóźnienia dla odczytu i drgania nie są "filtrowane". Cieszyła mnie realizacja po puszczeniu przycisku 😃

Teraz:

#define PinP 10
#define led 13
boolean wcisnieto=false;
boolean przycisk=false;
boolean stanled=false;
int i;

void setup() {
 pinMode(led, OUTPUT);
 pinMode(PinP, INPUT_PULLUP);

}

void loop() {
 // put your main code here, to run repeatedly:
deb();
}

void deb(){

 if(digitalRead(PinP) == LOW){
while(i>0){
 for(i=2000; i=0; i--){}
}
 }
  if(digitalRead(PinP) == LOW){
 wcisnieto=true;
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){
while(i>0){
 for(i=2000; i=0; i--){}
}
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){
 wcisnieto=false;
 przycisk=true;
}
if(przycisk==true){
 digitalWrite(led, stanled);
 stanled = !stanled;
 przycisk=false;
}
}

Wiem, że to kurs FPGA, przepraszam za wtrącenie, jeśli moderator uzna za stosowne mnie upomnieć, to proszę o info i zrobię nowy temat.

Czy teraz drgania są eliminowane?

Niestety nie wiem ile powinno wynosić "i" w pętli for dla powiedzmy 80ms. 2000 wpisałem tak sobie, żeby coś było. Jak to policzyć?

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Wdarł się pewien błąd do proponowanego kodu pliku UCF. W pierwszej linijce są nadmiarowe znaki białe, nie działał mi przez nie program. Poza tym wszystko w porządku 👍

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Grievous1990 dziękuję za zgłoszenie, sprawdzę temat 🙂

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...