Forum: Mikrocontroller und Digitale Elektronik ESP32 Pin Change interrupt


von Johannes (Gast)


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)?

von Brain 2.0 (Gast)


Lesenswert?

Dann probier doch mal den hier: 
https://github.com/me-no-dev/EspExceptionDecoder

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.