Отваливается LCD при попытке инициализировать SD

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Приветствую, граждане.

Имеется проблема, которая по сути и не должна быть...

В общем, в попытках сделать борткомпьюьер для авто, я запоролся в самом начале, когда пытался инициализировать SD карту. 

В чем суть косяка. SD и LCD от китайского плеера ST7567 подключены к arduino nano, при условии, что SCK и MOSI у них один и тот же, различие лишь в CS 

Однако при вызове функции проверки наличия SD карты, отваливается экран. Перестает мыргать лампочка L и картинка не обновляется.

переменная sdwork специально создана чтобы не давать отображать пока идет работа с картой.

Сама функция проверки(из примера скетча SD)

 

для проверки выводил все по порту.

В итоге получается так, что оно и находит карту, но экран повисает, выводя последние изображения.

и сам топорный ужас на термосоплях и макетках за 50 рублей..

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Попытка перестроить структуру инициализации успеха не дала.

Сделал проверку SD после 10 сек после включения, но сработало через 30сек. И повисло после проверки.

negavoid
Offline
Зарегистрирован: 09.07.2016

Мы рады за вас :)

Могу лишь предположить, что одна из библиотек рассчитывает на монопольное использование шины SPI и этим портит всю малину другой. Например, cs становится всегда 4 и u8glib с экраном обламывается, отправляя на самом деле команды для sd (но думая, что шлёт команды экрану).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Приветствую, гражданин.

Эта тема мусолится на форуме всякий раз, когда наши ряды пополняет человек, принципиально (или беспринципно) не пользующийся поиском (вроде Вас), а было такое чуть больше, чем 100500 раз.

Работающие решения находились и не одно, тем миллион, просто вбейте "LCD SD не работают вместе" в окно поиска в правом верхнем углу экрана и изучайте.

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Полазил по "интернетам" и темам, по сути согласен, однако как обратно перекидывать SS на 10 пин после установки 4-го?

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

В идеале, я по началу лазил по поискам, но всеж, скорее, всвязи своей косорукости, ничего не нашел. Вот и пишу сюда...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я же Вам сказал, здесь на этом форуме эта проблема решалась и не раз. Ищите - это есть. Я за Вас искать точно не буду.

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Я не просил гуглить за меня... причем тут это. Нет желания помогать, не надо. В гугл я тоже потыкать кого угодно могу...

 

из поисков вычитал про

NeiroN пишет:

Просто нужно перед обращением к устройству дергать его  CS (установив на всех 1 на нужном 0).

однако на деле результат тот же. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Cathexis пишет:

однако на деле результат тот же. 

Не верю! (с) Станиславский

hint: Вы бы код привели. Нередко бывает, программист хочет написать одно, а пишет совсем другое.

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017
Прога побита по файлам, так что код вырезками. 
#include "U8glib.h"
#include <SPI.h>
#include <SD.h>

//--------------------------
#define SDcs 4
#define LCDcs 10
//--------------------------
U8GLIB_NHD_C12864 LCD(13, 11, 10, 9, 8);  // SPI Com: SCK = 13, MOSI = 11, CS = 10, RST = 8, A0 = 9

bool sdexist = false;
bool sdwork = false;

//предъобъявления
void CheckCard();

void setup() {
  Serial.begin(250000);
  pinMode(SDcs, OUTPUT);
  pinMode(LCDcs, OUTPUT);
  digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,HIGH);
  LCD_Setup();
  CheckCard();
}

void loop() {
  if(millis()%10000 == 0){sdwork = true; CheckCard();Serial.println("CheckCard");}
  if((timer%1000 == 0)&&(!sdwork)){draw(); Serial.println("draw");}
  
}

// в setup------------------
void LCD_Setup()
{
  digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,LOW);
  LCD.setContrast(0);
  LCD.setRot180();
  LCD.setFont(u8g_font_04b_03r);
  digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,HIGH);
}
//--------------------------
// отрисовка----------------
void draw(void) {
    digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,LOW);
  LCD.firstPage();
  do { 
      MainGUIHeader();
      TestGUI();
      
      } while( LCD.nextPage() );
    digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,HIGH);

}
//--------------------------

void CheckCard(){
    digitalWrite(SDcs,LOW);
  digitalWrite(LCDcs,HIGH);
  if (SD.begin(SDcs)) {
    sdexist = true;
    Serial.println("C+");
  } else {
    sdexist = false;
    Serial.println("C-");
  }
  sdwork = false;
    digitalWrite(SDcs,HIGH);
  digitalWrite(LCDcs,HIGH);
}

 

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Заметил, что при работе с LCD диод L мигает тускло, а при работе с SD крайне ярко. Может ли быть дело в резисторах или их отсутствии?

slider
Offline
Зарегистрирован: 17.06.2014

и писали бы сразу в тему про фабрикаты на ST7567 , 

Cathexis пишет:

Заметил, что при работе с LCD диод L мигает тускло, а при работе с SD крайне ярко. Может ли быть дело в резисторах или их отсутствии?

с этого и надо было начинать. попробуйте отпаять пока светодиод  (он может засаживать слабые сигналы) или проще и безопасней отпаять его резистор.

 ни схемы вашей нет, о чем тогда говорить, какие советы тогда м.б. ?

без диспа , карта нормально робит? что там , преобразователи уровней или делители или резисторы?

Согласование уровней - одно из главных. правильность работы либ - тоже. при манипуляции с SCами.  

// мож глупость скажу для конкретного случая, либы инициируют настройки в начале программы. если настройки разные то, естественно   чей инит был позже, той либы и будет корректно работать.

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

slider пишет:

попробуйте отпаять пока светодиод  (он может засаживать слабые сигналы) или проще и безопасней отпаять его резистор.

с дуины? Это по моему не должно отпаиваться.....

slider пишет:

без диспа , карта нормально робит? что там , преобразователи уровней или делители или резисторы?

По отдельности все шикарно :\

slider пишет:

Согласование уровней - одно из главных. правильность работы либ - тоже. при манипуляции с SCами.  

Я в этом нуб...

slider пишет:

// мож глупость скажу для конкретного случая, либы инициируют настройки в начале программы. если настройки разные то, естественно   чей инит был позже, той либы и будет корректно работать. 

Я с ней даже склонен согласиться, ибо пока не объявишь SD, LCD пашет.

Схема в человеческом виде

Схема как она есть.

Знаю, порно из проводов, но оно все работает. Проверено не раз.

 

и сверху

slider
Offline
Зарегистрирован: 17.06.2014

.

slider
Offline
Зарегистрирован: 17.06.2014

это где вы видели , чтобы карту памяти и такой экран подключали напрямую к 5в ардуине? в инете много нубов выдумывающих дезу, делайте как указано в большинстве схем, или изучайте вопрос.

еще раз скажу, согласовывайте уровни, (если сам микроконтроллер атмега328 питается от 5в).  

Cathexis
Cathexis аватар
Offline
Зарегистрирован: 01.02.2017

Там же не напрямую, а через ams1117 5 - 3.3.
Приду, гугляну про уровни, ибо не имею понятия что это значит..