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

ATTINY i dodawanie tylko 1 po wcisniciu switch'a.

riger 18 Wrz 2009 17:42 1380 6
REKLAMA
  • #1 7032065
    riger
    Poziom 24  
    Witam!
    Mam nastepujacy problem. Jak napisac funkcje (w jezyku C), ktora po wcisnieciu przycisku doda mi do stanu licznika 1 tj. po przytrzymaniu nie bedzie dodawala w nieskonczonosc lecz doda mi tylko i wylacznie 1.
    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 7032213
    snow
    Poziom 31  
    Albo podpiąć pod INTx i wyzwalać przerwanie zboczem
  • #4 7032667
    kwesoly
    Poziom 15  
    I wpisać w forumową szukajke "drgania zestyków" lub "debounce" - w przeciwnym wypadku grozi Ci pytanie "Jak dodać jeden a nie 20" :)
  • REKLAMA
  • #5 7033752
    _Robak_
    Poziom 33  
    Jak by podpial pod inta tylko to nic nie da. Tak na szybko na pale to po prostu daj delaya jakies 50-100ms i bedzie akurat, tylko wtedy oczywiscie bedzie naliczal przy przytrzymaniu. Mozesz zrobic tak zeby nie naliczal, bierzesz dodatkowa zmienna np wcisniety, ktora sie ustawia na 1 jak wcisniesz klawisz, ustawiasz na 0 jezeli klawisz jest puszczony :) Jezeli jest na 1 to nie inkrementujesz innej zmiennej.
  • REKLAMA
  • #6 7036707
    p_zag
    Poziom 14  
    Witaj.
    Przeanalizuj mój fragment kodu, jest to kod pochodzący z mojego programu "Atmega8 i TWI na przykładzie zegara LED".
    Co prawda pisałem ten kod na Atmege, ale po zamianie bitów portów powinno pasować do Attiny. Najważniejszy jest bit "portu C" -> pełni rolę szybkiego przełącznika
    W tym kodzie ignorowana jest długość naciśnięcia klawisza, a również ignorowane jest naciśnięcie kilku klawiszy na raz.
    Czyli obojętnie jak długo jest naciśnięty klawisz zadanie wykona się tylko raz. Aby powtórnie wykonać zadanie trzeba zwolnić klawisz i na nowo nacisnąć.
    Zmienna "unsigned char klawiatura;" ma dowolną wartość np.0b00011111 , ale trzeba pamiętać o powiązaniu z "_delay_ms(30)" i "switch (klawiatura)"
    Funkcja "_delay_ms(30)" jest po to aby zniwelować drgania styków i tu też można sobie opóźnienia dobierać.

    Powodzenia
    Piotr




    
    
    unsigned char klawiatura; 
    
    
    int main(void)
     {   /* Instrukcje jednokrotnego wykonania */ 
      //        Porty: PD0 PD1 PD2 PD3 PD4  ->  wejścia klawiatury z pull-up'em 
      // 		Port:	PC0 -> znacznik jednokrotnego wykonania 
      // 1 -> wyjście
      // 0 -> wejście
      DDRC =0b00000001; 
      DDRD =0b00000000;
      // 1 -> z podciągnięciem do VCC (pull-up)
      // 0 -> bez podciągniecia do VCC
      PORTC =0b00000000;
      PORTD =0b00011111; 
     
      while(1)  /* Instrukcje wielokrotnego wykonania */
       {   
    //---------------------------
    //  początek
    //  test klawisza
    //---------------------------
        klawiatura =0b00011111;	
       if(bit_is_clear(PIND,PIND0)) { _delay_ms(30); klawiatura =klawiatura & 0b00011110; } 
        if(bit_is_clear(PIND,PIND1)) { _delay_ms(30); klawiatura =klawiatura & 0b00011101; } 
       if(bit_is_clear(PIND,PIND2)) { _delay_ms(30); klawiatura =klawiatura & 0b00011011; } 
       if(bit_is_clear(PIND,PIND3)) { _delay_ms(30); klawiatura =klawiatura & 0b00010111; } 
       if(bit_is_clear(PIND,PIND4)) { _delay_ms(30); klawiatura =klawiatura & 0b00001111; } 
       if(klawiatura ==0b00111111) PORTC &=~(1<<1); // znacznik  -> znacznik zwolnienia klawisza
    
    //---------------------------
    //  początek
    //  wybór klawisza
    //---------------------------
        if(bit_is_clear(PINC,PINC1)) // start klawiatury
        {
          switch (klawiatura)
         {
        // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           case 0b00011110: 
    						// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
                            PORTC |=(1<<1); // znacznik  -> wciśniętego klawisza
    						break;
           // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           case 0b00011101: 
    						// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz	   
    						PORTC |=(1<<1); // znacznik  -> wciśniętego klawisza
    						break;
           // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           case 0b0b00011011: 
    						// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz	   
    						PORTC |=(1<<1); // znacznik  -> wciśniętego klawisza
    						break;
           // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           case 0b00010111: 
    						// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz	   
    						PORTC |=(1<<1); // znacznik  -> wciśniętego klawisza
    						break;
           // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           case 0b00001111: 
    						// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz	   
                            PORTC |=(1<<1); // znacznik  -> wciśniętego klawisza
    						break;
           // -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
           default: /* klawisze poza wyborem */
                    break;
         } // END switch (klawiatura)
    //---------------------------
    //  koniec
    //  test klawisza
    //  wybór klawisza
    //---------------------------
        }// stop klawiatury  
    	
    	// tu wpisz dalsze instrukcje programu wykonywane wielokrotnie
    	
       } // end while()
      } // end main()
      
    
REKLAMA