ESP32 Timer Interrupt Frage

Hallo, ich teste mich gerade an einen Timer mit Interrupt an einen ESP32.
Programmiere mit PlatformIO und C++
Wenn ich den Timer Starte mit
timerAlarmWrite(Mytimer, 1000000, true); //1sec
timerAlarmEnable(Mytimer);

Dann wird sofort ein Interrupt ausgelöst. Und genau das will ich nicht. Ich möchte
den Timer Starten und dann nach der Zeit von 1sec soll erst ein Interrupt ausgelöst werden.

Und da blicke ich nicht durch, vllt kann jmd von euch mir helfen.

#include <Arduino.h>
volatile int interruptCounter = 0; 

hw_timer_t *Mytimer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; 

//====  Interrupt ==================== 
void IRAM_ATTR Timer0_ISR()
{  
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);
}

mfg Schuby

Hallo,

wenn ich das Wissen vom AVR übertrage könnte es sein du musst vorher irgendwelche Register nullen die mit dem Timer-Mode und Compare Match zu tun haben. Oder du musst vorher alle Timer Register reseten weil die möglicherweise vom Arduino Framework vorbelegt sind - wie beim AVR. Da hilft nur debuggen. Lass dir alle Inhalte der Timer Register ausgeben, provoziere bspw. einen analogWrite auf dem zugehörigen Pin und schau dir erneut die Register an. Bleiben die nicht Null könnte das ein Hinweis sein. Dann hilft nur Datenblatt vom ESP lesen und notfalls den kompletten Timer von Hand programmieren wenn es die API nicht hergibt.

Wenn ich es machen müßte wäre meine erste Anlaufstelle
General Purpose Timer und darunter Pulse Counter. Was anderes wüßte ich jetzt auch nicht. Oder im speziellen ESP32 Unterforum fragen, falls hier niemand mehr weiß.

Es gibt auch ein ESP32-Forum.

Gruß Tommy

Zeig mal bitte deinen ganzen Sketch. Da gehört ja noch mehr zur Timerinitiierung dazu,

Ja aber sicher doch, hier mein test code.

´#include <Arduino.h>
#include <iostream>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WIFI.h>
#include <stdio.h>
#include <stdlib.h>
#include <String.h>
#include <errno.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
using namespace std; 

volatile int interrups;


#define LED 2


String Empf_Str;

const char* ssid = "***********";  //Enter your wifi SSID
const char* password = "**********";  //Enter your wifi Password
int port = 23;  
WiFiServer server(port);
WiFiClient client;

hw_timer_t *Timer0_Cfg = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; 

void IRAM_ATTR Timer0_ISR()
{
    portENTER_CRITICAL_ISR(&timerMux);
    interrups++;
    portEXIT_CRITICAL_ISR(&timerMux);
}


void StarteTimer()
{
    Timer0_Cfg = timerBegin(0, 80, true);
    timerAttachInterrupt(Timer0_Cfg, &Timer0_ISR, true);
    timerAlarmWrite(Timer0_Cfg, 1000000, true);  //1sec
    timerAlarmDisable(Timer0_Cfg);
}

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
  Serial.println();
  
  WiFi.mode(WIFI_STA);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  server.begin(); 
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() 
{
    WiFiClient  client = server.available();   
    while(client.connected())
    {            
          //while (client.connected() && client.available())
          if (client.available()) 
          { 
            Empf_Str = "";
            Empf_Str =  client.readStringUntil('\n'); // .c_str();           
            client.println(Empf_Str); 

            if (Empf_Str[0] == 'A') 
            {
              StarteTimer();
            }  

            //===========================  
            if (Empf_Str[0] == 'B') 
            {
              timerAlarmDisable(Timer0_Cfg);
              //auf 3 sec gesetzt damit ich es besser an der Led sehe
              timerAlarmWrite(Timer0_Cfg, 3000000, true);
              timerAlarmEnable(Timer0_Cfg);

              do
              {
                /* code */
              } while (interrups == 0 );
                portENTER_CRITICAL(&timerMux); 
                interrups--;
                portEXIT_CRITICAL(&timerMux);
                digitalWrite(LED, !digitalRead(LED));
            }  

          }  

    } 
}

Hallo,

timer API
Es gibt verschiedene Methoden die du für einen sauberen "Init" ausprobieren kannst. End, Stop, ...

Mich überrascht nur das du für die timerBegin() Methode 3 Parameter verwenden kannst obwohl ich nur einen Parameter in der Deklaration sehe.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.