ESP32 a HW timer

Martin Locker locker na vosrk.cz
Pondělí Září 2 19:35:31 CEST 2024


Nevím jak mají ten timer implementovaný, ale zběžným pohledem to vypadá, že timer běží pořád.
Tudíž když nastavíš alarm, tak těžko říci, jaká je právě hodnota v timeru (předpokládám, že se tím nenuluje).
Takže bych zkusil k tomu nastavení alarmu přidat i nulování/nastaveni na nulu/ timeru 
"timerWrite(hw_timer_t * timer, uint64_t val)"

Martin L.

----- Původní zpráva -----
Odesilatel: Pavel Kutina (hw na prelude.cz)
Datum: 02/09/2024 19:11
Příjemce: HW-news (hw-list na list.hw.cz)
Předmět: ESP32 a HW timer

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ší část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240902/c145fab5/attachment.htm>


Další informace o konferenci Hw-list