Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AtMEGA16+TM12864ABBW6
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Nekromant
Доброго времени суток.
Сразу к проблеме:
Попытался запустить указанную в теме связкую, за основу класса взят пример с форума МЭЛТ, схема подключения так же взята оттуда. Проект собирается, но при попытке запустить на меге, на дисплее никакой реакции. Никто не сможет подсказать как проверить работоспособность дисплея или ткнуть на ошибку в программе.
PS проверить по рекомендации МЭЛТа через LPT не могу, т.к. этого самого порта на ноуте нету.
Заранее спасибо.
проект
Нажмите для просмотра прикрепленного файла
исходная библиотека
Нажмите для просмотра прикрепленного файла
haker_fox
Цитата(Nekromant @ Feb 3 2010, 20:13) *
Заранее спасибо.

Ошибку в явном виде найти не могу( Но могу поеркомендовать создать НОВЫЙ проект, где в одном файле будет инициализация дисплея и вывод инфы на него. Без прерываний и других сервисов. Вполне возможно, что в текущем проекте у Вас накладываются на работу с дисплеем другие процессы, например вызов прерываний и т.п.
Успехов!
Nekromant
С прерываниями на данный момент вообще не работаю. и все ссылки на лишние функции вырезаны. плюс в маке-файле прописана только директория лсд и маин.
Но в любом случае последую вашему совету и попробую и инициализацию и вывод сделать просто в майне. может и правда где проглядел и что то не так собирается.
haker_fox
Цитата(Nekromant @ Feb 9 2010, 12:02) *
Но в любом случае последую вашему совету и попробую и инициализацию и вывод сделать просто в майне. может и правда где проглядел и что то не так собирается.

Ну в общем где-то так. Т.е. оставить только работу с LCD. Внимательно проверить инициализацию, да и вывод на дисплей. Не стесняться читать даташит. Внимательно проверить схему. Прозвонить мультиметром на наличие обрывов и кз. Если не поможет и нет ошибок в программе и схеме, то LCD на свалку. Кстати, а пины, которые управляют дисплеем точно работают? Если PORTC учавствует в этом, то нужно обязательно выключить JTAG, иначе ничего не получиться.
Сергей Борщ
Цитата(Nekromant @ Feb 3 2010, 14:13) *
PS проверить по рекомендации МЭЛТа через LPT не могу, т.к. этого самого порта на ноуте нету.
Проверьте наличие отрицательного напряжения на выводе 18. И его попадание на вывод 3.
Nekromant
Цитата(Сергей Борщ @ Feb 10 2010, 09:36) *
Проверьте наличие отрицательного напряжения на выводе 18. И его попадание на вывод 3.

нету этого самого отрицательного напряжения. если быть точным -0,128В




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



Нажмите для просмотра прикрепленного файла
Son Of Stone
1) MT12864A нормально эмулируется в Proteus - можно попробовать и сразу узнаете в чем проблема - в железе или в коде.
2) У Атмеги выключить фьюз JTAGEN (сам попадался и именно с таким индикатором)
Nekromant
Цитата(Son Of Stone @ Feb 26 2010, 09:24) *
1) MT12864A нормально эмулируется в Proteus - можно попробовать и сразу узнаете в чем проблема - в железе или в коде.
2) У Атмеги выключить фьюз JTAGEN (сам попадался и именно с таким индикатором)

с Протеусом я очень сильно на вы и недолюбливаю его а фьюз у меги выключен уже давно
Сергей Борщ
Цитата(Nekromant @ Feb 26 2010, 03:05) *
нету этого самого отрицательного напряжения. если быть точным -0,128В
Значит либо ошибка в инициализации, либо в подключении, либо убитый дисплей. Покажите вашу схему подключения.

По вашему коду: ужас. С таким кодом не будет работать даже правильно подключеный исправный дисплей wink.gif.
1) Не вижу настройки выводов группы LCD_CTRL на вывод.
2)
Код
LCD_CTRL_PORT|= (0 << LCD_E);//    LCD_E=0;
комментарий не соответствует коду. Код не имеет смысла. Чтобы код делал то, что написано в комментарии, он должен быть таким:
Код
LCD_CTRL_PORT &= ~(1 << LCD_E);
Таких мест в вашем коде очень много, не буду перечислять все.
3)
Код
//При необходимости настроить здесь шину данных на вывод
  LCD_CTRL_PORT|= ((0 << LCD_RW)&&(cd << LCD_DI)&&(l << LCD_CS1)&&(r << LCD_CS2));
Этот код тоже делает не то, что вы ожидаете. Этот код делает то же самое, что и предыдущий: LCD_CTRL_PORT |= 0, т.е. ничего. Вы путаете логические и двоичные операции, функции "ИЛИ" и "И". Надо было написать:
Код
LCD_CTRL_PORT &= ~(1 << LCD_RW);  // LCD_RW = 0
LCD_CTRL_PORT |= (cd << LCD_DI) | (l << LCD_CS1) | (r << LCD_CS2);
или, если на этом порту больше ничего не подключено, так:
Код
  LCD_CTRL_PORT = (0 << LCD_RW) | (cd << LCD_DI) | (l << LCD_CS1) | (r << LCD_CS2);
А потом посмотрите в листинг и сравните с таким кодом:
Код
LCD_CTRL_PORT &= ~((1 << LCD_RW) | (1 << LCD_DI) | (1 << LCD_CS1) | (1 << LCD_CS2));
if(cd)
    LCD_CTRL_PORT |= (1 << LCD_DI);
if(l)
    LCD_CTRL_PORT |= (1 << LCD_CS1);
if(r)
    LCD_CTRL_PORT |= (1 << LCD_CS2);
Потом вы можете заметить, что функция WriteByte() всегда вызывается или с r=1, l=0 или с r=0, l=1. Так зачем передавать в нее два взаимно однозначных параметра? Достаточно передвать лишь один.
4)
Код
    _delay_ms(140);     //Это время предустановки адреса (tAW)
Вы не попутали миллисекунды и наносекунды?
5) В закомментированном коде ReadByte() есть настройка шины данных индикатора на вывод данных, но нет настройки порта меги на ввод. Аналогично и для WriteByte() - есть настройка индикатора на ввод, но нет настроки порта меги на вывод.

Есть еще огромный простор для оптимизации.
Nekromant
Цитата(Сергей Борщ @ Mar 9 2010, 01:12) *
...

да... видимо перерыв в писании программ больше полугода не идет на пользу совсем. действительно все намешал и ведь даже не заметил . сейчас попробую учесть все замечания
1-включил
2,3 счас подправлю
4 с задержками еще возиться однако придется и не раз так как все таки я сомневаюсь что МТ и ТМ дисплеи прямо один в один работают хоть вроде и копии
5 код раскомментирован и исправлен с вашими замечаниями
6-после изменений появилось отрицательное напряжение -5V что уже радует.
буду копать дальше и все результаты обязательно выложу здесь
p.s. оптимизировать буду как только запустится)))).
Nekromant
вроде везде подправил следуя замечаниям.
Выкладываю уже третью версию проекта.
подключение дисплея писано в Main.h( проблемы с интернетом на работе потому крутимся как можем).



Нажмите для просмотра прикрепленного файла
Сергей Борщ
Цитата(Nekromant @ Mar 9 2010, 14:54) *
вроде везде подправил следуя замечаниям.
Ага. "Телепаты, налетайте!"
Какие симптомы, что лечим на этот раз?
Nekromant
Цитата(Сергей Борщ @ Mar 9 2010, 16:11) *
Ага. "Телепаты, налетайте!"
Какие симптомы, что лечим на этот раз?

не ну не телепаты) запуститься не запустился, хотя вроде все подправил.
на всякий случай в майне написал подключение. лично меня смущает 3 и 18 ноги нормально ли их накоротко связывать или же хоть какое то сопротивление надо?
и второе
я вообще правильно его включил а то не удивлюсь что еще чего-нибудь прочитал А а поставил Б.
и третье
Функция _delay_us() может работать с дробными числами как я в проекте поставил?
если нет то как наносекунды сделать?
насколько я знаю есть ms и us а таймер включать на дисплей мне кажется кощунством
Сергей Борщ
Цитата(Nekromant @ Mar 9 2010, 15:55) *
на всякий случай в майне написал подключение. лично меня смущает 3 и 18 ноги нормально ли их накоротко связывать или же хоть какое то сопротивление надо?
Надо. Им настраивается контрастность.
Цитата(Nekromant @ Mar 9 2010, 15:55) *
и второе
я вообще правильно его включил а то не удивлюсь что еще чего-нибудь прочитал А а поставил Б.
Вечером гляну, если никто не ответит.
Цитата(Nekromant @ Mar 9 2010, 15:55) *
и третье
Функция _delay_us() может работать с дробными числами как я в проекте поставил?
может.
Nekromant
так и еще, почему у меня при включении дисплея через раз то +5 то - 5 вольт???
Сейчас уже отвязался от контроллера полностью просто на ноги 1 и 2 дисплея подал 5 вольт и получил на 18 ноге -7 возможных по даташиту пляшушие значения от -0,18 до 2,85.
при этом сопротивление между
1) +5 и 3 или 18 ногой =28,5МОм
2) GND и 3 или 18 ногой =28,5 МОм
сопротивления между ногами 3 и 18 пробовал менять от 100 Ом до 4,7кОм
Сергей Борщ
Цитата(Nekromant @ Mar 9 2010, 17:04) *
так и еще, почему у меня при включении дисплея через раз то +5 то - 5 вольт???
Сейчас уже отвязался от контроллера полностью просто на ноги 1 и 2 дисплея подал 5 вольт и получил на 18 ноге -7 возможных по даташиту пляшушие значения от -0,18 до 2,85.
Разбирайтесь с подключением, питанием. Преобразователь напряжения никак не завязан на контроллер, должен работать всегда и выдавать -7...-10в.

Код
    _delay_us((1000-140-450)/1000);    //Минимально допустимый интервал между сигналами E=1
Это компилится в _delay_us(0). Хотите получить деление с плавающей точкой - приведите к формату с плавающей точкой хотя бы один из операндов: (1000-140-450)/1000.0
Код
void WaitReady(bool l, bool r) {//Ждать готовности индикатора, опрашивая байт статуса
//При необходимости настроить здесь шину данных на ввод
LCD_CTRL_DDR=0x00;
LCD_DATA_DDR=0x00;
А ноги управления зачем на ввод настроили? И где переключение на ввод в функции чтения?

Подключение похоже на правду. На AVcc питание не забыли подать? От него питается порт A.
Nekromant
Цитата(Сергей Борщ @ Mar 10 2010, 13:32) *
Разбирайтесь с подключением, питанием. Преобразователь напряжения никак не завязан на контроллер, должен работать всегда и выдавать -7...-10в.

Код
    _delay_us((1000-140-450)/1000);    //Минимально допустимый интервал между сигналами E=1
Это компилится в _delay_us(0). Хотите получить деление с плавающей точкой - приведите к формату с плавающей точкой хотя бы один из операндов: (1000-140-450)/1000.0
Код
void WaitReady(bool l, bool r) {//Ждать готовности индикатора, опрашивая байт статуса
//При необходимости настроить здесь шину данных на ввод
LCD_CTRL_DDR=0x00;
LCD_DATA_DDR=0x00;
А ноги управления зачем на ввод настроили? И где переключение на ввод в функции чтения?

Подключение похоже на правду. На AVcc питание не забыли подать? От него питается порт A.

1) так и оставил только два провода питания на 1 и 2 ноги на дисплее и потыкался тестером везде где видел дорожки и намеки на точки хоть какие то. нигде ниже 0V не обнаружилось(((
дисплей не имеет никакой настройки по умолчанию? ну скажем затянуть3 3 ногу на землю или вообще не подключать? (я по аналогии с нашими MT16s2 там вроде так помогало).
2) настроил на вход все чтоб не забыть)))) счас уже исправил
3) контроллер на STK500 стоит так что питание есть, плюс к этому когда на порт А диоды цепляешь то они моргают, то есть порт работает.
4) плавающую точку добавил.
Сергей Борщ
Цитата(Nekromant @ Mar 10 2010, 16:18) *
1) так и оставил только два провода питания на 1 и 2 ноги на дисплее и потыкался тестером везде где видел дорожки и намеки на точки хоть какие то. нигде ниже 0V не обнаружилось(((
Значит ищите, что могли спалить/отломать в преобразователе, или ставьте внешний источник -7в, или берите новый индикатор.
Цитата(Nekromant @ Mar 10 2010, 16:18) *
дисплей не имеет никакой настройки по умолчанию? ну скажем затянуть3 3 ногу на землю или вообще не подключать? (я по аналогии с нашими MT16s2 там вроде так помогало).
Не знаю, я с ним не работал. В даташите упоминаний не нашел. Перечитайте - может я чего-то не заметил.
Nekromant
Цитата(Сергей Борщ @ Mar 10 2010, 18:02) *
Значит ищите, что могли спалить/отломать в преобразователе, или ставьте внешний источник -7в, или берите новый индикатор.Не знаю, я с ним не работал. В даташите упоминаний не нашел. Перечитайте - может я чего-то не заметил.

я тоже не нашел. попробую завтра у человека питание кинуть на другой дисплей и проверю сигналы потом отпишусь сюда.
Nekromant
Доброго времени суток.
1)Итак как я и обещал я подключился к такому же дисплею как указано у меня в топике:
дисплей по маркировке совпадает один в один
разница в дате покупки примерно год
и на этот раз подопытный кролик никуда даже не припаивался.
2)подавали только напряжение +5v и землю. остальное все висело в воздухе
3) результат удивил:
на третьей ное дисплея появилось +5V (как и на первом дисплее).
на 18 же ноге не появилось ничего.
4) перечитал еще раз даташит - не нашел ничего про то почему может не быть этого отрицательного напряжения.
Сергей Борщ
Цитата(Nekromant @ Mar 12 2010, 15:50) *
4) перечитал еще раз даташит - не нашел ничего про то почему может не быть этого отрицательного напряжения.
Предположим, что источник включается командой display on (0x3F).
Nekromant
Цитата(Сергей Борщ @ Mar 13 2010, 15:18) *
Предположим, что источник включается командой display on (0x3F).

Можно предположить и так. но при подаче этой команды -7 вольт так же нигде не появилось (



ps однако надо начинать читать даташит по другой диагонали
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.