HT1621B не запускается

Здравствуйте. проблема с ht1621b
Подключил к мега2560 по трем проводам CS, WR, DATA
пишу такой код:

Спойлер
#define LCD_WR 12
#define LCD_DATA 8

#define  BIAS     0x52 //
#define  SYSDIS   0X00
#define  SYSEN    0X02  //
#define  LCDON    0X06  //
#define  RC256    0X30
#define  WDTDIS1  0X0A
#define  BUFFERSIZE 12

static void lcdData(uint8_t data, uint8_t cnt);
static void lcdCommand(uint8_t command);
static void lcdAddress(uint8_t addr, uint8_t data1);


void lcdCommand(uint8_t command) {  //100
  digitalWrite(LCD_CS,LOW);
  lcdData(0x80, 4);
  lcdData(command, 8);
  digitalWrite(LCD_CS,HIGH);
  delay(1);
}

void lcdData(uint8_t data, uint8_t cnt) {
  unsigned char i;
  for (i = 0; i < cnt; i++) {
    digitalWrite(LCD_WR,LOW);
    delayMicroseconds(10);
    if (data & 0x80) {
    digitalWrite(LCD_DATA,HIGH);
    }
    else
    {
    digitalWrite(LCD_DATA,LOW);
    }
    digitalWrite(LCD_WR,HIGH);
    delayMicroseconds(10);
    data <<= 1;
  }
}

void lcdAddress(uint8_t addr, uint8_t data1)
{
  addr <<= 2;
  digitalWrite(LCD_CS,LOW);
  lcdData(0xa0, 3);
  lcdData(addr, 6);
  lcdData(data1, 8);
  digitalWrite(LCD_CS,HIGH);
  delay(1);
}



void setup() {
    pinMode(LCD_CS,OUTPUT);
    pinMode(LCD_WR,OUTPUT);
    pinMode(LCD_DATA,OUTPUT);
    digitalWrite(LCD_CS,LOW);
    digitalWrite(LCD_WR,LOW);
    digitalWrite(LCD_DATA,LOW);

 
    lcdCommand(BIAS);
   // lcdCommand(RC256);
    lcdCommand(SYSDIS);
   // lcdCommand(WDTDIS1);
    lcdCommand(SYSEN);
    lcdCommand(LCDON);

}

void loop() {
  for(int i = 0; i < 100; i++){
   lcdAddress(i,0xff);
  } 
} ```

Ну и на выходе у меня микросхема ничего вообще не выдает. кидаю щуп ослика на COM либо SEG и тишина.
имхо как-то я не правильно инициализирую микросхему.
Вот первая настройка BIAS


получается, что у меня число 29, а должно быть 52. хотя последний бит игнорируется.
Чего-то у меня уже мозг кипит. прошу помощи.

Попробуйте сначала через библиотеку. Если заработает, тогда сравните ваш код и код библиотеки и исправьте свой код.

void HT1621::wrDATA(unsigned char data, unsigned char cnt) {
	unsigned char i;
	for (i = 0; i < cnt; i++) {
		digitalWrite(_wr_p, LOW);
		delayMicroseconds(4);
		if (data & 0x80) {
			digitalWrite(_data_p, HIGH);
		}
		else {
			digitalWrite(_data_p, LOW);
		}
		digitalWrite(_wr_p, HIGH);
		delayMicroseconds(4);
		data <<= 1;
	}
}

Я вижу что троки 60-62 не совпадают с графиком …

так он один в один совпадает. ну за исключением времени задержки.

Хмммм. точно. странно почему так. Буду разбираться

Разобрался почему график не соответствовал. просто между digitalWrite(LCD_DATA,LOW) и первой командой lcdCommand(BIAS) никакого промежутка нет. а посему этот наносекундый digitalWrite(LCD_DATA,LOW) анализатор просто не показывал.
Сделал вот так:

pinMode(LCD_CS,OUTPUT);
    pinMode(LCD_WR,OUTPUT);
    pinMode(LCD_DATA,OUTPUT);
    digitalWrite(LCD_CS,LOW);
    digitalWrite(LCD_WR,LOW);
    digitalWrite(LCD_DATA,LOW);

delay(5);
digitalWrite(LCD_CS,HIGH);
delay(1);
digitalWrite(LCD_CS,LOW);


    lcdCommand(BIAS);
    lcdCommand(RC256);
    lcdCommand(SYSDIS);
    lcdCommand(WDTDIS1);
    lcdCommand(SYSEN);
    lcdCommand(LCDON);

и получил такую картину. все нормально.

Но один фиг от HT1621b вообще никаких реакций нет. на всех пинах тупо ноль.

Попробуйте после 36 стр из #1 сделать небольшую задержку

сделал. 10 микросекунд. нифигашечки.
Смотрю в даташит по таймингам, вроде везде в пределах как указано.

Может у меня в loop что-то не правильно?
картинку вижу такую.
вроде верно.

А просто в HIGH перевести на старте в setup не спасет вас ??? Нормальное состояние линий по графику ВЫСОКОЕ !!!

Имел ввиду, на всякий случай, перестраховаться, минимальную задержку.(хотя-бы 3-4 us) Как-то раз было подобное. Но, видимо не в этом случае

так оно так и есть в начале.

частота WR 50 КГц. по даташиту максимум при 3 вольтах - 150 КГц

Я вижу НИЗКИЙ уровень при старте:
void setup() {
pinMode(LCD_CS,OUTPUT);
pinMode(LCD_WR,OUTPUT);
pinMode(LCD_DATA,OUTPUT);
digitalWrite(LCD_CS,LOW);
digitalWrite(LCD_WR,LOW);
digitalWrite(LCD_DATA,LOW);

1 лайк

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

Я на не русском не умею объясняться !!! Сигналы CS и WR с черточками над ними - говорит нам о том, что активный уровень НИЗКИЙ. То есть начальное состояние (не активное ВЫСОКИЙ). Если у вас будет два таких чипа и вы на оба одновременно подадите низкий CS - что будет ???

Будут оба принимать сигнал. я не понимаю что не так? сигнал отдаю в соответствии с даташит

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


разве у меня не так:?

Изменил на старте так:

void setup() {
    pinMode(LCD_CS,OUTPUT);
    pinMode(LCD_WR,OUTPUT);
    pinMode(LCD_DATA,OUTPUT);
    digitalWrite(LCD_CS,HIGH);
    digitalWrite(LCD_WR,HIGH);
    digitalWrite(LCD_DATA,HIGH);
delay(10);
    lcdCommand(BIAS);
    //lcdCommand(RC256);
    //lcdCommand(SYSDIS);
    //lcdCommand(WDTDIS1);
    lcdCommand(SYSEN);
    lcdCommand(LCDON);
delay(1);
}

в итоге получил вот такую картину отправки команд

Все равно нифига на выходах с микросхемы нет

может дело то не в бобине?
я отправляю 3 команду на микросхему BIAS, SYSEN и LCDON
а далее оправляю по FF на все адреса
вот так в даташит

Я отправляю 101, потом адрес 0 и по 4 бита 1111 на каждый из 128 адресов.

Ну и у меня нифига не происходит. осликом я на всех ножках вижу только 0.
Может микросхема бракованная? Чего-то я уж прямо теряюсь в догадках.

Вам же ещё в #2 дали по делу совет. Всё равно у вас код - надёрганные куски из библиотеки. Для проверки запустите какой-нибудь пример