Доброго всем времени суток. Суть проблемы: нужно выводить на экран картинку с 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() { }
Повесить карточку или дисплей на софтварный SPI я не могу так как все ноги уже заняты. Всю голову сломал уже. Если не получиться исправить баг то придется переходить на 2560. Чего бы делать не хотелось.
У меня было - Обмен с датчиком влажности приводил к мусору на экране. Тут на форуме писАл об этом. Поэтому после чтения датчика в память процессора - приходится чистить память дисплея, а потом из процессора грузить в дисплей. Возможно чтение карты приводит к сбою настроек экрана. Пробуйте разделить их время работы. Например - прочитали из карты в буфер, остановили работу с картой. реинициализировали дисплей, загрузили из буфера. Потом - запустили карту, читаем и тд. ПС. В командах есть тонкости, которые не всем известны - например : play(freq, dur); // Функции play() и delay() работают одновременно. delay(dur); // pinMode(pin, OUTPUT); Пин переключит режим не через паузу после тона, а одновременно с окончанием тона.
Вывод на экран с флешки картинки делает библиотека UTFT_SdRaw.h. Как внутри нее это реализовано я не знаю. Взял скетч из примера. Только пины поменял у экрана. А написать без библиотеки у меня тяму не хватит. http://wiki.amperka.ru/продукты:tft-lcd-480x320 Вот тут статья есть. Как бы у людей работает. Вот только у меня нет. Может я не людь
Прикол еще вот в чем. После инициализации карты в цикле 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); }
Прошу прощения ввел вас в заблуждение. 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"); }
1. В сетапе инициализируйте дисплей раньше карты. Там же не важна очередность. 2. sd.begin(5) . Есть что-то подобное "sd.stop(5)" ? Может включать и выключать обмен с SD по мере необходимости ? А в основном держать его выключенным. 3. Все процессы идут во времени. Если не идет команда - для проверки надо вставлять delay() после нее, чтоб дать ей время исполниться. Типа - myGLCD.InitLCD(); delay(100); Фиг его знает - приходится извращаться пока запустишь.