Mikrokontroler 8051 Eliminacja drgań styków [Systemy wbudowane]

Odpowiedz Nowy wątek
DJR
2017-04-28 13:34
DJR

Rejestracja: 2 lata temu

Ostatnio: 2 lata temu

0

Witam !

Otóż dopadł mnie problem mały a może i dość spory ;)
Do rzeczy jest na sali osoba która może mi pomóc stworzyć oraz wyjaśnić kawałek kodu zobrazowany na poniższym algorytmie blokowym(załącznik na dole).

Mam za zadanie wbudować w program eliminację styków w przyciskach, mam 3 przyciski na P3_0 (dodawanie) P3_1 (odejmowanie) P3_7 (zerowanie).
Program zrealizowany z obsługa przycisków wklejam ponieżej, lecz wlaśnie jeszcze te nieszczęsne drgania eh :D

#include "8051.h"
//deklaracja zmiennych odpowiedzialnych za częstotliwość odświerzania
#define TH0_RELOAD 0xFF
#define TL0_RELOAD 0x00
#define TIK 5
// deklaracja tablicy ASCII zawierającej odpowiednie wartości na wyświetlaczu 0 - F
char display[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
// deklaracja liczników
char i=0;
char j=0;
// zmienne przechowujące wartość wyświetląną na wyświetlaczu
char war_wyś_x=2,war_wyś_y=0,war_wyś_z=1,war_wyś_w=7;

//stan przycisku eliminacja drgań

// funkcja obsługująca zegar
void timer0_init(void)
{
    TH0 = TH0_RELOAD;
    TL0 = TL0_RELOAD;
    TMOD = TMOD | 0x01;
    TR0 = 1;
    ET0 = 1;
}
void timer_isr (void) __interrupt (1) __using (0)
{
    static int count=0;
    TH0 = TH0_RELOAD;
    TL0 = TL0_RELOAD;
    count++;
    j++;
    j=j%4;
    if(count==TIK)
    {
        count=0;
        i++;
        i=i%16;
    }
}

}
void main(void)
{
    //obsługa przerwań oraz wywołanie funkcji zegara
    EA = 0;
    timer0_init();
    EA=1;
    P2=0xFF;
    while(1)
    {
         // obsługa przycisku  dodawania
        if (P3_0 == 0)
        { 
        if (war_wyś_w >= 9) {
            war_wyś_w = 0;
            if (war_wyś_z>= 9) {
                war_wyś_z= 0;
                war_wyś_y++;
                if(war_wyś_y >=9) {
                    war_wyś_y = 0;
                    war_wyś_x++;
            } 
            }
            else {
                war_wyś_z++;
            }
        } 
        else {
            war_wyś_w++;        
        } 
        if (war_wyś_w == 9 && war_wyś_x == 9 && war_wyś_y == 9 && war_wyś_z == 9) {
            break;
        }   
        }

        // obsługa przycisku odejmowania
        if (P3_0 == 0)
        { 
            if (war_wyś_w != 0) {
            war_wyś_w--;

        }
        else {
            war_wyś_w = 0;
            if (war_wyś_z != 0) {
                war_wyś_z--;
            }
            else {
                war_wyś_z = 0;

                if (war_wyś_y != 0) {
                    war_wyś_y--;
                } else {
                    war_wyś_y= 0;
                    if (war_wyś_x != 0) {
                        war_wyś_x--;
                    } else {
                        war_wyś_x = 0;
                            }
                        }
                }
        }

        }
        // obsługa przycisku zerowania
        if(P3_7==0) {
            war_wyś_x =0;
            war_wyś_y =0;
            war_wyś_z =0;
            war_wyś_w =0;
        }
        war_wyś_w;
        war_wyś_x;
        war_wyś_y;
        war_wyś_z;
        // wybór wyświetlacza 
        switch(j)
        {
            case 0:
                P1 = 0x01;
                P0 = display[war_wyś_x];
                break;
            case 1:
                P1 = 0x02;
                P0 = display[war_wyś_y];
                break;
            case 2:
                P1 = 0x04;
                P0 = display[war_wyś_z];
                break;
            case 3:
                P1 = 0x08;
                P0 = display[war_wyś_w];
                break;
        }
    }
}

Jeśli nie wytłumaczyłem wyczerpująco to jeszcze podaję dokładne polecenie:

  1. Zmodyfikuj kod programu będącego treścią zadania drugiego z ćwiczenia nr 2 (program obsługi
    wyświetlacza siedmiosegmentowego oraz klawiszy) dodając do niego programową eliminację drgań
    zestyków wg wytycznych przedstawionych w rozdziale 1 niniejszej instrukcji opierając się zwłaszcza
    na rys. nr 5.
  2. Dobierz eksperymentalnie wartość stałej LIMIT w sposób zapewniający poprawną pracę przycisków.
  3. Na podstawie analizy gotowego kodu źródłowego oszacuj czas wystarczający do eliminacji drgań
    zestyków w konkretnym zestawie uruchomieniowym.

Niestety jest ten problem że nie mam jak przetestować za bardzo i ciężko mi się tak programuje dlatego kieruje prośbę do was :)

edytowany 3x, ostatnio: DJR, 2017-04-28 13:39
Pro-tip: zmień studia w takim razie. Popularne jest obecnie "środowisko" (nie mylić z "ochroną środowiska") - można nieźle zarobić, jak pokazał Szyszka. - vpiotr 2017-04-28 13:38

Pozostało 580 znaków

2017-04-28 14:12

Rejestracja: 2 lata temu

Ostatnio: 7 godzin temu

0

Tutaj masz napisane dużo o debouncing'u - co to jest, czym jest to spowodowane i jak to wyeliminować (programowo i hardware'owo)

Przykład ze strony na eliminację za pomocą opóźnienia (pseudokod):

if(czy_przycisk_przycisniety){  

   //tak przyciśnięty  
   czekaj_10_milisekund;  

   if(czy_przycisk_przycisniety){  
      //tak nadal przyciśnięty  

       ..... wykryto przyciśnięcie ....  

   }  
}  

Pozostało 580 znaków

2017-04-28 14:43

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

Lokalizacja: Lublin

0

Drgania styków to mit!
Ten problem, który powszechnie nazywany jest drganiami styków wynika z czego innego.
Polecam lekturę: http://mirekk36.blogspot.com/[...]kow-to-bajki-wiec-jak-to.html
oraz: http://mirekk36.blogspot.com/[...]wiszy-drgania-stykow-cd2.html
Wprawdzie artykuły dotyczą AVR, ale dotyczy to wszystkich mikrokontrolerów.

p.s. nie wolno tego robić na na zasadzie czekania, tak jak kolega wyżej napisał, tylko kod powinien się opierać na flagach. Szczegóły w artykułach.


"Jesteśmy świadomymi istotami, a życie jest sposobem w jaki wszechświat poznaje sam siebie." prof. Brian Cox
edytowany 1x, ostatnio: bl4ster, 2017-04-28 14:45
Tak, tak mit, dlatego dalej w tych artykułach autor walczy z eliminacją ...? I generalnie robi się to właśnie na zasadzie czekania. A to czy w tym czekaniu blokujesz / czy nie blokujesz rdzeń, to już inna historia. - Sparrow-hawk 2017-04-28 15:58

Pozostało 580 znaków

DJR
2017-04-28 15:07
DJR

Rejestracja: 2 lata temu

Ostatnio: 2 lata temu

0

Hm tak tak wiem ze drgania to mit tylko powiedz to mojemu wykladowcy :/
Okey informacji duzo wrecz wystarczająco dlatego dziekuje dojde do tematu :)
Pozdrawiam uczestników i dziekuje za poswiecony czas :)

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0