[Частично решено] Вопрос новичка о lcd.creatChar().

Тема в разделе "Arduino & Shields", создана пользователем nichan, 17 сен 2015.

  1. nichan

    nichan Нуб

    Доброго времени суток.

    Собственно экспериментирую с LCD и Apduino. И нежданно-негаданно наткнулся на странный глюк вот на таком скетче. (Железо собрано правильно, ибо все другие "пробы пера" работают отлично)

    Код (Text):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 13, 6, 5, 4, 3);
    byte skull_and_bones[8] =
    {
      B01110,
      B10101,
      B11011,
      B01110,
      B00000,
      B10001,
      B01110,
      B10001,
    };
    void setup()
    {
    lcd.createChar(0,skull_and_bones);
    lcd.begin(16, 2);
    lcd.print("\0");
    lcd.setCursor (0,1);
    lcd.write(0);
    }
    void loop() {
    }
    При этом имеем в багрепорте следующее:

    Arduino: 1.6.3 (Windows 7), Плата"Arduino Uno"

    sketch_sep16a.ino: In function 'void setup()':

    sketch_sep16a.ino:20:12: error: call of overloaded 'write(int)' is ambiguous

    sketch_sep16a.ino:20:12: note: candidates are:

    In file included from sketch_sep16a.ino:1:0:

    C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src/LiquidCrystal.h:83:18: note: virtual size_t LiquidCrystal::write(uint8_t)

    virtual size_t write(uint8_t);

    ^

    In file included from C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src/LiquidCrystal.h:5:0,

    from sketch_sep16a.ino:1:

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*)

    size_t write(const char *str) {

    ^

    Ошибка компиляции.

    Подозреваю какой-то баг с нулевой ячейкой таблицы символов LCD, потому как создание глифа в ячейку с 1 по 7 проблем не вызывает. Может кто-то что-то знает, как этот баг одолеть?
     
    Последнее редактирование: 17 сен 2015
  2. DrProg

    DrProg Вечный нерд

    Вставьте код в окно для кода, так никто глаза ломать не будет.
     
    ИгорьК нравится это.
  3. nichan

    nichan Нуб

    2DrProg: Done.
     
  4. geher

    geher Гуру

    Баг, похоже, на самом деле в компиляторе, который не может решить, как ему вызывать write от целочисленной константы, и предлагает в качестве варианта функцию с параметром указателем.

    Можно попробовать "объяснить" компилятору, что "он не прав".
    lcd.write((uint8_t)0);
     
  5. AlexU

    AlexU Гуру

    Простыми словами -- ошибка:
    Код (Text):
    error: call of overloaded 'write(int)' is ambiguous
    говорит о том, что для функции 'write(int)', которую унаследовал класс LiquidCrystal, компилятор нашел два переопределения и не может выбрать какое из них использовать. Первое переопределение -- это функция 'size_t LiquidCrystal::write(uint8_t)', второе переопределение -- это 'size_t Print::write(const char*)'.
    Один из вариантов быстрого решения проблемы -- сделать, так называемый 'cast', т.е. явно указать тип переменной передаваемой в функцию:
    Код (Text):
    lcd.write((uint8_t) 0);
    UPD: не много опоздал .... geher опередил (вот только баг не в компиляторе)
     
    Последнее редактирование: 17 сен 2015
  6. nichan

    nichan Нуб

    Баг пофиксился - код скомпилировался и lcd.write выполняется.
    А вот lcd.print нет - не отображает "0 символ" из таблицы. Будем пользоваьтся write - ом.