ESP32 Pin Change interrupt

Gast #7004496
Lesenswert?
• ▲
▼
Hallo,

bei einem ESP32 habe ich Probleme bei einem Interrupt.
Immer wenn dieser Ausgelöst werden soll, stürzt das Programm ab.
1
#include <string.h>
2
#include <freertos/FreeRTOS.h>
3
#include <freertos/task.h>
4
#include <freertos/event_groups.h>
5
#include <esp_log.h>
6
#include <esp_sleep.h>
7

8
#include "pirSensor.h"
9

10
#define PIR_SENSOR_PIN  GPIO_NUM_2
11

12
#define PIR_SENSOR_HIGH_BIT BIT0
13
#define PIR_SENSOR_LOW_BIT  BIT1
14

15
static EventGroupHandle_t pirSensorEventGroup;
16
static uint8_t pirSensorLevel;
17

18
static void pirSensorTask(void* pvParameters);
19

20
static void IRAM_ATTR pirSensorIsrHandler(void* arg)
21
{
22
    static const char *TAG = "pirSensorIsrHandler";
23
    pirSensorLevel = gpio_get_level(PIR_SENSOR_PIN);
24
    ESP_LOGI(TAG, "Level: %d", pirSensorLevel);
25
    if(0 != pirSensorLevel) xEventGroupSetBits(pirSensorEventGroup, PIR_SENSOR_HIGH_BIT);
26
    else  xEventGroupSetBits(pirSensorEventGroup, PIR_SENSOR_LOW_BIT);
27
}
28

29
static void pirSensorTask(void* pvParameters)
30
{
31
    const char *TAG = "pirSensorTask";
32
    ESP_LOGI(TAG, "starting task");
33

34
    esp_err_t result;
35

36
    EventBits_t uxBits;
37
    pirSensorEventGroup = xEventGroupCreate();
38

39
    /* configure sensor */
40
    gpio_config_t sensorConfig;
41
    sensorConfig.intr_type = GPIO_INTR_ANYEDGE;
42
    sensorConfig.mode = GPIO_MODE_INPUT;
43
    sensorConfig.pull_up_en = GPIO_PULLUP_DISABLE;
44
    sensorConfig.pull_down_en = GPIO_PULLDOWN_ENABLE;
45
    sensorConfig.pin_bit_mask = (1 << PIR_SENSOR_PIN);
46
    result = gpio_config(&sensorConfig);
47
    if(result != ESP_OK)
48
    {
49
        ESP_LOGE(TAG, "failed gpio_config: %s", esp_err_to_name(result));
50
        return;
51
    }
52
    ESP_LOGI(TAG, "pirSensor configured");
53

54
    /* get initial sensorlevel */
55
    pirSensorLevel = gpio_get_level(PIR_SENSOR_PIN);
56

57
    /* configure interrupt and add handler */
58
    result = gpio_install_isr_service(0);
59
    if(result != ESP_OK)
60
    {
61
        ESP_LOGE(TAG, "failed gpio_install_isr_service: %s", esp_err_to_name(result));
62
        return;
63
    }
64
    result = gpio_isr_handler_add(PIR_SENSOR_PIN, pirSensorIsrHandler, NULL);
65
    if(result != ESP_OK)
66
    {
67
        ESP_LOGE(TAG, "failed gpio_isr_handler_add: %s", esp_err_to_name(result));
68
        return;
69
    }
70
    ESP_LOGI(TAG, "ISR handler Pir-Sensor configured");
71

72
    while(1)
73
    {
74
        uxBits = xEventGroupWaitBits(
75
            pirSensorEventGroup,
76
            PIR_SENSOR_HIGH_BIT | PIR_SENSOR_LOW_BIT,
77
            pdFALSE,
78
            pdFALSE,
79
            portMAX_DELAY);
80
            //1000/portTICK_PERIOD_MS);
81
        if(!(uxBits & PIR_SENSOR_HIGH_BIT) && !(uxBits & PIR_SENSOR_LOW_BIT))
82
        {
83
            ESP_LOGI(TAG, "Triggered without sensor");
84
        }
85
    }
86
}
87

88
uint8_t getPirSensorLevel(void)
89
{
90
    return pirSensorLevel;
91
}
92

93
void initPirSensorTask(void)
94
{
95
    xTaskCreate(pirSensorTask, "pirSensorTask", 100000, (void*)1, tskIDLE_PRIORITY, NULL);
96
}

Sobald ich jetzt aber den Pin auf High/Low setze, startet das Programm 
neu
1
abort() was called at PC 0x40082ac6 on core 1
2

3
Backtrace:0x400872eb:0x3ffb0880 0x40087989:0x3ffb08a0 0x4008e442:0x3ffb08c0 0x40082ac6:0x3ffb0930 0x40082be9:0x3ffb0960 0x401315ae:0x3ffb0980 0x4013460d:0x3ffb0c90 0x4013c781:0x3ffb0cc0 0x4008b511:0x3ffb0cf0 0x400d35a1:0x3ffb0d40 0x400845e1:0x3ffb0d60 0x400828dd:0x3ffb0d80 0x40139ceb:0x3ffba2a0 0x400d2b8b:0x3ffba2c0 0x4008831d:0x3ffba2e0 0x40087991:0x3ffba300
4

5

6
ELF file SHA256: 904924bed5648041
7

8
Rebooting...
9
ets Jun  8 2016 00:22:57
10

11
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

Bei den ganzen Konfigurationsaufrufen bekomme ich keinen Fehler.

Wie kann ich bei so etwas vorgehen um den Fehler zu finden (außer hier 
nachzufragen und jeden Funktionsaufruf auf OK zu überprüfen)?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.