• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 не глючила, то нужно не просто реагировать на то, что она в ответ отправила на команду, а еще и ожидать чутка, чтобы она успела выплюнуть все, что у нее там накипело, и только после этого отправлять ей следующую порцию данных/команд, иначе тоже ее переклинить может. Такие дела.
Спасибо за подсказку!
 
Сверху Снизу