Динамическая индикация на четырехразрядном индикаторе

Тема в разделе "Закажу проект", создана пользователем arssev1, 23 дек 2015.

  1. SergeiL

    SergeiL Оракул Модератор

    Прочитал и обалдел ...
    Что же Вы делали то сисадмином 25 лет?
    А еще это:
    Где же хочется? Можно же было бы и поучиться.

    Какой год? Фортран....Как минимум 25 лет...
     
    Последнее редактирование: 10 дек 2018
  2. ostrov

    ostrov Гуру

    В кодевижн то будет! Хотя, если сделать список #define, то везде будет. Но лучше один раз выучить логические операции, их не так много, научится хотя бы устанавливать отдельные биты в 0 или 1, и делать все правильно на минимальном аппаратном уровне.
     
    ИгорьК нравится это.
  3. Фантастика какая. А пример не приведете?
     
  4. ИгорьК

    ИгорьК Оракул Модератор

    Макросы Аскольда Волкова.

    Код (C++):
    #define _setL(port,bit)         do { port &= ~(1 << bit); } while(0)
    #define _setH(port,bit)         do { port |= (1 << bit); } while(0)
    #define _clrL(port,bit)         do { port |= (1 << bit); } while(0)
    #define _clrH(port,bit)         do { port &= ~(1 << bit); } while(0)
    #define _bitL(port,bit)         (!(port & (1 << bit)))
    #define _bitH(port,bit)         (port & (1 << bit))
    #define _cpl(port,bit,val)      do {port ^= (1 << bit); } while(0)
    Отсюда: http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html
     
    ostrov нравится это.
  5. И какое это имеет отношение к обсуждаемому синтаксису?
     
  6. ostrov

    ostrov Гуру

    Только не совсем понятно зачем цикл на одну итерацию?
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    Если речь не шла о макросах работы с битами в портах, то я что-то не понял.
     
  8. ostrov

    ostrov Гуру

    Вероятно, дядя Витя хочет докопаться до буковок, чтоб все было точка в точку.
     
  9. ostrov

    ostrov Гуру

    Немного другой синтаксис, конечно, но не сильно сложнее для понимания. Блинк:
    Код (C++):
    #define _PORTB(bitt,HL) HL?PORTB|=1<<bitt:PORTB&=~(1<<bitt)

    void setup() {
      DDRB = 0xFF;
    }

    void loop() {
      _PORTB(5, 1);
      delay(1000);
      _PORTB(5, 0);
      delay(1000);
    }
     
  10. Речь шла о расширении языка, позволяющем работать с битами с той же семантикой, что и с переменными. Это очень сильно другое. CPP-макрос так даже близко не может.
    Код (C++):
    int x = 5;
    PORTB.0 = PORTB.1 = x; // В оба бита записывается 1 по семантике приведения к булевым.
    PORTB.3 &= 1;
    // И так далее
     
     
    Последнее редактирование: 11 дек 2018
  11. ostrov

    ostrov Гуру

    Хрен знает как это компилируется в итоге, насколько быстро работает. Если как в ардуиновских функциях, то смысл какой? Да и так, если честно, пока не представляю что можно сделать при помощи такой записи, чего нельзя обычными бинарными операциями?
     
  12. Можно быстро и продуктивно работать. Если вы не считаете это важным, то замечу, что всё, что вы когда-либо напрограммировали, можно было бы сделать, вручную написав машинные коды.
     
  13. ostrov

    ostrov Гуру

    А что получается при компиляции в первом и втором случае? Размер какой? Ведь и с помощью макроса можно записать с краткой видимостью:
    Код (C++):
      for (uint8_t i = 0; i < 8; i++) {
        _PORTB(5,data & (1 << i));
        _delay_us(UART_DELAY);
      }
    Интересно не как это выглядит в тексте, а как в готовом коде.
     
  14. parovoZZ

    parovoZZ Гуру

    скомпилируй с разной оптимизацией и посмотри дизасм.
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Вам-не знаю видимо не для чего.А я пишу в Кодвижн.И в Ассемблере для AVR есть битовые операции чтоб можно было установить бит одним щелчком.
    Точно так.Установить единицу/высокий логический уровень на ножке РВ0.
    Очень хорошо.Теперь научитесь для неё писать коды.Всё почти точно также как и для Меги 8 но есть небольшие отличия.
     
  16. parovoZZ

    parovoZZ Гуру

    Правильно это делается так
    Код (C++):
    reg |= (1<<bit);
    очистить бит
    Код (C++):
    reg &= ~(1<<bit);
    reg - 'это регистр, bit - номер бита (от 0 до 7).
    Работать это будет везде и не стыдно выложить.
     
  17. Airbus

    Airbus Радиохулиган Модератор

    Это аксиома?Или догма?
     
  18. parovoZZ

    parovoZZ Гуру

    Это стандарт Си.
     
  19. Только это не то. Вы упустили одну важную деталь, и получился баг. data &(1<< i) может иметь значения другие, кроме и 1 и 0. А все потому, что эта каша практически нечитаемая. А скомпилируется в эффективный код, адекватный операции.
     
    Последнее редактирование: 11 дек 2018
  20. ostrov

    ostrov Гуру

    Код (C++):
    bool(data&1<<i)