• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Непонятки с настройкой функции пинов.

Johnes

New member
Привет Всем.

Не пинайте сильно, ажели что. Но уже пару дней убил на то, чтобы запустить управление GPIO. У меня имеется esp-12 модуль и SDK 0.9.5. Решил я в нем подергать ножками и столкнулся с проблемой: когда я выбрал для своих игрищь GPIO4, то обнаружил что он у меня просто молчит и не меняет свое состояние.

Код настройки GPIO и сами дрыгалки выглядят так:

PIN_FUNC_SELECT( PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4 );
GPIO_OUTPUT_SET( 4, 0 );

os_intr_lock();
uint16_t count = 100;
while( --count )
{
GPIO_OUTPUT_SET( 4, 1 );
ets_delay_us( 400 );

GPIO_OUTPUT_SET( 4, 0 );
ets_delay_us( 200 );
}
os_intr_unlock();

Попробовал скомпилировать и прошить из примеров blinky - и тоже получил облом: там дергают pin2 раз в секунду, но у меня на пине2 наблюдается сигнал очень похожий на UART, из чего я делаю вывод что пин2 не переключился на работу как GPIO.
Может это у меня модуль какой то не такой? ...... Промучившись так пару дней, мне только лишь удалось подергать pin12.

Может кто-то знает тайное кун-фу? почему не работает как нужно макрос PIN_FUNC_SELECT ?
 

nikolz

Well-known member
Могу лишь посоветовать залить nodeMCU.
На луа все дергается.
 

Andy Korg

Moderator
Команда форума
Посмотрите пожалуйста приведенный ниже код. Он как раз дергает ножками GPIO 4,5, 13.
Код:
/*
* Start project for clock matrix
*/

#include <ets_sys.h>
#include <osapi.h>
#include <os_type.h>
#include <gpio.h>
#include "driver/uart.h"
#include "c_types.h"
#include "eagle_soc.h"

#define DISP_SPI_MOSI         4                        //Display SPI MOSI
#define DISP_SPI_MOSI_MUX    PERIPHS_IO_MUX_GPIO4_U
#define DISP_SPI_MOSI_FUNC    FUNC_GPIO4

#define DISP_SPI_CLK        5                        //Display SPI CLK
#define DISP_SPI_CLK_MUX    PERIPHS_IO_MUX_GPIO5_U
#define DISP_SPI_CLK_FUNC    FUNC_GPIO5

#define DISP_SPI_UPD        13                        //Display SPI update output pins
#define DISP_SPI_UPD_MUX    PERIPHS_IO_MUX_MTCK_U
#define DISP_SPI_UPD_FUNC    FUNC_GPIO13

#define DispClckLow()        GPIO_OUTPUT_SET(DISP_SPI_CLK, 0)
#define DispClckHight()        GPIO_OUTPUT_SET(DISP_SPI_CLK, 1)

#define DispUpdLow()        GPIO_OUTPUT_SET(DISP_SPI_UPD, 0)
#define DispUpdHight()        GPIO_OUTPUT_SET(DISP_SPI_UPD, 1)

#define DELAY 10 /* milliseconds */

LOCAL os_timer_t refreshDisp_timer;
extern int ets_uart_printf(const char *fmt, ...);

LOCAL void out_byte_disp(u8 Value){
    u8 i;

    for (i=0; i<8; i++){
        GPIO_OUTPUT_SET(DISP_SPI_MOSI, Value &1);
        Value >>= 1;
        DispClckLow();
        DispClckHight();
        DispClckLow();
    }
}

LOCAL void ICACHE_FLASH_ATTR refreshDisplay(void *arg)
{
    static i=0;

    DispUpdLow();
    if (i & 1)
        out_byte_disp(0x55);
    else
        out_byte_disp(0xaa);
    i++;
    DispUpdHight();
}

void user_init(void)
{
    PIN_FUNC_SELECT(DISP_SPI_MOSI_MUX, DISP_SPI_MOSI_FUNC);
    PIN_FUNC_SELECT(DISP_SPI_CLK_MUX, DISP_SPI_CLK_FUNC);
    PIN_FUNC_SELECT(DISP_SPI_UPD_MUX, DISP_SPI_UPD_FUNC);
    DispClckLow();
    DispUpdLow();

    // Configure the UART
    uart_init(BIT_RATE_9600,BIT_RATE_9600);
    // Set up a timer to send the message
    // os_timer_disarm(ETSTimer *ptimer)
    os_timer_disarm(&refreshDisp_timer);
    // os_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunction, void *parg)
    os_timer_setfn(&refreshDisp_timer, (os_timer_func_t *)refreshDisplay, (void *)0);
    // void os_timer_arm(ETSTimer *ptimer,uint32_t milliseconds, bool repeat_flag)
    os_timer_arm(&refreshDisp_timer, DELAY, 1);
}
 

nikolz

Well-known member
попробую объяснить еще раз.
Так как у Вас непонятки с железом и софтом, то использование nodeMCU исключает второе.
При этом не надо собирать прошивки и их заливать для отладки теста.
Сам тест управления ногами до безобразия простой
Т е ставите nodeMCU и издеваетесь над железом.
потом начинаете писать свои прошивки.
 

Johnes

New member
Ну т.е. как я понял, из предложеного кода: вроде как тайного кунфу не существует и я делаю также как и все.
Остались теперь только сомнения по поводу железки ...... ок, попробую прошить nodeMCU и в ней уже проверить функциональность.
Еще попробую прошить пример кода предложенный Andy Korg
 

Johnes

New member
Прошил код предложенный Andy Korg, ..... и получается, что в моей плате перепутан пин4 и пин5, а все остальные как положено разведены.

Спасибо всем за помощь и наставления.
 
Сверху Снизу