sasken
11.Февраль.2024 17:06:52
1
Здравствуйте. проблема с 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. хотя последний бит игнорируется.
Чего-то у меня уже мозг кипит. прошу помощи.
Попробуйте сначала через библиотеку. Если заработает, тогда сравните ваш код и код библиотеки и исправьте свой код.
ua6em
11.Февраль.2024 17:21:21
3
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 не совпадают с графиком …
sasken
11.Февраль.2024 18:15:27
5
так он один в один совпадает. ну за исключением времени задержки.
Хмммм. точно. странно почему так. Буду разбираться
sasken
12.Февраль.2024 07:41:41
6
Разобрался почему график не соответствовал. просто между 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 сделать небольшую задержку
sasken
12.Февраль.2024 07:57:00
8
сделал. 10 микросекунд. нифигашечки.
Смотрю в даташит по таймингам, вроде везде в пределах как указано.
Может у меня в loop что-то не правильно?
картинку вижу такую.
вроде верно.
А просто в HIGH перевести на старте в setup не спасет вас ??? Нормальное состояние линий по графику ВЫСОКОЕ !!!
Имел ввиду, на всякий случай, перестраховаться, минимальную задержку.(хотя-бы 3-4 us) Как-то раз было подобное. Но, видимо не в этом случае
sasken
12.Февраль.2024 08:34:54
11
так оно так и есть в начале.
Дим-мычъ:
Имел ввиду, на всякий случай, перестраховаться, минимальную задержку.(хотя-бы 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 лайк
sasken
12.Февраль.2024 09:21:19
13
так он и есть низкий уровень при старте. просто старт сразу начинается.
вот я добавил задержку между назначением этим пинам LOW и начале отправки команд.
Я на не русском не умею объясняться !!! Сигналы CS и WR с черточками над ними - говорит нам о том, что активный уровень НИЗКИЙ. То есть начальное состояние (не активное ВЫСОКИЙ). Если у вас будет два таких чипа и вы на оба одновременно подадите низкий CS - что будет ???
sasken
12.Февраль.2024 09:37:51
15
Будут оба принимать сигнал. я не понимаю что не так? сигнал отдаю в соответствии с даташит
Парни, кто понимает о чём я, есть у вас не матерные слова, что бы донести суть ???
sasken
12.Февраль.2024 09:51:50
18
Изменил на старте так:
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);
}
в итоге получил вот такую картину отправки команд
Все равно нифига на выходах с микросхемы нет
sasken
12.Февраль.2024 09:58:11
19
может дело то не в бобине?
я отправляю 3 команду на микросхему BIAS, SYSEN и LCDON
а далее оправляю по FF на все адреса
вот так в даташит
Я отправляю 101, потом адрес 0 и по 4 бита 1111 на каждый из 128 адресов.
Ну и у меня нифига не происходит. осликом я на всех ножках вижу только 0.
Может микросхема бракованная? Чего-то я уж прямо теряюсь в догадках.
Вам же ещё в #2 дали по делу совет. Всё равно у вас код - надёрганные куски из библиотеки. Для проверки запустите какой-нибудь пример