Сразу проблема (

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ostrov, 1 окт 2016.

  1. ИгорьК

    ИгорьК Гуру

    Mbed - это ардуино для STM.
    JS не предназначен для точной работы в онлайн режиме, имхо.
    Он для реакции на события. Для точности и скорости - ассемблер. Ну и часто ли он нужен?
    А те кто пришел в Искру с JS... ну они просто не до конца понимают вопрос, мне кажется :)
     
  2. ostrov

    ostrov Гуру

    Суть та же как в выиндовсои VisualStudio, там тоже нарисовал кнопок и прочих объектов и задал функции на реакции, плюс по таймерам если надо, самой программы как таковой нет. Тут, насколько я понимаю, тот же принцип.
     
  3. ИгорьК

    ИгорьК Гуру

    Более менее... "но есть нюансы". Много.
     
  4. sys

    sys Злобный Буратино Модератор

    ну вы как то уж сильно приуменьшили возможности и задачи JS/Espruino... ;)
     
  5. ИгорьК

    ИгорьК Гуру

    Мне так пока видится. Я же не программист, самоделками балуюсь. :) тоже до конца от Сишного / ячеистопамятного мышления не избавился :)
     
  6. ИгорьК

    ИгорьК Гуру

    Тот же вопрос про несколько кнопок сразу... я приблизительно представляю как бы его решил, но сходу не отвечу.
    Например три кнопки. Полагаю (!!) надо сделать объект с тремя полями, и каждый из калбэков проверяет все три поля, выставляя при этом свое.
    Но это предположение.

    С точки зрения Си это расточительство. А JS - да и шут с ним. Просто и понятно.
     
  7. sys

    sys Злобный Буратино Модератор

    Кстати по JS материалы на MDN (https://developer.mozilla.org/ru/docs/Web/JavaScript) поинтересней будут...

    Есть такое :) но потренероваться в оптимизации алгоритма время от времени тоже можно.
     
  8. ostrov

    ostrov Гуру

    Попытаюсь объяснить свою мысль. Вот демо-код вывода на индикатор цифр, он не полный, ограничен 4 цифрами. но не суть. Принцип индикации стандартный динамический - включаем по очереди разряды, выставляем сегменты и так по кругу. Искра с задачей справилась, но добиться быстродействия выше 45 кадров в секунду не удалось, быстрее просто ножки не переставляются.
    [​IMG]
    В результате циферки заметно мерцают и имеют бледный цвет.
    [​IMG]
    Для сравнения, Attiny2313, которую я зачастую использую в качестве "видеокарты" на собственном внутреннем резонаторе 4МГц выдает, как бы не соврать, несколько сот кадров, чуть ли не тысячу. Все за счет того, что биты-байты-порты.

    Понимаю, что Искрой индикатор поддерживать все равно что гвозди микроскопом забивать, да и вообще не для того она нужна. Но все же показательно.

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

    Да, вот текст чудо-кода. )
    Код (Javascript):

    var str = new Array (5);  // разряды
    str[0]=  [0,0,0,1];
    str[1] = [0,0,1,0];
    str[2]=  [0,1,0,0];
    str[3] = [1,0,0,0];
    str[4] = [0,0,0,0];

    var seg = new Array (5);   // сегменты
    seg [0] = [0,0,0,0,0,0,1];
    seg [1] = [1,0,0,1,1,1,1];
    seg [2] = [0,0,1,0,0,1,0];
    seg [3] = [0,0,0,0,1,1,0];
    seg [4] = [1,1,1,1,1,1,1];

    var num = [1,2,3,0];

    var pinT = [P2,P3,P4,P5];
    var pinS = [P6,P7,P8,P9,P10,P11,P12];


    setInterval(function() {
      for (var i = 0; i < 4; i++) {
        for (var ii = 0; ii < 4; ii++) {
          digitalWrite(pinT[ii], str[i][ii]);        // разряды
        }
        for (ii = 0; ii < 7; ii++) {
          digitalWrite(pinS[ii], seg[num[i]][ii]);   // сегменты
        }
        del();                        // задержка для свечения
        for (ii = 0; ii < 7; ii++) {
          digitalWrite(pinS[ii], 1);  // выключение того и другого
        }
        for (ii = 0; ii < 4; ii++) {
          digitalWrite(pinT[ii], 0);
        }
      }

    }, 20);


    function del() {
      for (var i = 0; i < 10; i++) {
         var g = g*g;
      }
    }
    Но вот с чем на поспорить, на JS в десять раз быстрее писать чем на С++. И это с учетом, что только начал, в справочник тыкаюсь по каждой мелочи.
     
  9. ZAZ-965

    ZAZ-965 Гуру

    А по-моему, архитектура всех интерактивных программ одинакова - инициализация окружения и главный цикл. В Espruino в файле main.c https://github.com/espruino/Espruino/blob/master/targets/stm32/main.c нет принципиальных отличий от инициализации в Arduino
    Код (C++):
    int main(void){
      //инициализация железа
      jshInit();
      //инициализация интертрепатора
      jsvInit();
      //главный цикл
      while (1) {
        jsiLoop();
      }
    }
    Меня от изучения JS (кроме лени) останавливают такие моменты:
    - ограниченная поддержка номенклатуры микроконтроллеров, энтузиасты, конечно, молодцы, но от производителей контроллеров и средств программной разработки поддержки нет;
    - принципиальная невозможность работы на "младших" моделях микроконтроллеров, т.е. все равно придется знать Си;
    - избыточная расточительность - зачем в контроллере хранить интерпретатор? или можно как-то компилировать в байт-код, а в контроллере хранить только транслятор байт-кода?
    - наконец мне JS в вебе/браузерах надоел - на 10% полезной работы, 90% рекламной чепухи.
     
  10. ИгорьК

    ИгорьК Гуру

    Вот такая (не)задача: плавно управлять переменным током. Она решается следующим образом:
    - прерывание на ноге по восходящему фронту полуволны гасит симистор;
    - немедленно запускается таймер, который через некорторое время надо сбросить, что включит симистор;
    - это время и определяет яркость свечения
    - время самой полуволны - 1 сек / 50 гц / 2 = 10 мс.
    - чтобы свет менялся плавно от 0 до полного, в полуволну надо уложить минимум сто управляемых промежутков.

    Решение: я не знаю как это сделать стандартными средствами JS, без обращения к peek и poke.
    А как с ними обращаться я тоже не знаю - надо лопатить мануал.
    ... да мне это на AVR просто сделать.

    UPD. Хотя, если подумать... digitalPulse(pin, value, time)
     
    Последнее редактирование: 4 окт 2016
    sys нравится это.
  11. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Можно в обычную ардуино загрузить интерпретатор JS?
     
  12. ostrov

    ostrov Гуру

    Вот вопрос который не стыкует концепцию явы с моим о ннй восприятием. К примеру нужно сделать нечто с меню. То есть часть кнопок не работает пока устройство в рабочем режиме. Потом заходим в меню и начинаем тыкать в нем всякое. На С сделать это как два пальца, а кау на Яве в концепции сигнал-функция? Добавить флаги для работы той или иной функции? Или как по кошерному делается?
     
  13. sys

    sys Злобный Буратино Модератор

    Функция digitalWrite() имеет хитрую особенность обрабатывать сразу массив / http://www.espruino.com/Reference#l__global_digitalWrite /
    digitlaWrite([P1,P2,P3,P4,P5], 0b11010), где 0b11010: 0b - бинарный префикс, 11010 - значение, каждый бит которого соответствует сигналу устанавливаемому в пины из массива, обработка начинается с младшего бита (справо налево).... т.е 0->P5, 1->P4, 0->P3, 1->P2, 1->P1.
    вместо 0b11010 можно задать 26 (но сложнее читать исходный код)
    поэтому, если нигде не наврал, то ваш код вижу таким:
    Код (Javascript):

    var str = [0b0001, 0b0010, 0b0100, 0b1000, 0b0000];
    var seg = [0b0000001, 0b1001111, 0b0010010, 0b0000110, 0b1111111];
    var num = [1,2,3,0];

    var pinT = [P2,P3,P4,P5];
    var pinS = [P6,P7,P8,P9,P10,P11,P12];

    setInterval(function() {

      for (var i = 0; i < 4; i++) {

          digitalWrite(pinT, str[i]);        // разряды
          digitalWrite(pinS, seg[num[i]]);   // сегменты

          setTimeout(function(){                        // задержка для свечения
            digitalWrite(pinS, 0b1111111);  // выключение того и другого
            digitalWrite(pinT, 0);
          },1); // вместо 1 поставить нужную задержку

      }

    }, 20);

     
    Хотя мне кажется, что в этом коде задействуются не все значения массивов str и seg...
    Если я правильно понял суть, то добавил бы флаг типа menumode = true|false и обрабатывал бы "менюшные" кнопки только при успешной проверке на "трушность" :)
     
    Последнее редактирование: 5 окт 2016
    ИгорьК и ostrov нравится это.
  14. ostrov

    ostrov Гуру

    У него порты точно 8-битные?
     
  15. sys

    sys Злобный Буратино Модератор

  16. ostrov

    ostrov Гуру

    Разобрался, тут неважно сколькибитные у него порты. Спасибо, попробую массивом, может быть это быстрее.
     
  17. sys

    sys Злобный Буратино Модератор

    И нам будет интересно узнать о результатах эксперимента ;)
     
  18. ostrov

    ostrov Гуру

    Вот на эту строку он ругается:
    Код (C++):
          },1); // вместо 1 поставить нужную задержку
    И работает неправильно. Я, честно говоря, тоже не понял как это прерывание по таймеру внутри прерывания по таймеру. Такое возможно?

    Переделал ваш вариант с более понятной пока что для меня задержкой и все заработало. Действительно, код выглядит намного компактнее и понятнее. Этого я и хотел, чтобы было ближе к тому что в С++. Насчет быстродействия пока не проверял, очень интересно насколько digitalWrite(pinS, 0b1111111); быстрее цикла с той же задачей.
    Код (Javascript):

    var str = [0b0001, 0b0010, 0b0100, 0b1000, 0b0000];
    var seg = [0b0000001, 0b1001111, 0b0010010, 0b0000110, 0b1111111];
    var num = [1,2,3,0];

    var pinT = [P2,P3,P4,P5];
    var pinS = [P6,P7,P8,P9,P10,P11,P12];



    setInterval(function() {

      for (var i = 0; i < 4; i++) {

          digitalWrite(pinT, str[i]);        // разряды
          digitalWrite(pinS, seg[num[i]]);   // сегменты
          del();
          digitalWrite(pinS, 0b1111111);  // выключение того и другого
          digitalWrite(pinT, 0);
      }

    }, 20);



    function del() {
      for (var i = 0; i < 10; i++) {
         var g = g*g;
      }
    }
     
  19. sys

    sys Злобный Буратино Модератор

    ну значит всетаки наврал :) изначально тоже такой хотел предложить, но потом решил "подрезать"... видно я не совсем понял смысл del()
    setTimeout() просто разово выполняет содержимое функции с задержкой


    кстати, бросилась на глаза статейка http://catethysis.ru/stm32-gpio/ ... может пригодится...
     
    Последнее редактирование: 5 окт 2016
  20. ostrov

    ostrov Гуру

    Проверил быстродействие digitalWrite() так и этак при помощи простого теста:
    Код (Javascript):
    var pinS = [P6,P7,P8,P9,P10,P11,P12];

    var t = getTime();
    for (var i=0; i<5000; i++) {
      digitalWrite(pinS, 0b1111111);
    }
    print(getTime()-t);

    t = getTime();
    for (var i=0; i<5000; i++) {
      for (ii = 0; ii < 7; ii++) {
       digitalWrite(pinS[ii], 1);
      }
    }
    print(getTime()-t);
    Первый вариант оказался быстрее в 6,5 раз - 1 секунда против 6,5. Отлично! Я так понимаю, это максимально быстрый из возможных способов дергать сразу несколькими ногами в JS?
     
    sys нравится это.