Skocz do zawartości

Komunikacja przez UART - dwukrotne wysyłanie ciągu znaków


Pomocna odpowiedź

Witam,

Jestem na początku. Proszę o pomoc w zrozumieniu komunikacji z komputerem. Kod banalny, diody migają dopóki nie wciśnięty zostanie przycisk S0, wtedy ma się wyświetlić komunikat. Sekwencja "migania zostaje" wznowiona poprzez wciśnięcie S1.

Program działa, tak, że komunikat wyświetla się, po naciśnięciu S0 i ponownie po naciśnięciu S1.

#define S0 2
#define S1 3
#define L0 8
#define L1 9
bool p_akt;

void setup() {
 p_akt = false;
 pinMode(S0, INPUT_PULLUP);
 pinMode(S1, INPUT_PULLUP);
 pinMode(L0, OUTPUT);
 pinMode(L1, OUTPUT);
 digitalWrite(L0, LOW);
 digitalWrite(L1, LOW);
 attachInterrupt(digitalPinToInterrupt(S0), f_przerw, CHANGE);
 Serial.begin(9600);
 Serial.println("Program is running..");
}

void loop() {

 if (p_akt == false) {
   digitalWrite(L0, HIGH);
   digitalWrite(L1, LOW);
   delay (100);
   digitalWrite(L0, LOW);
   digitalWrite(L1, HIGH);
   delay (100);
 } else {
   Serial.println("S0 is pressed");
   delay(10);
   p_akt = false;
   while (digitalRead(S1) == HIGH) {
   }
 }
}

void f_przerw() {
 p_akt = true;
}
Link to post
Share on other sites

Przerwanie zapinasz na event CHANGE co oznacza że funkcja f_przerw wywoła Ci się dwa razy, w momencie wciśnięcia przycisku i w momencie puszczenia przycisku.

Spróbuj zmienić typ eventu na FALLING.

Link to post
Share on other sites
Przerwanie zapinasz na event CHANGE co oznacza że funkcja f_przerw wywoła Ci się dwa razy, w momencie wciśnięcia przycisku i w momencie puszczenia przycisku.

Spróbuj zmienić typ eventu na FALLING.

Próbowałem z każdym innym eventem i bez zmian. Wyświetlają się dwa komunikaty.

Link to post
Share on other sites

Zawsze dokładnie dwa? Bo zmiana typu wykrywanego zbocza nie pomoże na drgania styków. Musiałbyś dodać ich sprzętowe usuwanie lub dodać jakiś mechanizm w oprogramowaniu (np. wyłączanie przerwania na 50ms po wykryciu pierwszego zbocza).

Link to post
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

Lukaszm ma rację, to jest drganie styków, a dziwne zachowanie, że zawsze dwa razy wysyła komunikat wynika stąd, że choć można wyzwolić przerwanie 1-100 razy jednym naciśnięciem przycisku to przerwanie jedynie zmienia flagę i nic więcej nie robi. Wykonanie else trwa tu akurat tyle, że zareaguje tylko jeden dodatkowy raz na te kilkadziesiąt wywołań (wyniki XX przerwań czekają aż skończy się delay 10 i przy następnej okazji else wykonuje się jeszcze raz), a w sumie dwa razy.

Wróciłem, żeby dodać, że rozwiązaniem jest przesunięcie zmiany flagi za delay(10), ale już tak jest więc chodzi o coś innego. Zrobiłem sobie to u siebie, drugi raz drukuje tylko wtedy gdy aktywuje przerwanie, wejdzie w pętlę oczekującą na przycisk S1 i wtedy wcisnę S0 + S1 w tej kolejności. Ale potem nie wchodzi w oczekiwanie na S1 bo zapewne S1 też wielokrotnie drga.

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.