Skocz do zawartości

ESP32 przerwania


kellyq

Pomocna odpowiedź

Hej

Napotkałem pewną dziwną rzecz związaną z przerwaniami na esp32. Mam zadeklarowany przycisk pod 33 GPIO, fizycznie jest on podciągnięty do VDD rezystorem 10k + układ RC do sprzętowego debouncingu na wejściu do uC. Przypięte jest do niego przerwanie które zmienia wartość zmiennej "flaga". Zmienną tą resetuje do zera za pętlą while. I teraz dziwna sytuacja bo kiedy używam przerwania do wydostania się z pętli to za pierwszym przyciśnięciem działa prawidłowo, za drugim razem samo wyzwala się , za trzecim razem znowu działa prawidłowo, za czwartym samo wyzwala itd. Co drugie wejście w pętle while zostaje zignorowane i samo z niej wychodzi. 

Kiedy zmienię po prostu na odczytywanie stanu pinu dział tak jak trzeba. 

W sumie to nie zależy mi tutaj na tym przerwaniu ale dobrze by było wiedzieć dlaczego tak się dzieje.

#define przyciskKip 33        //przycisk kiprowania
  
--------------------------------------------------
 pinMode(przyciskKip, INPUT_PULLUP);
 attachInterrupt(przyciskKip, ISR, FALLING);

--------------------------------------------------
  void ISR(){
  flaga = 1;
	}
--------------------------------------------------
        while (1) {
        // if (flaga == 1) {             //przycisk wysypywania naciśnięty
        // goto skip_1;

        // }
            if(digitalRead(przyciskKip)==LOW){
              goto skip_1;
            }
      	}
		skip_1:

 

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

1 godzinę temu, ethanak napisał:

 brakuje IRAM_ATTR przy funkcji ISR.

Ja mam pytanie w związku z powyższym bo nie jestem pewny...doczytałem że stringi,stałe,tablice muszą być zwykle z odpowiednim makrem dopisane..w stylu, DRAM_ATTR/DRAM_STR... No i pytanie czy sytuacja ta dotyczy tylko 

const

??

Link do komentarza
Share on other sites

18 minut temu, ethanak napisał:

chyba że z jakichś powodów chcesz je wepchać do RAM.

No właśnie o to chodzi żeby do ram jeśli funkcja też się tam znajduje (void IRAM_ATTR...etc) no tak przeczytałem że const'y trzeba, a zwyklych zmiennych nie byłem pewny..

Link do komentarza
Share on other sites

46 minut temu, ethanak napisał:

Nie byłeś pewny że zmienne siedzą w ramie? 😉

Hehe..nie to już wiem że zwykle zmienne siedzą w ramie😜 ten cały IRAM_ATTR ma chyba 64kb, więc część pamięci jest na niego wydzielona, a ESP ma tak pokrojone te pamięci na kawałki że nie byłem pewny czy zwykły ram to to samo co ten wydzielony kawałek...(czytałem już kilkukrotnie o pamięciach w ESP, ale jeszcze nie wszystko kapuje 😉)

Link do komentarza
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.