Например TDA7294

Форум РадиоКот • Просмотр темы - In vino veritas
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 18:54:56

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 1081 ]     ... , , , 25, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 18, 2018 17:06:35 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Схемка вроде с первого взгляду ... хотя...
Питать матрицу лучше от плюса (общий анод), а в качестве промежуточных ключей использовать ULN2803.
Так и нагрузку (в части силовых токов) распределить проще и возможность мультиплексирования для увеличения количества знакомест сразу закладывается.
Со схемкой и объяснялка будет.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 18, 2018 17:24:27 
Друг Кота
Аватар пользователя

Карма: 123
Рейтинг сообщений: 7955
Зарегистрирован: Сб сен 13, 2014 16:27:32
Сообщений: 39199
Откуда: СпиртоГонск созвездия Омега
Рейтинг сообщения: 0
зкладка думаю неудобная у Вас ставит регист и выводить даные на него в в статике като не фэншуйно
даи когда будете выводить все 6 разрядов ЧЧ-ММ-СС возникнут проблемки-наверняка-слишком много ножек и длиных будет там

_________________
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 18, 2018 17:39:33 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Для начала КОТЕНКУ хотя-бы секундомер с минутками/секундами.
Дабы укусить и не подавиться - а там при надлежащем усердии и аккуратности сам во вкус войдет.
8)
Посему стартуем от этой схемки
http://img.radiokot.ru/files/20529/1ja2nyvfh1.GIF
как будет готова описалка/прожка-затравка положу.
А пока... на изучение начинающему КОТЕЙКУ.
В схемке сразу и раскладка для удобства монтажа заложена и возможность "высоковольтного" питания светиков и возможность мультиплекса по анодам.
Для всяческих расширений просто выкусываем оранжевую линию по + питания и делаем соответствующие добавки.
В прожке будут выставлены условные имена согласно схемки.
:beer:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 18, 2018 17:45:29 
Друг Кота
Аватар пользователя

Карма: 123
Рейтинг сообщений: 7955
Зарегистрирован: Сб сен 13, 2014 16:27:32
Сообщений: 39199
Откуда: СпиртоГонск созвездия Омега
Рейтинг сообщения: 0
2803 это редкая чипа ее еще поискать лучше пот unl2003 заложить ее должно хватать даже на ИВЛ вместо светикоф подтянув к 27в держит легко играючи можнои выше (но не нужно)кстати защитные диоды можно исползовать на гашение садиш на землю и все тухнет

_________________
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 18, 2018 18:44:58 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Там лапок маловато - 2803 = 8 каналов, а 2003 всего шерсть.
Да собственно и не столь важно ее наличие в физическом виде. Заменяется на сборку транзисторов.
musor это ведь УЧЕБНЫЙ МАТЕРИАЛ ДЛЯ СОВСЕМ НАЧИНАЮЩЕГО КОТЕНКА.
Пусть лучше от него (migvu) вопросы идут - буду уточнять по мере их (вопросов) поступлению.
:wink:
Сейчас более важен сам вариант составления прожки для начинающего - чего как и в какой последовательности делается.
И как собственно в одном исходнике сделать возможной подстройку под любой вариант схемной обвязки.
Возьмем за цель для начала обыкновенный индикатор, который считает секунды и минуты с выводом на статический дисплей.
Самый правый разряд (DISP0) - единицы секунд и далее справа налево по наростающей десятки секунд, единицы минут и десятки минут.
ММ:СС (но получится скорее ММ.СС)
Для прожки создадим проектную заготовку (у меня на основе AVRSTUDIO 4.19)
Вложение:
tiny13prj.rar [59.12 KiB]
Скачиваний: 132

А далее ...
Собственно генератор МК лучше выбрать на 9,6 МГц - он "по умолчанию" при выпуске с завода фузами установлен.
Основное преимущество по сравнению с 4,8 (второй режим генератора) - для 9,6 МГЦ калибровочная константа для RC-генератора загружается АВТОМАТИЧЕСКИ при запуске МК, а в случае с 4,8 ее надо предварительно вычитывать и вводить вручную.
Коэффициенты деления для получения опорной сетки частот выбираем самостоятельно.
Теперь насчет базового генератора (сердчишко секундомера и всех возможных конструкций)...
Используем предделитель главного генератора и таймер Т0.
Затем два байта ОЗУ в качестве счетчиков секунд и минут, возможно потребуется буфер вывода и блок перекодировки а также блок загрузки регистрового файла.
Это следующий этап "на подумать".
Уполз готовить.
:write:
:beer:

Начнемсс с "декларации о намерениях" - суть программы своими словами:

Конфигурация ядра
Генератор - встроенный RC-генератор 9,6 МГц
--- определяется набором фузее бит
сброс определяем как power-on-reset
Clkpr - Системный предделитель – «по умолчанию» (/8) не трогаем
Osccal - не трогаем – для 9,6 МГц будет загружен автоматически
Система BOD определена фузее-битами
WDT отключен с возможностью программного включения
Аналоговый компаратор отключен при ACSR.ACD=1 (установить в программе)
АЦП отключен по умолчанию
Didr0 = 0 по умолчанию
Указатель стека автоматически загружается адресом конца ОЗУ
Режимы порта вывода настраиваем соответственно задаче.
Таймер Т0
Режим СТС
Константа досчета =150
Предделитель = 8
Результирующее прерывание каждые 0,001S
Конфигурируем прерывания
Далее загружаем начальные значения в счетчики
Заводим «обнулялку» в регистровый файл.
Запускаем счет таймера…
Наслаждаемся картинкой.

Далее следуют утилитки:
1. подпрограмма вывода данных в регистровый файл;
2. подпрограмма преобразования байта в две тетрады (единицы и десятки);
3. подпрограмма преобразования тетрады в сегментный код;
4. собственно счетчик секунд в диапазоне от 00:00 до 59:59

вроде как все...
:roll:
Остается толко все это описать на ассемблере в рамках вышепредставленного "шкелета"
:write:


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 09:14:14 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Ср окт 26, 2016 08:30:43
Сообщений: 191
Откуда: Омск
Рейтинг сообщения: 0
Очень интересное начало! Есть для меня не совсем понятные детали с которыми я ещё не сталкивался. Такие как макросы. Имею поверхностное представление , так как ещё с ними не работал на практике. С таймерами тренировался так что настроить таймер могу. С англиским у меня туго так что даташиты читаю по буквам и не всегда понимаю чего прочитал. Переводчик иногда только ещё больше затрудняет понимание сути дела! Также не имел дела с добавлением файлов Не понял о чём идёт речь вот в этом коментарие " вместо name project подставляется имя файла соответствующего проекта шаблоны имеют name project = proto ".

Добавлено after 9 minutes 21 second:
Пользуюсь Atmel Studio 6.2. Думаю что приобрету много нового изучая этот проект! Потихоньку буду разбираться если что буду громко мяукать!! :))) С нетерпением жду полного кода для изучения. Огромное СПАСИБО что делитесь опытом с чайника-котами!!! :beer:

_________________
Лучше семь раз покрыться потом , чем один раз инеем!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 09:53:38 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Это шаблон-заготовка (proto\shaps_tn13prj.asm)- потому там и поставлен комментраий - обобщение.
Поскольку у АВРок биты конфигурации в состав выходного файла не включаются был сделан шаблон заголовок по аналогии с ПИКовыми. В верхней части описание фузов конфигурации и их назначения, чуток пониже то, что нужно вручную на программаторе вводить.
В этом шаблоне также подготовлены строчки для обязательных подключаемых файлов (чтоб не перегружать текст лишними буковами и не мудрить с опциями линкера был выбран метод подстановки текстовых файлов).
Конкретика ставится в прикладном файлике tn13.asm - в основной папке проекта:
файлик заводских дефайнов tn13Adef.inc (продублирован в папке baseinc\tn13Adef.inc),
файлик собственных дефайнов (общий на весь проект) librus\map_def_t13.txt
и файлик макросов общего назначения librus\mac_t13.txt
Далее на усмотрение - или добавляем "вкладыш" с текстом или напрямую дописываем свой текст в tn13.asm - зависит от объёма текста и личных предпочтений.
Собственно МАКРОС это участок программного текста, который подставляется во все места в основном тексте программы, где этот макрос указан.
Весьма часто применяется для "дополнительных команд-самоделок".
Описание МК на русском есть в СУНДУКЕ КОТА
https://sunduk.radiokot.ru/loadfile/?load_id=1287391092
и
https://sunduk.radiokot.ru/loadfile/?load_id=1472824691
ну и множество книжек на сайтах
http://elektromehanika.org
и
http://publ.lib.ru/publib.html
8)
Знание английского (минимум со словарем) ОБЯЗАТЕЛЬНО.
Иначе ни электронику ни МК не освоить.
(Желательно и немецкий с чешским и прочими...)
:beer:
Постараюсь по последовательным "полочкам" написание проекта разложить. Возможно не сразу и не слишком быстро - надоть и работать иногда. :wink:
:write:
Воть ешшо "шпоргалка" по системе команд
Вложение:
шпора AVR.pdf [60.25 KiB]
Скачиваний: 102

Для относительно быстрого восприятия всего имеющегося арсенала
(в то же время не отменяет instruction set manual 0856J-AVR-07/2014).
:beer:

Вот собственно нашкарябался базовый остов тик-так генератора
Вложение:
tiny13prj.zip [108.09 KiB]
Скачиваний: 137

Эта прожка просто периодически отрабатывает прерывания в симуляторе IDE.
8)
Теперь можно и собственно к остальной части проекта приступить
- счетчики секунд, минут счетчик досчета секунды и перекодировщик-загрузчик регистров.
Вариантов решения довольно много.... посмотрим на каком остановлюсь...
:write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 13:38:42 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Ср окт 26, 2016 08:30:43
Сообщений: 191
Откуда: Омск
Рейтинг сообщения: 0
Наверно лучше остановиться на том ,что попроще для вкуривания :)))

Добавлено after 7 minutes 33 seconds:
Книга Евстифеева А.В. у меня есть в бумажном виде ( я с бумаги лучше понимаю материал) И ещё кучу книг накупил . Но там нет боле менее серьёзных проектов . Дрыгать ногами уже слегка научился. Наделал тестовых платок на Attiny13a ,attiny2313a, Atmega8a. По мере необходимости к ним цепляю разные модули .

Добавлено after 3 minutes 28 seconds:
Шпора хорошая к ней надо привыкнуть (похожа на таблицу Менделеева!)

_________________
Лучше семь раз покрыться потом , чем один раз инеем!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 14:15:24 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Только основой у меня были MCS51/I8080/Z80 - у тех таблички кодирующие - можно сразу карандашиком машинный код на бамажке писать (без всяких компов). У современных такая табличка всего лишь подсказка чем из имеющегося арсенала можно воспользоваться и какие ограничения могут возникнуть.
8)
Собственно по возможному направлению прожки...
Можно обработчик секундомера в прерывание втиснуть - но... тогда надо жестко стек отслеживать.
Чаще всего применяется флаг-маркер (тогда никакого усложнения по стеку в прерывании не требуется) и проще просчитать коррекцию на реакцию на прерывание - повысить точность хода корректировкой содержимого OCR0A.
Собственно сами счетчики или в регистровом файле(R0-R31) размещаются (малая модель программы) или растыкиваются в ОЗУ, а ресурсы регистрового файла используются под системные ресурсы. Во втором случае при вызове обработчика дополнительно используется стек для хранения содержимого используемых текущей подпрограммой ресурсов.
Метод более медленный, но и более гибкий.
Обычно для примитив-часиков используется первый вариант - "все регистры в R0-R31" - места вполне достаточно... Однако...как-то "приелось"...
Для куражу воткну в прожке второй вариант (основные ресурсы в ОЗУ) - там возможностей для трансформации прожки по мере роста аппетита больше будет.
:roll:
:write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 17:18:32 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Ср окт 26, 2016 08:30:43
Сообщений: 191
Откуда: Омск
Рейтинг сообщения: 0
Согласен на любой вариант. Главное чтоб в процессе программного марафона я на хвосте висел и не сильно перегревался от умственной работы! :)))

Добавлено after 31 minute 21 second:
Посмотрел приложенные файлы. Что то понятно что то совсем не понятно. Чётко понял что имеются большие дыры в моих знаниях. Попробую вникнуть

_________________
Лучше семь раз покрыться потом , чем один раз инеем!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 18:36:26 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ну то, что я последнее время выкладываю вобщем-то тоже в некотором роде "слэнг, приближенный к желаемому".
Пример "истинно многофайлового" проекта на ассемблере найти можно разве что у профи-разработчиков...
И то там строчки линкера потребны (в зависимости от семейства МК и компилятора). А особенности линкеров учить...
Для любителя хотя-бы слэнг переварить.
:beer:
Пока проект "в процессе зловредных размышлений"
8)
:write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Пн мар 19, 2018 22:22:37 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Ср окт 26, 2016 08:30:43
Сообщений: 191
Откуда: Омск
Рейтинг сообщения: 0
Буду учиться. Пока мне Ассемблер нравится .это как игра в шахматы 16 фигур и сотни тысяч комбинаций! Так и тут кучка команд и крутись как сможешь и как запасной ферзь всякие штуки в виде прерываний и разной периферии. :beer:

Добавлено after 2 hours 3 minutes 59 seconds:
BOB51 Вы какую прогу используете для рисования схем?

_________________
Лучше семь раз покрыться потом , чем один раз инеем!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вт мар 20, 2018 09:41:56 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 1
Для схем - splan8
печатки - layout6.0
внешние редакторы текстов DPAD (4 и 5я версии).
Могу сбросить на почтовик "вложенным файлом".
8)

Вот и грубочерновик тикалки нашкарябался
Вложение:
tiny13prj.zip [114.88 KiB]
Скачиваний: 159

после включения индикаторы погашены, затем начинается индикация с изменением содержимого каждую секунду.
В симуляторе АВР IDE правда строб данных не виден... Но то не слишком уж проблемно.
Занято всего 410 байт ПЗУ (включая таблицу сегментных кодов). Так что есть место для "вариаций".
:wink:
Все файлы приведены к единой кодировке относительно кириллицы - так что ВСЕ комментарии на листинге будут без "кракозябр".
В предыдуших версиях немного "недоглядел" прыгая с компа на комп.
:oops:
Как разбросать текст по файлам ("вылизать"/оптимизировать) то... надо абы чуток "отлежалось" - да и у каждого свой вариант обычно находится.
Далее можно прожку/схемку и модернизировать - добавлять кнопы, мигалки и прочие "плюшки".
А заодно потренироваться на внесении изменений/дополнений.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вт мар 20, 2018 15:14:06 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 2
Рейтинг сообщений: 13
Зарегистрирован: Ср окт 26, 2016 08:30:43
Сообщений: 191
Откуда: Омск
Рейтинг сообщения: 0
BOB51 Скачал , посмотрел , откуда хвост растёт не понял! Буду детально разбираться. Спасибо за помощь в обучении !!!

_________________
Лучше семь раз покрыться потом , чем один раз инеем!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вт мар 20, 2018 19:17:42 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Собственно основная програма (hs_init.txt) содержит инициализацию железа и начальные процедуры программной инициализации МК.
В файлике sekmetr.txt собственно сам секундомер, преобразователь бинарного байта в две двоично-десятичных тетрады, табличный перекодировщик тетрада->байт сегментного кода и подпрограмма загрузки байта в регистр 595 (загрузка там комплектом - сразу все четыре байта сегментного кода из ОЗУ).
Собственно в прожке и макросы и таблица в ПЗУ и преобразователь двоичный->двоично/десятичный формат (математика).
Сами макросы расположены в файле mac_t13.txt. Чтобы увидеть развертку макросов в листинге нужно раскомментировать строку 77 файла tn13.asm и заново запустить компиляцию. На всякий случай листинг с раскрытыми макросами добавлю тут:
Спойлер
Код:
AVRASM ver. 2.1.42  D:\AVR_projekt\tiny13prj\tn13.asm Tue Mar 20 20:14:39 2018

D:\AVR_projekt\tiny13prj\tn13.asm(69): Including file 'C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc'
D:\AVR_projekt\tiny13prj\tn13.asm(72): Including file 'D:\AVR_projekt\tiny13prj\librus\map_def_t13.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(73): Including file 'D:\AVR_projekt\tiny13prj\librus\mac_t13.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(90): Including file 'D:\AVR_projekt\tiny13prj\librus\hs_init.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(91): Including file 'D:\AVR_projekt\tiny13prj\librus\sekmetr.txt'
                 
                 
                 ;      hider file for ATtiny13 chip
                 ;      version 1.02 KOBRA softvare
                 ;        for version2 assembler!
                 ;----------
                 ;
                 ;   Projekt _______
                 ;   Filename ______
                 ;   File version __
                 ;   Autor _________
                 ;
                 ;----------
                 ; основная конфигурация:
                 ;
                 ; CKDIV8=0 (по умолчанию внутр. rc-генератор 9,6 МГц
                 ;            clkps 3-0 = 0011 /коэффициент деления=8/ )
                 ;         изменение значения в слове конфигурации
                 ;         затрудняет дальнейшее репрограммирование ИС
                 ;   предпочтительно изменение коэффициента в clkps 3-0 программой пользователя!!!
                 ; SUT1:SUT0=10(умолч.max) определяет длительность задержки сброса
                 ;    режим работы тактового генератора :
                 ; CKSEL1:CKSEL0=10 (умолч.) внутр.r-c генератор 9,6МГц
                 ;                01 внутр. r-c генератор 4,8МГц
                 ;
                 ;         ВНИМАНИЕ!!!
                 ; В области сигнатуры ATtiny13A размещаются два байта
                 ; калибровочных констант для внутреннего RC генератора.
                 ; Старший байт по адресу 0х00 содержит калибровочную константу
                 ; для работы генератора на частоте 9.6 MHz. Данная константа
                 ; будет автоматически загружена в OSCCAL по окончании сигнала сброса.
                 ; Автоматическая загрузка калибровочной константы
                 ; для работы генератора на частоте 4.8 MHz НЕ ВЫПОЛНЯЕТСЯ!
                 ; Чтение, хранение и загрузка калибровочной константы
                 ; для работы внутреннего RC генератора на частоте 4.8 MHz
                 ; должны выполняться прикладной программой.
                 ; Калибровочная константа для работы генератора на частоте 4,8 MHz
                 ; размещена в старшем байте поадресу 0х01 в области сигнатур.
                 ;
                 ; DWEN=1 отладка gebugWire запрещена (0-разрешена)
                 ; EESAVE=1 общее сирание и EEPROM - 1 стирает, 0 не стирает
                 ; SPIEN=0 последовательное программирование разрешено (1-запрещено)
                 ; WDTON=1 WDT может быть выключен программно (0-всегда включен)
                 ; SELFPRGEN=1 самопрограммирование (команда SPM) запрещено (0-разрешено)
                 ; BODLEVEL1:BODLEVEL0=11 (выключена)
                 ;    порог срабатывания схемы BOR (обязательно восстановить то, что было до программирования,
                 ;если не предусмотренно иное значение согласно прикладной программы)
                 ; RSTDISBL=1 вывод RST как вход сброса (0- только при наличии "высоковольтного программатора!!!)
                 ;
                 ;конфигурационные ячейки могут быть записаны только при помощи
                 ;программатора,а прочитаны как программатором,так и командой LPM.
                 ;общее стирание ИС на содержимое конфигурационных ячеек не влияет
                 ;_____
                 ;
                 ; выбрана текущая конфигурация проэкта:
                 ;
                 ; CKDIV8=0 (по умолчанию внутр. rc-генератор 9,6 МГц
                 ;            clkps 3-0 = 0011 /коэффициент деления=8/ )
                 ; SUT1:SUT0=10 (умолч.max) определяет длительность задержки сброса
                 ; CKSEL1:CKSEL0=10 (умолч.) внутр.r-c генератор 9,6МГц
                 ; DWEN=1 отладка gebugWire запрещена
                 ; EESAVE=1 общее сирание и EEPROM - 1 стирает
                 ; SPIEN=0 последовательное программирование разрешено
                 ; WDTON=1 WDT может быть выключен программно
                 ; SELFPRGEN=1 самопрограммирование (команда SPM) запрещено
                 ; BODLEVEL1:BODLEVEL0=11 (выключена)
                 ; RSTDISBL=1 вывод RST как вход сброса (0- только при наличии "высоковольтного программатора!!!)
                 ;----------
                       .list
                 ; ----------
                   .include "librus\map_def_t13.txt" ; файл объявленных имен, бит и констант
                 
                 ;         "map_def_t13.txt"  файл объявленных имен, бит и констант (шаблон)
                 ;
                 ;----------
                 ; variable definitions
                 ;(таблица обьявленных имен)
                 ;_____
                 ;таблица обьявленных имен - пользовательские константы
                 ;
                 ;   .equ name/label = const / expr
                 ;             define datas
                  .equ port_out = PORTB ; порт вывода (по усмотрению)
                  .equ DATO_ln = 0 ; линия вывода данных прямой уровень
                  .equ CLC_ln = 1 ; линия строб-импульса активный уровень 1
                  .equ WR_ln = 2 ; линия строба записи активный уровень 1
                  .equ sg_A = 0 ; позиционный номер сегмента sg_A
                  .equ sg_B = 1 ; позиционный номер сегмента sg_B
                  .equ sg_C = 2 ; позиционный номер сегмента sg_C
                  .equ sg_D = 3 ; позиционный номер сегмента sg_D
                  .equ sg_E = 4 ; позиционный номер сегмента sg_E
                  .equ sg_F = 5 ; позиционный номер сегмента sg_F
                  .equ sg_G = 6 ; позиционный номер сегмента sg_G
                  .equ sg_H = 7 ; позиционный номер сегмента sg_H (запятая)
                  .equ DISP0 = 0 ; позиционный номер дисплейной матрицы единиц секунд
                  .equ DISP1 = 1 ; позиционный номер дисплейной матрицы десятков секунд
                  .equ DISP2 = 2 ; позиционный номер дисплейной матрицы единиц минут (сотен)
                  .equ DISP3 = 3 ; позиционный номер дисплейной матрицы десятков минут (тысяч)
                  .equ over60 = 60 ; константа переполнения "более 59" единиц
                  .equ div150 = 150 ; константа для OCR0A
                  .equ tik_tak = 1<<CS01 ; константа пуска Т0
                            ; системная частота *8
                  .equ cnts_l = 200 ; константа младшего счетчика досчета секундомера
                  .equ cnts_h = 5 ; константа старшего счетчика досчета секундомера
                 
                 ;_____
                 ;таблица обьявленных имен - переназначение регистров РОН
                 ;
                 ; регистры R26-R31 заранее объявлены как X,Y и Z
                 ; R31:R30=ZH:ZL (Z)
                 ; R29:R28=YH:YL (Y)
                 ; R27:R26=XH:XL (X) ;
                 ;
                  .def Bh = r25 ; регистр (полный)
                  .def Bl = r24 ; регистр (полный)
                  .def flags = r23 ; регистр (полный (tmp7)) systems flags
                  .def tmp6 = r22 ; регистр (полный)
                  .def tmp5 = r21 ; регистр (полный)
                  .def tmp4 = r20 ; регистр (полный)
                  .def tmp3 = r19 ; регистр (полный)
                  .def tmp2 = r18 ; регистр (полный)
                  .def tmp1 = r17 ; регистр (полный)
                  .def tmp0 = r16 ; регистр (полный)
                  .def shr_sreg = r15 ; регистр (урезан) РВХ SREG
                  .def tic_cnth = r14 ; регистр (урезан (regn)) старший счетчик досчета секундомера
                  .def tic_cntl = r11 ; регистр (урезан (regn)) младший счетчик досчета секундомера
                 ; .def regn = r10 ; регистр (урезан)
                 ; .def regn = r9 ; регистр (урезан)
                 ; .def regn = r8 ; регистр (урезан)
                 ; .def regn = r7 ; регистр (урезан) dark_zh
                 ; .def regn = r6 ; регистр (урезан) dark_zl
                 ; .def regn = r5 ; регистр (урезан) dark_yh
                 ; .def regn = r4 ; регистр (урезан) dark_yl
                 ; .def regn = r3 ; регистр (урезан) dark_xh
                 ; .def regn = r2 ; регистр (урезан) dark_xl
                 ; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
                 ; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
                 ;_____
                 ;таблица обьявленных имен - секция флагов пользователя
                 ;
                 ; .equ name/label = expr
                 ;
                 ; флаги в регистре flags
                    .equ tim_tik = 0 ; передаточный флаг генератора тайм-сетки
                    .equ en_sek = 1 ; флаг "счет секундомера разрешен"
                    .equ min_plus = 2 ; флаг "требуется приращение счетчика минут"
                 
                 
                 
                 ;_____
                 ;таблица обьявленных имен - секция определенных данных (ОЗУ)
                 ;
                   .dseg
                     .org SRAM_START
                 ;
                 ; label: .byte expr
000060              sekond: .byte 1 ; счетчик секунд
000061              minut:  .byte 1 ; счетчик минут
000062              vram:   .byte 4 ; буфер вывода (сегментный код)
                 
                 
                 
                 ;_____
                 ;таблица обьявленных имен - секция определенных данных (EEPROM)
                 ;
                   .eseg
                 ; label: .byte expr
                   .include "librus\mac_t13.txt" ; файл описания макросов
                 
                 ;         "mac_t13.txt" ; файл описания макросов (шаблон)
                 ;
                  .macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром"
                      eor @0,@1 ; вызывается как xchrr rd,rs
                      eor @1,@0
                      eor @0,@1
                   .endmacro
                 ;
                  .macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/"
                      ldi @0l,low(@1) ; вызывается как ldwi rp,0xnnnn или ldiw rp,name (где name=0xnnnn, rp=x,y,z)
                      ldi @0h,high(@1)
                   .endmacro
                 ;
                  .macro strob ; строб-импульс поддержки данных загрузчика 595
                    sbi PORTB,CLC_ln
                    nop
                    cbi PORTB,CLC_ln
                    nop
                   .endmacro
                 ;
                  .macro trsbt ; пересылка бита
                     sbrs tmp0,@0 ; вызывается как trsbt number  где number = номер перемещаемого бита
                     cbi PORTB,DATO_ln
                     sbrc tmp0,@0
                     sbi PORTB,DATO_ln
                     nop
                   .endmacro
                 ;    вместо name project подставляется имя файла соответствующего проекта
                 ;           шаблоны имеют name project = proto
                 ;_____
                    .listmac ; раскрытие макросов в листинге (только функционал отладки)
                 ;
                   .cseg
                       .org 0x000
                    irq_res:
000000 c009            rjmp init ; переход к началу программы инициализации системы
                 ; - - - - - - - - - - - - - - - - - - - - - - - - - - -
                 ; блок размещения векторов активных прерываний
                       .org OC0Aaddr
                    irq_t0:
000006 c027            rjmp tiks ; переход на обработчик прерывания tiks
                 ; - - - - - - - - - - - - - - - - - - - - - - - - - - -
                 ;_____
                   .include "librus\hs_init.txt" ; файл начальной инициализации МК и софта
                 
                 ; файл начальной инициализации железа и софта
                 ;     "hs_init_1.txt"
                 
                    .org (irq_res+int_vectors_size) ; обход блока векторов прерываний
                       init:                    ;блок начальной инициализации кристалла
                 ;Собственно начало проекта надо делать с конфигурации ядра МК.
                 ;Описываем просто словами чего хотим.
                 
                 ;----------
                 ;Конфигурация ядра:
                 ;Генератор  - встроенный RC-генератор 9,6 МГц
                 ;сброс определяем как power-on-reset
                 ;Clkpr - Системный предделитель - <по умолчанию> (/8) не трогаем
                 ;Osccal - не трогаем - для 9,6 МГц будет загружен автоматически
                 ;Система BOD определена фузее-битами
                 ;WDT отключен с возможностью программного включения
                 ; - определяется выбранным набором фузее бит
                 ;----------
                 ;АЦП отключен по умолчанию
                 ;Didr0 = 0 по умолчанию
                 ;Указатель стека автоматически загружается адресом конца ОЗУ
                 ;----------
                 ;отключить аналоговый компаратор
00000a 9a47          sbi ACSR,ACD
                 
                 ;Режимы порта вывода настраиваем соответственно задаче.
00000b ef08          ldi tmp0,~(1<<DATO_ln | 1<<CLC_ln | 1<<WR_ln)
00000c bb08          out PORTB,tmp0 ; защелки выходных сигналов приводим к 0
00000d 9500          com tmp0
00000e bb07          out DDRB,tmp0 ; выводы настраиваем как выходы
                                 ; с исходным уровнем =0
                 ; поскольку по умолчанию MCUCR.PUD=0 то для остальных выводов
                 ; сконфигурированных как входы с содержимым защелок =1
                 ; будет реализована "подтяжка к 1"
                 
                 ; настраиваем режим СТС таймера Т0
                 ; генерация прерывания по OCF0A каждые 0,001S
00000f e906         ldi tmp0,div150
000010 bf06          out OCR0A,tmp0 ; загрузка константы досчета
000011 2700          clr tmp0
000012 bf02          out TCNT0,tmp0
000013 bf03          out TCCR0B,tmp0
000014 e002          ldi tmp0,1<<WGM01
000015 bd0f          out TCCR0A,tmp0 ; константы загружены, режим СТС установлен
                                ; таймер в отстанове/ожидании
                 
                 ; Конфигурируем прерывания
000016 e004         ldi tmp0,1<<OCIE0A
000017 bf09         out TIMSK0,tmp0
                 ; остается только разрешить прерывания
                 ;     sei
                 ; и запустить таймер
                 ;     ldi tmp0,tik_tak
                 ;     out TCCR0B,tmp0
                 ;----------
                 ;
                 ; загружаем начальные параметры для работы секундомера
                 ;  "soft init"
                  sf_init:
000018 ec08            ldi tmp0,cnts_l ; cnts_l=200
000019 2eb0                mov tic_cntl,tmp0 ; загрузка младшего счетчика досчета
00001a e005               ldi tmp0,cnts_h ; cnts_h=5
00001b 2ee0                mov tic_cnth,tmp0 ; загрузка старшего счетчика досчета
                +
00001c e6a0     +ldi xl , low ( sekond )
00001d e0b0     +ldi xh , high ( sekond )
                           ldiw x,sekond
00001e 2700                clr tmp0
00001f 930d                st x+,tmp0
000020 930d                st x+,tmp0
000021 930d                st x+,tmp0
000022 930d                st x+,tmp0
000023 930d                st x+,tmp0
000024 930d                st x+,tmp0 ; очистка ОЗУ
000025 d055               rcall print ; очистка/гашение дисплея
000026 6072               sbr flags,1<<en_sek ; разрешаем счет en_sek=1
000027 9478            sei ; прерывания разрешены
000028 e002             ldi tmp0,tik_tak
000029 bf03           out TCCR0B,tmp0 ;таймер активирован
                  wt_stop:
00002a ff70           sbrs flags,tim_tik
00002b cffe          rjmp wt_stop
00002c d003            rcall sekmetr ; при tim_tik=1 отработать приращение секундомера
00002d cffc         rjmp wt_stop
                 ;
                 ;----------
                 ; собственно заглушка обработчика прерывания
                   tiks:
00002e 6071           sbr flags,1<<tim_tik ; установка передаточного флага tim_tik=1
00002f 9518           reti
                   .include "librus\sekmetr.txt" ; секундомер
                 
                 ; файл подпрограммы секундомера
                 ;     "sekmetr.txt"
                 ;
                 ; вход по rcall sekmetr
                 ;
                  sekmetr:
000030 7f7e          cbr flags,1<<tim_tik ; сброс передаточного флага тайм-сетки
000031 ff71          sbrs flags,en_sek ; исполнение только при en_sek=1
000032 9508          ret ; выход при запрете счета - en_sek=0
000033 94ba            dec tic_cntl ; tic_cntl=tic_cntl-1
000034 f009            brbs SREG_Z,loop_cntsh
000035 9508            ret ; выход, если нет переопустошения tic_cntl
                  loop_cntsh:
000036 ec08                ldi tmp0,cnts_l ; cnts_l=200
000037 2eb0                mov tic_cntl,tmp0 ; перезагрузка младшего счетчика досчета
000038 94ea            dec tic_cnth ; tic_cnth=tic_cnth-1
000039 f009          brbs SREG_Z,loop_cntss
00003a 9508          ret ; выход, если нет переопустошения tic_cnth
                  loop_cntss:
00003b e005                ldi tmp0,cnts_h ; cnts_h=5
00003c 2ee0               mov tic_cnth,tmp0 ; перезагрузка старшего счетчика досчета
                  sek_plus:
00003d 9100 0060          lds tmp0,sekond ; читаем секундомер
00003f 9503               inc tmp0 ; tmp0=tmp0+1
000040 330c               cpi tmp0,over60 ; неразрушающее сравнение с константой
000041 f010                brbs SREG_C,point11 ; при С =1 счетчик менее 60 - идем к point11
                             ; при С =0 имеем переполнение: tmp0=>60
000042 2700                  clr tmp0 ; сбросить темп0
000043 6074                  sbr flags,1<<min_plus ; установить флаг приращения минут и идем к point11
                 point11:
000044 9300 0060          sts sekond,tmp0 ; возвращаем значение в секундомер
                +
000046 e6a2     +ldi xl , low ( vram )
000047 e0b0     +ldi xh , high ( vram )
                         ldiw x,vram ; загрузка начала видеоОЗУ в указатель Xh:Xl
000048 d00e            rcall decod ; отрабатываем перекодировку в разрядах секунд
000049 ff72             sbrs flags,min_plus ; если приращения для счетчика
00004a c00a            rjmp point12 ; минут небыло продолжаем от point12
00004b 7f7b             cbr flags,1<<min_plus ; min_plus=0
                  minuta:
00004c 9100 0061      lds tmp0,minut ; читаем счетчик минут
00004e 9503           inc tmp0 ; tmp0=tmp0+1
00004f 330c               cpi tmp0,over60 ; неразрушающее сравнение с константой
000050 f008           brbs SREG_C,point14 ; при С =1 счетчик менее 60 - идем к point14
                             ; при С =0 имеем переполнение: tmp0=>60
000051 2700               clr tmp0 ; и перенос в счетчик часов при наличии
                  point14:
000052 9300 0061     sts minut,tmp0 ; возвращаем значение в счетчик минут
                        ; текущее значение в X соответствует vram+3
000054 d002           rcall decod ; отрабатываем перекодировку в разрядах минут
                  point12:
000055 d025         rcall print ; выполнить загрузчик регистрового файла
000056 9508        ret
                 
                 ;
                 ;
                 ;
                 ;
                 ;----------
                 ; преобразование двоичного кода счетчика секунд/минут
                 ; из байта в два байта сегментного кода, соответствующих десяткам и единицам
                 ; его десятичного эквивалента
                 ;
                  decod:
000057 2711            clr tmp1 ; очистка накопителя десятков
000058 2722          clr tmp2 ; создаем константу 0 для ADC
                  loop1:
000059 9513           inc tmp1 ; десятки +1
00005a 500a            subi tmp0,10 ; подсчет десятков в tmp1
00005b f7e8          brcc loop1 ; jnc loop1 повторяем до переопустошения
00005c 951a           dec tmp1 ; накопитель десятков -1
00005d 5f06           subi tmp0,-10 ; adi 10 восстановим единицы (они остались в tmp0)
00005e d003          rcall tbdt ; сегментный код по табличному декодеру со смещением из tmp0
00005f 2f01           mov tmp0,tmp1 ; повторяем для значения десятков
000060 d001          rcall tbdt
000061 9508         ret
                  tbdt:
                +
000062 e6eb     +ldi zl , low ( ss_table )
000063 e0f0     +ldi zh , high ( ss_table )
                      ldiw z,ss_table ; загрузка адреса начала таблицы декодера в указатель Zh:Zl
000064 0fe0           add zl,tmp0 ; получаем адрес сегментного кода
000065 1ff2           adc zh,tmp2
000066 0fee           lsl zl
000067 1fff           rol zh ; Z=Z*2
000068 9104           lpm tmp0,z ; читаем сегментный код
000069 930d           st x+,tmp0 ; и грузим его в видео ОЗУ
00006a 9508          ret
                 ;
                 ;----------
                 ; табличный перекодировщик тетрады 0N в соответствующий значению N сегментный код
                 ;
                  ss_table:
00006b 003f       .dw (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*0*/\
00006c 0006
00006d 005b           (1<<sg_B | 1<<sg_C),/*1*/ (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_D | 1<<sg_E),/*2*/\
00006e 004f           (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*3*/\
00006f 0066           (1<<sg_B | 1<<sg_C | 1<<sg_G | 1<<sg_F),/*4*/\
000070 006d           (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*5*/\
000071 007d           (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D | 1<<sg_E),/*6*/\
000072 0007           (1<<sg_A | 1<<sg_B | 1<<sg_C),/*7*/\
000073 007f           (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*8*/\
000074 006f           (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_F | 1<<sg_G),/*9*/\
000075 0077           (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*A*/\
000076 007c           (1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*b*/\
000077 0039           (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*C*/\
000078 005e           (1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_G),/*d*/\
000079 0079           (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*E*/\
00007a 0071           (1<<sg_A | 1<<sg_E | 1<<sg_F | 1<<sg_G)/*F*/
                 ;
                 ;
                 ;----------
                 ;
                 ; загрузчик регистрового файла 4*595
                 ; передача старшими битами вперед
                 ; передается массив из четырех байт ОЗУ vram
                 ; первым идет крайнее правое знакоместо
                 ;
                  print:
                +
00007b e6a2     +ldi xl , low ( vram )
00007c e0b0     +ldi xh , high ( vram )
                     ldiw x,vram ; загрузка начала видеоОЗУ в указатель Xh:Xl
00007d 910d          ld tmp0,x+
00007e d00c           rcall trs_595 ; DISP0 загружен
00007f 910d          ld tmp0,x+
000080 d00a           rcall trs_595 ; DISP1 загружен
000081 910d          ld tmp0,x+
000082 d008           rcall trs_595 ; DISP2 загружен
000083 910d          ld tmp0,x+
000084 d006           rcall trs_595 ; DISP3 загружен
000085 9ac2         sbi PORTB,WR_ln
000086 0000         nop
000087 0000         nop
000088 98c2         cbi PORTB,WR_ln
000089 0000         nop
00008a 9508        ret
                 ;----------
                 ; собственно пересылка байта из tmp0 в
                 ; регистровый файл
                 ; для уменьшения ошибок при вводе текста применены макросы
                 ;
                  trs_595:
                +
00008b ff07     +sbrs tmp0 , 7
00008c 98c0     +cbi PORTB , DATO_ln
00008d fd07     +sbrc tmp0 , 7
00008e 9ac0     +sbi PORTB , DATO_ln
00008f 0000     +nop
                      trsbt 7
                +
000090 9ac1     +sbi PORTB , CLC_ln
000091 0000     +nop
000092 98c1     +cbi PORTB , CLC_ln
000093 0000     +nop
                      strob
                +
000094 ff06     +sbrs tmp0 , 6
000095 98c0     +cbi PORTB , DATO_ln
000096 fd06     +sbrc tmp0 , 6
000097 9ac0     +sbi PORTB , DATO_ln
000098 0000     +nop
                      trsbt 6
                +
000099 9ac1     +sbi PORTB , CLC_ln
00009a 0000     +nop
00009b 98c1     +cbi PORTB , CLC_ln
00009c 0000     +nop
                      strob
                +
00009d ff05     +sbrs tmp0 , 5
00009e 98c0     +cbi PORTB , DATO_ln
00009f fd05     +sbrc tmp0 , 5
0000a0 9ac0     +sbi PORTB , DATO_ln
0000a1 0000     +nop
                      trsbt 5
                +
0000a2 9ac1     +sbi PORTB , CLC_ln
0000a3 0000     +nop
0000a4 98c1     +cbi PORTB , CLC_ln
0000a5 0000     +nop
                      strob
                +
0000a6 ff04     +sbrs tmp0 , 4
0000a7 98c0     +cbi PORTB , DATO_ln
0000a8 fd04     +sbrc tmp0 , 4
0000a9 9ac0     +sbi PORTB , DATO_ln
0000aa 0000     +nop
                      trsbt 4
                +
0000ab 9ac1     +sbi PORTB , CLC_ln
0000ac 0000     +nop
0000ad 98c1     +cbi PORTB , CLC_ln
0000ae 0000     +nop
                      strob
                +
0000af ff03     +sbrs tmp0 , 3
0000b0 98c0     +cbi PORTB , DATO_ln
0000b1 fd03     +sbrc tmp0 , 3
0000b2 9ac0     +sbi PORTB , DATO_ln
0000b3 0000     +nop
                      trsbt 3
                +
0000b4 9ac1     +sbi PORTB , CLC_ln
0000b5 0000     +nop
0000b6 98c1     +cbi PORTB , CLC_ln
0000b7 0000     +nop
                      strob
                +
0000b8 ff02     +sbrs tmp0 , 2
0000b9 98c0     +cbi PORTB , DATO_ln
0000ba fd02     +sbrc tmp0 , 2
0000bb 9ac0     +sbi PORTB , DATO_ln
0000bc 0000     +nop
                      trsbt 2
                +
0000bd 9ac1     +sbi PORTB , CLC_ln
0000be 0000     +nop
0000bf 98c1     +cbi PORTB , CLC_ln
0000c0 0000     +nop
                      strob
                +
0000c1 ff01     +sbrs tmp0 , 1
0000c2 98c0     +cbi PORTB , DATO_ln
0000c3 fd01     +sbrc tmp0 , 1
0000c4 9ac0     +sbi PORTB , DATO_ln
0000c5 0000     +nop
                      trsbt 1
                +
0000c6 9ac1     +sbi PORTB , CLC_ln
0000c7 0000     +nop
0000c8 98c1     +cbi PORTB , CLC_ln
0000c9 0000     +nop
                      strob
                +
0000ca ff00     +sbrs tmp0 , 0
0000cb 98c0     +cbi PORTB , DATO_ln
0000cc fd00     +sbrc tmp0 , 0
0000cd 9ac0     +sbi PORTB , DATO_ln
0000ce 0000     +nop
                      trsbt 0
                +
0000cf 9ac1     +sbi PORTB , CLC_ln
0000d0 0000     +nop
0000d1 98c1     +cbi PORTB , CLC_ln
0000d2 0000     +nop
                      strob
0000d3 98c0           cbi PORTB,DATO_ln
0000d4 9508          ret
                 


RESOURCE USE INFORMATION
----------

Notice:
The register and instruction counts are symbol table hit counts,
and hence implicitly used resources are not counted, eg, the
'lpm' instruction without operands implicitly uses r0 and z,
none of which are counted.

x,y,z are separate entities in the symbol table and are
counted separately from r26..r31 here.

.dseg memory usage only counts static data declared with .byte

ATtiny13A register use summary:
r0 :   0 r1 :   0 r2 :   0 r3 :   0 r4 :   0 r5 :   0 r6 :   0 r7 :   0
r8 :   0 r9 :   0 r10:   0 r11:   3 r12:   0 r13:   0 r14:   3 r15:   0
r16:  66 r17:   4 r18:   2 r19:   0 r20:   0 r21:   0 r22:   0 r23:   8
r24:   0 r25:   0 r26:   3 r27:   3 r28:   0 r29:   0 r30:   3 r31:   3
x  :  11 y  :   0 z  :   1
Registers used: 12 out of 35 (34.3%)

ATtiny13A instruction use summary:
.lds  :   0 .sts  :   0 adc   :   1 add   :   1 adiw  :   0 and   :   0
andi  :   0 asr   :   0 bclr  :   0 bld   :   0 brbc  :   0 brbs  :   4
brcc  :   1 brcs  :   0 break :   0 breq  :   0 brge  :   0 brhc  :   0
brhs  :   0 brid  :   0 brie  :   0 brlo  :   0 brlt  :   0 brmi  :   0
brne  :   0 brpl  :   0 brsh  :   0 brtc  :   0 brts  :   0 brvc  :   0
brvs  :   0 bset  :   0 bst   :   0 cbi   :  18 cbr   :   2 clc   :   0
clh   :   0 cli   :   0 cln   :   0 clr   :   6 cls   :   0 clt   :   0
clv   :   0 clz   :   0 com   :   1 cp    :   0 cpc   :   0 cpi   :   2
cpse  :   0 dec   :   3 eor   :   0 icall :   0 ijmp  :   0 in    :   0
inc   :   3 ld    :   4 ldd   :   0 ldi   :  17 lds   :   2 lpm   :   2
lsl   :   1 lsr   :   0 mov   :   5 movw  :   0 neg   :   0 nop   :  27
or    :   0 ori   :   0 out   :   8 pop   :   0 push  :   0 rcall :  11
ret   :   8 reti  :   1 rjmp  :   5 rol   :   1 ror   :   0 sbc   :   0
sbci  :   0 sbi   :  18 sbic  :   0 sbis  :   0 sbiw  :   0 sbr   :   3
sbrc  :   8 sbrs  :  11 sec   :   0 seh   :   0 sei   :   1 sen   :   0
ser   :   0 ses   :   0 set   :   0 sev   :   0 sez   :   0 sleep :   0
spm   :   0 st    :   7 std   :   0 sts   :   2 sub   :   0 subi  :   2
swap  :   0 tst   :   0 wdr   :   0
Instructions used: 32 out of 105 (30.5%)

ATtiny13A memory use summary [bytes]:
Segment   Begin    End      Code   Data   Used    Size   Use%
----------
[.cseg] 0x000000 0x0001aa    378     32    410    1024  40.0%
[.dseg] 0x000060 0x000066      0      6      6      64   9.4%
[.eseg] 0x000000 0x000000      0      0      0      64   0.0%

Assembly complete, 0 errors, 0 warnings

Плохо то, что не так хорошо структурировано по разделам и не оптимизированы все возможные циклы - в некоторых случаях так и остался "линейный примитив" начальной фазы разработки программы.
Однако работать будет - проверил на симуляторе IDE перед отправкой.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Ср мар 21, 2018 07:30:19 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 3
Ваша секунда на 6,665мс длиннее, т.к.
Цитата:
A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock cycle.

Возможен и другой подход для AVR с максимальным использованием возможностей. Типа
Вложение:
CLOCK_TN13_595.zip [74.02 KiB]
Скачиваний: 125


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Ср мар 21, 2018 10:16:00 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Так о точности в суперварианте речь ПОКА не идет - там и подгонку надо делать, и отработку реакции на прерывание учитывать.
В то же время навыки по изъятию калибровочной константы для RC генератора 4,8 МГц с последующим ее применением это задача не для новичка и не для любого, имеющегося в распоряжении любителя программатора.
Да и предпочтительно часики кварцевать хотя-бы 32768 кварцем.
Это учебка для бытового применения. Дабы мозги потренировать.
8)
По CLOCK_TN13_595.zip варианту.
Неплохо, ежли задача исключительно по часикам - удобно все ресурсы в R0-R31 разместить.
Счет непосредственно в десятичном виде снимает вопрос преобразования данных.
По "минусам" -
Игнорирование резервирования области векторов прерываний не есть хорошо, тем более размещение таблицы знакогенератора (или участка программного кода) в данной области как-то "противошерстно"...
:dont_know:
А вот приема вида
BRLO PC+2 с непосредственным указанием адреса перехода не меткой, а абсолютным адресом к текущему содержимому программного счетчика все же предпочтительно ... избегать. Гораздо лучше с самого начала к именам-меткам привыкнуть.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Ср мар 21, 2018 12:49:30 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 0
BOB51 писал(а):
Так о точности в суперварианте речь ПОКА не идет - там и подгонку надо делать, и отработку реакции на прерывание учитывать.
Если правильно установить таймер, подгонять и обрабатывать не нужно.
Так программа формирует вторую и следующие секунды при неправильно установленном значении OCR0A=150
СпойлерИзображение

Так программа формирует вторую и следующие секунды при установленном значении OCR0A=150-1
СпойлерИзображение


Вложения:
BOB51_OCR0A_150.jpg [34.39 KiB]
Скачиваний: 310
BOB51_OCR0A_149.jpg [71.95 KiB]
Скачиваний: 339


Последний раз редактировалось akl Ср мар 21, 2018 13:21:12, всего редактировалось 2 раз(а).
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Ср мар 21, 2018 13:13:28 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
ГХЫММ...
Уважаемый akl -
Это же не со мной спор - надо для начинающего (migvu) объяснять в чем тонкости того или иного решения.
Постарайтесь именно с такой точки зрения подойти к учебному тесту.
Я то нюансы знаю - хочется, чтобы и для migvu они понятны были.
А у Вас даже комментария для начинающего НЕТУ...
:(
Кстати...
С табличкой я таки ТУПАНУЛ аж на 16 байт.
Вот видоизмененный фрагмент из файла sekmetr.txt (даст экономию в 16 байт ПЗУ)

Спойлер
Код:
 tbdt:
     ldiw z,(ss_table*2) ; загрузка адреса начала таблицы декодера в указатель Zh:Zl
     add zl,tmp0 ; получаем адрес сегментного кода
     adc zh,tmp2
;     lsl zl
;     rol zh ; Z=Z*2
     lpm tmp0,z ; читаем сегментный код
     st x+,tmp0 ; и грузим его в видео ОЗУ
    ret
;
;----------
; табличный перекодировщик тетрады 0N в соответствующий значению N сегментный код
;
 ss_table:
 .db (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*0*/\
     (1<<sg_B | 1<<sg_C),/*1*/ (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_D | 1<<sg_E),/*2*/\
     (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*3*/\
     (1<<sg_B | 1<<sg_C | 1<<sg_G | 1<<sg_F),/*4*/\
     (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*5*/\
     (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D | 1<<sg_E),/*6*/\
     (1<<sg_A | 1<<sg_B | 1<<sg_C),/*7*/\
     (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*8*/\
     (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_F | 1<<sg_G),/*9*/\
     (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*A*/\
     (1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*b*/\
     (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*C*/\
     (1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_G),/*d*/\
     (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*E*/\
     (1<<sg_A | 1<<sg_E | 1<<sg_F | 1<<sg_G)/*F*/

8)
А вот изменение содержимого OCR0A в пределах +/-10 и есть коррекция точности хода в грубом виде.
И не только на реакцию на прерывание, но и на отклонения в точности самого RC генератора.
Основной корректор RC генератора находится в OSCCAL c момента его автозагрузки.
Корректировать значение калибровочной константы нужно весьма внимательно (хорошо хоть убить с ее помощью МК невозможно).
8)
В моей прожке прерывание только выставляет флажок, а не напрямую обрабатывает счетчики досчета.
Это дополнительный "джиттер" (неравноценность точки входа в обработку в цикле ожидания с опросом флага)... там корректировка в -1/-2 будет давать некоторый "разнобой".
Собственно лучший результат даст 16 разрядный таймер.
Надо еще и учитывать потребности возможных (с ростом апетита) дополнительных функций - антидребезг, разного рода "мигалки", мультиплексирование индикатора, которые могут заинтересовать обучаемого. Кроме прочего для накопительного секундомера/таймера особое значение имеет точка обработки флага "разрешение счета" en_sek - от того, в каком счетном цикле этот флаг работает зависит суммарное отклонение при многократном старт/останове. Лучше конечно главный таймер стопорить... Но в комплекте с опросом кнопок и визуальными эффектами ... при наличии ОДНОГО таймера придется идти на компромисс...
:roll:
А вот место для указания корректирующей поправки рекомендовано не в файле самой прожки
Код:
39      ldi tmp0,div150
,
а в файле дефайнов
Код:
29   .equ div150 = 150-2 ; константа для OCR0A

дабы по тексту не выискивать все возможные появления константы с поправкой (собственно для того те дефайны и существуют).
Как вариант подстановка значения из ЕЕПРОМки (можно программно менять).
:beer:

Несколько слов об алгоритме вывода данных в 595й регистр.
В программе CLOCK_TN13_595.zip у akl применен классический вариант
сдвига/вращения с анализом содержимого флага С регистра SREG и
последующим сбросом/установкой вывода данных выходного порта
в зависимости от содержимого SREG.С ...
Анализ и установка могут также по разному выполняться.
Я в своем варианте заложил типично ПИКовый прием анализатора,
основанный на командах вида
"проверка бита регистра и пропуск при совпадении условия"
Код:
 .macro trsbt ; пересылка бита
    sbrs tmp0,@0 ; вызывается как trsbt number  где number = номер перемещаемого бита
    cbi PORTB,DATO_ln
    sbrc tmp0,@0
    sbi PORTB,DATO_ln
    nop
  .endmacro

Однако...
Ежли у ПИКовых этот тип команд действует и относительно содержимого
регистра STATUS, что позволяет легко реализовать алгоритм контроля флага С,
то для АВР действие команд относительно регистров НЕРАВНОЦЕННО.
Помимо того команды вида
"проверка бита регистра и пропуск при совпадении условия"
не допускают косвенной адресации бита - разрешено исключительно
прямое указание...
Посему и пришлось реализовать "длинну гусеницу" из цепочки макросов вместо
желаемого короткого варианта.
А весьма приятненько могло бы выглядеть:

sbrs SREG,С ; НЕДОПУСТИМО ДЛЯ АВР относительно SREG
cbi PORTB,DATO_ln
sbrc SREG,С ; НЕДОПУСТИМО ДЛЯ АВР относительно SREG
sbi PORTB,DATO_ln
nop


УВЫ... это таки АВРки.
:cry:
Пришлось побитово буфер данных сканировать.
А с другой стороны... Возможно применение как шифровальщика заданной маской передачи
в программном обмене между устройствами - порядковость передачи не ограничена стандартным кольцевым сдвигом.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: In vino veritas
СообщениеДобавлено: Вс мар 25, 2018 10:30:47 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
После обновления платок в ардуинко IDE для ардуино нано появилась строчка "atmega328P (Old bootloader)"
которая соответствует моим модулям V3 (с USB-COM на CH340)...
Вложение:
IMG_20180325_112200_186.jpg [167.82 KiB]
Скачиваний: 325

а чему соответствует строчка без "OLD"...
:dont_know:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 1081 ]     ... , , , 25, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y