Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/135: Рейтинг темы: голосов - 135, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 102
1

Органайзер? Может как-то иначе?

22.12.2011, 21:42. Показов 24728. Ответов 49
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Давно хотел собрать устройство, которое за бугром называют PDA - Personal Digital Assistent. Ума мало, амбиций много. Периодически возникают неотложные дела, и идею приходится забрасывать далеко и надолго, но потом она возвращается. В качестве ядра для такого девайса рассматривал и AVR (Ну конечно же, как не их?) и Z80 и даже 80186. Но компромисс никак не хотел находиться. С появлением на форумах информации о дисплеях от сотовых и их подключении интерес вернулся с новой силой. В результате было решено начать уж хоть с чего-нибудь. Отработанный и усвоенный умом алгоритм несложно перенести на любую привычную платформу, так я подумал и купил дисплей от Моторолы Т190. Товарищ Sporkir, участник данного форума, разработал программу по его управленю. Я ее удачно залил и проверил - хм, правда работает! Для начала мне такого дисплея очень хватало - разрешение сносное, скорость вывода - довольно шустро. Но...
Программа была написана на ассемблере и после переписи мною на си никак не хотела работать. Бился долго, мучал вопросами форумчан, но безрезультатно... Проект был заброшен, как обычно...
Спустя некоторое время я вновь вернулся к нему, написал всё с нуля и, о чудо, программа заработала... Си мне уже как родной язык (не без помощи интернета, конечно), потому я решил улучшить алгоритм вывода на дисплей...

Продолжение следует...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2011, 21:42
Ответы с готовыми решениями:

Как создать приложение-органайзер новичку
Добрый день! Задача: Освоить питон на создании своего приложения-органайзера. Смесь Екселя и...

Органайзер. Как можно каждую ячейку DataGridView сделать как класс для удобного обращения
Здравствуйте. Скажите пожалуйста ,а как можно каждую ячейку DataGridView сделать как класс ?чтобы...

Элементарный органайзер: как привязать текстбокс к календарю
Доброй ночи! Пишу элементарный органайзер на WPF .Хочу сделать так, чтобы при нажатии на любую дату...

Как иначе?
private List<List<Info>> stack = new List<List<Info>>(); private void Work(){ //Формируется некая...

Как иначе записать?
Как иначе записать эту часть кода? *(m+i)=*(*(mas+i)+nomstb);

49
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
Органайзер? Может как-то иначе?
А может так? http://www.youtube.som/watch?v=8aM1aCivEIg... Предлагаю объединить усилия и поделиться опытом... Подробнее или в "личку".
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;
}
Адрес EEPROM - 0xA0, 0xA1
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2012, 23:42
Помогаю со студенческими работами здесь

Как записать иначе?
Есть фрагмент кода. Точнее цикл добавления элементов в вершину стека. Вопрос: как заменить и...

Как составить блок схему хэширования? Может есть программа или может вы сами составите её?
#include &lt;iostream&gt; int main() { char a = &quot;Hello World&quot;; char b; for (int i = 0; i...

как и иначе перемешать массив?
Есть рабочий код, но преподаватель считает, что это можно сделать легче: &quot;слишком сложно...

Как иначе написать программу?
Доброго времени суток уважаемые форумчане, написал программу, в принципе она работает но я не...

Событие или как то иначе?
Помогите реализовать, Есть поле Edit1-&gt;Text при счелчке на него мышью выполняется привязанное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru