|
|
  |
7 сегментов и динамическая индикация |
|
|
|
Feb 14 2009, 06:44
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(_Pasha @ Feb 13 2009, 16:34)  Позвольте поднять эту банальную тему в целях поиска ... А кто пошел дальше? Может есть все-таки более элегантные решения, чем то, что у меня? Не совсем в нему, но... Есть у меня подпрограммка на асме под АВР, с каментами, настраивается все на мой взгляд достаточно просто, дефайнами в начале. Выложить?
Сообщение отредактировал smac - Feb 14 2009, 06:46
|
|
|
|
|
Feb 19 2009, 20:03
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(_Pasha @ Feb 13 2009, 17:34)  Позвольте поднять эту банальную тему в целях поиска окончательного решения проблемы распределения битов, портов и прочих неудобств. Вот один из моих вариантов, тоже в меру кривой, потому что всегда надо переписывать функцию do_screen() и переназначать сегменты и знакоместа. И он сугубо под WinAVR, но это не самое сложное, обеспечить в данном случае портабельность.
А кто пошел дальше? Может есть все-таки более элегантные решения, чем то, что у меня? О май гад... В асме это проще выглядит... ;-) Во всяком случае, мысли впихнуть перекодировку ASCII->LED у меня не возникало.. На семисегментнике ведь много не нарисуешь и в 99% хватает минимума типа Err F-1 F-2.. Постараюсь подумать, как свою мысль перевести на общечеловеческий (Си) язык..
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Feb 20 2009, 07:38
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(_Pasha @ Feb 20 2009, 10:20)  Вы ж поймите: тут задачи другие. Помимо того, что на индикатор может выводиться с тех пинов, с которых удобнее развести на плате, и не обязательно эти пины будут на одном порте, так еще появляется соблазн делать программу переносимой на любой МК. На асме выполнима только первая часть. У нас конструктор печатных плат тоже любит развести платку "как проще". Работаем на С++, поэтому я в этом случае делаю очередной производный класс, в котором определяю "виртуальную" шину, например для того же ЖКИ. А все остальные функции уже используют ее и не требуют изменения в своей реализации. ИМХО сдесь объектно-ориентированный подход очень хорошо ложиться. А вот с переносимостью пока только в пределах семейства, все-таки организация на физическом уровне может отличаться. MCS51, PIC, AVR, 196, 166. Нужно писать порты под каждую платфому.
|
|
|
|
|
Feb 20 2009, 08:53
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(VladimirYU @ Feb 20 2009, 10:38)  Нужно писать порты под каждую платфому. Если Вы смотрели то, что я выкладывал, то там переносимость обеспечивается отвязкой от прерывания через опрос тиков системного таймера, PROGMEM тоже легко будет на const _flash или чего-то подобного - сделаю, как и чтение этого PROGMEMа. И еще мой вариант учитывает возможный опрос линий возврата клавиатуры: Код #include "keyb.h" #include "led7.h" #define T5ms 5000
static timer_t screen_time =0;
if(time_diff(screen_time) > T5ms)
{ screen_time = get_time();
// в таком случае связи модулей led7 и keyb нет вообще do_keyboard(le7s.pos); // делаем то,что надо с экраном do_screen(); } В принципе, можно определить указатель на экран как входной параметр do_screen(led7_scr_t *screen) Тогда можно описывать do_screen где угодно - например в главном модуле. Что думаете?
|
|
|
|
|
Feb 20 2009, 14:22
|

Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879

|
Цитата(_Pasha @ Feb 20 2009, 12:53)  В принципе, можно определить указатель на экран как входной параметр do_screen(led7_scr_t *screen) Тогда можно описывать do_screen где угодно - например в главном модуле. Что думаете? Боюсь сморозить чушь (только начинаю изучать), но я обычно (в асме) работу экрана выношу в отдельную, изолированную от всего функцию. У неё нет входных параметров (кроме отображаемого буфера, в который программа пишет необходимые вещи). По прерыванию вызывается процедура экрана, которая сама через указатель из буфера берет байт, перекодирует и выводит в порт. Указатель на буфер и таймер инкрементируется внутри прерывания и программа (основная) не знает, что там экран делает. То же самое с кнопками.
Причина редактирования: Удалена лишняя часть цитаты.
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Feb 20 2009, 14:49
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Я в асме делал точно так же - все в прерывании. Но со временем появились и другие варианты. Оно может быть и в прерывании, и в основном цикле, и в функции, в которой собраны все быстрые задачи- чтоб не "вешать" контроллер во время ожиданий. А в прерываниях находится минимальное время - прочитал/записал в/из буфера и все. Это уж кому как нравится. Или как позволяет задача.
Насчет того, почему все переменные через структуру. Во-первых, с ними удобно работать из асма, если это надо будет. Во-вторых, может возникнуть ситуация, когда надо поддержать несколько дисплеев, код легче модифицировать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|