• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 не отвечает AVR

Konstantin

New member
Здраствуйте!
Перепробовал уже все варианты с подключением. Если модуль ESP8266 подключить к USB-UART он отвечает на команды. (Например AT - в ответ OK). Но если же подключить к микроконтроллеру, то МК отсылает команду по UARTу а в ответ ни чего!!! Да и как команды он ни чего не воспринимает. Т.е. с МК отсылаю строку с командой (AT) он её видит а не воспринимает.
У меня: МК - Atmega8, ESP8266 - версия SDK — 0018, в версия AT — 0902.
 

Konstantin

New member
Код в студию, шаманов тут нет наверное.
Код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>

unsigned char byte_receive = 0;
unsigned char NUM = 0;

void send_Uart(char c)
{
    while(!(UCSRA&(1<<UDRE)));
    UDR = c;
}

void send_Uart_str(char *s)
{
    while (*s != '\0')
    {
        send_Uart(*s);
        s++;
    }
}

int getch_Uart(void)
{
    while(!(UCSRA&(1<<RXC)));
    return UDR;
}

void init_UART(void)
{
    UBRRH=0;
    UBRRL=51;
    UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

ISR(USART_RXC_vect)
{
    NUM = UDR;
    byte_receive =1;
    send_Uart(NUM);
}

int main(void)
{
    DDRC |= (1<<5);
    DDRC |= (1<<4);
    DDRC |= (1<<3);
   
    init_UART();

    _delay_ms(5000);   
       
    send_Uart_str("AT+CIPMODE=0");
    send_Uart(13);
    _delay_ms(5000);   
               
    send_Uart_str("AT+CIPMUX=1");
    send_Uart(13);
    _delay_ms(5000);   
   
    send_Uart_str("AT+CIPSERVER=1,8888");
    send_Uart(13);
    _delay_ms(5000);
       
    PORTC |= (1<<5);
   
    while(1)
    {
        send_Uart_str("AT");
        send_Uart(13);
        _delay_ms(1000);
       
          sei();
            if (NUM == '1')
            PORTC |= (1<<3);
            if (NUM == '2')
            PORTC &=~ (1<<3);
         cli();
    }
}
 

Alex

Member
В описании АТ команд указано что ввод подтверждается /r/n. Уж коли в стринге передавать это не желаете пробуйте так.
 

JustACat

Moderator
Команда форума
Konstantin, А можно поинтересоваться, почему вам не хочется добавлять в строку сразу переносы?
Вместо такого:
send_Uart_str("AT+CIPMODE=0");
send_Uart(13);
send_Uart(10);
Писать 1 строкой так:
send_Uart_str("AT+CIPMODE=0\r\n");

Ну и сразу поделюсь наблюдениями/граблями: работа с ESP на задержках - очень не советую. Даже в задержку в 5 секунд при некоторых обстоятельствах может не уложиться ESP, и весь код далее пойдет прахом. Не надежно это.
Сам пишу общение с ESP без блокировки на конечном автомате пока что.
Шлю команду, выставляю некий флаг и делаю что-то другое, а по приходу данных в UART смотрю, что там пришло. Если пришло, что команда выполнилась корректно, смотрю, что за команда вообще была (по флагу) и уже действую по обстоятельствам. Либо, если некий промежуток времени прошел, а ответа нет (таймаут), то опять же в зависимости от флага делаю еще что-то.
Причем что еще заметил, чтобы ESP не глючила, то нужно не просто реагировать на то, что она в ответ отправила на команду, а еще и ожидать чутка, чтобы она успела выплюнуть все, что у нее там накипело, и только после этого отправлять ей следующую порцию данных/команд, иначе тоже ее переклинить может. Такие дела.
 

Konstantin

New member
Konstantin, А можно поинтересоваться, почему вам не хочется добавлять в строку сразу переносы?
Вместо такого:
send_Uart_str("AT+CIPMODE=0");
send_Uart(13);
send_Uart(10);
Писать 1 строкой так:
send_Uart_str("AT+CIPMODE=0\r\n");

Ну и сразу поделюсь наблюдениями/граблями: работа с ESP на задержках - очень не советую. Даже в задержку в 5 секунд при некоторых обстоятельствах может не уложиться ESP, и весь код далее пойдет прахом. Не надежно это.
Сам пишу общение с ESP без блокировки на конечном автомате пока что.
Шлю команду, выставляю некий флаг и делаю что-то другое, а по приходу данных в UART смотрю, что там пришло. Если пришло, что команда выполнилась корректно, смотрю, что за команда вообще была (по флагу) и уже действую по обстоятельствам. Либо, если некий промежуток времени прошел, а ответа нет (таймаут), то опять же в зависимости от флага делаю еще что-то.
Причем что еще заметил, чтобы ESP не глючила, то нужно не просто реагировать на то, что она в ответ отправила на команду, а еще и ожидать чутка, чтобы она успела выплюнуть все, что у нее там накипело, и только после этого отправлять ей следующую порцию данных/команд, иначе тоже ее переклинить может. Такие дела.
Спасибо за подсказку!
 
Сверху Снизу