logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8]Bardzo duże drgania na przyciskach

gigipawel 26 Lis 2009 08:40 1754 6
REKLAMA
  • #1 7310085
    gigipawel
    Poziom 15  
    Witam.

    Mam płytkę stykową i nie mogłem zamontować na niej procesora bo porostu wyskakiwał. Dolutowałem do końcówek podstawki druciki .
    Dodatkowo łącze to wszytko dość długimi kabelkami.
    Programowo na 100% dziala bo wklepałem gotowca z kursu z gazety.
    Oto schemat może na nieodpowiedni kanał przyłączam.
    [Atmega8]Bardzo duże drgania na przyciskach
  • REKLAMA
  • #2 7310150
    danielpalka
    Poziom 12  
    Witam.
    "Bardzo duże drgania na przyciskach" to znaczy?
    Fuse bity ustawione?
    Co to za program (kod)?
  • REKLAMA
  • #3 7310185
    gigipawel
    Poziom 15  
    Funkcja odpowiedzialna za usuwanie drgań.
    if(!(PINB & 1<<0))
    		{
    			// usuwanie drgań styków
    			g_bDelay = 15; //50ms
    			while(g_bDelay != 0) {}
    			if(!(SWPIN & 1<<SW1))
    			{
    				++g_Licznik; 
    				g_bDelay = 120; //1s
    				while(!(SWPIN & 1<<SW1))
    				{
    					WyswietlDEC(g_Licznik); 
    					if(g_bDelay==0)
    					{
    						g_bDelay = 15; //50ms
    						++g_Licznik; 
    					}
    				}
    			}
    		}
    		if(!(SWPIN & 1<<SW2))
    		{
    			// usuwanie drgań styków
    			g_bDelay = 15; //50ms
    			while(g_bDelay != 0) {}
    			if(!(SWPIN & 1<<SW2))
    			{
    				--g_Licznik; 
    				g_bDelay = 120; //1s
    				while(!(SWPIN & 1<<SW2))
    				{
    					WyswietlDEC(g_Licznik); 
    					if(g_bDelay==0)
    					{
    						g_bDelay = 15; //50ms
    						--g_Licznik; 
    					}
    				}
    			}
    		}


    FuseBity są ustawione na wewnętrzne procesora standardowo 1MHz ale mogę zmienić na 8MHz.

    TE dwa przyciski mają zwiększać lub zmniejszać wartość wyświetlana na wyświetlaczu. W czasie gdy nie naciskam liczba powinna być stała niestety rośnie lub maleje (losowo) :/
    Używam w micro swichach tylko 2 nóżek NO.
  • REKLAMA
  • #4 7312516
    janbernat
    Poziom 38  
    A podciąganie wejść włączone?
  • #5 7313748
    kordirko
    Poziom 22  
    Spróbuj czegoś takiego:

    
    #define SW_BITS  0xF
    void obsluz_klawisze(){
    
    	unsigned char bit;
    
    	bit = WE1_PIN & _BV(WE1_BIT);
    	bit = ( bit != 0 ) ? 1 : 0;
    	sw_bits = (sw_bits << 1) | bit;
            unsigned char bity = sw_bits & SW_BITS;
    	
    	if( bity == 0 )
    			sw_State = 0; // stan pinu 0
    	else if( bity == SW_BITS )
    			sw_State = 1; // stan pinu 1
    	// else - do not change lastState
    }


    Funkcja wołana z przerwania (u mnie 120 razy na sekundę).
    Odczytujesz bit z pinu i przesuwasz je w rejestrze.
    Maska SW_BITS mówi ile kolejnych bitów musi mieć po kolei 0000 lub 1111
    aby klawisz zmienił stan na 0 lub 1 (można regulować od 1 do 8 bitów, u mnie 4 bity),
    jak ma inny wzorzec np. 0100 to nie zmienia stanu.
    Czyli stan zmienia się dopiero wtedy, jak ustaną drgania
    - czas drgań nas zupełnie nie obchodzi, może być 10ms, może być 5sek,
    przełączy się dopiero jak drgania ustaną.

    W programie głównym nie ma żadnych delajów czy innych komplikacji,
    po prostu badam stan zmiennej sw_State.
  • REKLAMA
  • #6 7322249
    michalm
    Poziom 12  
    Można też wlutować pomiędzy styki przycisku kondensator. Ja stosowałem 100nF, ale możliwe, że trzeba będzie poeksperymentować z wartością.
  • #7 7325562
    gigipawel
    Poziom 15  
    Kondensatory nie pomogły :/
    Dopiero zmiana PORTU z C na Inny pomogła.
REKLAMA