Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

ESP8266 виснет

Тема в разделе "Общие вопросы по esp8266", создана пользователем Victor, 7 мар 2015.

  1. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.452
    Симпатии:
    173
    А если найти по старее версию и то и другие глюки могут вылезти.
     
  2. kab

    kab Авторитетный участник сообщества

    Сообщения:
    633
    Симпатии:
    78
    В ардуино иде есть функция ( не помню, как называется - поищите сами) - выдает количество свободной памяти. Сделайте вывод и в мониторе порта последите - не уменьшается ли доступная память критически в процессе работы.
     
  3. Roboter

    Roboter Новичок

    Сообщения:
    5
    Симпатии:
    1
    У меня модуль, NodeMCU ESP8266, виснет от установки пина 7 в input

    void setup() {
    pinMode(7, INPUT);
    }
    в консоли пишет

    ets Jan 8 2013,rst cause:4, boot mode:(3,6)

    wdt reset
    load 0x4010f000, len 1384, room 16
    tail 8
    chksum 0x2d
    csum 0x2d
    v4ceabea9
    ~ld

    если поставить пин 0 - работает (подключена кнопка)
    пин 3 - работает (весит в воздухе)
    6,7,8 - виснет
     
  4. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    Есть два обозначения пинов :
    это либо D0...D10 - для nodemcu, либо GPIO0...GPIO16.
    Что такое pin 6,7,8 ?
     
  5. Roboter

    Roboter Новичок

    Сообщения:
    5
    Симпатии:
    1
    среда ардуино
    Arduino Reference
    тут 13 для уно
     
  6. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    Ну вот и разбирайтесь что есть что
    так как некоторые пины имеют несколько режимов и лепить все без понимания не следует.
     
  7. Roboter

    Roboter Новичок

    Сообщения:
    5
    Симпатии:
    1
    Режимы я уже посмотрел, ничего криминального
    [​IMG]
     
  8. Roboter

    Roboter Новичок

    Сообщения:
    5
    Симпатии:
    1
    Всё, понял, полез смотреть почему не работает D7, оказалось неправильно выбрал board
    поменял, заработало
     
  9. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    462
    Симпатии:
    49
    сам погорел недавно на обозначении пинов - https://esp8266.ru/forum/threads/max31855-ne-rabotaet.3133/#post-47964

    вызвав pinMode(7, INPUT) вы вызываете GPIO7 который работает как выход, для чтения вашего гениального кода из флешки. Пытаясь сделать его входом, роняете систему, срабатывает WDT. Круг замкнулся.

    правильно вот так pinMode(D7, INPUT) что равнозначно GPIO13

    описание пинов для NODEMCU в макросах тут - Arduino/pins_arduino.h at master · esp8266/Arduino · GitHub
     

    Вложения:

    • Capture.PNG
      Capture.PNG
      Размер файла:
      52,8 КБ
      Просмотров:
      3
    Последнее редактирование: 12 фев 2018
  10. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Возникла проблема модуль - nodemcu 1.0. Пишу программу для считывания показаний с цифрового штангенциркуля, работает на прерываниях, и хотел показания вывести на web через websockets, но почему то модуль перезагружается при срабатывании прерывания и при попытке подключится к модулю по WIFi. Если отдельно прерывания все нормально в COM PORT шлет, и так же если отдельно с WEB работать без прерываний тоже все нормально подключается и работает. Работаю с библиотеками:
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>

    Код (C):
    1. // Вызов прерывания при начале передачи данных
    2. attachInterrupt(digitalPinToInterrupt(clock_Master), read_bitM, FALLING);
    3.  
    4. void read_bitM() // Обработчик прерывания Мастер индикатора
    5. {
    6. flag_M = 1; // Разрешается чтение
    7. }
    Да я понимаю что Ардуино - Дурино но может кто подскажет как решить проблему, не хотелось бы писать код вечно ждуший сигнала. Пробовал на 2 модулях с разными бутлодерами результат один ресет во время подключения клиента.
     
  11. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.127
    Симпатии:
    226
  12. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Ух ну не знаю... 900 строк ...прикрепил.
    Но к стати, есть надежда, потому что в самом слабом варианте работает, показания снимает четко и на страницу выводит, если обновлять вручную:
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <WiFiClient.h>
    3. #include <ESP8266WebServer.h>
    4. //SSID and Password to your ESP Access Point
    5. const char* ssid = "ESP_WIFI";
    6. const char* password = "";
    7. ESP8266WebServer server(80); //Server on port 80
    8. //*************************************************************************
    9. volatile long word_bitM, word_bitS = 0; // переменная полученного значения
    10. volatile int count_M, count_S = 0;    // переменная счетчика импульсов
    11. volatile float result_M, last_result_M,
    12.       result_S, last_result_S = 0;
    13. volatile int sign_M, sign_S = 1;
    14. volatile int flag = 1;
    15. volatile unsigned int Time_countM, Time_countS = 0;
    16. int Resiv_count_S;
    17. int stop_int;
    18.  
    19. void handleRoot() {
    20.   //server.send(200, "text/plain", "hello from esp8266!");
    21.   server.send(200, "text/plain", String(result_M));
    22. }
    23.  
    24. // Объявление выводов МК
    25. #define data_Master D1
    26. #define clock_Master D2
    27. #define data_Slave D3
    28. #define clock_Slave D5
    29.  
    30. #define detectpin_M D6
    31. #define detectpin_S D7
    32.  
    33. void read_bitM() // Обработчик прерывания Мастер индикатора
    34. {
    35.   delayMicroseconds(20); // задержка для проверки значения, по середине синхроимпулса
    36.   if (count_M < 16)
    37.   {
    38.     bitWrite(word_bitM, count_M, !digitalRead(data_Master)); //  чтение бита
    39.   }
    40.   if (count_M == 20) // Проверка знака 20й бит
    41.   {
    42.     if (digitalRead(data_Master))
    43.       sign_M = 1;
    44.     else
    45.       sign_M = -1;
    46.   }
    47.   digitalWrite(detectpin_M, HIGH);
    48.   count_M++;
    49.   digitalWrite(detectpin_M, LOW);
    50.   //noInterrupts();
    51. }
    52.  
    53. void read_bitS() // Обработчик прерывания Подчиненного индикатора
    54. {
    55.   delayMicroseconds(20); // задержка для проверки значения, по середине синхроимпулса
    56.   if (count_S < 16)
    57.   {
    58.     bitWrite(word_bitS, count_S, !digitalRead(data_Slave)); //  чтение бита
    59.   }
    60.   if (count_S == 20) // Проверка знака 20й бит
    61.   {
    62.     if (digitalRead(data_Slave))
    63.       sign_S = 1;
    64.     else
    65.       sign_S = -1;
    66.   }
    67.   digitalWrite(detectpin_S, HIGH);
    68.   count_S++;
    69.   digitalWrite(detectpin_S, LOW);
    70.   //noInterrupts();
    71. }
    72.  
    73. void setup()
    74. {
    75.   //ets_update_cpu_frequency(8);
    76.   pinMode(clock_Master, INPUT); // Вход для синхроимпульса
    77.   pinMode(data_Master, INPUT);  // Вход для приема данных
    78.   pinMode(clock_Slave, INPUT);  // Вход для синхроимпульса
    79.   pinMode(data_Slave, INPUT);   // Вход для приема данных
    80.   pinMode(detectpin_M, OUTPUT);
    81.   pinMode(detectpin_S, OUTPUT);
    82.   delay(50);
    83.   attachInterrupt(digitalPinToInterrupt(clock_Master), read_bitM, FALLING); // Вызов прерывания при начале передачи данных
    84.   noInterrupts();
    85.   Serial.begin(115200);
    86.   Serial.println("");
    87.   WiFi.mode(WIFI_AP);           //Only Access point
    88.   WiFi.softAP(ssid, password);  //Start HOTspot removing password will disable security
    89.   IPAddress myIP = WiFi.softAPIP(); //Get IP address
    90.   Serial.print("HotSpt IP:");
    91.   Serial.println(myIP);
    92.   server.on("/", handleRoot);      //Which routine to handle at root location
    93.   server.begin();                  //Start server
    94.   Serial.println("HTTP server started");
    95.  
    96. }
    97.  
    98. // Функция определения начала передачи данных
    99. void Get_start(uint8_t clockpin, uint8_t datapin, volatile long word_bit, volatile int count)
    100. {
    101.  
    102.   if (flag)
    103.   { // Если оба пина находятся в одинаковом состоянии дольше 1 мс разрешаются прерывания
    104.     // Поиск начального участка без сигнала, что бы не начать считать импульсы посередине пакета данных
    105.     if ((digitalRead(clockpin) == digitalRead(datapin)) && ((micros() - stop_int) > 1000))
    106.     {
    107.       flag = 0;
    108.       interrupts(); // Разрешаем прерывания когда свободный участок найден
    109.     }
    110.     else
    111.     {
    112.       stop_int = micros(); // Сбрасываем значение таймера
    113.       flag = 1;
    114.       word_bit = 0;
    115.       count = 0;
    116.     }
    117.   }
    118. }
    119.  
    120. void loop()
    121. {
    122.   Get_start(clock_Master, data_Master, word_bitM, count_M);
    123.   // Проверка формирования Значения для Master
    124.   if (count_M == 24) // Неполный пакет игнорируется
    125.   {
    126.  
    127.     digitalWrite(detectpin_M, HIGH); // debug
    128.     delay(2);
    129.     result_M = (word_bitM * sign_M) / 100.00;
    130.     digitalWrite(detectpin_M, LOW); // debug
    131.     // Serial.print("count_M: ");
    132.     // Serial.println(count_M);
    133.     // Serial.print("word_bit_M: ");
    134.     // Serial.println(word_bitM, BIN);
    135.     // Serial.print("word_bit_M DEC: ");
    136.     // Serial.println(word_bitM, DEC);
    137.     if (last_result_M != result_M)//Вывод результата если он отличается от предыдущего
    138.     {
    139.       Serial.print("RESULT_M: ");
    140.       Serial.println(result_M, 2);
    141.       last_result_M = result_M;
    142.     }
    143.     stop_int = micros();
    144.     flag = 1;
    145.     count_M = 0;
    146.     word_bitM = 0;
    147.     delay(1);
    148.   }
    149.   if (count_M > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
    150.   {
    151.     noInterrupts();
    152.     flag = 1;
    153.     count_M = 0;
    154.     word_bitM = 0;
    155.   }
    156.  
    157.   Get_start(clock_Slave, data_Slave, word_bitS, count_S);
    158.   // Проверка формирования Значения для Slave
    159.   if (count_S == 24) // Неполный пакет игнорируется
    160.   {
    161.     digitalWrite(detectpin_S, HIGH); // debug
    162.     delay(2);
    163.     result_S = (word_bitS * sign_S) / 100.00;
    164.     digitalWrite(detectpin_S, LOW); // debug
    165.    
    166.     // Тестовый блок проверки количества пакетов в СЕК.
    167.     Resiv_count_S++;
    168.     if (Time_countS == 0)
    169.     Time_countS = micros();
    170.     if ((micros() - Time_countS) > 1000000){
    171.     Serial.print("Resived paket_S: ");
    172.     Serial.println(Resiv_count_S);
    173.     Time_countS = 0;
    174.     Resiv_count_S = 0;
    175.     }
    176.  
    177.    
    178.     // Serial.print("word_bit_S: ");
    179.     // Serial.println(word_bitM, BIN);
    180.     // Serial.print("word_bit_S DEC: ");
    181.     // Serial.println(word_bitM, DEC);
    182.     if (last_result_S != result_S) //Вывод результата если он отличается от предыдущего
    183.     {
    184.       Serial.print("RESULT_S: ");
    185.       Serial.println(result_S, 2);
    186.       last_result_S = result_S;
    187.     }
    188.     stop_int = micros();
    189.     flag = 1;
    190.     count_S = 0;
    191.     word_bitS = 0;
    192.     delay(1);
    193.   }
    194.   if (count_S > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
    195.   {
    196.     noInterrupts();
    197.     flag = 1;
    198.     count_S = 0;
    199.     word_bitS = 0;
    200.   }
    201.   server.handleClient();          //Handle client requests
    202. }
     

    Вложения:

    • main.cpp
      Размер файла:
      38 КБ
      Просмотров:
      1
  13. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    посмотрите count_M
    Вы сравниваете его с 16 и 20 и инкрементируете,
    а где сбрасываете в ноль ? или работаете по переполнению?
     
  14. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Да обработчик прерываний без веб работает хорошо, и даже если питание отключить посреди пакета. count_M сбрасывается в ноль если больше 24. Там если что для понимания 2 штангенциркуля подключено. Ну соответственно они шлют пакеты по 24 бита по прерыванию на шине clock считываю показания на data все просто, если длинна полученного пакета отличается от 24 значит пакет битый и не учитывается. Но вот походу какой то библиотеке это не особо нравится. Основная часть это разработка от Третьякова Сергея.
     
  15. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    Как вы определяете начало передачи из штангея?
    Есть сигнал готовности данных от него?
     
  16. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    что-то у вас не продумано
    два раза этот блок повторяется
    if (count_S > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
    {
    //noInterrupts();
    flag = 1;
    count_S = 0;
    word_bitS = 0;
    }
     
  17. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    По заднему фронту clock. Мне бы узнать, какие есть ограничения нюансы при работе с прерываниями и вайфай.
     
  18. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    посмотрите этот кусок
    flag = 1;
    count_M = 0;
    word_bitM = 0;
    delay(1);
    }
    if (count_M > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
    {
    //noInterrupts();
    flag = 1;
    count_M = 0;
    word_bitM = 0;
    }
    ---------------------------
    может быть так записать:
    }
    if (count_M >=24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
    {
    //noInterrupts();
    flag = 1;
    count_M = 0;
    word_bitM = 0;
    }
     
  19. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Это 2й штангель, там count_S и count_M.
     
  20. nikolz

    nikolz Гуру

    Сообщения:
    4.002
    Симпатии:
    426
    прерывание долго нельзя
    а wifi может быть долго.
    ---------------------
    Все зависит от того, что вы будете делать с введенными данными.
    Может быть их сначала обработать а потом передавать
    и какая у вас скорость считывания(дискретизации)
    допускается пропуск данных или нет
     

Поделиться этой страницей