1

(11 відповідей, залишених у C++)

Клятий шматок ла..на!!! *WALL* Оптимізував, оптимізував і довиоптимізовувався!!!

2

(11 відповідей, залишених у C++)

І знову привіт. Все те питання мене бентежить  *DONT_KNOW*
Якщо я можу записати дані в масив, то як мені усереднити цю процедуру?
Тобто скажімо десять разів прилетів біт, то записали, а ні то не записали... %)

Ось код за яким виставляються біти в масиві.

Прихований текст
uint32_t array[8];
uint8_t bitNum = 0;
uint8_t data = 0;

for (int i = 0; i < 8; i++)
                {
                    if (data & (0x01 << i))
                    {
                        array[i] |= (0x01 << bitNum[1]);

                    }
                    else
                    {
                        array[i] &= ~(0x01 << bitNum[1]);
                    }
                }

потрібно зробити якийсь масив лічильників для кожного біту і якщо лічильник дорахував до певної кількості то біт записати в масив. Але для кожного біту це 32*8=256  :o
Що, реально робити 256 лічильників? Чи може щось підкажете? *DONT_KNOW* 

uint8_t counterAverage[256]

3

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

Ой йооо...  *PARDON*

4

(11 відповідей, залишених у C++)

Помилився поки малював. Бітів 32 а addr 0x03.

5

(11 відповідей, залишених у C++)

Друзі, не можу придумати як записати окремі байти в масив.
Є масив із 8ми комірок і два байти даних що несуть в собі інфу куди що записати. Виглядає все так:

uint32_t array[8]; // масив 32*8
uint8_t addr = 0x00; // номер біта який потрібно змінити у всьому масиві
uint8_t data = 0x00; // дані що потрібно встановити в номері біта

Повинно бути такЖ
https://replace.org.ua/extensions/om_images/img/610e95f146b2f/2l70bkhhok.png
Нажаль не можу в голові укласти як це реалізувати... *WALL*

6

(3 відповідей, залишених у C++)

    a = (a & 0x55) << 1 | (a & 0xAA) >> 1;
    a = (a & 0x33) << 2 | (a & 0xCC) >> 2;
    a = (a & 0x0F) << 4 | (a & 0xF0) >> 4;

    b = a >> 8 - variant;

Друзі. Зламав свій мозочок над простим перетворенням 8 бітного числа.
Є одне число що потрібно перетворити в інше, за дуже простим алгоритмом який має вісім варіантів.
а - вхідний байт; б - перетворений.
1) б(біт 0) = а(біт 0)
2) б(біт 0) = а(біт 1); б(біт 1) = а(біт 0);
3) б(біт 0) = а(біт 2); б(біт 1) = а(біт 1); б(біт 2) = а(біт 0);
4) б(біт 0) = а(біт 3); б(біт 1) = а(біт 2); б(біт 2) = а(біт 1); б(біт 3) = а(біт 0);
https://replace.org.ua/extensions/om_images/img/61082c651459c/2l1natp821.png
І так далі. Якщо уважно прочитати, то можно побачити що дані з байту "а" записуються в ьайт "б", де що перевернутими ззаду наперд. Але перевертається не весь байт а окрема його частина в залежності від варіанту... Ось що я натулив поки ламав головешку

Прихований текст
short a = 0x01, b;
short variants;

if(variants == 1)
{
    b |= a & 0x01;
}

if(variants == 2)
{
    b |= (a & 0x01) << 1; // Здвиг біта №0 на 1 вперед
    b |= (a & 0x02) >> 1; // Здвиг біта №1 на 1 назад
    // в байті b буде число 0x02
}

if(variants == 3)
{
    b |= (a & 0x01) << 2; // Здвиг біта №0 на 2 вперед
    b |= a & 0x02;
    b |= (a & 0x04) >> 2; // Здвиг біта №2 на 2 назад
    // в байті b буде число 0x04
}

if(variants == 4)
{
    b |= (a & 0x01) << 3; // Здвиг біта №0 на 2 вперед
    b |= (a & 0x02) << 1; // Здвиг біта №1 на 1 вперед
    b |= (a & 0x04) >> 1; // Здвиг біта №2 на 1 назад
    b |= (a & 0x08) >> 2; // Здвиг біта №3 на 2 назад
    // в байті b буде число 0x04
}
// і так далі...

Так, я роблю це в ручну, і здається мені що це не оптимізовано і взагалі не правильно. Шановні Гуру, може щось підкажете?

8

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

Остапе. Як для початку, раджу зрозуміти що таке отой fasm, masm чи просто asm.
https://flatassembler.net/docs.php?article=manual
Чому ти не хочеш продовжувати працювати з Python? Він на багато легший в освоюванні, і вивести графіку на дисплей з ним дуже просто... ???? Коли ти реально хочеш за це братися, а не "тільки зараз і тільки сьогодні" то дізнайся який у тебе процесор на ПК і яка архітектура, вали на сайт  https://software.intel.com/content/www/ … /home.html і прочісуй його вздовж і впоперек. Там знайдеш все що тебе цікавить. ???? А на форумі, ти можеш просити допомоги лише коли ти реально зробив все правильно але воно не працює, то тоді досвідчені люди допоможуть. Не потрібно просити допомоги, не написавши жодного рядка коду ????. Ну і сам ти цього не зробиш, доки не прочитаєш інструкцій. Здається, оцей хлопець починав де що не з асемблерів, і у нього чудово виходило... https://youtube.com/channel/UCt2SN0hJihrrxfgMOvQnzRw Чи не так, малюче? ????????

ReAl написав:

Це погана ознака, десь щось у коді зроблено геть неправильно.

Цікава штука цей volatile
Справа в тому що у мене є такий собі системний Тік, який реалізований на таймері. Тобто якийсь код я прокручую по за цим Тіком, а якийсь в ньому. Отже як раз лінійка світлодіодів була в цьому Тіку. При будь якій оптимізації, компілятор не враховував до уваги зміни змінної Тіка, а значить код лінійки не виконувався. Я зробив її volatile, і все запрацювало.

ReAl написав:

якщо хтось почепить 11 плат
але це вже апаратно, pull-up на IndInput_Pin відразу дасть одиничку і буде 0 плат.
Ну й стильове

Плат не може бути більше 10
У мене pull-down я чекаю up( коли обрив або нема плат) то повертається 0. Далі працювати не буде )
Дякую за пораду.

ur_naz написав:

ти сам зрозумів що ти ото понаписав?

Увімкнути високий рівень на DATA
Дригати CKL до тих пір доки мк не побачить високий рівень на вході.
Якщо отримав 1 то кількість відправлених біт ділити на 32.
далі виліт з циклу.

Таким чином я фактично рахую кількість плат на яких по 32 діоди.

ReAl написав:

Оптимізація хоч якась увімкнена?

Коли вмикаю оптимізацію, нічого не працює (.

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

Прихований текст
#define INDRES_LOW()         do {GPIO_WritePin_LOW(IndRes_GPIO_Port, IndRes_Pin);} while(0)
#define INDRES_HIGH()        do {GPIO_WritePin_HIGH(IndRes_GPIO_Port, IndRes_Pin);} while(0)
#define INDLATCH_LOW()        do {GPIO_WritePin_LOW(GPIOB, IndLatch_Pin);} while(0)
#define INDLATCH_HIGH()        do {GPIO_WritePin_HIGH(GPIOB, IndLatch_Pin);} while(0)
#define INDDATA_LOW()        do {GPIO_WritePin_LOW(GPIOB, IndData_Pin);} while(0)
#define INDDATA_HIGH()        do {GPIO_WritePin_HIGH(GPIOB, IndData_Pin);} while(0)
#define INDCLK_LOW()        do {GPIO_WritePin_LOW(GPIOB, IndClk_Pin);} while(0)
#define INDCLK_HIGH()        do {GPIO_WritePin_HIGH(GPIOB, IndClk_Pin);} while(0)
#define IndikatorReset()    do {INDRES_LOW();INDRES_HIGH();INDLATCH_HIGH();INDLATCH_LOW();} while(0)
#define Latch()                do {INDLATCH_HIGH();INDLATCH_LOW();} while(0)

void GPIO_WritePin_LOW(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  GPIOx->BRR = (uint32_t)GPIO_Pin;
  //GPIOx->ODR &= ~(uint32_t)GPIO_Pin;
}

void GPIO_WritePin_HIGH(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  GPIOx->BSRR = (uint32_t)GPIO_Pin;
  //GPIOx->ODR |= (uint32_t)GPIO_Pin;
}

Зараз я рахую кількість плат таким чином. Перед загальним циклом резетую всі мікросхеми, не вмикаючи строб виводжу одиницю на INDDATA і просто рахую INDCLK. Коли дорахував,визначаю кількість плат та виходжу з циклу. Я надіюсь, це так має виглядати? До речі у відладчику бачу реальну кількість, от же працює.

void countPlt()
{
    INDDATA_HIGH();
    for (int i = 1; i < 320; i++)
    {
        INDCLK_HIGH();
        INDCLK_LOW();
        if (HAL_GPIO_ReadPin(GPIOA, IndInput_Pin))
        {
            kilkIndPlat = i / 32;
            return;
        }

    }
}
koala написав:

Скільки LED-ів на двох платах?

На кожній платі 32 світлодіоди

Наліпив слідуючий г..код. За допомогою цієї функції, я можу виводити 32х бітне число в любу плату, та коли виводжу число, скажімо в третю плату то світлодіоди вмикаються замітно повільніше ніж в першу. Це зумовлено послідовним прогоном кожного біта в гирлянду мікросхем. Як би так зробити, щоб заганяти кожен раз, скажімо 160 біт (32 * 5 плат), а виводити тільки потрібні? Тобто навіть коли підключені тільки дві плати, то все одно проганяти 160 біт. Так це буде повільніше але з однаковою швидкістю.

Прихований текст
void indOut(u32 numPLT, u32 data)
{
    IndikatorReset; // зкинути всі мікросхеми

    for (int i = 0; i < (numPLT * 32) + 1; i++)
    {
        INDCLK_HIGH; // клоки
        if ((data & 0x80000000) == 0x00)
        {
            INDDATA_LOW; // дані
        }
        else
        {
            INDDATA_HIGH;
        }

        INDCLK_LOW;
        data = (data << 1);
    }
    INDLATCH_HIGH;// вивід
    INDLATCH_LOW;
}

Можливо пишу не в ту вітку, прошу модераторів перенести тему, якщо це потрібно.

Друзі, є декілька плат зі світлодіодними лінійками що з'єднуються одна в одну. Таких плат може бути від одної до 5 а може і більше. Платами керує МК STM32. На кожній платі 32 світлодіоди якими управляють 4 мікросхеми 74HC595. Проблема полягає в тому, що я "не дуже програміст" а ще, що розробник плати контролера чомусь почепив ці мікросхеми мимо апаратного SPI. Тобто дригати ноги управління треба програмно. Де що я вже реалізував. А саме засвітити один світлодіод із будь якої кількості плат.

#define u32                 uint32_t
#define INDRES_LOW         HAL_GPIO_WritePin_LOW(IndRes_GPIO_Port, IndRes_Pin);
#define INDRES_HIGH        HAL_GPIO_WritePin_HIGH(IndRes_GPIO_Port, IndRes_Pin);
#define INDLATCH_LOW    HAL_GPIO_WritePin_LOW(GPIOB, IndLatch_Pin);
#define INDLATCH_HIGH    HAL_GPIO_WritePin_HIGH(GPIOB, IndLatch_Pin);
#define INDDATA_LOW        HAL_GPIO_WritePin_LOW(GPIOB, IndData_Pin);
#define INDDATA_HIGH    HAL_GPIO_WritePin_HIGH(GPIOB, IndData_Pin);
#define INDCLK_LOW        HAL_GPIO_WritePin_LOW(GPIOB, IndClk_Pin);
#define INDCLK_HIGH        HAL_GPIO_WritePin_HIGH(GPIOB, IndClk_Pin);
#define IndikatorReset    INDRES_LOW;INDRES_HIGH;INDLATCH_HIGH;INDLATCH_LOW;

u32 cnt = 0, kilkIndPlat = 2;

while (1)
    {
                // подальший код прокручується декілька раз в секунду
                // тому лишнє вирізав щоб не мішало
           
                cnt++;
        if (cnt > kilkIndPlat * 32)
        {
            cnt = 1;
        }
        
                 indOut(cnt); // Засвітка світлодіода
    }



void indOut(u32 numberLed)// функція виводу одного світлодіода
{
    IndikatorReset;
    for (int i = 0; i < (kilkIndPlat * 32) + 1; i++)
    {
        INDCLK_HIGH;
        if (i != numberLed - 1)
        {
            INDDATA_LOW;
        }
        else
        {
            INDDATA_HIGH;
        }

        INDCLK_LOW;

    }

    INDLATCH_HIGH;
    INDLATCH_LOW;
}

Тут питання скоріше програмного характеру.
Як засвітити декілька світлодіодів?
А як засвітити якийсь світлодіод не погасивши той що раніше засвічував?

Я хотів би створити функцію що виглядала би приблизно так

void output(bool state, u32 numPlt, u32 numLed)
{
     // а тут фіг лого знає що написатию... ((
}

Я пробував безліч варіантів, та то все марно, отримую якусь фігню. Дякую що дочитали

17

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

Не пам'ятаю як це точно зветься, але десь на аліекспрес, бачив спеціальні наклейки на клавіатуру ноутбука. Якийсь спеціальний матеріал, що підсвічується дисплеєм ноутбука і відбиває світло. Складається враження що клавіатура з підсвіткою.  Є сенс пошукати такий варіант.)

18

(10 відповідей, залишених у C#, .NET)

Torbins написав:

Si4karuk
Наприклад так вміє SoundPlayer, але треба правильно запакувати mp3 в wav формат.

Стосовно "Правильно запакувати", та це золоті слова!!!!!! І SoundPlayer запрацював і файли з exe-шника читаються.

Дякую всім хто допомагав, з наступаючими святами!!!

19

(10 відповідей, залишених у C#, .NET)

Із SoundPlayer, у мене все якось не ладнається від самого початку. Не знаю, де і що не так роблю, та він не працює. А от WMP запрацював з півоберту. Мені би поглянути якийсь примірник, та таких майже не зустрічається в інтернетах.

20

(10 відповідей, залишених у C#, .NET)

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