/* EPS32 Timer-Test * - Timer Vorteiler von 1 bis 65536 * - Timer Grundfrequenz 80MHz -> in Arduino nicht veränderbar * * Timer-Funktionen: siehe * %userprofile%\Documents\Arduino\hardware\espressif\esp32\cores\esp32\esp32-hal-tmer.h * https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/timer.html */ const int LED = 4; hw_timer_t * testTimer1 = NULL; hw_timer_t * testTimer2 = NULL; uint64_t timerValNew, timerValOld; long nextAlarm; bool state; // Timer-ISR, im RAM halten void IRAM_ATTR onTimer( ) { long Zeit = timerReadSeconds(testTimer1); Serial.printf("Sekunden: %4d s\n", Zeit); // nächsten Alarm setzen: nextAlarm += 1000000; Serial.printf("Nächster Alarm: %8d\n", nextAlarm); timerAlarmWrite(testTimer1, nextAlarm, false); // bei Auto-Reload beginnt der Zähler wieder bei 0, hier aber soll der Alarmwert verändert werden timerAlarmEnable(testTimer1); // ohne erneuten Enable funktioniert der Alarm nur 1x (außer bei Auto-Reload true) } void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); state = LOW; digitalWrite(LED, state); // Timer 0 als Timer mit Alarmwert für 1s konfigurieren nextAlarm = 1000000; testTimer1 = timerBegin(0, 80, true); // Timer0, Teiler:80, Aufwärtszähler timerAlarmWrite(testTimer1, nextAlarm, false); // Alarm bei 1s, ohne Auto-Reload timerAttachInterrupt(testTimer1, &onTimer, true); // ISR onTimer() timerAlarmEnable(testTimer1); timerStart(testTimer1); delay(10); // hat nachher Auswirungen auf den ersten Timer!! // Timer 2 ohne Alarm, 1MHz Takt testTimer2 = timerBegin(1, 80, true); // Timer0, Teiler:80, Aufwärtszähler timerStart(testTimer2); } void loop() { // Wie genau ist denn Delay... delay(500); //timerStop(testTimer1); timerValNew = timerReadMicros(testTimer1); // mit testTimer2 funktioniert es problemlos... //timerStart(testTimer1); digitalWrite(LED, state); state=!state; Serial.printf("Zählerstand: %6d \n", timerValNew); Serial.printf("Alarmwert: %6d \n", timerAlarmRead(testTimer1)); long delta = timerValNew - timerValOld; Serial.printf("Vergangene Zeit: %6d us\n", delta); timerValOld = timerValNew; }