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

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 :)

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 ....  
  
   }  
}  
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/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html
oraz: http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-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.

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 :)

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