Схемка вроде с первого взгляду ... хотя... Питать матрицу лучше от плюса (общий анод), а в качестве промежуточных ключей использовать ULN2803. Так и нагрузку (в части силовых токов) распределить проще и возможность мультиплексирования для увеличения количества знакомест сразу закладывается. Со схемкой и объяснялка будет.
зкладка думаю неудобная у Вас ставит регист и выводить даные на него в в статике като не фэншуйно даи когда будете выводить все 6 разрядов ЧЧ-ММ-СС возникнут проблемки-наверняка-слишком много ножек и длиных будет там
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Для начала КОТЕНКУ хотя-бы секундомер с минутками/секундами. Дабы укусить и не подавиться - а там при надлежащем усердии и аккуратности сам во вкус войдет.
Посему стартуем от этой схемки http://img.radiokot.ru/files/20529/1ja2nyvfh1.GIF как будет готова описалка/прожка-затравка положу. А пока... на изучение начинающему КОТЕЙКУ. В схемке сразу и раскладка для удобства монтажа заложена и возможность "высоковольтного" питания светиков и возможность мультиплекса по анодам. Для всяческих расширений просто выкусываем оранжевую линию по + питания и делаем соответствующие добавки. В прожке будут выставлены условные имена согласно схемки.
2803 это редкая чипа ее еще поискать лучше пот unl2003 заложить ее должно хватать даже на ИВЛ вместо светикоф подтянув к 27в держит легко играючи можнои выше (но не нужно)кстати защитные диоды можно исползовать на гашение садиш на землю и все тухнет
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Там лапок маловато - 2803 = 8 каналов, а 2003 всего шерсть. Да собственно и не столь важно ее наличие в физическом виде. Заменяется на сборку транзисторов. musor это ведь УЧЕБНЫЙ МАТЕРИАЛ ДЛЯ СОВСЕМ НАЧИНАЮЩЕГО КОТЕНКА. Пусть лучше от него (migvu) вопросы идут - буду уточнять по мере их (вопросов) поступлению.
Сейчас более важен сам вариант составления прожки для начинающего - чего как и в какой последовательности делается. И как собственно в одном исходнике сделать возможной подстройку под любой вариант схемной обвязки. Возьмем за цель для начала обыкновенный индикатор, который считает секунды и минуты с выводом на статический дисплей. Самый правый разряд (DISP0) - единицы секунд и далее справа налево по наростающей десятки секунд, единицы минут и десятки минут. ММ:СС (но получится скорее ММ.СС) Для прожки создадим проектную заготовку (у меня на основе AVRSTUDIO 4.19)
А далее ... Собственно генератор МК лучше выбрать на 9,6 МГц - он "по умолчанию" при выпуске с завода фузами установлен. Основное преимущество по сравнению с 4,8 (второй режим генератора) - для 9,6 МГЦ калибровочная константа для RC-генератора загружается АВТОМАТИЧЕСКИ при запуске МК, а в случае с 4,8 ее надо предварительно вычитывать и вводить вручную. Коэффициенты деления для получения опорной сетки частот выбираем самостоятельно. Теперь насчет базового генератора (сердчишко секундомера и всех возможных конструкций)... Используем предделитель главного генератора и таймер Т0. Затем два байта ОЗУ в качестве счетчиков секунд и минут, возможно потребуется буфер вывода и блок перекодировки а также блок загрузки регистрового файла. Это следующий этап "на подумать". Уполз готовить.
Начнемсс с "декларации о намерениях" - суть программы своими словами:
Конфигурация ядра Генератор - встроенный 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
вроде как все...
Остается толко все это описать на ассемблере в рамках вышепредставленного "шкелета"
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Очень интересное начало! Есть для меня не совсем понятные детали с которыми я ещё не сталкивался. Такие как макросы. Имею поверхностное представление , так как ещё с ними не работал на практике. С таймерами тренировался так что настроить таймер могу. С англиским у меня туго так что даташиты читаю по буквам и не всегда понимаю чего прочитал. Переводчик иногда только ещё больше затрудняет понимание сути дела! Также не имел дела с добавлением файлов Не понял о чём идёт речь вот в этом коментарие " вместо name project подставляется имя файла соответствующего проекта шаблоны имеют name project = proto ".
Добавлено after 9 minutes 21 second: Пользуюсь Atmel Studio 6.2. Думаю что приобрету много нового изучая этот проект! Потихоньку буду разбираться если что буду громко мяукать!! С нетерпением жду полного кода для изучения. Огромное СПАСИБО что делитесь опытом с чайника-котами!!!
_________________ Лучше семь раз покрыться потом , чем один раз инеем!
Это шаблон-заготовка (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
Знание английского (минимум со словарем) ОБЯЗАТЕЛЬНО. Иначе ни электронику ни МК не освоить. (Желательно и немецкий с чешским и прочими...)
Постараюсь по последовательным "полочкам" написание проекта разложить. Возможно не сразу и не слишком быстро - надоть и работать иногда.
Эта прожка просто периодически отрабатывает прерывания в симуляторе IDE.
Теперь можно и собственно к остальной части проекта приступить - счетчики секунд, минут счетчик досчета секунды и перекодировщик-загрузчик регистров. Вариантов решения довольно много.... посмотрим на каком остановлюсь...
Наверно лучше остановиться на том ,что попроще для вкуривания
Добавлено after 7 minutes 33 seconds: Книга Евстифеева А.В. у меня есть в бумажном виде ( я с бумаги лучше понимаю материал) И ещё кучу книг накупил . Но там нет боле менее серьёзных проектов . Дрыгать ногами уже слегка научился. Наделал тестовых платок на Attiny13a ,attiny2313a, Atmega8a. По мере необходимости к ним цепляю разные модули .
Добавлено after 3 minutes 28 seconds: Шпора хорошая к ней надо привыкнуть (похожа на таблицу Менделеева!)
_________________ Лучше семь раз покрыться потом , чем один раз инеем!
Только основой у меня были MCS51/I8080/Z80 - у тех таблички кодирующие - можно сразу карандашиком машинный код на бамажке писать (без всяких компов). У современных такая табличка всего лишь подсказка чем из имеющегося арсенала можно воспользоваться и какие ограничения могут возникнуть.
Собственно по возможному направлению прожки... Можно обработчик секундомера в прерывание втиснуть - но... тогда надо жестко стек отслеживать. Чаще всего применяется флаг-маркер (тогда никакого усложнения по стеку в прерывании не требуется) и проще просчитать коррекцию на реакцию на прерывание - повысить точность хода корректировкой содержимого OCR0A. Собственно сами счетчики или в регистровом файле(R0-R31) размещаются (малая модель программы) или растыкиваются в ОЗУ, а ресурсы регистрового файла используются под системные ресурсы. Во втором случае при вызове обработчика дополнительно используется стек для хранения содержимого используемых текущей подпрограммой ресурсов. Метод более медленный, но и более гибкий. Обычно для примитив-часиков используется первый вариант - "все регистры в R0-R31" - места вполне достаточно... Однако...как-то "приелось"... Для куражу воткну в прожке второй вариант (основные ресурсы в ОЗУ) - там возможностей для трансформации прожки по мере роста аппетита больше будет.
Согласен на любой вариант. Главное чтоб в процессе программного марафона я на хвосте висел и не сильно перегревался от умственной работы!
Добавлено after 31 minute 21 second: Посмотрел приложенные файлы. Что то понятно что то совсем не понятно. Чётко понял что имеются большие дыры в моих знаниях. Попробую вникнуть
_________________ Лучше семь раз покрыться потом , чем один раз инеем!
Ну то, что я последнее время выкладываю вобщем-то тоже в некотором роде "слэнг, приближенный к желаемому". Пример "истинно многофайлового" проекта на ассемблере найти можно разве что у профи-разработчиков... И то там строчки линкера потребны (в зависимости от семейства МК и компилятора). А особенности линкеров учить... Для любителя хотя-бы слэнг переварить.
Буду учиться. Пока мне Ассемблер нравится .это как игра в шахматы 16 фигур и сотни тысяч комбинаций! Так и тут кучка команд и крутись как сможешь и как запасной ферзь всякие штуки в виде прерываний и разной периферии.
Добавлено after 2 hours 3 minutes 59 seconds: BOB51 Вы какую прогу используете для рисования схем?
_________________ Лучше семь раз покрыться потом , чем один раз инеем!
после включения индикаторы погашены, затем начинается индикация с изменением содержимого каждую секунду. В симуляторе АВР IDE правда строб данных не виден... Но то не слишком уж проблемно. Занято всего 410 байт ПЗУ (включая таблицу сегментных кодов). Так что есть место для "вариаций".
Все файлы приведены к единой кодировке относительно кириллицы - так что ВСЕ комментарии на листинге будут без "кракозябр". В предыдуших версиях немного "недоглядел" прыгая с компа на комп.
Как разбросать текст по файлам ("вылизать"/оптимизировать) то... надо абы чуток "отлежалось" - да и у каждого свой вариант обычно находится. Далее можно прожку/схемку и модернизировать - добавлять кнопы, мигалки и прочие "плюшки". А заодно потренироваться на внесении изменений/дополнений.
Собственно основная програма (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 ; константа старшего счетчика досчета секундомера
; "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
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 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 перед отправкой.
Так о точности в суперварианте речь ПОКА не идет - там и подгонку надо делать, и отработку реакции на прерывание учитывать. В то же время навыки по изъятию калибровочной константы для RC генератора 4,8 МГц с последующим ее применением это задача не для новичка и не для любого, имеющегося в распоряжении любителя программатора. Да и предпочтительно часики кварцевать хотя-бы 32768 кварцем. Это учебка для бытового применения. Дабы мозги потренировать.
По CLOCK_TN13_595.zip варианту. Неплохо, ежли задача исключительно по часикам - удобно все ресурсы в R0-R31 разместить. Счет непосредственно в десятичном виде снимает вопрос преобразования данных. По "минусам" - Игнорирование резервирования области векторов прерываний не есть хорошо, тем более размещение таблицы знакогенератора (или участка программного кода) в данной области как-то "противошерстно"...
А вот приема вида BRLO PC+2 с непосредственным указанием адреса перехода не меткой, а абсолютным адресом к текущему содержимому программного счетчика все же предпочтительно ... избегать. Гораздо лучше с самого начала к именам-меткам привыкнуть.
Так о точности в суперварианте речь ПОКА не идет - там и подгонку надо делать, и отработку реакции на прерывание учитывать.
Если правильно установить таймер, подгонять и обрабатывать не нужно. Так программа формирует вторую и следующие секунды при неправильно установленном значении OCR0A=150 Спойлер Так программа формирует вторую и следующие секунды при установленном значении OCR0A=150-1 Спойлер
ГХЫММ... Уважаемый akl - Это же не со мной спор - надо для начинающего (migvu) объяснять в чем тонкости того или иного решения. Постарайтесь именно с такой точки зрения подойти к учебному тесту. Я то нюансы знаю - хочется, чтобы и для migvu они понятны были. А у Вас даже комментария для начинающего НЕТУ...
Кстати... С табличкой я таки ТУПАНУЛ аж на 16 байт. Вот видоизмененный фрагмент из файла sekmetr.txt (даст экономию в 16 байт ПЗУ)
А вот изменение содержимого OCR0A в пределах +/-10 и есть коррекция точности хода в грубом виде. И не только на реакцию на прерывание, но и на отклонения в точности самого RC генератора. Основной корректор RC генератора находится в OSCCAL c момента его автозагрузки. Корректировать значение калибровочной константы нужно весьма внимательно (хорошо хоть убить с ее помощью МК невозможно).
В моей прожке прерывание только выставляет флажок, а не напрямую обрабатывает счетчики досчета. Это дополнительный "джиттер" (неравноценность точки входа в обработку в цикле ожидания с опросом флага)... там корректировка в -1/-2 будет давать некоторый "разнобой". Собственно лучший результат даст 16 разрядный таймер. Надо еще и учитывать потребности возможных (с ростом апетита) дополнительных функций - антидребезг, разного рода "мигалки", мультиплексирование индикатора, которые могут заинтересовать обучаемого. Кроме прочего для накопительного секундомера/таймера особое значение имеет точка обработки флага "разрешение счета" en_sek - от того, в каком счетном цикле этот флаг работает зависит суммарное отклонение при многократном старт/останове. Лучше конечно главный таймер стопорить... Но в комплекте с опросом кнопок и визуальными эффектами ... при наличии ОДНОГО таймера придется идти на компромисс...
А вот место для указания корректирующей поправки рекомендовано не в файле самой прожки
Код:
39 ldi tmp0,div150
, а в файле дефайнов
Код:
29 .equ div150 = 150-2 ; константа для OCR0A
дабы по тексту не выискивать все возможные появления константы с поправкой (собственно для того те дефайны и существуют). Как вариант подстановка значения из ЕЕПРОМки (можно программно менять).
Несколько слов об алгоритме вывода данных в 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
УВЫ... это таки АВРки.
Пришлось побитово буфер данных сканировать. А с другой стороны... Возможно применение как шифровальщика заданной маской передачи в программном обмене между устройствами - порядковость передачи не ограничена стандартным кольцевым сдвигом.
После обновления платок в ардуинко IDE для ардуино нано появилась строчка "atmega328P (Old bootloader)" которая соответствует моим модулям V3 (с USB-COM на CH340)...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения