ассемблер ногодрыг

Тема в разделе "Микроконтроллеры AVR", создана пользователем Ардуинщик55055, 17 сен 2018.

?

какая плата

  1. атмега

    0 голосов
    0,0%
  2. уно

    0 голосов
    0,0%
  3. нано

    3 голосов
    42,9%
  4. про мини

    0 голосов
    0,0%
  5. еще какие то спец платы

    1 голосов
    14,3%
  6. и те и другие

    3 голосов
    42,9%
  1. Оказалось что вместо МК шилась ардуино. И ардуино спи слетал
     
  2. b707

    b707 Гуру

    Вы мой ответ, что сами цитируете - не читали, что ли? :) Я ж вам в нем как раз обьяснил, почему так получилось.
    Если б вы разобрались с опциями avrdude - вам бы и usbasp не понадобился.
     
  3. parovoZZ

    parovoZZ Гуру

    тормознись! Ишь ты разогнался =) Код давай, да?

    Открываем дашик и видим:
    2 тика на такую простую операцию! На сях всё тоже самое, ибо стандартное
    PORTx |= (1 << PINxy)
    PORTx &= ~(1 << PINxy)
    компилятором приведется к вышеназванным командам
     
  4. ostrov

    ostrov Гуру

    Чего болтать то, давайте мне HEX на ассемблере для 328 на любую ногу, сравним с Сишным вариантом, выложу оба результата. Самому интересно.
     
  5. KindMan

    KindMan Гуру

    В 12 году статья была на хабре, как раз разбирали скорость ногодрыга. По памяти, Си'шный код делал за четыре такта прямоугольник - вкл, выкл и переход назад. 4 мГц на дуне. По факту те же асм инструкции.
    По теме - где вы на асме сэкономите память? На Си вы определили переменные, столько памяти и сожрут. На Асме вы же так же их будете объявлять.
     
  6. b707

    b707 Гуру

    вот такйо код дает 4 МГц
    Код (C++):
    void setup() {
    DDRB = B00000100;
    while(1) {
    PORTB = B00000100;
    PORTB = B00000000;
    }
    }
    void loop() {}
     
     
  7. AlexU

    AlexU Гуру

    А такой сколько выдаст?
    Код (C++):
    void setup() {
      DDRB = B00000100;
      while(1) {
        PINB = B00000100;
      }
    }
    void loop() {}
     
    ostrov нравится это.
  8. parovoZZ

    parovoZZ Гуру

    а зачем ссылаться на какие-то статьи, если в дашике описано практически все?
    если дрыгать целиком всем портом, то можно и каждый тик дрыгать. Но теряем все восемь ног. Как вариант - выставить бит PUD и какие-то ноги перевести на вход.
     
  9. KindMan

    KindMan Гуру

    Да просто там как раз на разных ЯП дизамили хексы, вот и запомнилось.
    Можно вкл/выкл писать строками и до 8 доведём, но переход в начало должен быть… как с переходом дрыгать каждый тик всем портом?
     
  10. parovoZZ

    parovoZZ Гуру

    Половину от тактовой
     
  11. ostrov

    ostrov Гуру

    А что, дрыгать портом медленнее чем одной ногой?
     
  12. parovoZZ

    parovoZZ Гуру

    Не силен в асме. Значит надо дизасм смотреть =)
     
  13. AlexU

    AlexU Гуру

    Не похоже на правду. Переход только два такта заберёт.
     
  14. parovoZZ

    parovoZZ Гуру

    наоборот. Причем если дрыгать пином в РОНе, то это тоже один такт)))
     
  15. parovoZZ

    parovoZZ Гуру

    Ну вот же здесь авторитетное заявление:
     
  16. AlexU

    AlexU Гуру

    Тот код 4-е МГц даёт, а этот?
     
  17. ostrov

    ostrov Гуру

    До 8 вроде можно разогнать, если как AlexU написал. На асме быстрее можно?
     
  18. parovoZZ

    parovoZZ Гуру

    А твой одну треть должен дать.
     
  19. AlexU

    AlexU Гуру

    В том коде можно получить 1/3 от тактовой частоты с заполнением 1/3 (типа ШИМ).
    1/2 от тактовой можно получить, если всю флеш забить кодом типа PINB = 1. Но зачем это нужно, если ту же 1/2 можно получить аппаратно при помощи таймеров?
     
  20. parovoZZ

    parovoZZ Гуру

    ну если бы авр-ка умела синхронизироваться и по переднему и по заднему фронту тактовой частоты, то можно было бы и быстрее.
     
  21. AlexU

    AlexU Гуру

    Хоть чутка понимаешь, о чём пишешь?