реклама на сайте
подробности

 
 
> 7 сегментов и динамическая индикация
_Pasha
сообщение Feb 13 2009, 13:34
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Позвольте поднять эту банальную тему в целях поиска окончательного решения проблемы распределения битов, портов и прочих неудобств. Вот один из моих вариантов, тоже в меру кривой, потому что всегда надо переписывать функцию do_screen() и переназначать сегменты и знакоместа. И он сугубо под WinAVR, но это не самое сложное, обеспечить в данном случае портабельность.

А кто пошел дальше? Может есть все-таки более элегантные решения, чем то, что у меня?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Eddy71
сообщение Feb 19 2009, 20:03
Сообщение #2


Местный
***

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



Цитата(_Pasha @ Feb 13 2009, 17:34) *
Позвольте поднять эту банальную тему в целях поиска окончательного решения проблемы распределения битов, портов и прочих неудобств. Вот один из моих вариантов, тоже в меру кривой, потому что всегда надо переписывать функцию do_screen() и переназначать сегменты и знакоместа. И он сугубо под WinAVR, но это не самое сложное, обеспечить в данном случае портабельность.

А кто пошел дальше? Может есть все-таки более элегантные решения, чем то, что у меня?


О май гад... В асме это проще выглядит... ;-)
Во всяком случае, мысли впихнуть перекодировку ASCII->LED у меня не возникало..
На семисегментнике ведь много не нарисуешь и в 99% хватает минимума типа Err F-1 F-2..
Постараюсь подумать, как свою мысль перевести на общечеловеческий (Си) язык..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 20 2009, 07:20
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Eddy71 @ Feb 19 2009, 23:03) *
В асме это проще выглядит... ;-)

Вы ж поймите: тут задачи другие. Помимо того, что на индикатор может выводиться с тех пинов, с которых удобнее развести на плате, и не обязательно эти пины будут на одном порте,  так еще появляется соблазн делать программу переносимой на любой МК. На асме выполнима только первая часть.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Feb 20 2009, 07:38
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(_Pasha @ Feb 20 2009, 10:20) *
Вы ж поймите: тут задачи другие. Помимо того, что на индикатор может выводиться с тех пинов, с которых удобнее развести на плате, и не обязательно эти пины будут на одном порте,  так еще появляется соблазн делать программу переносимой на любой МК. На асме выполнима только первая часть.

У нас конструктор печатных плат тоже любит развести платку "как проще". Работаем на С++, поэтому я в этом случае делаю очередной производный класс, в котором определяю "виртуальную" шину, например для того же ЖКИ. А все остальные функции уже используют ее и не требуют изменения в своей реализации. ИМХО сдесь объектно-ориентированный подход очень хорошо ложиться.
А вот с переносимостью пока только в пределах семейства, все-таки организация на физическом уровне может отличаться. MCS51, PIC, AVR, 196, 166. Нужно писать порты под каждую платфому.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 20 2009, 08:53
Сообщение #5


;
******

Группа: Участник
Сообщений: 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 где угодно - например в главном модуле. Что думаете?
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Feb 20 2009, 14:22
Сообщение #6


Местный
***

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



Цитата(_Pasha @ Feb 20 2009, 12:53) *
В принципе, можно определить указатель на экран как входной параметр
do_screen(led7_scr_t *screen)
Тогда можно описывать do_screen где угодно - например в главном модуле. Что думаете?

Боюсь сморозить чушь (только начинаю изучать), но я обычно (в асме) работу экрана выношу в отдельную, изолированную от всего функцию. У неё нет входных параметров (кроме отображаемого буфера, в который программа пишет необходимые вещи). По прерыванию вызывается процедура экрана, которая сама через указатель из буфера берет байт, перекодирует и выводит в порт. Указатель на буфер и таймер инкрементируется внутри прерывания и программа (основная) не знает, что там экран делает. То же самое с кнопками.
Причина редактирования: Удалена лишняя часть цитаты.


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 20 2009, 14:49
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



 Я в асме делал точно так же - все в прерывании. Но со временем появились и другие варианты. Оно может быть и в прерывании, и в основном цикле, и в функции, в которой собраны все быстрые задачи- чтоб  не "вешать" контроллер во время ожиданий. А в прерываниях находится минимальное время - прочитал/записал в/из буфера и все. Это уж  кому как нравится. Или как позволяет задача.


Насчет того, почему все переменные через структуру. Во-первых, с ними удобно работать из асма, если это надо будет. Во-вторых, может возникнуть ситуация, когда надо поддержать несколько дисплеев, код легче модифицировать.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016