Atmega328pu+tft9225+sd

Тема в разделе "Arduino & Shields", создана пользователем pian, 30 апр 2021.

  1. pian

    pian Нуб

    Доброго всем времени суток. Суть проблемы: нужно выводить на экран картинку с sd карточки но экран одновременно с sd картой работать не желает. Оба повешены на аппаратный SPI. Если закомментировать строчку while (!sd.begin(5)) {} то экран работает: выводит надпись "SD Card initialised". А если провести инициализацию sd карточки то не работает. Но по строчкам Serial.println("SD Card initialised"); и Serial.println("tft print"); можно убедится что программа не зависает, то есть инициализация карты происходит. К тому же quick start из библиотеки sd_raw работает, выводит информацию о карточке и показывает что там есть файл raf с картинкой

    Код (C++):
    #include <SPI.h>
    #include <SdFat.h>
    #include <UTFT.h>
    #include <UTFT_SdRaw.h>
    SdFat sd;
    UTFT myGLCD(QD220A,11,13,8,7,6);   // SDA SCL CS RST RS  Remember to change the model parameter to suit your display module!
    UTFT_SdRaw myFiles(&myGLCD);

    extern uint8_t SmallFont[];

    void setup()
    {
      Serial.begin(9600);
      pinMode(14, OUTPUT);
      digitalWrite(14, LOW);
      while (!sd.begin(5)) {}
      Serial.println("SD Card initialised");
      delay(1000);
     
      myGLCD.InitLCD();
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);      // выбираем большой шрифт
      myGLCD.setColor(VGA_GREEN);
      myGLCD.print("SD Card initialised", CENTER, 100);
      Serial.println("tft print");
     
      // выводим изображение с SD-карты на дисплей
      //myFiles.load(0, 0, 180, 220, "water.raw");
    }

    void loop()
    {
     
    }
     
  2. pian

    pian Нуб

    Повесить карточку или дисплей на софтварный SPI я не могу так как все ноги уже заняты. Всю голову сломал уже. Если не получиться исправить баг то придется переходить на 2560. Чего бы делать не хотелось.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

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

    play(freq, dur); // Функции play() и delay() работают одновременно.
    delay(dur); //
    pinMode(pin, OUTPUT);

    Пин переключит режим не через паузу после тона, а одновременно с окончанием тона.
     
    Последнее редактирование: 30 апр 2021
  4. pian

    pian Нуб

    Вывод на экран с флешки картинки делает библиотека UTFT_SdRaw.h. Как внутри нее это реализовано я не знаю. Взял скетч из примера. Только пины поменял у экрана. А написать без библиотеки у меня тяму не хватит. http://wiki.amperka.ru/продукты:tft-lcd-480x320
    Вот тут статья есть. Как бы у людей работает. Вот только у меня нет. Может я не людь:(
     
  5. pian

    pian Нуб

    Прикол еще вот в чем. После инициализации карты в цикле loop я делал SPI.transfer(0b01110100); Повесил осцилограф на пин MOSI. И там тишина. Просто высокий уровень. Команда на передачу по SPI не работает
    Код (C++):
    #include <SPI.h>
    #include <SdFat.h>
    #include <UTFT.h>
    #include <UTFT_SdRaw.h>
    SdFat sd;
    UTFT myGLCD(QD220A,11,13,8,7,6);   // SDA SCL CS RST RS  Remember to change the model parameter to suit your display module!
    UTFT_SdRaw myFiles(&myGLCD);

    extern uint8_t SmallFont[];

    void setup()
    {
      Serial.begin(9600);
      pinMode(14, OUTPUT);
      digitalWrite(14, LOW);
      while (!sd.begin(5)) {}
      Serial.println("SD Card initialised");
      delay(1000);
     
      myGLCD.InitLCD();
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);      // выбираем большой шрифт
      myGLCD.setColor(VGA_GREEN);
      myGLCD.print("SD Card initialised", CENTER, 100);
      Serial.println("tft print");

      // выводим изображение с SD-карты на дисплей
      //myFiles.load(0, 0, 180, 220, "water.raw");
    }

    void loop()
    {
       SPI.transfer(0b01110100);
    }
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    А где команда SPI.begin ? Или библиотека это сама сделает ?
     
  7. pian

    pian Нуб

    Прошу прощения ввел вас в заблуждение. SPI.transfer(0b01110100); работает даже без SPI.begin.
    А вот этот код нет. На осцилографе высокий уровень. Обмена данными не наблюдаю. Строчка Serial.println("tft print"); в loop выводится в serial port и говорит о том что программа не зависла. Если закоментировать while (!sd.begin(5)) {} то все работет, сразу видно обмен на осцилографе да и экран оживает.
    Код (C++):
    #include <SPI.h>
    #include <SdFat.h>
    #include <UTFT.h>
    #include <UTFT_SdRaw.h>
    SdFat sd;
    UTFT myGLCD(QD220A,11,13,8,7,6);   // SDA SCL CS RST RS  Remember to change the model parameter to suit your display module!
    UTFT_SdRaw myFiles(&myGLCD);

    extern uint8_t SmallFont[];

    void setup()
    {
      Serial.begin(9600);
      pinMode(14, OUTPUT);
      digitalWrite(14, LOW);
      while (!sd.begin(5)) {}
      Serial.println("SD Card initialised");
      delay(1000);
     
      myGLCD.InitLCD();
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);      // выбираем большой шрифт
      myGLCD.setColor(VGA_GREEN);
      myGLCD.print("SD Card initialised", CENTER, 100);
      Serial.println("tft print");
     
      // выводим изображение с SD-карты на дисплей
      //myFiles.load(0, 0, 180, 220, "water.raw");
    }

    void loop()
    {
      myGLCD.InitLCD();
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);      // выбираем большой шрифт
      myGLCD.setColor(VGA_GREEN);
      myGLCD.print("SD Card initialised", CENTER, 100);
      Serial.println("tft print");
    }
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. В сетапе инициализируйте дисплей раньше карты. Там же не важна очередность.
    2. sd.begin(5) . Есть что-то подобное "sd.stop(5)" ? Может включать и выключать обмен с SD по мере необходимости ? А в основном держать его выключенным.
    3. Все процессы идут во времени. Если не идет команда - для проверки надо вставлять delay() после нее, чтоб дать ей время исполниться. Типа -
    myGLCD.InitLCD();
    delay(100);
    Фиг его знает - приходится извращаться пока запустишь.
     
    Последнее редактирование: 1 май 2021