ESP32 a HW timer
Petr Zapadlo
zapik na email.cz
Úterý Září 3 06:24:46 CEST 2024
Byť je ti už nějak vyřešeno, tak když se používá arduino framework, tak
na práci s časovými intervaly je dobrá knihovna Ticker
https://github.com/sstaub/Ticker
A jestli se správně dívám, tak je už nativní součástí prostředí.
Petr
Dne 02. 09. 24 v 19:11 Pavel Kutina napsal(a):
> Zdravim,
>
> pokouším se tu krotit HW timer v ESP32 na Arduino IDE, potřebuju
> neblokující indikační pípák (zavolej funkci a jdi si dělat co
> potřebuješ, ono už se to dopípá).
>
> Kód má jednoduchou myšlenku:
>
> v setup si nadefinuj interrupt
> při stisku tlačítka nahoď pin s pípákem, současně spusť HW timer
> když dojede HW timer, obsluha interruptu shodí pin s pípákem
>
> Ve vlastním kódu je to o chlup složitější, testuje se tam, jestli
> pípák ještě pípá, aby se to nespouštělo znovu.
>
> Ať dělám, co dělám, mám nastavený dvousekundový píp, ale ty pípy jsou
> různě kratší, skutečně dvousekundových je málo.
>
> Netušíte, co dělám blbě? Jinak kód jsem zjednodušil "až na dřevo",
> výsledek je stejný. Když jsem nečetl stav portu, ale použil proměnnou
> se stavem, chovalo se to stejně. Když jsem použil funkce pro přímý
> zápis na pin místo digitalWrite, chovalo se to stejně. Připúadá mi to
> neprůstřelný, ale není :)
> Někde dělám něco blbě, ale nevidím to.
>
> Díky za pomoc.
>
> Pavel Kutina
>
> //-----------------------------------------------------------------------------
>
> #define BEEPER 2 // beeper
> #define ENC_SW 32 // encoder button, HW pull-up
>
> hw_timer_t * timer = NULL;
>
> //-----------------------------------------------------------------------------
>
> void IRAM_ATTR beepTimer()
> {
> digitalWrite(BEEPER, LOW);
> }
>
> //-----------------------------------------------------------------------------
>
> void setup()
> {
> pinMode(BEEPER, OUTPUT);
> pinMode(ENC_SW, INPUT); // button enkoderu
> Serial.begin(115200);
>
> // hw_timer_t * timerBegin(uint32_t frequency);
> timer = timerBegin(1000000UL);
>
> // void timerAttachInterrupt(hw_timer_t * timer, void
> (*userFunc)(void));
> timerAttachInterrupt(timer, &beepTimer);
> }
>
> //-----------------------------------------------------------------------------
>
> void loop()
> {
> // kdyz neni stisknute tlasitko a soucasne nepipa pipak
> if ((digitalRead(ENC_SW) == false) && (digitalRead(BEEPER) == false))
> {
> // void timerAlarm(hw_timer_t * timer, uint64_t alarm_value,
> bool autoreload, uint64_t reload_count);
> timerAlarm(timer, uint32_t(2000000UL), true, 1);
>
> digitalWrite(BEEPER, HIGH);
> }
> }
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list