Skocz do zawartości

Odczytanie stanu przycisku na rejestrach Arduino


SheepHunter

Pomocna odpowiedź

Cześć, piszę na arduino w C++ wykorzystując rejestry.
Męczę się z tym już trzecią godzinę i nie potrafię napisać poprawnego warunku który wstawię do if() i sprawdzi wciśnięcie przycisku. chcę to zrobić bez używania bibliotek i komend typu bit_is_clear. Z góry dziękuję za pomoc.

Program jest prosty, do testów. ma migać diodami na pinach 0 1 i 2. Przyciski mam na pinach 3 4 i 5

#include <avr/io.h>  
#include <util/delay.h>

int main(void) {
  DDRD = 0b00000111;
  PORTD = 0b00111000;
  while (1) 
  {

    if(    )
    {
    PORTD = 0b00000111;
    _delay_ms(500);
    }
    else
    {
    PORTD = 0b00000000;
    _delay_ms(500);
    }

  }
}

 

Edytowano przez SheepHunter
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Po to sobie robisz definicje z użyciem operacji logicznych by odczytywać i włączać tyle te piny, które Cię interesują. Nie używaj pinów 0 i 1, one są podłączone do konwertera UART.

Przykładowy kod, jak makra są brzydkie to z użyciem CTR+C i CTR+V możesz ładnie powiększyć ilość znaków w programie:


//Macro for led
#define led1 (1<<PD0) // led
#define led1_1 PORTD |= led1 //led set to 1
#define led1_0 PORTD &= ~led1 //led set to 0
#define led1_n PORTD ^= led1  //led change state

#define led2 (1<<PD1) // led
#define led2_1 PORTD |= led2 //led set to 1
#define led2_0 PORTD &= ~led2 //led set to 0
#define led2_n PORTD ^= led2  //led change state

#define led3 (1<<PD2) // led
#define led3_1 PORTD |= led3 //led set to 1
#define led3_0 PORTD &= ~led3 //led set to 0
#define led3_n PORTD ^= led3  //led change state

#define KEY1_PIN (1<<PD3)
#define KEY1_PRESS !(PIND & KEY1_PIN)

#define KEY2_PIN (1<<PD4)
#define KEY2_PRESS !(PIND & KEY2_PIN)

#define KEY3_PIN (1<<PD5)
#define KEY3_PRESS !(PIND & KEY3_PIN)

int main( void ) {
  DDRD |= led1;
  DDRD |= led2;
  DDRD |= led3;
DDRD &= ~KEY1_PIN;  // dla edu na wejsciowy
DDRD &= ~KEY2_PIN;  
DDRD &= ~KEY3_PIN;  
PORTD |= KEY1_PIN; //pullup
PORTD |= KEY2_PIN; //pullup
PORTD |= KEY3_PIN; //pullup
while(1)
{
if( KEY1_PRESS )  led1_1;
else led1_0;
if( KEY2_PRESS )  led2_1;
else led2_0;
if( KEY3_PRESS )  led3_1;
else led3_0;
 
 
}

}

 

Link do komentarza
Share on other sites

6 godzin temu, kaczakat napisał:
#define led1_n PORTD ^= led1  //led change state

Ho, ja bym z czymś takim nie ryzykował, bo to może mieć różne nieprzewidziane efekty (zależy jak wstawisz w kod). Raczej coś w stylu:

#define led1_n do { PORTD ^= led1;} while(0)

To taki typowy sposób...

Link do komentarza
Share on other sites

Zauważ, że taki zapis nie gwarantuje, że bedzie potraktowany jako kompletna instrukcja. Zapis z do/while gwarantuje, przy czym kompilowany jest na taki sam kod.

Inaczej: Twój sposób zadziała w 99.99%. Mój w 100.

Link do komentarza
Share on other sites

Pozostaje mi się tylko domyślać, że kiedyś, w dawnych czasach,  korzystając z jakiegoś notatnika jako RAD mogło się coś takiego zdarzyć. Kiedyś to były czasy 😄. Wcale mnie nie dziwi, że widzę to pierwszy raz, programowanie to dla mnie świeże hobby i nie jedyne, ale parę książek przekartkowałem, a przynajmniej miałem zamiar.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.