ESP32 a HW timer

Pavel Kutina hw na prelude.cz
Pondělí Září 2 19:11:12 CEST 2024


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);
    }
}
------------- další část ---------------
A non-text attachment was scrubbed...
Name: ESP32_Timer_Beep2.ino
Type: application/octet-stream
Size: 1206 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240902/b4a0c620/attachment.obj>


Další informace o konferenci Hw-list