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