Forum: Mikrocontroller und Digitale Elektronik ESP8266 startet ständig neu


von Max M. (maxmicr)


Angehängte Dateien:

Lesenswert?

Ich arbeite aktuell mit dem espressif NONOS_SDK 3.1 für den ESP8266. 
Gerade bin ich dabei, die Temperaturdaten aus einem BMP280 auszulesen. 
Das klappt soweit schonmal (siehe Anhang).

Meine user_main.cpp sieht so aus:
1
extern "C" {
2
    #include "user_interface.h"
3
    #include "ets_sys.h"
4
}
5
6
#include "I2C_OLED.h"
7
#include "BMP280.h"
8
9
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
10
#error "The flash map is not supported"
11
#elif (SPI_FLASH_SIZE_MAP == 2)
12
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
13
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
14
#define SYSTEM_PARTITION_RF_CAL_ADDR            0xfb000
15
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0xfc000
16
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0xfd000
17
#elif (SPI_FLASH_SIZE_MAP == 3)
18
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
19
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
20
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x1fb000
21
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x1fc000
22
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x1fd000
23
#elif (SPI_FLASH_SIZE_MAP == 4)
24
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
25
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
26
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x3fb000
27
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x3fc000
28
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x3fd000
29
#elif (SPI_FLASH_SIZE_MAP == 5)
30
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
31
#define SYSTEM_PARTITION_OTA_2_ADDR              0x101000
32
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x1fb000
33
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x1fc000
34
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x1fd000
35
#elif (SPI_FLASH_SIZE_MAP == 6)
36
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
37
#define SYSTEM_PARTITION_OTA_2_ADDR              0x101000
38
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x3fb000
39
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x3fc000
40
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x3fd000
41
#else
42
#error "The flash map is not supported"
43
#endif
44
45
static const partition_item_t at_partition_table[] = {
46
    { SYSTEM_PARTITION_RF_CAL,              SYSTEM_PARTITION_RF_CAL_ADDR,             0x1000},
47
    { SYSTEM_PARTITION_PHY_DATA,             SYSTEM_PARTITION_PHY_DATA_ADDR,           0x1000},
48
    { SYSTEM_PARTITION_SYSTEM_PARAMETER,         SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR,       0x3000},
49
};
50
51
extern "C" void ICACHE_FLASH_ATTR user_pre_init(void) {
52
    if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
53
    os_printf("system_partition_table_regist fail\r\n");
54
    while(1);
55
  }
56
}
57
58
extern "C" void ICACHE_FLASH_ATTR user_init(void) {
59
    BMP280 bmp_280 = BMP280();
60
61
    while(true) {
62
        int32_t temperature = bmp_280.read_temperature();
63
        os_printf("Temperature: ");
64
        os_printf("%d\r\n", temperature);
65
        os_delay_us(2000000);
66
    }
67
}

Mit dem 2s Delay hatte ich eigentlich gedacht, dem ESP8266 genügend 
Spielraum für interne Angelegenheiten zu geben, die Ausgabe habe ich 
auch angehängt.

Ich komme genau 2 mal dazu die Temperatur auszulesen, dann startet der 
ESP8266 neu.

Hat dazu jemand eine Idee?

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

ich treibe mich auf den ESPs aus Bequemlichkeit in der ArduinoIDE rum, 
aber trotzdem: was meldet der ESP8266 als Resetgrund (Baudrate ist 
74880)?
Ich habe mich jetzt nicht nach unten gekramt, aber sicher, daß 
os_delay_us die anderen Tasks bedient und nicht nach rund 6s einfach der 
WDT zuschlägt?

Gruß aus Berlin
Michael

von imkeller (Gast)


Lesenswert?

Stromversorgung !
Elko direkt an ESP....
Alter Hut.

von Max M. (maxmicr)


Lesenswert?

Ich hab das nun mit einem Software-Timer gelöst.

imkeller schrieb:
> Stromversorgung !
> Elko direkt an ESP....
> Alter Hut.

Ich hab ein Wemos D1 mini Board und hatte gehofft, damit etwaige 
Kondensator-Probleme zu umgehen?

von ... (Gast)


Lesenswert?

Ich kenne mich mit dem ESP nicht aus.

Zwei Punkte aber trotzdem:

1. Warum läuft die Schleife in der internen Funktion "user_init". Ein 
C-Programm beginnt immer mit "main".

2. Ein Delay ist mir bisher immer als tote Schleife untergekommen. Hier 
wird der Prozessor wirklich die ganze Zeit blockiert.

Ich tippe hier auf Watchdog.

von Franz (Gast)


Lesenswert?

Du darfst das SDK nicht so lange blockieren. Keine so langen Sleeps und 
schon gar keine Endlosschleifen! Das Init muss wie jede andere Funktion 
zeitig verlassen werden.

von Max M. (maxmicr)


Lesenswert?

Franz schrieb:
> Du darfst das SDK nicht so lange blockieren. Keine so langen Sleeps und
> schon gar keine Endlosschleifen! Das Init muss wie jede andere Funktion
> zeitig verlassen werden.

D.h. man sollte quasi alle wiederholenden Tätigkeiten in einen Timer 
auslagern und die Timerfunktion dann auch möglichst schnell abarbeiten?

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Max M. schrieb:
> D.h. man sollte quasi alle wiederholenden Tätigkeiten in einen Timer
> auslagern und die Timerfunktion dann auch möglichst schnell abarbeiten?

Nein man nutzt einen Timer als Zeitgeber und stößt die Abarbeitung von 
Aufgaben in der Mainloop, evtl. abhängig von Zeitintervallen, an.

Hängt immer von der Aufgabe und deren Teil-Prioritäten ab.

von Franz (Gast)


Lesenswert?

Es gibt im NONOS SDK keine Mainloop. Das ist erstmal grundsätzlich zu 
begreifen, bevor man anfängt.

Timer und Events (Callbacks) sind der richtige Weg.

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.