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

[solved]brakuje jednego pinu ATMEGA8

Yazutsu 17 Gru 2010 21:12 1293 7
REKLAMA
  • #1 8881494
    Yazutsu
    Poziom 10  
    Problem polega na tym że zostały 3 porty I/0 a przycisków ma być 4.
    Więc wymyśliłem że ten czwarty będzie podłączony pod drugi i trzeci na raz a wykrywać to będę programowo, ale coś nie działa tak jak trzeba.
    Na 10 prób funkcja wykrywa że naciśnięty został przycisk czwarty 7-8 razy, w reszcie przypadków wykazuje przycisk 2 lub 3.
    Zamieszczam moją funkcję i schemat , może da się wykorzystać któryś z używanych już pinów?a może po prostu funkcja kuleje?

    [solved]brakuje jednego pinu ATMEGA8

    
    int sprawdzanie_stanu_przyciskow()
    	{
    	int wybrano_przycisk=0;
    	//1-ok
    	//2-góra
    	//3-dół
    	//4-esc
    			if(bit_is_clear(PINC,PC1))						// guzik ok
    				{
    					wybrano_przycisk=1;
    					_delay_ms(200);						
    				}
    
    			if(bit_is_clear(PINB,PB0))						// gora
    				{
    					wybrano_przycisk=2;
    					_delay_ms(200);						
    				}
    			if(bit_is_clear(PINB,PB1))						// dol
    				{
    					wybrano_przycisk=3;
    					_delay_ms(200);
    				}
    			if(bit_is_clear(PINB,PB0) && bit_is_clear(PINB,PB1))			// esc
    				{
    					wybrano_przycisk=4;
    					_delay_ms(300);						
    				}
    	return wybrano_przycisk;
    	}
    


    Z góry dzięki za pomoc.
  • REKLAMA
  • Pomocny post
    #2 8881533
    sulfur
    Poziom 24  
    Za mało kodu, ale proponuję usunąć wszystkie _delay_ms() i wstawić jedno, bezpośrednio przed return. O ile w ogóle jest potrzebne.
  • REKLAMA
  • #3 8881596
    asembler
    Poziom 32  
    Podłacz wszystkie klawisze przez odpowiednie dzielniki do wejscia ADC i wykrywaj nacisniecie poprzez pomiar napiecia.
  • REKLAMA
  • #4 8881646
    Yazutsu
    Poziom 10  
    dzięki, pomogło danie jednego delaja na końcu, bez niego niestety występuje tzw efekt debouncingu bardzo u mnie niepożądany , no chyba że wiesz jak mu zapobiec bez potrzeby zatrzymywania procka na te 200ms?
  • #5 8881707
    sulfur
    Poziom 24  
    Filtr RC lub wywoływanie funkcji co określony czas lub propozycja kolegi asembler.
  • REKLAMA
  • #6 8883029
    Yazutsu
    Poziom 10  
    Na razie wystarczy, próbowałem zgooglować "filtr rc" ale po chińsku wszystko, żaden ze mnie elektronik, natomiast propozycja kolegi asembler jest bardzo kusząca i tu od razu zapytam.
    A dało by się tak że powiedzmy wykorzystuje sobie tylko dwa piny?
    Wszystkie guziki przez te dzielniki(rozumiem to jako rezystory o różnej oporności po prostu, jeśli się mylę skorygujcie) podłączone do wejścia ADC i każdy do INT1 a wywołanym przerwaniem wykonywałbym pomiar na ADC?
  • #7 8883106
    mirekk36
    Poziom 42  
    Yazutsu napisał:
    A dało by się tak że powiedzmy wykorzystuje sobie tylko dwa piny?
    Wszystkie guziki przez te dzielniki(rozumiem to jako rezystory o różnej oporności po prostu, jeśli się mylę skorygujcie) podłączone do wejścia ADC i każdy do INT1 a wywołanym przerwaniem wykonywałbym pomiar na ADC?


    Dobrze myślisz ;) i nawet bez przerwania INT1 dałoby radę bo po co? zapuścić ADC w trybie ciągłego pomiaru w przerwaniu i niech ciągle dokonuje pomiaru. Wtedy wystarczy jedną funkcyjką porównywać wartość ADC gdzieś w pętli głównej do danego klawisza.
  • #8 8883467
    Yazutsu
    Poziom 10  
    Fajno, na razie sobie to jednak odpuszczę, gdyby się okazało że jednak będzie potrzeba zwolnić choć jeden pin na coś dodatkowego to wrócę do tematu.
    Zamykam.
REKLAMA