Самодельный передатчик (часть 2)

VRV
msv:

Люди добрые, помогите… Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома. Уж и бинарник размером 4К ему подкладывал и ручками пытался MODDATA править, один фиг страшие разряды адреса игнорирует… Это конкретный косяк модели или как-то лечится??

Похожая проблема и у меня. Модели представлені массивом структур в еепром. Так вот при симуляции структура пишется всегда по нулевому адресу. Тож думал косяк в программе, но в студио еепром заполняется без ошибок. И еще- в протеусе файл служит для начальной инициализации еепром. При последующей симуляции данные еепром сохраняются во вспомогательном файле симуляции. Могут быть сброшены через меню дебаг.

ЗЫ: хотел отправить архив с моделю в протеусе но стоит ограничение на тип файлов(только графика)\справку читал:)\

msv

Хочу уточнить, изменение параметров резистором доп. ан. каналом- не будет полноценная замена кнопок “вверх-вниз”. Просто при изменении параметра от-100 до +100 это гораздо удобнее сделать одним движением пота. И Хотя почти всё (ключ. слово - “почти”) можно сделать без этих кнопок, но отазываться совсем от них наверное не стоит…
Ох… погорячился я минутами на реализацию проверки CRC EEPROM… Уже второй вечер пытаюсь понять, почему после “больший” изменений, CRC получается правильной только на второй раз…
А вот код для проверки eeprom в протеусе:

#define SIZEOF_EEPROM 4*1024
void testeeprom(void)
{
unsigned int i;
eeprom unsigned char *p;
p=0;
for(i=0; i<SIZEOF_EEPROM; i++, p++)
{
*p=0xaa;
}
}

После этой функции помотреть дамп eeprom в протеусе…

DD

VRV, а не подскажете где VG400 за 10 евро продают

VRV

Все тотже EBay. Причем именно его немецкая версия(ebay.de). Очень много лотов выставляется Graupner. Зайдите-посмотрите цены:P(правда в 10 евро нужно попасть на удачный лот (вг-устаревшая модель)). Единственная трудность с оплатой - немцы не жалуют пайпал, а предпочитают перевод:)(около 300грн для одной транзакции:)). Поэтому нужно отбирать еще и по способу оплаты.(или заводить друга в Германии:)). Кстати на английском(co.uk) тоже попадаются неплохие варианты - но там нужно уговаривать для отправки в страны СНГ.😃 Кстати тамже (.com)заказывал два дисплея нокиа 7110 по ~3 доллара.

ЗЫ:А для кого летать первостепенно и есть хотябы 100 убитых енотов - то на хоббисити есть 9 каналка за 70 + (20-30 модуль)$.

DD
VRV:

ЗЫ:А для кого летать первостепенно и есть хотябы 100 убитых енотов - то на хоббисити есть 9 каналка за 70 + (20-30 модуль)$.

Это то понятно, просто хочется найти дешевую аппу именно под переделку, чтобы конструктив, так сказать полностью устраивал. Надо чтобы места в ней было много, напрмер большинство апп которые идут без дисплея какие то урезанные по вертикали. Хотелось чтобы джои нормальные были, а то я переделывал валькеру, джои там авно полное. Хотелось чтобы триммеры было просто переделывать, я вот на свою валькеру достал джои от футабы, теперь опять проблемы с триммерами.
Еще я так понял вы пишете новую прошивку, у меня есть пару предложений:

  1. Может использовать АРМ
  2. Может можно попробовать использовать микрочиповскую графическую библиотеку, она с открытыми кодами, правда под 16битные процы, но я код просмотрел, вроде переделывается легко, зато там по умолчанию поддерживаются многие дисплеи и еще много полезной фигни😁

PS: я к чему про АРМ то, я тут не так давно ковырялся в санвовском ПСМ, и вообще в ПСМ, так вот мне кажется что АВР тут маловато будет, хотя как писать. Иногда напишешь что нибудь которое по времени не должно работать, а оно работает, а иногда наоборот😁

VRV

Ecли вы не предполагаете декодирование видео, то АВР вполне достаточен для задач ру. Простая прикидка - пачка сигнала ппм=20мс. При частоте 12 мгц =12/50=600 000 машинных циклов для обновления данных о каналах. При этом само обновление - по прерыванию простой записю в регистр из массива вычисленных значений. Если не использовать операций деления(заменять сдвигом) и не вычислять значений неизменных каналов, то вся математика займет пару десятку процентов. Касаемо затрат по обновлению дисплея- тоже копейки если не рисовать элипсы и смнусоиды:) При этом само обновление в главном экране 1 раз в сек(для таймера), а в остальных меню по факту изменений(или также 1 раз за сек).
Касаемо PCM - насколько я понимаю в данном случае вместо таймера задействуется модуль uart для передачи данных о состоянии каналов, однако стандарт передачи для каждого производителя отличается.
Как я гоаворил прошивка не новая, просто не смог разобратся в выложенных:) и вставлял из них куски а кое что дописывал, т.к хотел изменить способ ввода и сделать легко изменяемое меню. До структуры меню Николая конечно далеко, но вроде в своем пока не запутался:).
Для меня данный проект интересен не конечной реализацией(хотя и она интерена:)), а самим процессом, дабы не утерять а иногда и приумножить:) знания мк и с. Я думаю если ктото заинтересуется изучением АРМ, то перенести данный проект на другую платформу не составит труда, т.к даже графика написана на с. В этом плане микрочип к примеру склоняется больше к ассеблеру(из свободных проектов и AN).
Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)

ps: кстати как кинуть атач с моделю? принимает только графику.
pps: да и запись данных в лсд их памяти тоже по прерыванию(без ожидания флага внутри программы), а это примерно по 60 циклов на каждое обращение к spi (вот сегодня этим как раз и займусь:))

DD

я про графическую библиотеку от микрочипа (на си, с открытым кодом) в которой прорисованы все элементы управлнения и отображения, а так же определено их поведение. Библиотека достаточно итересная поддерживает много устройств вывода и ввода (даже тачскрин). Минус это то что она изначально предназначена для контроллеров от 16бит и выше, но это сделано как я понял искуственно. Мне кажется что есть смыс использовать подобную библиотеку с какой нибудь ос. Просто текущие прошивки так реализованы что изменять их сложно.(например у msv задержка канала, помоему связана с ппм, тоесть просто так изменить протокол сложно). Больше подобных библиотек я не нашел. А ведь по большому счету задача кодера как раз это взаимодействие с пользователем. По поводу АРМ: я считаю что его стоит применить, так сказать на будущее, тем более что цена не особо дороже, а плюшек много получается не только от железа, так еще и от софта.
ПСМ, по крайней мере санвовский генерировать уартом точно не получится.
Но это все моё ИМХО, советовать то все умеют, и я тоже

VRV

На сегодня последняя фраза и спать:)
Качать не стал, но глянул видео - интересная штука с больними возможностями.
Но повторюсь- для чб дисплея с макс разрешением 100Х100 сие счасте не обязательно. Тем более что хорошая библиотека меню написана Николлаем. Могу кинуть свою(попроще).
Я ток за арм, тем более сам хотел с ним поработать, да руки не доходят. Но лично у меня ни аппаратных ни програмных инструментов под него нет.
На будущее вижу его ток как основу OSD для полетов по камере, но помойму его также реализовали на меге:)
Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца:)
Да кстати если есть прямая ссылка на сей страшный протокол pcm- кинте, интересно глянуть с чем не сможет справится уарт(а на чем идут последние санвы кстати тоже любопытно?)

EagleB3
VRV:

кстати как кинуть атач с моделю?

Сюда - никак. Файл надо заложить в какое-нибудь файлохранилище (что-то типа depositfiles.com) или слепить сайтик (например, на narod.ru; чисто номинальный - но дадут место под хранение/раздачу файлов) и положить файл туда, а здесь выложить ссылку на файл.

Nick_Shl
Aleksey_Gorelikov:

Николай, посмотри в сторону ДХ5. 40 баксов за корпус с модулем и антеной - весьма неполохо.

Смотрел - нет экрана, а это много слесарщины. Не хочу. Да и не сменные модули тоже не гуд - вдруг когда захочется ещё что-нибуль и на тему радиоканала замутить - по крайней мере с электроникой у меня дела идут лучше, чем моделями 😃.

EagleB3:

Или, как здесь уже советовалось, пристально посмотреть на Тургнигу-“тушку”. … Там же вся тушка $70.

Тоже интересный вариант. Но ещё за доставку почти 30$. Итого 100$. Сейчас у меня такой возможности нет. И ломать работающую вещь будет жалко, а дохлую - нет.

А вообще это был такой тонкий намёк 😃. Если кто может презентовать/продать за символическую сумму дохлый Optic 6 был бы очень признателен…

Aleksey_Gorelikov:

С тем подходом как у фокуса\мсв - экранный буфер много ОЗУ съедает.

Экранный буфер получается 128x64 точек = 8192 бит. Итого 1 kB. Меньше никак. Только если вообще без буфера, но тогда возможно мерцание экрана при отрисовках.

VRV:

Николай, спасибо за ответ по меню. Интересна была прежде всего реализация динамического легко маштабируемого меню. Т.к ответ пришел чуть позже:) успел набросать свою версию.

Просто поздно заметил 😃.

VRV:

Прежде всего не стал использовать структуры с указателями, а использовал статическую таблицу переходов(на мой взгляд получилоссь достаточно наглядно) которая дает представление об иерархии всего меню.
Если будет интересно- скину куски.

Интересно, потому что смысла сказанного я не понимаю 😃. Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).

VRV:

А основная идея управления пульта- отказ от кнопок и использование энкодера.

На счёт этого не знаю. Думаю кнопок + ручек более чем достаточно для управления. А энкодерам место для управления триммерами. Я раньше такую мысль высказывал, а потом оказалось что это не моё ноу-хау - у старших моделей футаб именно так и сделано 😃. Вот только реализовать в железе 4-ре энкодера для управления триммерами не тривиальная задачка…

DD:
  1. Может использовать АРМ

Можно. LPC не плохие. Вот только шаг у них поменьше - боюсь ЛУТ-ом тяжело будет сделать. Нужно либо осваивать фоторезист - это сложно, да и плёночный мне достать сложно, либо заказывать на стороне - а это дорого.

VRV:

До структуры меню Николая конечно далеко, но вроде в своем пока не запутался:).

Хоть кто-то оценил. Приятно однако 😁.

VRV:

Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)

Не тоит забывать про нормализацию кривые и микшеры. Тут может потеряться точность…

VRV:

Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца:)

У меня наоборот - обновление экрана без прерываний. На главном экране 10 раз в секунду - таймер с сотыми секунды 😎. Обновление всего экрана занимает приблизительно 16 мс - тестировал на железе. Генерация импульсов идёт в прерывании. Все остальные задачи сидят на другом таймере. Для них предусмотрена разрешение прерываний что бы генерация импульсов шла без проблем и не реентерабельность, что бы не подвесить пульт.

Про симуляцию: Нафиг! У меня с ней были постоянные проблемы. Отлаживатся на железе нужно. Я использовал STK500 совместимый бутлоадер(могу выложить) + вывод отладочной информации в UART. Для связи использовал USB шнурок от старого телефона с конвертером USB-UART внутри.

DD

VRV
Вот и у меня тоже руки не как не дойдут с АРМ заняться😁
Прямой ссылки на ПСМ нет, я смотрел в исходниках рсджой и смарт пропо плюс,
усарт не справится потому что у него жестко задана структура передачи старт бит данные стоп бит, а вот например в санва ПСМ2 на канал передается 20бит, а за ними еще столько же для второго и тд. Если надо могу выложить свои эксперименты с ПСМ, я санва ПСМ2 съэмулировал на аврке, на этом дело и закончилось😁, я почему то решил что на данный день ПСМ не актуальна и заказал себе корону, вот жду когда приедет

Nick_Shl
Не подскажете какой самый большой шаг у ЛПС, по ЛУТ получает делать платы для FT232R, а у нее шаг 0,65, да и мне кажется что с помощью ЛУТ можно делать платы еще с меньшим шагом, главное терпение.
И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо

VRV
Nick_Shl:

Интересно, потому что смысла сказанного я не понимаю 😃. Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).

У меня наоборот - обновление экрана без прерываний. На главном экране 10 раз в секунду - таймер с сотыми секунды 😎. Обновление всего экрана занимает приблизительно 16 мс - тестировал на железе. Генерация импульсов идёт в прерывании. Все остальные задачи сидят на другом таймере. Для них предусмотрена разрешение прерываний что бы генерация импульсов шла без проблем и не реентерабельность, что бы не подвесить пульт.

Про симуляцию: Нафиг! У меня с ней были постоянные проблемы. Отлаживатся на железе нужно. Я использовал STK500 совместимый бутлоадер(могу выложить) + вывод отладочной информации в UART. Для связи использовал USB шнурок от старого телефона с конвертером USB-UART внутри.

Дело в том что я меню реализовал как статическую таблицу переходов, где хранятся не адреса а номера функций отрисовки экрана(структуры не всегда корректно отображаются в протеусе):



 void InitDisp(void);
  void ShowDisp(void);
  void ShowMainDisp(void );
  void ShowStdMenuDisp(void );
  void ShowSelectModelDisp (void );
  void ShowCopyModelDisp (void );
.......................................................................

#define MainDisp                                    0
       #define MainMenuDisp                         1
                #define ModelMenuDisp               2
                        #define SelectModelDisp     3
                        #define SaveModelDisp       4
                        #define ModelNameDisp       5
                        #define SetTransDisp        6
                #define ControlsMenuDisp            7
                        #define MixerDisp           8
                        #define CurveDisp           9
..............................................................................



flash unsigned char  *MenuTxt[] =
{
  "MENU\0",
    "MAIN\0",
       "Model\0",
       "Select\0",
       "Save\0",
       "Name\0",
       "Trns.\0",
     "Controls\0",
       "Mixers\0",
       "Curve\0",
   .....................................................


flash unsigned char MenuTable[MenuMaxItems][MenuMaxStruct] =
{
//-----------NameMenuDisp-----------|---- ExitDisp-----------|-ExitItem---|--Items--|-IsEndDisp --|----------------- ItemsDisp=MenuMaxDeep-10-------------------------------|
        { MainDisp,                          _NONE_ ,              0,           0  ,       1,            _NONE_,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {  MainMenuDisp,                     MainDisp,             0,           4,         0,            ModelMenuDisp,ControlsMenuDisp,OptionMenuDisp, SaveMenuDisp,_NONE_ },
        {     ModelMenuDisp,                 MainMenuDisp,         0,           4,         0,            SelectModelDisp,SaveModelDisp, ModelNameDisp,SetTransDisp ,_NONE_},
        {       SelectModelDisp,             ModelMenuDisp,        0,      MAX_MODELS,     1,             _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       SaveModelDisp,               ModelMenuDisp,        1,      MAX_MODELS,     1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       ModelNameDisp,               ModelMenuDisp,        2, MAX_MODELS_NAME+1,   1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       SetTransDisp,                ModelMenuDisp,        3,           0,         1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {     ControlsMenuDisp,              MainMenuDisp,         1,           4,         0,            MixerDisp,CurveDisp,ChanelDisp, AdvanceCtrDisp ,_NONE_},
        {       MixerDisp,                   ControlsMenuDisp,      0, MaxControlsNames+1, 1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       CurveDisp,                   ControlsMenuDisp,      1,   CURVE_NODES+1,    1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       ChanelDisp ,                 ControlsMenuDisp,      2,           4,        1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {       AdvanceCtrDisp,              ControlsMenuDisp,      3,           4,        1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {     OptionMenuDisp,                MainMenuDisp,          2,           3,        0,            TimerMenuDisp,BatareyDisp,MonitorDisp ,_NONE_ ,_NONE_},
        {        TimerMenuDisp,              OptionMenuDisp,        0,           0,        1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {        BatareyDisp,                OptionMenuDisp,        1,           0 ,       1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {        MonitorDisp,                OptionMenuDisp,        2,           0 ,       1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {     SaveMenuDisp,                  MainMenuDisp,          3,           3 ,       0,           SaveAllDisp,CopyModDisp ,CopyCtrDisp  ,_NONE_ ,_NONE_},
        {        SaveAllDisp ,               SaveMenuDisp,          0,           1 ,       1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {        CopyModDisp,                SaveMenuDisp,          1,           1 ,       1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
        {        CopyCtrDisp,                SaveMenuDisp,          2,           3 ,       1,            _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_}



};//end menutable

собственно само переключение :



 JoyMenuSelect(); \\ реакция на енкодер

 switch(CurDispState.CurDisp)


      {
      case MainDisp : ShowMainDisp();
      break;
         case MainMenuDisp: ShowStdMenuDisp();
         break;
              case ModelMenuDisp: ShowStdMenuDisp();
              break;
              case SelectModelDisp : ShowSelectModelDisp();
              break;
              case SaveModelDisp: ShowSaveModelDisp();
              break;
              case ModelNameDisp: ShowModelNameDisp();
              break;
         case ControlsMenuDisp: ShowStdMenuDisp();
         break;
........................................................................

По прерываниям spi- по даташиту сосетуют использовать прерывания при высоких значениях предделителя от 64 и выше. Обидно терять циклы для ожидания готовности spi.

На счет железа согласен(пример глюки протеуса при записи еепром), однако мое железо бедет корректироватся в зависимости от реализации программы, а возится с макеткой лень:)

Кстати случайно наткнулся на такой проектик www.smartpropoplus.com/dnn/Home/…/Default.aspx
Правда насколько я понял используется декдирование с помощю аудиокарты.

Texnik
EagleB3:

Файл надо заложить в какое-нибудь файлохранилище

Например, torrents.ru

EagleB3
msv:

Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома.

Глючит. И 7.6SP0 глючит. Он нормально (вроде как) сохраняет/читает с адресов дальше 0x00ff, но не ватчит. Даже через волатил не ватчит.

На всякий случай еще задал вопрос здесь.

Nick_Shl:

Смотрел - нет экрана, а это много слесарщины. Не хочу.

Насчет много слесарщины - в VG400 место “под дисплей” очень тонкое. Я взял дисплей с полупропусканием и подсветкой (TIC154+TB1038S), и пришлось стачивать бортики окантовки (чтобы стекло дисплея поднялось “на себя”). Гравером, вручную, выдерживая равную высоту - это еще то скульптуротворчество. 😵 Потом выровнял “холодной сваркой” - собирался резьбовые стойки вклеить, но толщина слоя там получилась никакая. Вот и пришлось пружины мутить. И еще плюс стачивать понижения под головки винтов на нижней крышке. Так что количество слесарщины вполне сравнимо (КМК) с притыканием дисплея во внешней коробочке.

А с дисплеем во внешней коробочке (корпус от старого пейджера?) можно очень красиво и юзефульно выступить! Навесить дисплей на кронштейне, можно даже с изменяемым углом наклона. Я собирался так сделать, если бы стал врезаться в корпус Сигнала (Алексей Гореликов мне подарил). Он весь такой параллелепипедальный с закругленными гранями - внешний дисплей бы на нем получился очень-очень к месту.

Ну да на вкус и цвет, как говорится…

DD:

А не подскажете где VG400 за 10 евро продают

Я в Москве оторвал. С рук, б/у. Повезло… 😉

vvvv
Nick_Shl:

На счёт этого не знаю. Думаю кнопок + ручек более чем достаточно для управления. А энкодерам место для управления триммерами. Я раньше такую мысль высказывал, а потом оказалось что это не моё ноу-хау - у старших моделей футаб именно так и сделано . Вот только реализовать в железе 4-ре энкодера для управления триммерами не тривиальная задачка…

наконец энкодер вместо кнопок
а нельзя ли сделать как то так что бы все управлялось с одного колеса как в футабе ?

Nick_Shl
DD:

Не подскажете какой самый большой шаг у ЛПС, по ЛУТ получает делать платы для FT232R, а у нее шаг 0,65, да и мне кажется что с помощью ЛУТ можно делать платы еще с меньшим шагом, главное терпение.

Шаг 0,5. Получается ножка 0,25 и межноговое пространство 0,25…
А насчёт терпения: я уже натерпелся когда плату делал. Первая получилась с первого раза а от вторая…

DD:

И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо

Всё очень просто. В CodeVisionAVR есть всё что надо: программатор и терминал. Для прошивки нужно прошить бутлоадер с поддержкой STK500 протокола. Бутлоадер можно взять тут. Компилировать нужно WinAVR. Зашивать в область бутлоадера и прошить фузы с загрузкой через бутблок. Перед компиляцией нужно подрпавить F_CPU в makefile и в коде определения для входа:

#ifdef __AVR_ATmega128__
#define BL_DDR  DDRD
#define BL_PORT PORTD
#define BL_PIN  PIND
#define BL0     PIND5
#define BL1     PIND4

Код немного подправлен, возможна работа только через UART0(можно легко исправить) - он сидит на порту программатора, так что проблем нет.
Далее добавляем код:

// *****************************************************************************
// ***   Работа с COM портом - сгенерирована CodeVisionAVR   *******************
// *****************************************************************************
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1 << FE)
#define PARITY_ERROR (1 << UPE)
#define DATA_OVERRUN (1 << OVR)
#define DATA_REGISTER_EMPTY (1 << UDRE)
#define RX_COMPLETE (1 << RXC)

// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 32
char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0 < 256
    unsigned char rx_wr_index0, rx_rd_index0, rx_counter0;
#else
    unsigned int rx_wr_index0, rx_rd_index0, rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
    char status, data;
    status = UCSR0A;
    data = UDR0;
    if((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0)
    {
        rx_buffer0[rx_wr_index0] = data;
        if(++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0 = 0;
        if(++rx_counter0 == RX_BUFFER_SIZE0)
        {
            rx_counter0 = 0;
            rx_buffer_overflow0 = 1;
        };
    };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
    char data;
    while(rx_counter0 == 0);
    data = rx_buffer0[rx_rd_index0];
    if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0 = 0;
    #asm("cli")
    --rx_counter0;
    #asm("sei")
    return data;
}
#pragma used-
#endif

// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 32
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0 < 256
    unsigned char tx_wr_index0, tx_rd_index0, tx_counter0;
#else
    unsigned int tx_wr_index0, tx_rd_index0, tx_counter0;
#endif

// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
    if(tx_counter0)
    {
        --tx_counter0;
        UDR0 = tx_buffer0[tx_rd_index0];
        if(++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0 = 0;
    };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART0 Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
    while(tx_counter0 == TX_BUFFER_SIZE0);
    #asm("cli")
    if(tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY) == 0))
    {
        tx_buffer0[tx_wr_index0] = c;
        if(++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0 = 0;
        ++tx_counter0;
    }
    else UDR0 = c;
    #asm("sei")
}
#pragma used-
#endif

// *****************************************************************************
// ***   Конец кода работы с COM портом   **************************************
// *****************************************************************************

Он нужен для вывода в UART. Теперь можно выводить отладочную информацию в UART:

#ifdef DEBUG
    printf("MODEL_Init(%d);\r", ModelNum);
    delay_ms(1);
#endif

Большинство проблемных мест так отлаживал. Потому как в Протеусе вообще ничего сделать не могу - как-то он отладку по исходному коду хреново делает. Или глючит. Например вместо линии при некоторых условиях получалась ерунда. Надоело с ним баловался…

VRV:

По прерываниям spi- по даташиту сосетуют использовать прерывания при высоких значениях предделителя от 64 и выше. Обидно терять циклы для ожидания готовности spi.

Ясно. Просто у меня экран с контроллером KS0108, а там 8 бит данных + доп сигналы. Управлять им приходится полностью программно.

VRV:

На счет железа согласен(пример глюки протеуса при записи еепром), однако мое железо бедет корректироватся в зависимости от реализации программы, а возится с макеткой лень:)

Так может с этого и стоит начать? Стделать ТЗ, развести плату, сделать. Разводить с заделом на будущее - все неиспользуемые ноги на разёмы.
После первой сделаете вторую - без всех недостатков 😃. Именно так было у меня. Вначале сделал одну, увидел недостатки и сделал вторую версию.

EagleB3:

Я взял дисплей с полупропусканием и подсветкой (TIC154+TB1038S)

Вот себе хочу именно такую комбинацию, только с TB1025S(белая).Кстати, сколько стоит такая комбинация в $ ?
Жаль что трёхцветных подсветок на такие TICи нет…

EagleB3
Nick_Shl:

Вот себе хочу именно такую комбинацию, только с TB1025S(белая).Кстати, сколько стоит такая комбинация в $ ?

Я брал в “Тритоне”, причем взял и зеленую, и белую - чтобы посмотреть и решить какая лучше. Благо цена на них смешная.
Зеленая имеет приятный салатовый оттенок - ее и решил поставить. Белый мне показался очень холодным, мертвым каким-то.
Все подсветки стоили по $2 +/-30 центов (белая = 63руб, зеленая = 52руб (голубая - столько же). И дисплей 225 руб.

… А можно про бутлоадер популярно в двух словах (или ссылочку)? Никогда такой штукой не пользовался. Что он дает? В чем его прелесть при наличии программатора и разъеме SPI, выведенном наружу в укромном месте? Можно ссылочку на какое-нибудь доходчивое нравоучение?

…Я уже писал здесь где-то, что пользуюсь CVAVR с USB-шным программатором = аналог AVRISP, причем он умеет принимать отладочную информацию по SPI-шинам, тем же, по которым идет внутрисхемное программирование. Так что в любую программу добавляются два малюсеньких кусочка (описание линий и альтернативная функция putchar) + вызов инициализации в main. И все - вывод putchar’ом и printf’ом перенаправляются в SPI. UART камня можно при этом вообще не использовать и не инициализировать.
AStudio с этим программатором тоже прекрасно работает. Она проверяет версию фирмвари подключенных к ней программаторов и ругается, если версия слишком старая. так вот в моем программаторе версия фирмвари меняется из того же терминала: double “Enter”, видим запрос и вводим желаемую версию.

Для ATMEGA8535 первый кусочек выглядит так:


#define MOSI PORTB.5
#define MISO PORTB.6
#define   SCK PORTB.7
#define MMS_OutNull 0b11100000 //MOSI, MISO, SCK = Out, Null


// Declare your global variables here

void init_debug(void)
{
  PORTB=0x00;
  DDRB=MMS_OutNull;     //MISO, MOSI, SCK = Out, Pullup     //0x38
  MOSI=1;               //сигнал MOSI = используется как SS
  delay_us(500);
  MOSI=0;
  delay_us(500);
}

void putchar( char c)
{
  unsigned char n;
  for (n=0;n<8;n++)
  {
    if (c & 1) MISO=1; // сигнал MISO = данные
    else MISO=0;
    SCK=0;             // сигнал SCK = clock
    delay_us(30);
    SCK=1;
    delay_us(30);
    c=c>>1;
  }
}

Одна мелкая неприятность - CVAVR почему-то не любит, когда терминал и программатор на одном COM-порту (а именно так оно в этом случае и получается); при запуске терминала каждый раз выдает предупреждение о возможном конфликте и не реагирует на кнопку Reset в интерфейсе терминала.

P.S. Прошивку программатора я брал из другого места, которое сейчас почему-то недоступно. если кому-то потребуется - пишите, пришлю или выложу.

Nick_Shl
EagleB3:

Я брал в “Тритоне”, причем взял и зеленую, и белую - чтобы посмотреть и решить какая лучше. Благо цена на них смешная.
Зеленая имеет приятный салатовый оттенок - ее и решил поставить. Белый мне показался очень холодным, мертвым каким-то.
Все подсветки стоили по $2 +/-30 центов (белая = 63руб, зеленая = 52руб (голубая - столько же). И дисплей 225 руб.

Ещё жёлтая думаю должна быть симпатичной. Жаль, что у них ничего толком про почту не расписано - боюсь в Беларусь могут и не отправить. Да и со способами оплаты ничего не ясно…

EagleB3:

… А можно про бутлоадер популярно в двух словах (или ссылочку)? Никогда такой штукой не пользовался. Что он дает? В чем его прелесть при наличии программатора и разъеме SPI, выведенном наружу в укромном месте? Можно ссылочку на какое-нибудь доходчивое нравоучение?

С ссылкой сложно. Я искал в поиске. Конкретно про выложенный бутлоадер можно найти глянув в заголовок файлов что я выложил и забив в поисковике. Смысл бутлоадера в том, что бы запускатся перед программой и выполнять какие либо действия перед передачей ей управления. Например обновление прошивки. Это у нас она открытая, а если проект коммерческий, то прошивка должна быть защищена от “пионеров”. Её шифруют, а бутлоадер перед записью дешифрует. Бутлоадер записывается в специальную область. Команды записи во флеш работают только из этой области. Для защиты самого лоадера его область можно закрыть на запись, что бы он сам себя не грохнул.
Теперь про прелесть для нас: 128-ая мега шьётся не через SPI, а через UART. И если вы вывели прошивочный разъём, то вывели и UART. Я же его вывел в виде миниджека на боковую строну. А на кабеле ответный разъём - как у наушников. Количество необходимых проводов уменьшается с 5/6-ти до 3-х.

EagleB3:

…Я уже писал здесь где-то, что пользуюсь CVAVR с USB-шным программатором = аналог AVRISP, причем он умеет принимать отладочную информацию по SPI-шинам, тем же, по которым идет внутрисхемное программирование.

Сразу минус: всё программно. У меня же UART работает по прерываниям - меньше вносимые погрешности.

EagleB3:

Одна мелкая неприятность - CVAVR почему-то не любит, когда терминал и программатор на одном COM-порту (а именно так оно в этом случае и получается); при запуске терминала каждый раз выдает предупреждение о возможном конфликте и не реагирует на кнопку Reset в интерфейсе терминала.

Есть такое, но в версии 2 меня как-то не особо напрягает. Главное закрыть терминал перед открыванием программатора и наоборот…

Евгений_Зайцев

У меня другая мысль была по поводу использования UART - сохрянять и восстанавливать настройки передатчика на компьютере. Или передавать на другой передатчик. У меня передатчика два, работают в режиме тренер-ученик. Было бы здорово иметь возможность передавать настройки. Для обмена между передатчиками вообще ничего кроме проводов не надо, а для обмена с компом нужен либо преобразователь уровней, либо радикальнее сразу переходник со специализированной микросхемой для подключения в USB.