8(495) 662-59-14

Главная / Форум
  • РУС / ENG
(495) 662-59-14 Многоканальный телефон Не дозвонились?
Форумы >>ЖК индикаторы >>RE: Проблема с MT-12232A: вызываются команда вместе с записью данных
RE: Проблема с MT-12232A: вызываются команда вместе с записью данных

yotia
Пользователи

Сообщений: 3
Регистрация: 11.09.2024

Всем привет

У меня вохникла проблема с записью данных на MT-12232A: вместе с байтом данных, который корректно записываeтся в стольбец, выполняется команда, которая соотвествует этому байту. Например:

WriteCodeL(0xB8) // Выбор страницы как в оф примере
WriteCodeL(0x13) // Начало страницы

WriteDataL(0x18) // Запишет 0x18 в 0x13 и перепрыгнет на столбец 0x18
WriteDataL(0x18) // Запишет 0x18 в 0x18

или

WriteCodeL(0xB8) // Выбор страницы как в оф примере
WriteCodeL(0x13) // Начало страницы

WriteDataL(0xAE) // Запишет 0xAE в 0x13 и выключит кристалл

сам пин A0 работает - данные записываются(для 0xFF все работает корректно)

Встречал ли кто такую проблему? Есть ли решение?

Заранее спасибо

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1484
Регистрация: 25.11.2009

Очевидно нужно показать код самой функции WriteDataL() и вызываемых из неё, вплоть до операций над конкретными сигналами индикатору.
Такое нередко наблюдается если перепутали полярность сигнала E, он в этом индикаторе инверсный относительно других подобных индикаторов.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

yotia
Пользователи

Сообщений: 3
Регистрация: 11.09.2024

У меня уже возникала ошибка с неправильным E и к моменту вопроса я ее исправил. Функция Write data реализованна как в примере, но вот код:


WriteData(0, 0xFF)

||
\/

func WriteData(cs rpio.State, b byte) error {
return d.writeByte(b, 1, cs)
}

||
\/

func writeByte(b byte, cd, cs rpio.State) error {
if err := d.waitReady(cs); err != nil {
return fmt.Errorf("wait ready: %w", err)
}

d.pinCS.Write(cs) // Select cristals

d.dev.WriteByte(b, cd)
return nil
}

||
\/

func (d *device) WriteByte(b byte, cd rpio.State) {
d.busOutput()
d.PinRW.Low() // We write
d.PinA0.Write(cd)

// Write bus
d.PinDB0.Write(rpio.State((b >> 0) & 1))
d.PinDB1.Write(rpio.State((b >> 1) & 1))
d.PinDB2.Write(rpio.State((b >> 2) & 1))
d.PinDB3.Write(rpio.State((b >> 3) & 1))
d.PinDB4.Write(rpio.State((b >> 4) & 1))
d.PinDB5.Write(rpio.State((b >> 5) & 1))
d.PinDB6.Write(rpio.State((b >> 6) & 1))
d.PinDB7.Write(rpio.State((b >> 7) & 1))

time.Sleep(adressWriteTimeout)

d.PinE.Low() // Strobe start
time.Sleep(dataStrobeTimeout)
d.PinE.High() // Strobe end

time.Sleep(gapTimeout - dataStrobeTimeout - adressWriteTimeout)
}

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1484
Регистрация: 25.11.2009

Я очевидных проблем не вижу.
Кроме неясной (по содержанию, не по назначению) функции d.waitReady() - вдруг она выдаёт лишний строб, попробуйте её убрать вместе с её if-ом, лучше при необходимости увеличьте задержку в конце d.WriteByte() (хотя похоже она там и так правильная, но много не мало).
Вообще для индикаторов 12232 невыгодно опрашивать готовность, проще сделать задержку до или после выдачи/чтения любого байта (причём часть неё и так образуется за счёт побитовой выдачи байта). А для не слишком быстрых контроллеров задержкой может являться даже сам вызов процедур, но это разумеется ненадежно в плане совместимости разных контроллеров и компиляторов.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

yotia
Пользователи

Сообщений: 3
Регистрация: 11.09.2024

Извините, что с задержкой. Да, действительно, если заменить WaitReady на обычную задержку, то ошибка уходит. В WaitReady я не нашел лишнего строба, ну может если только экранчик все равно выполняет то, что лежит на шине, не смотря на то, что поставлен бит чтения статуса. Но это уже не важно, спасибо за помощь.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1484
Регистрация: 25.11.2009

Экранчик не может выполнять того чего ему не сказано (управляющими сигналами).
Возможно в WaitReady сигнал RW выставляется или после перепада E=1->0, или слишком близко к нему - и индикатор считает что будет таки команда, а не чтение статуса, ну и выполняет её. А потом, видя правильное RW=1, ещё и статус выдаёт.
Кроме того, для чтения статуса на шине не должно ничего лежать,, она должна быть или в третьем (z) состоянии (настроена на вход в контроллере) или подтянута куда-то достаточно слабо - чтобы индикатор мог выдать на шину своё состояние.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение
Сейчас на форуме (гостей: 4, пользователей: 1 , из них : 0 )