Кресты / Говнокод #28084 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
void SoftSPIB::setClockDivider(uint8_t div) {
    if (div == SPI_CLOCK_DIV2) _delay = 2;
    else if (div == SPI_CLOCK_DIV4) _delay = 4;
    else if (div == SPI_CLOCK_DIV8) _delay = 8;
    else if (div == SPI_CLOCK_DIV16) _delay = 16;
    else if (div == SPI_CLOCK_DIV32) _delay = 32;
    else if (div == SPI_CLOCK_DIV64) _delay = 64;
    else if (div == SPI_CLOCK_DIV128) _delay = 128;
    else _delay = 128;
}

uint8_t SoftSPIB::transfer(uint8_t val) {
    ...
    uint8_t del = _delay >> 1;

    uint8_t bval = 0;
    for (uint8_t bit = 0; bit < 8; bit++) {
        digitalWrite(_sck, _ckp ? LOW : HIGH);

        for (uint8_t i = 0; i < del; i++) {
                asm volatile("nop");
        }

        if (...) {...} else {
                digitalWrite(_mosi, val & (1<<bit) ? HIGH : LOW);
        }
    ...
    ...
    ...
    }
    return out;
}

- А это точно частота CLOCK_DIV2? /* Fosc/2 */
- Не боись, я все рассчитал!

Запостил: Steve_Brown Steve_Brown, (Updated )

Комментарии (95) RSS

  • В этой вашей ардуине готовых функций для задержки нету что ли?
    Ответить
    • Есть, delay и delayMicroseconds. Но тут нужна задержка именно по тактам (константы SPI_CLOCK_DIVx взяты из SPI.h). Скажем, для частоты Fosc/2 длина каждой 0 и 1 должна быть одном такту, т.е. 1 команда nop.
      Ответить
      • А железного SPI там нету разве? Вроде был. Или пины чем-то другим заняли?
        Ответить
        • Был муж
          Да объелся груш.

          Сгорел, что ли, но MISO на одной плате не работает. Пришлось кидать перемычку на другой пин и искать софтовую либу.
          Может, проще свою было написать.
          Ответить
  • > точно частота

    Поскольку SPI синхронный, точная частота и не требуется. Лишь бы была достаточно быстрой, чтобы успеть передать данные и достаточно медленной, чтобы провода не мешали.
    Ответить
  • .
            for (uint8_t i = 0; i < del; i++) {
                    asm volatile("nop");
            }

    И как ты проверишь, наанроллит тебе компилятор этот nop, или сделает цикл с счетчиком, в котором дергается nop? Задержка при этом может радикально различаться.
    Ответить
    • uint8_t del = this->_delay >> 1;

      Не заанроллит, тут и к листингам не ходи.

      Собственно, именно поэтому...
      Ответить
      • Частично наанроллить может. Для точной задержки, сам "цикл" лучше на ассемблере писать
        Ответить
    • блядь потом из за такого кода у меня lode runner на современны процах неиграбелен

      j123, ты как там?
      Ответить
        • Кстати, в гоблинах первых сначала спрашивали, какой у вас камень (286, 386, 486) и потом подстраивали скорость. Видимо не было cpuid в 286, а вот странно, что частоту не спросили
          Ответить
          • В принципе, можно было измерить частоту вместо этих вопросов. Таймер же был. Пару тиков подождать недолго.
            Ответить
            • лениво было программисту видимо
              Ответить
          • У меня в контроллерах я на этапе компиляции знаю, какой у меня камень. Поэтому я за контроллеры.
            Ответить
            • В электропапиросах сплошь и рядом кейсы, когда паршивка на разных моделях MCU крутиться.
              Ответить
              • я бы хотел писать под электропапиросы.. а какие там API? как в контроллерах?
                Ответить
                  • > нувотоны

                    Т.е. всё-таки cortex m0? Или у них какая-то своя рахитектура?
                    Ответить
                      • Блядь, m4 в сраной сигарете?! Они серьёзно? Что за матан там прошивка считает?
                        Ответить
                          • На джаваскрипте.

                            Затянулся неудачно, и получил undefined дозу никотина
                            Ответить
                          • полюбасик, нормальный человек не стал бы эту хуйню кодить.
                            Ответить
                        • Я, есссли честно, вообще удивлён, что для того чтобы курить нужен какой-то "контроллёр"

                          Хотя я не курю, может они кроме испарения ёще что-нибудь должны уметь.
                          Ответить
                          • Да можно и аналоговый регулятор температуры собрать, наверное.
                            Ответить
                            • В одноразовой сигарете там вообще нагревательный элемент подключен к батарейке последовательно через какой-то датчик, который как-то определяет затяжку. Затянулся - сопротивление упало - пошёл нагрев. Сильнее затянулся - сильнее упало - сильнее нагрев.
                              Ответить
                              • Я видел такой аналоговый контроллер для приставки: чем сильнее жмеш ручку -- тем сильнее меняется сопротивление, и так работает

                                ну про программирование джойстиков мы уже тут ржали

                                так вот: давайте придумаем игру чтобы контролировалась затяжкой

                                симулятор наркомана?
                                Ответить
                              • Фу, вы ещё обсудите контроллер для введения дозы героина, блядь.
                                Ответить
                                • Для начала нужно решить проблему: как определять, что приход кончился и нужна новая доза?

                                  Кстати, замени героин на морфиновые обезболивающие и получится вполне годная штука.
                                  Ответить
                                  • > получится вполне годная штука

                                    Warning! Vital signs critical. Morphine administered.

                                    Или как там было?
                                    Ответить
                                  • The prototype medic power armor has the ability to administer Med-X, which it will do if the wearer's health drops below 33% or if a limb's health drops below 25%. Med-X will be dispensed every 2.5 (in-game) hours.
                                    Ответить
                          • Ну как бы нужна возможность включать и выключать, а также детектить низкий заряд и об этом сообщать. Самый самый минимум.

                            А температура там меряется через обсчет температурного коэффициента сопротивления. Вот твой матан, bormand.
                            Ответить
                            • Ну даже и нагревательного элемента не нужно. Просто когда курить, процессор начинает считать матан (или майнить эфириум).
                              Ответить
                        • `На `m4' матан хоть и можно считать, но очень муторно. Не рекомендую.'
                          Ответить
                          • Кстати, чуваку с хабра, который пилит свой хакерский тамагочи, надо подсказать идею оформить его в виде сигареты. Затягиваешься и шлагбаум открывается.
                            Ответить
                            • Не взлетит. Уже были попытки вставить мрз плеер, тачскрин с жестами и самая дурацкая - bluetooth колонку.
                              Ответить
                              • > bluetooth

                                А интеграция с какой-нибудь прогой для ЗОЖ на мобиле есть?

                                На этой неделе вы курили на час меньше, чем на прошлой.
                                Ответить
                                • И даже такое тоже было, но я не помню что за платформа там. Возможно как раз твой м0.

                                  Данная программа было разработана специально для электронных сигарет с функцией Bluetooth. Это сделает вашу электронную сигарету более человечной и интеллектуальной.

                                  ¯\_(ツ)_/¯
                                  Ответить
              • А почему не понасобрать прошивку под разные MCU, если делается хуйня под названием "time delay loop"?

                Вообще, грамотнее было б делать так:

                time_t time = gettime_now() + delay_need;
                while(gettime_now() < time)
                {
                  asm volatile("nop");
                }
                Ответить
                • а у вас в контроллерах нельзя запрогрммировать таймер и на его прерывание повесить чото? или процессор один хер принадлежит вам, и всем похуй?
                  Ответить
                  • > а у вас в контроллерах нельзя запрогрммировать таймер и на его прерывание повесить чото?

                    Можно

                    > или процессор один хер принадлежит вам, и всем похуй?

                    Ну это если никакой ОС нет. А если есть, она под планировщик может какие-то таймеры себе захавать. В общем, там по-всякому может быть
                    Ответить
                    • Кстати, таймер может срабатывать допустим раз в секунду и менять атомарно какую-то глобальную переменную, которую могут читать особые функции для получения "времени". Но иногда еще есть в контроллере встроенный счетчик тактов, и "время" можно от него получать.
                      Ответить
                      • > счетчик тактов

                        Во многих вообще RTC'шку можно поднять при желании.
                        Ответить
                        • Для RTC отдельный чип должен быть. Если время считать процом, то результат мягко говоря нестабильный. Опять же, в мире электропапиросов был кейс с часиками для украшения паршивки.
                          Ответить
                          • Там внешний кварц на 32кГц достаточно зацепить и запасное питание от батарейки (если основное планируется отрубать). Всё остальное уже внутри есть.
                            Ответить
                            • > основное планируется отрубать
                              Подразумевается, что элементы меняют постоянно. Надо бы провести эксперимент с часами, никаких литиевых таблеток я внутри не видел.
                              Ответить
                              • На время замены кондёра хватит, как мне кажется. Оно там по бекапному питанию совсем копейки жрёт.
                                Ответить
                • Тут ирония в том, что используются константы из <SPI.h>. Что порождает невысказанное предположение, что задержка в N тактов процессора между импульсами осуществляется повторением команды "nop" (исполняющейся 1 такт) в цикле for с N итерациями, в том числе при малых значениях N (2, 4...)
                  Ответить
                  • А процессор имеет право выкинуть нахуй нопы? Или там есть какое спец инструкцие типа volatile?
                    Ответить
                    • У меня в микроконтроллерах (такого класса) нет хитроумного исполнения.
                      Там все команды задокументированы по времени исполнения, так что можно высчитать задержку с точностью до такта.
                      Ответить
                      • У меня в IBM PC XT тоже
                        задокументированны Фогом
                        Ответить
        • Напомню, что так называемые русские — это народ-пидор, народ-мразь, народ-говно, народ-гнида, народ-гной, народ-хуесос. Смерть ванючей русне!
          Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8