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