Skocz do zawartości

Przerwania, a ponowne sprawdzenie stanu przycisku.


Pomocna odpowiedź

23 minuty temu, ethanak napisał:

Przypominam: ośmiobitowy procek taktowany megahercem...

Trudno się dziwić że część początkujących programistów ma problemy z wydajnością swoich systemów skoro od początku nauki  kody źródłowe są nie kończącym się spaghetti z mnóstwem delayów. A przecież to tak proste do rozwiązania, zwłaszcza że arduino na dzień dobry daje funkcję millis i nie trzeba kombinować z konfiguracją timera. Kiedyś to było... Wyciąganie ostatnich potów z posiadanego sprzętu, teraz to nima czasów. <img/nosacz>

12 minut temu, SOYER napisał:

daj linka albo twórcę...

Musisz poczekać do jutra...

 

Chociaż nie: sprawdź pierwszy wynik w Google. Wiesz, to taka fajna strona gdzie coś wpisujesz a ona pokazuje gdzie to znaleźć 😉

23 minuty temu, _LM_ napisał:

przecież to tak proste

Wiesz - ja zaczynałem od Spectrum 16 i C16 (Odry nie liczę), a i na VC20 zdarzyło mi się po pijanemu jakąś grę napisać 🙂 To była naprawdę dobra szkoła wyciskania wszystkiego ze sprzętu...

A delay() jest też dla ludzi. Podobnie jak goto i wódka. Tylko trzeba wiedzieć jak się tego używa 🙂

  • Pomogłeś! 1

A że wódka jest przydatna, niech o tym świadczy pewna historia.

Za czasów pracy w teatrze miałem bardzo dobrego kolegę aktora. Aktor lalkarz raczej z tej wyższej półki, niestety - miał problem z jedną piosenką, nie potrafił wejść w tonację. Stwierdziłem że go nauczę. Kupiliśmy flaszkę, postawiłem dwa kieliszki i magnetofon i kazałem mu zaśpiewać. Oczywiście nie wyszło. Nalałem sobie kieliszeczek, wypiłem, kolega nieśmiało zapytał "a dla mnie?" - dowiedział się, że dostanie jak zaśpiewa.

Następnego dnia na próbie pani reżyser powiedziała "posłuchajcie, jak Mirek ładnie śpiewa, czy to takie trudne?"

Wódka jest czasami potrzebna 🙂

goto i delay też...

(edytowany)
  ITimer1.attachInterrupt(100000, wciskanie);

Po kolei:

#include <ESP32TimerInterrupt.h>

ESP32Timer ITimer1(1);
uint8_t flaga1=0;

const uint8_t ilosc = 2;

Potem w Setup ta linijka którą wstawiłem jako pierwszą

wreszcie na samym dole:

void IRAM_ATTR wciskanie(){
  if (digitalRead(TOUCH_1)){
    if (flaga1 < ilosc){
      flaga1++; // liczymy dotyk
    }
  }
  else if(flaga1 != ilosc){
     flaga1 = 0; // to był impuls
  }
}

wywala błąd:

C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_385575\__OK_DOMOFON_OSTATNIA_WERSJA_POPRAWKI_DZWONIENIA.ino: In function 'void setup()':
__OK_DOMOFON_OSTATNIA_WERSJA_POPRAWKI_DZWONIENIA:202:35: error: 'wciskanie' was not declared in this scope
   ITimer1.attachInterrupt(100000, wciskanie);



exit status 1
'wciskanie' was not declared in this scope

Jeśli skasuję tą linijkę w SETUP to kompiluje się bezproblemowo, więc to raczej nie problem z nawiasami.

??

Edytowano przez SOYER

A co się stanie, jeśli prawidłowo zadeklarujesz funkcję przed jej użyciem?

Owszem, builder Arduino robi parę rzeczy za Ciebie, ale nie wszystko. Zapomnij o udogodnieniach dla pacanów i potraktuj plik .ino jak normalny plik źródłowy C++. 

Po prostu funkcja musi być zdeklarowana (niekoniecznie zdefiniowana) przed pierwszym wystąpieniem w kodzie. Jeśli definicję masz na końcu to się nie dziw, że kompilator zanim do niej dolezie to jej nie zna...

 

Faktycznie racja, już kiedyś tak miałem.

Zastanawiałem się wtedy dlaczego funkcje użyte w pętli głównej mogą być napisane pod loopem i nie wywala tego błędu.

Dlaczego?

2 minuty temu, jand napisał:

Przenieś deklarację funkcji

deklaracja != definicja. Definicja jest jednocześnie deklaracją, ale w drugą stronę to nie działa...

Przed chwilą, SOYER napisał:

Dlaczego?

To obejrzyj sobie plik cpp stworzony przez buildera na podstawie Twojego ino. Zobaczysz, że builder dodał brakujące deklaracje.

9 minut temu, ethanak napisał:

deklaracja != definicja.

Tak jest. Byłem nieprecyzyjny.

Swoją drogą ciekawe, dlaczego IDE nie tworzy za użytkownika deklaracji funkcji obsługi przerwania.

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