1

(1 відповідей, залишених у Залізо)

Шукаю "щасливого" власника плати HSC-ADC-EVALEZ. Маю декілька запитань по ліцензіях по високо швидкісним портам.

2

(2 відповідей, залишених у Системне програмування)

не знаю чи актуально, але...

послідовність має бути така:
1. Reset
2. isPresent
3. Skeep ROM Command
4. Convert Command
6. Delay
7. Reset
8. isPresent
9. Skeep ROM Command
10. Read Scratchpad
11. Delay
12. go to 1

3

(10 відповідей, залишених у Ваші проєкти)

Вибачте, не звертав увагу на нові відповіді.
Інші не можливо поставити, бо пристрій має бути мобільним і працювати і над морем і на висоті, і в будь-якій точці Землі. А це тільки супутниковий зв'язок.
Розмір має значення і параболічну антену немає куди поставити. тобто тільки модеми Iridium.
А зараз у Iridium швидкість не найкраща. А даних стільки, що потрібно використати аж 8 модемів.

4

(3 відповідей, залишених у Системне програмування)

Знайшов DTB!!!
Я просто налаштував Eclipse по тому що знайшов в Google.
Виходило, що зашивав я тільки u-boot  без DTB.
Зате розібрався що кому і куди підсовувати.
Починається наступний етап: як записати ядро і як його стартонути.

5

(3 відповідей, залишених у Системне програмування)

Для своїх потреб виготовив платку на STM32F746.
А десь з півроку назад надибав на Linux on the STM32F746G Discovery board with Buildroot https://github.com/fdu/STM32F746G-disco_Buildroot.

З тих пір я декілька разів пробував її зібрати.
Помилки компіляції не сумісних версій *.с  я повиправляв (в WWW знайшлося) . їх правда і не багато було.
отримав усі файли на виході.

Але моя плата - це не Disco. Повиправляв dts принаймні на uart (який має бути для консолі), частоти, sdram.
Також передивився щоб використані ніжки не були використані в інших блоках.
Перезібрав.

Залив - і не працює. Плата працює - я їй на FreeRTOS понаписував тестових програм.
Досить довгий час зайняло встановити ST-Link на Lubuntu, налаштувати eclipse на відладку з цим проектом.

У відладці на етапі запуску U-boot показало "Missing DTB". Хоча на виході є файл u-boot.bin, в якому той dtb присутній.

Хтось може тикнути носом куди далі дивитись? Бо Гугл нічого путнього не підказує.

6

(56 відповідей, залишених у Системне програмування)

Якщо актуально:

taburyak написав:

Постала інша проблема. Досвіду не вистачає, щоб придумати як обійти, чи зробити по іншому.

Є оголошені такі структури і дефайн:

typedef struct {
    char  host[33] = NAME_DEVICE;
    char  blynkToken[33] = "";
    char  blynkServer[33] = "blynk-cloud.com";
    char  blynkPort[6] = "8442";
    int   salt = EEPROM_SALT_WM;
} WMSettings;

WMSettings wmSettings;

typedef const struct Menu_Item {        
    const uint16_t  Index;    
    const String    Text;
    const String    Value;
} Menu_Item_t;

#define MENU_ITEM(Name, Index, Text, Value) \
        Menu_Item_t const Name = {Index, Text, Value}

Є оголошені такі пункти меню:

//--------Name----------Index--------Text-----------Value------
MENU_ITEM(Menu1_1_0,    M_BACK_DEVICE, "Back", "<---");
MENU_ITEM(Menu1_1_1,    M_DEVICE_NAME, String(wmSettings.host), " ");
MENU_ITEM(Menu1_1_2,    M_FIRMWARE_VERSION, "Firmware version", String(FIRMWARE_VERSION));

Плюс масив з пунктів меню (сторінка меню):

Menu_Item_t const * PageDeviceInfo[] = {&Menu1_1_0, &Menu1_1_1, &Menu1_1_2, NULL};

Саме проблема тут в Menu1_1_1, а саме String(wmSettings.host), бо при оголошені "прописується" назва хоста за замовчуванням "IoT-ESP8266". А вже потім на початку програми з EEPROM в wmSetting вантажаться поточні налаштування, наприклад host = "test-device". І коли я формую сторінку з пунктами меню:

TableMenuWrite(PageDeviceInfo);

static void TableMenuWrite(Menu_Item_t const * page[])
{    
    tableSettings.clear();    

    int i = 0;

    while (page[i] != NULL)
    {
        tableSettings.addRow(page[i]->Index, page[i]->Text, page[i]->Value);
        i++;
    }    
}

Я отримаю в меню назву host за замовчуванням - "IoT ESP8266", а не бажану назву "test-device". Це зрозуміло мені чому так відбувається. Бо пункт меню сформований під час компіляції і зашитий вже в флеш.
Тимчасово вийшов з положення що після виклику:

TableMenuWrite(PageDeviceInfo);

дописав:

tableSettings.updateRow(M_DEVICE_NAME, wmSettings.host, " ");

тоді вже завантажена з EEPROM назва девайсу перебиває назву за замовчуванням. Але це повна хрінь і нівелює всі мої потуги по зручній структуризації меню і зручної зміни і переробки меню в процесі еволюції прошивки.

От що придумати? Бо даних завантажених з EEPROM чималенько і такі костилі з tableSettings.updateRow мене не влаштовують.

Не сильний в Ардуїно,але прога ділиться на дві? частини init та loop.
Десь перед init:

int InitFromEEPROM;

В init додайте:

 InitFromEEPROM=0;

потім:

WriteEEPROMSettingsToVariables(void * DataFromEEPROM))
{
// наприклад
     tableSettings.updateRow(M_DEVICE_NAME, wmSettings.host, DataFromEEPROM[i]);
}

в loop:

// при чому має бути в перших рядках loop
if(InitFromEEPROM==0)
{
  ReadFromEEPROM(&DataFromEEPROM);
  WriteEEPROMSettingsToVariables(&DataFromEEPROM));   
  InitFromEEPROM=1;
}

7

(10 відповідей, залишених у Ваші проєкти)

Сам і відповім:
SIM800c  має аналог dial-up, але тільки на одне з'єднання.
BGS2T теж має аналог dial-up по GPRS, але не заточений під одне з'єднання.

8

(10 відповідей, залишених у Ваші проєкти)

Тепер таке питання: чи вміють сьогоднішні GSM-модеми, з вбудованим TCP/IP стеком, працювати як dial-up модеми?
зокрема SIM800C від SimCom.
чи Cinterion BGS2

9

(10 відповідей, залишених у Ваші проєкти)

Дякую.
Multi-link PPP буду "курити".
"802.3ad" - там де є MAC-адреса. у мене чи ще немає, чи вже не має.

10

(10 відповідей, залишених у Ваші проєкти)

Припустімо є пристрій, що вміє керувати декількома dial-up модемами. Пристрій знаходиться на рухомому об'єкті і тип модему змінити не можливо. Декілька модемів встановлено тільки для того щоб збільшити швидкість передачі. Всі дані з пристрою передаються на ОДИН сервер. Можливо що буде основний і резервний, але всі дані з пристрою повинні сходитись на один сервер (або основний, або резервний).
Для з'єднання з оператором використовується PPP. Тоді кожен модем отримує свою IP-адресу. І коли під'єднуєшся до сервера, отримуємо декілька з'єднань. І оброблятись будуть як декілька, а потрібно як одне з'єднання.

Чи існує протокол щоб декілька з'єднань виглядали на стороні сервера як одне з'єднання?

11

(196 відповідей, залишених у Системне програмування)

taburyak написав:
Прихований текст

Малечі вже 1.5 рочки і іноді вона може сама погратись 15-20 хвилин і в мене іноді є можливість приділити час захопленню

Є такий шмат коду:

//Функція відображення інформації на індикатор
void ShowScreen(uint8_t* number, uint8_t number_of_digits)
{
    uint16_t digitPin[] = {D0_Pin,D1_Pin,D2_Pin,D3_Pin};
    for(int i = 0; i < number_of_digits; i++)
    {
        IND_PORT -> BRR = (D0_Pin|D1_Pin|D2_Pin|D3_Pin);//Вимикаємо всі розряди
        IND_PORT -> BSRR = digitPin[i];//Вмикаємо потрібний розряд індикатора
        DigitToPort(*(number+i));//Виводимо цифру у потрібний розряд
        HAL_Delay(1);//Невеличка затримка. Хай цифра світиться якийсь час
    }
}

...

Я б написав так

 const uint16_t digitPin[] = {D0_Pin,D1_Pin,D2_Pin,D3_Pin};

і зберіг 8 байт в RAM. і не побоявся б навіть винести за межі функції.

Сильно мерехтить індикація?

А точно попадає в квадрат 100*100?

13

(196 відповідей, залишених у Системне програмування)

В прикладі першими функціями є:

/* Set up the default menu text write callback, and navigate to an absolute menu item entry. */
    Menu_SetGenericWriteCallback(Generic_Write);
    Menu_Navigate(&Menu_1);

Перша показує якою функцією буде виводитись текст. (Обовязково потрібна)
Друга виводить перше меню.

У Вас є аналог Generic_Write() ?
Правда до while має доходити

14

(196 відповідей, залишених у Системне програмування)

викладіть те що у вас вийшло.
і опишіть що значить зависає.

15

(196 відповідей, залишених у Системне програмування)

Не додивився  :-X

#define MENU_ITEM_READ_POINTER(Addr)   (void*)pgm_read_word(Addr)

замінити на

#define MENU_ITEM_READ_POINTER(Addr)   (void*)(Addr)

https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма

17

(196 відповідей, залишених у Системне програмування)

ще з приводу https://github.com/abcminiuser/micromenu-v2
Мені сподобалось як вирішено звязок між менюшками.
Для статичного меню це добре.

А як реалізовано вивід динамічного параметру? - В приципі можна зробити в "GetButtonPress()" виклик якоїсь BUTTON_UPDATE_DIPSLAY через 0,2...0,5 секунди, якщо немає натиснутих клавіш.

А як реалізовано зміна параметрів (особливо якщо їх багато)?

Тому пропоную розкажу як зробив сам (коли використовую RTOS).
Є задача CheckButtons(), де визначається яку клавішу(-і) натиснуто.
При старті запускаю функцію Menu1, в якій:
1. Вивід статичного тексту для цього меню.
2. Вивід динамічної складової меню.
3. виклик GetButtonPress() для переходу в інші меню або зміна параметру
4. засинаю на 0,2 ... 0,5 сек
5. переходжу до п.2

без RTOS є три задачі:
1. CheckButtons() визначає натиснуті клавіші
2. SelectMenu() в якій переходи по меню або зміна параметру
3. RefreshDisplay() в якій власне виводиться інфа

ні в один з цих способів не вписується micromenu-v2

18

(196 відповідей, залишених у Системне програмування)

Передмова: у восьмибітних AVR і MICROCHIP FLASH-память і RAM-память починають адресуватися з 0x0000  (і у інших виробників теж є такі). Тому щоб хоч якось їх відрізнити в програмі, вони в компіляторах 'С' ввели оператори типу PROGMEM , FLASH, RAM, ROM і інші. У Cortex-M3 адресація наскрізна в межах 4ГБ. У STM32F103 FLASH з 0х08000000, RAM - 0х20000000. Тож проблем з визначенням немає.

Тому (це стосується з глобальних змінних):

 // буде в FLASH
const int MyVar= -2345;
const float coeffs[5] ={0.012, 1.569, -56.678, 48.125, -3.567};

//буде в RAM
int YourVar= -2345;
float EnotherCoeffs[5] ={0.012, 1.569, -56.678, 48.125, -3.567};

Тепер відповідь на ваше питання.

PROGMEM замініть на const.
Думаю MENU_ITEM_READ_POINTER можна визначити так:

#define MENU_ITEM_READ_POINTER(Addr)   Addr

Example на https://github.com/abcminiuser/micromenu-v2 не найкращий

19

(196 відповідей, залишених у Системне програмування)

taburyak написав:

Щось я не можу побороти одну проблему. Є два сенсора температури і коли виймаєш їх то замість показників температури має бути написочка "No Device". Це працює коли один сенсор встановлено. Але коли їх два, то замість "No Device" показує "-0.0 С". Десь помилився чи з умовою чи з циклом, не можу розібратись. Гляньте свіжим поглядом.

    
          ...
            if (OW_Send(OW_SEND_RESET, query, 12, buf, 2, 10)==OW_NO_DEVICE){
                lcd_puts((uint8_t *)"No Device")//якщо функція повертає "OW_NO_DEVICE" то друкуємо написочку "No Device"
            } else {
                //Визначаємо який знак у температури
                if ((buf[1]&0x80) != 0) {    //Перевіряємо старший розряд як не 0 то..
                    lcd_puts((uint8_t *)"-"); //ставимо знак -
                    unsigned int tmp;        //робимо потрібні перетворення з числом
                    tmp = ((unsigned int)buf[1]<<8)|buf[0]; //зліплюємо 0 і 1 байт ОЗУ сенсора
                    tmp = ~tmp + 1; //виконуємо операцію логіного заперечення
                    buf[0] = tmp; //повертаємо результат перетворення
                    buf[1] = tmp>>8;
                }
                    ...
       

Значить коли відключені обидва датчики функція OW_Send повертає не OW_NO_DEVICE. Так що перевіряй на інші результати функції  OW_Send.

і ще :
  1. lcd_putc виконується швидше ніж lcd_puts
  2. lcd_itos повинна вміти виводи "-" перед від'ємними числами (по опису)

і мій варіант:

//Визначаємо який знак у температури
int T1;        //робимо потрібні перетворення з числом
T1 =(int) (((unsigned int)buf[1]<<8)|buf[0]); //зліплюємо 0 і 1 байт ОЗУ сенсора
if (T1 <0)
{
lcd_putc('-'); //ставимо знак -
T1 = -T1;  // від'ємне число стає додатнім
}

lcd_itos(T1>>4);//ціле на екран
lcd_putc('.');//кому на екран 
T1 = T1 & 15;
T1 = (T1<<1) + (T1<<3);// Множимо на 10
T1 = (T1>>4);//ділимо на 16 або множимо на 0.0625
lcd_itos(T1);//залишок на екран
lcd_putc(0);//спецсимвол на екран 
lcd_puts((uint8_t *)"C   ");

20

(3 відповідей, залишених у HTML та CSS)

Кінцевий варіант вийшов таким.
Як працює не питайте.
Але працює навіть на IE7.