Подскажите новичку как соединить жк и atmega.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Не, я понимаю то что b меняется, я лишь говорю, что если я ей и присваиваю значение-программа не идет(дело не в этой переменной, которая меняясь позволяет рисовать картинку, а в функциях, которые с ней работают)
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Если еще не добились успеха, накидайте схемку подключения, я перелопачу МЭЛТовский исходник и набросаю Вам рабочий код. А там будем с вопросами разбираться, сейчас Вам нужен результат. :)
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
adrenocrome
Потрогал лапой паяльник
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow
Контактная информация:

Re: Подскажите новичку как соединить жк и atmega.

Сообщение adrenocrome »

Ок, я тоже вставлю свои пять копеек, как говориться.
Вот эту ф-ию я бы объявил после объявления WriteByte. То есть сначала объявляем WriteByte, потом WriteCode, в теле которой ссылаемся на WriteByte. Это понятно почему?
И опять эта запись в одну строку. Места что ли жалко? =)

Код: Выделить всё

void WriteCode(char b) { 
  WriteByte(b,0);
}


Разберём WriteByte/ Я там комментарии поправил чутка. Понятно, что задержки конские конечно. Но чтоб увидеть, что ЖКИ работает - пойдёт.

Код: Выделить всё

//Процедура выдачи байта в индикатор
void WriteByte(char b, char cd) {
  WaitReady(); //Ждать готовности индикатора
  [b]//При необходимости настроить здесь шину данных на вывод[/b] - это важное замечание! Порт А контроллера должен быть настроен на вывод!!! Иначе ничего работать не будет.
  PORTB.1=0; //это по-видимому флаг записи в ЖКИ
  PORTB.3=cd; //CD - данные или команда. Типа 0 - значит толкаем в ЖКИ данные, 1 - команду. Это к примеру, даташит не смотрел как там.
  PORTA=b; //Выдать байт на шину данных индикатора
  delay_ms(1); //
  PORTB.2=1;  //Скажем ЖКИ что ему надо проглотить то, что мы ему выдаём на шине данных
  delay_ms(1); //Подождём пока ЖКИ переварит полученое
  PORTB.2=0;  //Скажем ЖКИ что мы закончили запись
  delay_ms(1); //Подождём пока он это поймёт
}
День прошёл, а ты всё жив
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Спасибо!!! Если можете, покажите как одну точку зажечь-дальше сам должен понять))))
Вот как я его подключил к atmega16:
PORTA(0-7) содержит шину данных индикатора DB(0-7), подключенную соответственно PORTA.0 соединен с DB0, PORTA.1 с DB1.... и т.д...
PORTB.0=RES;
PORTB.1=RD/WR;
PORTB.2=E;
PORTB.3=A0;
Вот так всё подключено... Петухов из МЕЛТА(консультант или тому подобное) сказал, что всё правильно подключил.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Alerr, информацию принял. Сейчас возвращаюсь из командировки (сижу с ноутом на вокзале в Николаеве), завтра утром буду в Севастополе и займусь делом. В общем, к вечеру ждите. :)
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Большое спасибо!!! Сам, я, тоже пока "в командировке", а пишу и читаю с телефона(
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

В общем, заняться мне было нечем, посему вечера решил не ждать. =)
В прикрепленном архиве - проект CVAVR с прошивкой и всеми бебехами.
Хотел документик разъясняющий написать в pdf-е, да решил, что это будет долго (да и не сегодня), и писать не стал.
В общем, пробуйте, экспериментируйте, вопросы задавайте.
ЗЫ. Из программы я исключил функции чтения с индикатора и вывода точки - оставил только то, что нужно для выведения на индикатор. С остальным, думаю, сможете разобраться по аналогии.
И да, еще - в свойствах проекта я установил тактовую частоту 4 МГц. Измените, если что.
Вложения
ATMega16_MT6116.rar
(29.89 КБ) 164 скачивания
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Спасибо, спасибо))) Работает! Пока разбираюсь...
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Чтож, видать мои познания в С почти на нуле(.
Можете разьяснить, что это (&= ~) делает к примеру вот тут PORTB &= ~_BV(E);
Когда поднялся к #define _BV(x) (1<<(x)) -не совсем понятно(для чего вы перемещаете x);
Не знаю для чего подключена вот эта библиотека: #include <stdio.h>???
Что значит эта строка: PORTB |= _BV(RES); //Снять сигнал RES -я понимаю, что снятие сигнала(а как это вот |= _BV(RES); функционирует???? :) )
Пока этого хватает для разбора. Принцип вывода, вроде,:

{ 0x00,0x00,0x00,0x00,0x00,0xC0,020,0xF8,0xF8,0xE0, //Верхнее поле(всё)
0x80,0x00,0x00,0x08,0x08,0xF8,0xF8,0xF8,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0xF8,0xF8,0x88,
0x88,0xE8,0x18,0x38,0x00,0x08,0x08,0xF8,0xF8,0xF8,
0x88,0x88,0xF8,0xF8,0x70,0x00,0x00,0x08,0x08,0xF8,
0xF8,0xF8,0x88,0x88,0xF8,0xF8,0x70,0x00,0x00,0x00,
0x00
},
{ 0x00,0x00,0x08,0x08,0x0E,0x09,0x01,0x09,0x0F,0x0F, //Нижнее поле(всё)
0x0F,0x0C,0x08,0x08,0x08,0x0F,0x0F,0x0F,0x08,0x08,
0x08,0x0C,0x0E,0x00,0x00,0x08,0x0F,0x0F,0x0F,0x08,
0x08,0x0B,0x0C,0x0E,0x00,0x08,0x08,0x0F,0x0F,0x0F,
0x08,0x09,0x07,0x0F,0x0E,0x08,0x06,0x08,0x08,0x0F,
0x0F,0x0F,0x08,0x09,0x07,0x0F,0x0E,0x08,0x06,0x00,
0x00
}

я понял как выводят)))
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Самое загадочное-как вы написали мой ник??? Вы его на бумажке чтоль сперва выписали???
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Alerr, не за что. По вопросам.
1. _BV(x) - макрос, являющийся встроенным для среды WinAVR. Просто мне его очень удобно использовать, так как с первых дней написания программ на С я им пользуюсь. Этот макрос создает число с установленным битом x (это как раз та самая надпись (1<<x), о которой Вы спрашивали). Рекомендую, но не настаиваю. :)
2. За включение в проект библиотеки stdio.h прошу прощения - она здесь не нужна.))) Просто я ее не заметил и не удалил - она перекочевала сюда путем комбинаций Ctrl+C - Ctrl+V из другого, старого моего проекта.
3. Теперь самое интересное. Битовые операции. Разберем строку

Код: Выделить всё

PORTB &= ~_BV(E);

Как я писал выше, макрос _BV(x) создает число с установленным битом x. Вообще, если бы я не определил E строкой #define E 2, то вместо E в скобках мне пришлось бы написать 2 - чтобы компилятор определил, какой бит в числе нужно установить. За сигнал E у нас отвечает вывод PB2, и для удобства я его так и определил - "E". С помощью макроса я создаю число 0b00000100 - число с установленным вторым битом. Это число нужно проинвертировать (зачем, будет ясно дальше) - инвертирование означает значок ~. Получаем 0b11111011. И с помощью накладывания маски &= (где в маске стоят единицы, соответствующие биты исходного числа не меняются, а где ноли - в исходном числе тоже будут ноли) я получаю состояние PORTB такое, что все биты, кроме второго, остаются неизменными. А второй обнуляется, сбрасывается. Это очень важно - ведь если я затрону другие управляющие сигналы, то работать у меня ничего не будет. Допустим, состояние PORTB было таким: 0b11111111. Тогда 0b11111111 &= ~(0b00000100); 0b11111111 &= 0b11111011; PORTB = 0b11111011. Думаю, с этим ясно.
4. Дальше.

Код: Выделить всё

PORTB |= _BV(RES);

Здесь тоже имеет место создание числа с установленным битом RES (он у нас нулевой) с помощью макроса _BV(x), и дальнейшее накладывание маски |=. Здесь по-другому. Там, где в маске стоят нули, биты исходного числа не изменятся, а там, где в маске единицы, биты исходного числа также примут значение 1. По сути, на Порт B мы накладываем маску 0b00000001, то есть устанавливаем нулевой бит (который отвечает за сигнал RES) в единицу, не затрагивая остальные биты (сигналы). А именно это нам и нужно.
5. По поводу вывода на дисплей. Да, действительно, поле дисплея МТ-6116 состоит из двух страниц, то есть нам нужен глобальный многомерный массив. Первый элемент массива отвечает за нулевую страницу, а второй элемент - за первую страницу. В то же время, каждый из элементов состоит из 61 байта, каждый байт - это один столбец страницы. Младший бит в байте означает верхний пиксель страницы, старший бит - нижний пиксель.
На бумажке я ничего не писал, естественно. :)
Существуют специальные программы - я пользуюсь FastLCD и Image2LCD. Первая позволяет задавать разрешение экрана и редактировать изображение или надпись попиксельно. Вторая программа преобразовывает любое изображение в массив чисел. Так что забудьте о пахоте вручную, пользуйтесь софтом - сэкономите кучу времени. =)
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Вроде понял Ваши побитовые операции-Вы просто работали полностью со всем портом В, а я писал: PORTB.n=x; В этом вроде и вся разница.... Для чего Вы написали: #define E 2, почему 2???
Можете обьяснить, почему моя инициализация не работает???? Я пытался запустить дисплей с ней, оказывается, что она не верна!?
void glcd_init() // верно
{
// LCD module initialization
PORTB.2=0;
PORTB.0=0; // 1 res
delay_us(15);

PORTB.0=1; // 2 res
delay_ms(2);
PORTB.0=0;

PORTB.1=0; // 3 reset
PORTB.3=0;
PORTA=0b11100010;

PORTB.1=0; // 4 (end)
PORTB.3=0;
PORTA=0b11001110;


PORTB.1=0; // 5 static drive on/off
PORTB.3=0;
PORTA=0b10100100;



PORTB.1=0; // 6 duty select
PORTB.3=0;
PORTA=0b10101000;


PORTB.1=0; // верхнюю строку на 0 (dis start line)
PORTB.3=0;
PORTA=0b11000000;



PORTB.1=0; //NonInvert scan RAM
PORTB.3=0;
PORTA=0b10100000;


PORTB.1=0; // 7 display on/off
PORTB.3=0;
PORTA=0b10101111;


}
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Еще есть интересный вопрос: Может ли этот ЖК, допустим при проматывании текста вниз плавно отображать его.
Расшифрую-у меня будет стоять карта памяти(не большая), на ней текст-массив символов...
Я хочу сосчитать эти символы, загнать энное число в экран, при нажатии на кнопку "вниз/вверх", мк считывает символы с карты и формирует всё так, что выглядит как плавный подьем текста. Ну это как прокрутка в текстовом редакторе:
опускаешь ползунок-поднимается плавно текст.
Возможно ли такое????
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Alerr, Ваша инициализация не работает уже хотя бы потому, что у Вас не выполняется функция WriteByte (точнее, Вы не проводите все необходимые операции с управляющими сигналами). Там поочередно дисплею выдаются команды с помощью функции WriteCode, которая, в свою очередь, вызывает функцию WriteByte - чтоб записать код команды в дисплей. Так вот, у Вас я не вижу выполнения всех процедур WriteByte при записи каждой команды. Могут быть еще какие-то нюансы (меня, например, смущает простое присваивание), но уже вышеуказанного вполне достаточно для того, чтобы дисплей не работал.
Я написал #define E 2, потому как хотел сделать код более читабельным. Когда я использую директиву #define, компилятор во время компиляции производит автоподстановку - вместо E он поставит 2, то есть поймет, что мне нужно установить (сбросить) второй бит в регистре. Сигнал E у нас управляется выводом PB2, отсюда и двойка.
И последнее - да, Вы сможете осуществить плавный сдвиг. Тут нужно будет применять математические операции с массивами. Вы можете ознакомиться с общими принципами на примере простеньких осциллографов на МК - схем, описаний и исходников в сети море.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Дошло почему именно 2!!! Насчет инициализауии: я писал инициализацию согласно даташиту, пункт в пункт... Там и нет этих функций... Разве не так???
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Конечно же, там нет этих функций. Эти функции, извините, должен реализовать программист. Но там написано "подать команду.." - и так несколько пунктов. А у Вас команда не подается. Вы просто сбрасываете A0 и RDWR. А строб-сигнал кто подавать будет? А задержки устанавливать? А дожидаться сброса флага занятости? LCD-модуль попросту Вас не понимал, не воспринимал команды.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Похоже, я плохо представляю принцип работы жк(... Получается жк считывает команды только после подачи строб сигнала??? Скажите, может я не понимаю правильно, прочитать данные- это прочитать данные с ножек шины данных, а без чтения, данные не запишешь в озу(после записать)... А из озу мк у жк все автоматически выводит???? Правильно понимаю?
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Да, строб-сигнал в данном случае необходим для того, чтобы контроллер ЖКИ определил состояние управляющих выводов и при необходимости считал данные с шины.
Читать данные не обязательно. Но, по крайней мере, нужно дождаться сброса флага busy.
Контроллер выводит все автоматически, да.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Подскажите новичку как соединить жк и atmega.

Сообщение Alerr »

Обгаружил интересную вещь для меня.. Почему-то выводимые мною символы слегка с некоторых краев подразмазаны, ближние пиксели, расположенные по ходу рисования цифры горят на 1/4, кагбудто мк не успевает между пробелами снимать питание... Может,.. задержки увеличить? Но мне не помогло..
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Подскажите новичку как соединить жк и atmega.

Сообщение SubDia »

Задержки не помогут. К сожалению, сам столкнулся сейчас с такой проблемой - правда, на бОльшем дисплее, и с ARM-контроллером. Ответа на вопрос пока что не знаю (мне коллега на работе посоветовал помощнее источник питания использовать - якобы ЖК не хватает питания, но это не факт). Разберусь - напишу.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»