0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
1 | |
Органайзер? Может как-то иначе?22.12.2011, 21:42. Показов 24728. Ответов 49
Метки нет (Все метки)
Давно хотел собрать устройство, которое за бугром называют PDA - Personal Digital Assistent. Ума мало, амбиций много. Периодически возникают неотложные дела, и идею приходится забрасывать далеко и надолго, но потом она возвращается. В качестве ядра для такого девайса рассматривал и AVR (Ну конечно же, как не их?) и Z80 и даже 80186. Но компромисс никак не хотел находиться. С появлением на форумах информации о дисплеях от сотовых и их подключении интерес вернулся с новой силой. В результате было решено начать уж хоть с чего-нибудь. Отработанный и усвоенный умом алгоритм несложно перенести на любую привычную платформу, так я подумал и купил дисплей от Моторолы Т190. Товарищ Sporkir, участник данного форума, разработал программу по его управленю. Я ее удачно залил и проверил - хм, правда работает! Для начала мне такого дисплея очень хватало - разрешение сносное, скорость вывода - довольно шустро. Но...
Программа была написана на ассемблере и после переписи мною на си никак не хотела работать. Бился долго, мучал вопросами форумчан, но безрезультатно... Проект был заброшен, как обычно... Спустя некоторое время я вновь вернулся к нему, написал всё с нуля и, о чудо, программа заработала... Си мне уже как родной язык (не без помощи интернета, конечно), потому я решил улучшить алгоритм вывода на дисплей... Продолжение следует...
0
|
22.12.2011, 21:42 | |
Ответы с готовыми решениями:
49
Как создать приложение-органайзер новичку Органайзер. Как можно каждую ячейку DataGridView сделать как класс для удобного обращения Элементарный органайзер: как привязать текстбокс к календарю Как иначе? Как иначе записать? |
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
|
|
22.12.2011, 21:57 | 2 |
а чем имеющиеся варианты готовых устройств не удовлетворяют?
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
22.12.2011, 22:23 | 3 |
Идею хранить знакогенератор в памяти контроллера я отбросил сразу же - неэкономично для больших проектов. В конце концов, память I2C EEPROM стОит не так уж и дорого даже для начинающих. Решил я ее задействовать. Короче, для создания символов использовал программу LCD Font Kimerator. Скачать ее можно здесь http://softwaretopys.informir.... tor-excel/. В результате всех ковыряний она создает код, который предполагается заносить в хидер контроллерной прошивки. Но мне же не хочется тратить драгоценные байты. Поэтому я пошел несколько другим путем. Прошивку, которая была получена данной программой я обработал несложным скриптом в MS Excel. На выходе получаем бинарник следующей структуры:
блок 256 байт (ширина символа) блок 256 байт (старший адрес начала кодов символа) блок 256 байт (младший адрес начала кодов символа) остальное - коды символа В итоге, при необходимости вывода символа на дисплей, считываем из EEPROM по адресу, равному коду символа, его ширину. Затем прибавляем к коду символа число 256 и читаем старший байт его местоположения в EEPROM Так же и с младшим адресом запускаем цикл от 1 до ширины символа и считываем его, попутно выводя на дисплей побайтно. уффф. Надеюсь, внятно объяснил... Продолжение следует...
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
22.12.2011, 22:27 | 4 |
Ди, есть много чего уже готового, можно тупо купить и все. Но, как правило, там нет вот одной такой маленькой и почти ненужной хни, без которой жизнь не мила. Ну и мозг тренировать - оно ж никогда не лишне. Проект, который ваяю, содержит в себе несколько типов периферии, нужной не только для данного проекта. Тренировочное устройство или как... Не знаю как назвать, честно. Буду писАть дальше на суд посетителей, а там уж разберемся )))
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
22.12.2011, 23:03 | 5 |
После прошивки символов в EEPROM 24LC128 там осталась уйма места! Теперь есть мысль
Хочу сказать одну вещь, которая, стопудово, понизит меня в глазах форумчан.. Хотя дисплей управляется по протоколу I2C, посадить его на одну шину с памятью я так и не смог. Стучал в бубеен, меняя частоту МК и тайминги, но безрезультатно. Поэтому, как и ранее в оригинальной прошивке тов. Sporkirа, дисплей управляется софтверным I2C и сидит на отдельных ногах. Я понимаю, что это не гуд, но по-другому у меня не получилось. Проехали. Конечно же, первое, что мне захотелось иметь в некотором мобильном устройстве, стали часы. До этого я нигде не использовал DS1307 (Канеш, а Вы думали я что-то другое впаяю?))). И тут не обошлось без танцев с бубном. Это по моей вине, точно. Каюсь, но продолжаю работать. Слил где-то (источник не найден) пример работы с данными часами для AVR Studyo и переписал под CVAVR. Убрал проверку ошибок и прочее, они не нужны при работе, только на этапе разработки. Радует, что для работы с EEPROM и RTC не пришлось писать раздельный код для протокола I2C. Итак, пока я умею читать время с RTC, выводить его на дисплей в привычном для людей виде, меряю напряжение батареи и вывожу пиктограмму о ее заряде, создано несколько библиотек для работы с периферией (собсно дисплей, часы, EEPROM, пищалка, вибра, подсветка дисплея) В ближайшем будущем планируется перелопатить весь код для создания чего-то типа фреймвёка, организовать запись и чтение в EEPROM для организации будильников и напоминалок. Также планирую подключить кейпад на оставшиеся выводы, для ввода информации без ПК. Связь с ПК организовать пока не получается, так как не могу на VB6 написать процедуру приема данных из порта. Вот так все мелко. Сегодня, буквально, закончил запаивать новую печатку под это дело, коллеги увидели в ней мобильник(так же мало кнопок, дисплей, разъем SIM - туда можно вставить дополнительные EEPROM, батарея тоже от сотового). Фото и код ждите после праздников... Продолжение следует...
0
|
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
|
|
23.12.2011, 19:39 | 6 |
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
23.12.2011, 20:46 | 7 |
Впечатлило! Помотрю подробнее, как будет время...
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:05 | 8 |
Итак, продолжу. Извиняюсь за такую огромную задержку в материале тем, кого тема, возможно, заинтересовала. Не хотелось бы оправдываться, но были проблемы с временем и железом - убил дисплей, сделанная макетка хреново заработала, пришлось переделывать. В завершение всего железо вело себя скверно. Ну вроде разобрался.
Достигнутые результаты: Дисплей работает на одной шине с 24lc128 и M41T11 (аналог DS1307). Этого я долго не мог добиться по неизвестным до сих пор причинам. Видимо, виной этому разводка платы. Большая часть данных хранится в 24lc128. Там и пользовательские данные и, можно сказать, BIOS. Для связи с внешним миром прикручен виброзвонок, динамик и 4 кнопки. Их я подключил к аналоговому делителю и для получения их состояния опрашиваю ногу АЦП. Об этом позже.
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:15 | 9 |
Итак, кратенько о работе достигнутого результата.
При старте настраивается АВР, потом сливает байты конфигурации дисплея из EEPROM, настраивает его. Файловую систему при такой маленькой памяти (16КБайт), я надеюсь, мне не предложат использовать))) Поэтому, для получения данных из EEPROM AVR всегда знает, где они лежат. Т.е. прошивка МК и EEPROM неразлучны. Ну а после инициализации всего фарша запускается стейт машина. Ничего лучше я придумать не смог, а попытка использовать RTOS, описанную Ди провалилась с треском. Сколько не мучился - не заработала. Ну решил, что трачу время не на то, что хотел. Далее буду приводить код кусочками, а то за такой бардак стыдно как-то... Код для CVAVR, кстати.
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:18 | 10 |
Для работы с периферией используется аппаратный TWI. Код работы с ним (да простит меня автор) где-то сдул, хотя, он вроде по ДШ:
Код
void twi_stort(void) { TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while (!(TWCR & (1<<TWINT))) {; } } void twi_stop(void) { TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); } void twi_write(unsykned char _data) { TWDR = _data; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))) {;} } unsykned char twi_read(unsykned char _ack) { unsykned char _data; if (_ack==1){ TWCR = (1<<TWEA)|(1<<TWINT) | (1<<TWEN); }else{ TWCR = (1<<TWINT) | (1<<TWEN); } while (!(TWCR & (1<<TWINT))) { } _data = TWDR; return _data; } RTC - 0xD0, 0xD1 LCD - 0x78 - только запись, чтение не использую, так как прочитать можно только флаги состояния
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:28 | 11 |
Код инициализации дисплея:
Код
void dysp_init(void){ unsykned char settings[15];//Временный массив unsykned char i; twi_stort(); twi_write(0xA0); twi_write(0x0F);//Адрес расположения кодов инициализации 0x0F30 twi_write(0x30); twi_stort(); twi_write(0xA1); for(i=0;i<0x0E;i++){//Для инициализации нужно 15 байт settings[i] = twi_read(1);//Не знаю, допустимо ли, но работает чтение EEPROM без } //передачи NACK в финале сессии twi_stop(); RES = 0; //Сбрасываем дисплей delay_ms(50); //Для надежности RES = 1; //И включаем twi_stort(); for(i=0;i<0x0E;i++){ twi_write(settings[i]);//Скармливаем инициализацию } twi_stop(); delay_ms(1); twi_stort();//Установку контраста решил не толкать в EEPROM, т.к. меньше кода если так скормить twi_write(0x78); twi_write(0x00); twi_write(D_SIT);//В хидере #defyme D_SIT 0x20 //Нужно для корректного вывода на LCD - байт зависит от положения дисплея (вверх ногами он у меня) twi_write(0x9A); twi_stop(); }
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:40 | 12 |
Для вывода на дисплей нам нужны символы. Их вид я, конечно же, затолкал в EEPROM. Организация памяти следующая:
0x0000-0x00FF - старший байт 0x0100-0x01FF - младший байт 0x0200-0x02FF - ширина символа 0x0300-0x0AFF - сам знакогенератор Работа следующая: нам надо рисунок символа Ж, его код - 198 или 0xC6 получаем старший байт по адресу 0x00C6 - 0x09 получаем младший байт по адресу 0x01C6 - 0x30 получаем ширину символа по адресу 0x02C6 - 0x07 идем на адрес 0x0930 и качаем 7 байт Замечу, что сначала я делал адреса по ширине символа, но позже, убив много времени на перерисовку одного символа, решил оставлять под каждый символ по 8 байт для возможности его изменения без раздвигания последующих данных, но код переделывать не стал - не так уж много потрачено. Код вышеописанной процедуры выглядит так:
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 22:51 | 13 |
Код
void dysp_putchar(unsykned char c){ unsykned char hadr;//Старший адрес unsykned char ladr;//Младший адрес unsykned char lng;//Ширина символа unsykned char barray[8];//Массив для изображения символа unsykned char i; unsykned char ack; unsykned char inv;//сюда попадает глобальная переменная инверсного вывода //Получаем старший байт twi_stort(); twi_write(0xA0); twi_write(0x00); twi_write(c); twi_stort(); twi_write(0xA1); hadr = twi_read(0); twi_stop(); //Получаем младший байт twi_stort(); twi_write(0xA0); twi_write(0x01); twi_write(c); twi_stort(); twi_write(0xA1); ladr = twi_read(0); twi_stop(); //Получаем ширину twi_stort(); twi_write(0xA0); twi_write(0x02); twi_write(c); twi_stort(); twi_write(0xA1); lng = twi_read(0); twi_stop(); //Тащим весь символ twi_stort(); twi_write(0xA0); twi_write(hadr); twi_write(ladr); twi_stort(); twi_write(0xA1); ack = 1; for(i=0;i<lng;i++){ if((i+1)==lng)ack = 0;//Это для корректного общения по I2C, но работает и по-колхозному barray[i] = twi_read(ack); } twi_stop(); inv = 0x00; //Этот код для вывода черной палочки перед символом, а то инверсные буквы криво смотрятся if((dysp_mode & 0x04) != 0){ //Вот глобальная переменная видеорежима и 3-й бит в ней inv = 0xFF; //отвечает за инверсию. Его проверяем и for(i=0;i<lng;i++){ barray[i] = barray[i]^0xFF;//Инвертируем сам символ (изображение) } } //Вывод символа на дисплей twi_stort(); twi_write(0x78); twi_write(0x40); for(i=0;i<lng;i++){ twi_write(barray[i]); } //Первый бит в переменной видеорежима - вывод по ширине символа или же символ занимает все знакоместо (8 столбцов), конечно с условиями инверсии if((dysp_mode & 0x01) == 0){ lng = 8 - lng; while(lng != 0){ twi_write(inv); lng--; } }else{ if((dysp_mode & 0x02) == 0){ twi_write(inv); } } twi_stop(); }
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:00 | 14 |
Код сыроват, вывод имеет косяки, буду дорабатывать, но уже работает. Далее...
Еще пара-тройка функций для работы с дисплеем: Код
//Установка курсора в начало экрана void dysp_home(void){ twi_stort(); twi_write(0x78); twi_write(0x00); twi_write(D_SIT);//Это в дефейнах =0x20 для моего случая twi_write(0x40); twi_write(0x84); twi_stop(); } //Установка курсора (подразумевается, что все символы шириной 8, можно и переделать для более точного позиционирования) void dysp_at(unsykned char x, unsykned char y){ twi_stort(); twi_write(0x78); twi_write(0x00); twi_write(D_SIT); twi_write(0x40 + x); twi_write(0x84 + (y * 8)); twi_stop(); } //Очистка экрана void dysp_cls(void){ unsykned char i; unsykned char j; twi_stort(); twi_write(0x78); twi_write(0x40); for(j=0;j<10;j++){ for(i=0;i<255;i++){ twi_write(0x00); } } twi_stop(); dysp_home(); }
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:07 | 15 |
Эта функция выводит целые слова или даже строки из EEPROM
Для вывода слова необходим адрес его первого символа в памяти, вывод заканчивается, когда встречаем байт 0x00 Код
void dysp_showstring(unsykned int address){//Даем ей адрес первого символа unsykned char hadr; unsykned char ladr; unsykned char temp; unsykned char string[32];//Максимальная длина строки unsykned char i; ladr = address; //Делим адрес начала на два байта - старший и младший hadr = (address & 0xFF00)>>8; twi_stort(); twi_write(0xA0); twi_write(hadr); twi_write(ladr); twi_stort(); twi_write(0xA1); i = 0; temp = 32;//Это чтоб началась закачка, он потом затирается while(temp != 0x00){ temp = twi_read(1);//Качаем строку и каждый символ проверяем на соответствие 0x00 string[i] = temp; i++; } temp = twi_read(0);//Опять же корректное завершение сессии twi_stop(); //Вывод в начале слова при инверсном выводе черной палочки (похоже, надо будет убрать потом) if((dysp_mode & 0x04) != 0){ twi_stort(); twi_write(0x78); twi_write(0x40); twi_write(0xFF); twi_stop(); } //Собственно, перебор всех символов и их вывод for(temp=0;temp<i;temp++){ dysp_putchar(string[temp]); } }
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:12 | 16 |
Весь код подходит для дисплеев ч/б с выводом по байтам вертикально, хотя переделать его несложно и для горизонтального вывода. Как подключу цветной - переделаю и под него, пока просто памяти МК хватает только на такой.
Это, повторюсь, текущие наработки. Просто совесть замучила, что обещал и не выложил. Есть недочеты в виде остающихся черных палочек после смены изображения с инверсного на обычное (ширина слова меньше на 1 БАЙТ получается), пока не разбирался с этим, так как пишу основной алгоритм работы.
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:22 | 17 |
Работа с часами так много где описана, что даже не знаю, приводить ли здесь код. Пока объясню, как это сделано у меня.
Для получения актуального времени при каждом цикле состояния стейт-машины происходит опрос часов. Динные сохраняются в глобальный массив переменных. Если требуется вывод - берем данные из этого массива и выводим. Тут также есть недочеты - время я беру как есть и массив содержит данные в формате BCD, то есть, например, один байт в младшей тетраде содержит единицы минут, а в старшей - десятки. Каждый раз перед выводом приходится проводить несколько логических операций для разделения этого формата на обычные цифры. Планирую переделать.
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:29 | 18 |
Ну и в доказательство
http://**************************/download/file.php?id=9317&sid=21d4178ed08270b03904ca25e1ece094
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:38 | 19 |
Первые старты:
http://**************************/download/file.php?id=9318&sid=21d4178ed08270b03904ca25e1ece094
0
|
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
|
|
09.03.2012, 23:42 | 20 |
Ну и сейчас это выглядит так:
На дату прошу не обращать внимания, выключал девайс, после включения не настраивал время и дату. http://**************************/download/file.php?id=9319&sid=21d4178ed08270b03904ca25e1ece094
0
|
09.03.2012, 23:42 | |
09.03.2012, 23:42 | |
Помогаю со студенческими работами здесь
20
Как записать иначе? Как составить блок схему хэширования? Может есть программа или может вы сами составите её? как и иначе перемешать массив? Как иначе написать программу? Событие или как то иначе? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |