środa, 28 września 2016

[2] Atmega328P - Obsługa przycisku

W tym poście chciałbym przedstawić sposób obsługi przycisku.

Działanie programu będzie standardowe jeśli przycisk będzie wciśnięty to odczeka 100 ms, po tym czasie ponownie sprawdzi czy przycisk jest wciśnięty. Jeśli tak to zapali diodę wbudowaną do płytki Arduino.


Program wygląda następująco:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #define DELAY_TIME 100
  4. int main (void)
  5. {
  6.     //Ustawienie pin 5 GPIOB jak wyjście,
  7.     DDRB |= _BV(DDB5);
  8.     DDRD != ~_BV(DDD7); //Ustawienie jako wejsciowy
  9.     PORTD |= _BV(DDD7); //
  10.    
  11.     while(1) {
  12.         if(!(PIND & (1<<PD7)))
  13.         {
  14.           _delay_ms(DELAY_TIME);
  15.           if(!(PIND & (1<<PD7)))
  16.           {
  17.             PORTB |= _BV(PORTB5);
  18.             _delay_ms(DELAY_TIME+100);
  19.           }
  20.           else
  21.           {
  22.             PORTB &= ~_BV(PORTB5);
  23.           }
  24.         }
  25.     }
  26. }

Domyślnie piny w rejestrze DDRx są ustawione na zera, wobec tego nie trzeba negować poszczególnych operacji, wystarczy tylko włączyć odpowiednie wyprowadzenia.