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