1883

Разработка метода обнаружения развития аварии в кабельной линии до пробоя изоляции

Дипломная

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

Цель работы — разработка метода обнаружения развития аварии в кабельной линии до пробоя изоляции, разработка структурной схемы работы устройства прогнозирующей защиты, создание устройства, разработка алгоритма и программного обеспечения для устройства.

Русский

2013-01-06

217.6 KB

23 чел.

1

Оглавление
1.
Характеристика работы................................................................................3

актуальность.................................................................................................3

цель................................................................................................................5

объект и предмет исследования..................................................................5

научная новизна...........................................................................................5

теоретическая значимость  и прикладная ценность..................................6
2.
Обзор существующих устройств и методов................................................6
3.
Разработка устройства..................................................................................8

Разработка метода обнаружения развития аварии в КЛЭП.....................8

Разработка структурной схемы устройства .............................................11

Разработка печатной платы.......................................................................13

Разработка алгоритма и программного обеспечения..............................15
4.
Проведение экспериментов, результаты испытаний................................17
5.
Заключение.................................................................................................18
6.
Библиографический список.......................................................................19
7.
Приложение А.............................................................................................20
2


1. Характеристика работы
Актуальность
Для  повышения  надежности  электроснабжения  ответственных  потребителей 
широко  используются  устройства  автоматического  включения  резервного 
питания (АВР). При отключении выключателей рабочего источника Q1 и (или) 
Q2  (рис.  1)  устройство  АВР  включает  секционный  выключатель  QB  (или 
выключатель,  на  котором  осуществлялось  в  нормальном  режиме  деление 
системы). При исчезновении напряжения со стороны энергосистемы в устройстве 
АВР имеются специальные пусковые органы минимального напряжения (а также 
могут работать по другим параметрам - тока, частоты и др.), срабатывающие при 
снижении напряжения до определенной величины и отключающие выключатели 
рабочего источника Q1 и (или) Q2.
 
Рисунок. 1. Схема электроснабжения с двумя источниками питания и АВР.
3

Одной  из  особенностей  работы  устройств  АВР  является  необходимость 
включения  резерва  с  обязательным  условием  отключения  источника  рабочего 
питания,  из-за  чего  возникает  небольшая  выдержка  времени.  Это  вызвано 
опасностью  включения  резервного  источника  на  неустранившееся  короткое 
замыкание (КЗ) на шинах потребителей основного источника.
Перерыв питания при АВР приводит к бестоковой паузе и при возобновлении 
питания происходит самозапуск двигательной нагрузки. Причем для синхронных 
двигателей  приходится  осуществлять  их  новый  пуск,  поскольку  самозапуск 
после  действия  АВР  становится  невозможным  из-за  большой  вероятности 
несинхронного  включения  с  большими уравнительными токами.  В  некоторых 
случаях  для  уменьшения  бестоковой  паузы  применяют  быстродействующие 
устройства  АВР,  которые  сложны,  но  самое  главное  -  требуют  использования 
специальных быстродействующих выключателей.
В  большинстве  случаях  исключить  бестоковые  паузы  можно  изменив 
алгоритм  работы  существующего  АВР,  суть  которого  сводится  к  постоянному 
контролю  состояния  изоляции,  и,  при  начале   развития   аварийной   ситуации 
(резкое   снижение   сопротивления,   резкае   нарастание   кажушегося   заряда 
частичных   разрядов),  включению  секционного  выключателя  QB,  а  затем 
отключению выключателя рабочего источника питания Q1 и Q2.
4

Цель
Цель работы — разработка метода обнаружения развития аварии в кабельной 
линии до пробоя изоляции, разработка структурной схемы работы устройства 
прогнозирующей   защиты,   создание   устройства,   разработка   алгоритма   и 
программного обеспечения для устройства.
Объект и предмет исследования
Объектом исследования являются разрушающие процессы, происходящие в 
изоляции кабельных линий электропередач, предмет исследования — частичные 
разряды, количество и кажущийся заряд которых указывает на скорость 
развития этих процессов и место развивающейся аварии.
Научная новизна
Новизна заключается в применении современной элементной базы для 
создания устройства, разработке нового метода контроля сопротивления и 
остаточного ресурса изоляции — путем описаниия разрушающих процессов в 
изоляции характерной картиной частичных разрядов, расчете остаточного 
5

ресурса кабеля путем учета влияния на изоляцию внешних факторов.
Теоретическая значимость и прикладная ценность
Исследование   процессов   старения   изоляции   показало,   что   создание 
устройства прогнозирующей защиты позволит полностью исключить перерывы 
питания при вводе резерва, таким образом исключит самозапуск двигательной 
нагрузки, исключит необходимость повторных пусков синхронных двигателей, 
исключит   вероятность   их   несинхронного   включения,   стоимость   такого 
устройства,   рассчитанного   на   подачу   сигнала   ввода   резерва   и   отключения 
источника   до   пробоя   изоляции   будет   существенно   ниже,   чем   стоимость 
использования   быстродействующих   устройств   АВР   и   специальных 
выключателей.
2. Обзор существующих устройств и методов
Существующие   в   настоящее   время   приборы,   контролирующие   состояние 
изоляции   кабельных   линий,   прямо   или   косвенно   измеряют   сопротивление 
изоляции,   и   реле   построенные   на   основе   этих   приборов   срабатывают   по 
снижению   сопротивления   ниже   установленного   для   конкретного   кабеля   и 
6

условий его эксплуатации значения — от сотен до десятков кОм (РКИ 500 — 
500 кОм — требования ПУЭ, РКИ 50 — 50 кОм — медицинский стандарт, 
РКТУ–01 — 500 кОм, АВВ CM-IWN-AC — от 1 до 110 кОм) и часто имеют 
специфичную применяемость — АВВ CM-IWN-AC предназначено для контроля 
сопротивления   изоляции   между   незаземленными   сетями   переменного   тока   и 
защитным   заземляющим   проводом,   реле   РКИ   предназначены   для   контроля 
сопротивления изоляции в однофазных и трехфазных цепях с изолированной 
нейтралью.   Реле   РКТУ-01,   напротив,   обладает   универсальностью   за   счет 
косвенного измерения сопротивления изоляции через ток утечки. Они и стало 
отправной   точкой   исследований   направленных   на   разработку   метода 
обнаружения развития аварии. Измерение тока утечки и расчет сопротивления 
изоляции было признано неперспективным потому, что ток утечки — это не 
только емкостный ток между фазой и землей, но и ток между фазами, который, 
при   высоких   напряжениях   и   большой   протяжённости   кабельной   линии 
привнесет непостоянные (из-за воздействия внешних факторов — температура, 
влажность, старение изоляции), а потому — трудно учитываемые погрешности.
Прямой   метод   измерения   сопротивления   изоляции   путем   накладывания 
измерительного   высокого   напряжения,   по   которому   работают   щитовые 
мегаомметры, подходит только для сетей с изолированной нейтралью и только 
для контроля сопротивления между проводником и землей, что ограничило бы 
сферу применения устройства.
7

3. Разработка устройства
Разработка метода обнаружения развития аварии в кабельной линии
Анализ работ Кучинского Г.С., Мостового С.Е., Федорова Г.С. Показал, что 
контроль   частичных   разрядов   —   перспективный   и   удобный   метод   контроля 
состояния изоляции.
Частичными  разрядами  (ЧР)  называют  разрядные  процессы  в  изоляции, 
которые  развиваются  под  действием  приложенного  напряжения  и 
распространяются лишь на часть изоляционного промежутка.
Частичные  разряды  могут  возникать  в  ослабленных  местах  изоляции, 
например, в газовых включениях, или в местах резкого усиления электрического 
поля,  в  частности,  у  острых  краев  электродов.  Наибольшую  опасность 
представляют ЧР в газовых включениях, так как в этом случае ЧР возникают при 
меньших  напряжениях,  чем  в  жидких  или  твердых  компонентах  внутренней 
изоляции.
Согласно  [2],  можно  утверждать,  что  темпы  электрического  старения  и  срок 
службы изоляции, зависят от средней мощности Рч.р и энергии Wч.р. Поэтому 
Рч.р  и  Wч.р  являются  важнейшими  характеристиками  ЧР.  Однако 
непосредственное  измерение  Рч.р  и  Wч.р  в  большинстве  случаев  практически 
невозможно,  так  как  они  очень  малы.  В  связи  с  этим  в  качестве  мер 
интенсивности ЧР применяют другие величины, пропорциональные Рч.р и Wч.р
но поддающиеся прямому измерению.
8


Чтобы  пояснить  физический  смысл  используемых  мер  интенсивности  ЧР, 
рассмотрим кратко основы электрического метода измерения характеристик ЧР. 
В  этом  методе  используется  одно  из  внешних  проявлений  ЧР  –  снижение  при 
каждом  ЧР  напряжения  на  испытуемой  изоляции  скачком  (точнее,  за  время 
10-7…10-8 с) на величину ΔU. Ниже будет показано, что скачок напряжения ΔU 
пропорционален энергии Wч.р
Скачок напряжения ΔU на изоляции вызывает переходный процесс в цепях, с 
которыми соединена емкость  Сх  изоляции. В измерительной  установке,  схема 
которой показана на рис. 1, переходный процесс возникает в контуре, состоящем 
из емкости испытуемой изоляции Сх, емкости конденсатора связи Сс, источника 
регулируемого 
напряжения 
(испытательного 
трансформатора) 
Т 
и 
измерительного  элемента  Zи  (резистора  с  сопротивлением  R  или  катушки 
индуктивности  Lи).  Вследствие  этого  переходного  процесса  на  измерительном 
элементе  Zи  возникает  кратковременный  импульс  напряжения.  Так  как  контур 
состоит  из  линейных  элементов,  амплитуда  импульса  напряжения  на  Zи 
пропорциональна значению  ΔU.
Рисунок 1. Схема установки для измерения характеристик ЧР в изоляции.
9

Импульс напряжения с элемента Zи через фильтр Ф поступает на усилитель У, 
а  затем  на  осциллограф  ЭО  для  измерения  его  амплитуды  и  на  счетчик 
импульсов  СИ  для  измерения  числа  импульсов,  т.е.  числа  ЧР,  в  единицу 
времени. В этой схеме фильтр Ф используется для того, чтобы на вход усилителя 
У не попадали мешающие измерениям напряжения промышленной частоты и его 
гармоники,  обусловленные  падением  напряжения  на  Zи  от  протекающих  через 
Сс емкостных токов.
Скачок напряжения ΔU объясняется тем, что в канале ЧР рассеивается часть 
энергии, запасенной в электрическом поле изоляции.
При  таком  методе  измерения  характеристик  ЧР,  получившем  наибольшее 
распространение  из-за  высокой  чувствительности,  в  качестве  меры 
интенсивности  единичного  ЧР  принимают  величину  q   =  ΔUxCx,  которую 
называют кажущимся зарядом ЧР.
Опытным путем установлено [1], что в различных видах внутренней изоляции, 
в зависимости от качества изоляции и значения приложенного напряжения, ЧР 
могут  иметь  кажущиеся  заряды  от  10-14  до  10-16  Кл.  При  ЧР  с  кажущимися 
зарядами  10-14  …10-16  Кл  происходит  относительно  медленное  старение 
изоляции. В ряде случаев такие ЧР допустимы при рабочем напряжении, так как 
обусловленное  ими  старение  оказывается  настолько  медленным,  что 
обеспечивается  необходимый  срок  службы  (около  20  лет  и  более).  При  ЧР  с 
q=10-9…10-6  Кл  за  короткое  время  происходит  значительное  разрушение 
изоляции; такие ЧР недопустимы даже при кратковременных перенапряжениях 
и, следовательно, при испытательных напряжениях.
Согласно [1], было решено использовать метод регистрации высокочастотных 
10

колебаний,   возникающих   при   ЧР   в   изоляции,   так   как   этот   метод   позволяет 
надежно   и   точно   измерять   основные   характеристики   ЧР   и   обеспечивает 
чувствительность порядка 10-14  — 10-15  Кл. Согласно метода, между жилой и 
землей включается резистивный делитель напряжения, к одному из резисторов 
которого подключается вход АЦП.
Вывод:   Основываясь  на  [1, 2]   был   разработан   метод  определения  момента 
начала   и   развития   лавинообразного   деструктивного   процесса   в   изоляции, 
приводящего к ее пробою и возникновению аварии, основанный на измерении 
характеристик   ЧР   и   сравнении   их   с   полученными   экспериментально 
максимальными   значениями   энергии   и   частоты   следования,   при   превышении 
которых на заданном напряжении развивается пробой.
Разработка структурной схемы  устройства прогнозирующей защиты
Система  защиты  опирается  на  измерение  характеристик  ЧР,  но,  при  этом 
разработано несколько методов контроля изоляции – накопление статистических 
данных  о  деструктивных  процессах  в  изоляции  и  их  влияние  на  картину  ЧР  и 
сравнение динамики значений снимаемых характеристик ЧР с экспериментально 
полученной динамикой этих характеристик непосредственно перед пробоем.
Суть  первого  метода  заключается  в  контроле  сопротивления  изоляции  и 
контроле  параметров  ЧР  в  изоляции  кабелей  с  различным  возрастом  и 
измерение  зависимостей  параметров  ЧР  от  сопротивления  изоляции,  что 
позволит  контролировать  сопротивление  изоляции  любой  кабельной  линии  не 
11

выводя  ее  из  работы  и  не  разрушая  изоляцию  повышенным  напряжением   и 
рассчитывать   примерный   остаточный   срок   службы   кабельной   линии.  Второй 
метод заключается в том, что  зная  картины  ЧР  при  развитии  повреждений и 
пробое,  этот  метод  позволит  успеть  переключиться  на  резервный  источник 
питания  даже  при  механическом  или  термическом  воздействии  на  изоляцию  и 
предотвратить аварию, дополнив подсчет количества и энергии ЧР акустическим 
методом контроля, можно рассчитать место в котором развивается повреждение.
Структурная схема показана на рис. 2.
Вывод о 
Измерение   
Анализ 
состоянии 
количества 
(Построение 
изоляции и 
Отключение
и  заряда  ЧР 
графиков, 
необходи-
в  единицу 
накопление 
мости 
времени
статистики)
отключения
Рис. 2. Упрощенный алгоритм работы системы прогнозирующей защиты.
Вывод:   разработана   структурная   схема   устройства,   обладающего 
необходимыми   для   достижения   поставленных   задач   характеристиками   с 
возможностью   дальнейшего   наращивания   возможностей   и   улучшения 
эксплуатационных характеристик за счет блочной структуры.
Разработка печатной платы
12

Прибор создан на SMD компонентах основе микроконтроллера АТ Mega 32, 
на котором, при помощи ассемблера, реализована многозадачная операционная 
система, многозадачность которой реализована на прерываниях. Это позволило 
постепенно   наращивать   возможности   устройства   и   запускать   измененные 
алгоритмы   анализа   либо   расчетов   не   прибегая   к   перепрограммированию 
микроконтроллера,   а   просто   записав   их   на   Micro   SD   карту.   Прибор   имеет 
внешний   SD   контроллер,   внешний   АЦП,   буфер   СОМ   интерфейса 
программирования,   внешний   USB   контроллер,   буфер   LAN.   Таким   образом, 
обеспечена   полная   развязка   между   программатором,   сервером,   прибором   и 
измерительной   аппаратурой,   все   контроллеры   связаны   друг   с   другом   по 
протоколу   I2C.   Прибор   имеет   графический   дисплей,   СОМ   порт   для 
программирования, USB и LAN для связи с сервером, Micro SD для сохранения 
настроек и архивных данных при отсутствии возможности работы с сервером 
онлайн, разъём для подключения измерительной аппаратуры к внешнему либо 
внутреннему АЦП, разъем основного питания, часы и календарь с питанием от 
перезаряжаемого аккумулятора, разъем для управления внешним оборудованием 
(через электромагнитные реле с цепью управления рассчитанной на +5 Вольт), 
термодатчиком для ведения статистики износа изоляции.
Прибор в режиме анализа, при помощи внешнего, либо внутреннего АЦП 
анализирует форму сигнала на делителе напряжения и передает ее на сервер по 
интерфейсу USB (виртуальный COM — до 1 Мбит/с), либо по LAN (до 100 
Мбит/с), либо записывает на SD карту используя GZIP алгоритм компрессии для 
дальнейшего   анализа.   В   режиме   защиты   прибор   сам   анализирует   короткие 
промежутки   осциллограммы   и   рассчитывает   частоту   и   энергию   ЧР   и 
сопоставляет   их   динамику   с   опасными   значениями,   получаемыми   в   ходе 
13

испытаний. При возникновении и начале развития аварии появляется +5 вольт 
(либо   «-»)   на   любом   проводе   управления   внешним   оборудованием,   либо   на 
нескольких   сразу   (настраивается),   к   которому,   через   электромагнитное   реле 
может   быть   подключен   блинкер,   цепь   отключения   выключателя,   либо   цепь 
перехода на резерв без бестоковых пауз.
Контроль   состояния   изоляции   осуществляется   при   помощи   измерения 
частоты и кажущегося заряда частичных разрядов в исследуемом кабеле. Любое 
изменение   характеристик   изоляции   сказывается   на   количестве   и   кажущемся 
заряде частичных разрядов, таким образом, можно экспериментально установить 
характерные   картины   развития   пробоя   и   сравнивать   с   ними   снимаемые 
показания.   Соответствие   снимаемых   показаний   с   одной   из   картин   развития 
пробоя считается началом развития аварии.
Вывод:   созданный   прибор   соответствует   поставленной   задаче   и   позволяет 
наращивать   свои   возможности   для   увеличения   точности   расчета   времени   до 
конца срока службы, времени до аварии (пробоя), реализации алгоритма расчета 
мест наиболее вероятных повреждений.
Разработка алгоритма и программного обеспечения
Программное обеспечение устройства написано на Ассемблере и представляет 
собой многозадачную операционную систему на прерываниях, что позволяет не 
останавливая   измерений   производить   оценку   ситуации.   Реализована 
возможность запуска предварительно скомпилированной программы, записанной 
14

на Micro SD карту начиная с нулевого сектора, все настройки хранятся на Micro 
SD карте в бинарном виде, таблицы по которым описывается опасная динамика 
характеристик хранятся в текстовом виде без сжатия, снимаемые осциллограммы 
записываются в виде текстовых таблиц с GZIP компрессией для экономии места, 
снимаемые   характеристики   ЧР   записываются   в   виде   текста   с   разделителями. 
Ниже   приведены   исходные   тексты   операционной   системы   и   подпрограмм   с 
комментариями приведены в приложении А.
Алгоритм  работы  прибора  будет  пояснен  на  основе  блок-схемы, 
представленной на рис. 3.
1. Блок  измерения  характеристик  ЧР  – служит  для  проведения  измерений  и 
передачи  информации  для  дальнейшей  обработки.  Представляет  собой 
внутренний   АЦП   микроконтроллера.   Предусмотрена   возможность 
использования внешних АЦП с улучшенными характеристиками.
2. Блок  обработки  информации  –   буфер   между   АЦП   и   контроллером, 
предназначен для обеспечения гальванической развязки устройства и цепи 
на которой проводятся измерения, а так же развязки устройства и сетевого 
интерфейса.
3. Внешнее ЗУ с информацией и настройками – представляет собой внешний 
носитель (Micro SD карта) с экспериментальной информацией о динамике 
изменения характеристик ЧР при пробоях образцов изоляции защищаемой 
линии, а так же с настройками — временем отключения до предполагаемой 
аварии,   выбранные   варианты   действий   в   случае   обнаружения 
надвигающейся аварии.
4. Внешний  интерфейс  для  отладки  –  представляет  собой  последовательный 
порт для подключения прошивальщиков/дамперов и т.д.
15

5. Основной  микроконтроллер  будет  выполнять  вычисление  оставшегося 
времени службы изоляции и прогнозирование аварии исходя из измерений 
и данных получаемых от внешнего ЗУ, содержащего информацию о КЛ.
6. Органы  управления  АВР  –  система  сигналов,  позволяющая 
взаимодействовать с АВР.
Блок 
измерения 
Блок  обработки 
Внешний сетевой 
характеристик ЧР
информации
интерфейс
Основной 
микроконтроллер 
(алгоритмы 
Органы 
распознавания 
Внешнее  ЗУ  с  информацией 
различных 
управления АВР
и настройками
ситуаций и 
принятие 
решения)
Внешний 
интерфейс 
для 
отладки
Рисунок 3. Блок-схема устройства.
Вывод:   разработана   многозадачная   операционная   система,   способная 
удовлетворить   все   требования,   предъявляемые   поставленной   задачей   — 
реализовать одновременный сбор, анализ, вывод данных и управление внешними 
устройствами.   Операционная   система   построена   по   архитектуре   микроядра, 
основной системы и драйверов устройств, что позволяет гибко изменять состав и 
количество внешних устройств.
16

4. Проведение экспериментов
Для   получения   необходимых   для   работы   устройства   характерных   картин 
изменения параметров ЧР при пробое, накопления статистики о характеристиках 
ЧР в изоляции при ее старении были поставлены эксперименты.  Согласно [1], 
было   решено   использовать   метод   регистрации   высокочастотных   колебаний, 
возникающих при ЧР в изоляции, так как этот метод позволяет надежно и точно 
измерять   основные   характеристики   ЧР.   Осциллограф   и   АЦП   устройства 
подключались на резистивный делитель напряжения, включенный параллельно 
образцу исследуемой изоляции. По результатам экспериментов можно сказать, 
что существует проблема различения ЧР и помех в линии, проблема различения 
ЧР в образце и в масле повышающего трансформатора испытательного стенда, 
проблема   быстродействия   и   разрядности   АЦП,   что   не   влияет   на 
работоспособность   устройства,   но   может   привести   к   ложным   срабатываниям 
защиты.
5. Заключение
Разработан новый метод обнаружения развития аварии в кабельной линии до 
пробоя изоляции, основанный на предложенной в [2] Кучинским Г.С. 
зависимости частоты следования и кажущегося заряда ЧР от времени службы 
изоляции, разработана структурная схемы работы устройства прогнозирующей 
17

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

6. Библиографический список
1. Кучинский Г.С. Частичные разряды в высоковольтных конструкциях / 
Кучинский Г.С. - Ленинград: Энергия, 1979. - 224 с.
2. Кучинский Г.С.,  Кизеветтер В.Е., Пинталь Ю.С. Изоляция установок 
высокого напряжения: Учебник для вузов / Под общ. ред. Кучинского Г.С. - 
Москва: Энергоатомиздат, 1987. - 368 с.
3. Сви П.М. Контроль изоляции оборудования высокого напряжения / Сви 
П.М. - Москва: Энергоатомиздат, 1988.
4. Сви П.М. Методы и средства диагностики оборудования высокого 
напряжения / Сви П.М. - Москва: Энергоатомиздат, 1992. - 237 с.
5. Зайцев К.А., Шарлот С.А. Частичные разряды как фактор контроля 
изоляции электрооборудования в эксплуатации / Электротехника, 1983. №4. 
с. 29 — 30.
19

Приложение А
Ядро операционной системы:
;=============================================================================
; Процедура очистки очереди
;=============================================================================
ClearTaskQueue:
push ZL
push ZH
ldi ZL, low(TaskQueue)
ldi ZH, high(TaskQueue)
ldi OSRG, $FF
;
ldi Counter, TaskQueueSize
CEQL01: st Z+, OSRG
;
dec Counter
;
brne CEQL01
; Loop
pop ZH
pop ZL
ret
;=============================================================================
; Процедура очистки таймеров
;=============================================================================
ClearTimers:
push ZL
push ZH
ldi ZL, low(TimersPool)
ldi ZH, high(TimersPool)
20

ldi Counter, TimersPoolSize
ldi OSRG, $FF
; Empty 
ldi Tmp2, $00
CTL01:
st Z+, OSRG
; Event
st Z+, Tmp2
; Counter Lo
st Z+, Tmp2
; Counter Hi
dec Counter
;
brne CTL01
; Loop
pop ZH
pop ZL
ret
;=============================================================================
; Процедура обработки очереди задач
;=============================================================================
ProcessTaskQueue:
ldi ZL, low(TaskQueue)
ldi ZH, high(TaskQueue)
ld OSRG, Z
; For Event
cpi OSRG, $FF
; No Event or Addr out of Range
breq PTQL02
; No Action
clr ZH
lsl OSRG
mov ZL, OSRG
subi ZL, low(-TaskProcs*2)
sbci ZH, high(-TaskProcs*2) ; Add
lpm
; mov r0 <- CODE[Z]
21

mov OSRG, r0
ld r0, Z+
; inc Z
lpm
mov ZL, OSRG
; Get Addr
mov ZH, r0
push ZL
push ZH
; Advance Queue
ldi Counter, TaskQueueSize-1
ldi ZL, low(TaskQueue)
ldi ZH, high(TaskQueue)
cli
PTQL01:
ldd OSRG, Z+1 
;
Shift Queues
st Z+, OSRG
;
;
cpi OSRG, $FF
;
;
breq PTQL02
; For Long Queues
dec Counter
;
brne PTQL01
; Loop
ldi OSRG, $FF
;
st Z+, OSRG
;
sei
pop ZH
pop ZL
ijmp 
; Minimize Stack Usage
PTQL02:
ret
;-------------------------------------------------------------------------
; OSRG - Event
22

SendTask:
push ZL
push ZH
push Tmp2
push Counter
ldi ZL, low(TaskQueue)
ldi ZH, high(TaskQueue)
ldi Counter, TaskQueueSize
SEQL01: ld Tmp2, Z+
cpi Tmp2, $FF
breq SEQL02
dec Counter
;
breq SEQL03
; Loop
rjmp SEQL01
SEQL02: st -Z, OSRG
; Store EVENT
SEQL03:
; EXIT
pop Counter
pop Tmp2
pop ZH
pop ZL
ret
;------------------------------------------------------------------------
; OSRG - Timer Event
; X - Counter
SetTimer:
push ZL
push ZH
push Tmp2
push Counter
23

ldi ZL, low(TimersPool)
ldi ZH, high(TimersPool)
ldi Counter, TimersPoolSize
STL01:  ld Tmp2, Z
; Value / Counter
cp Tmp2, OSRG
; Search for Event
breq STL02
subi ZL, Low(-3)
; Skip Counter
sbci ZH, High(-3)
; Z+=2
dec Counter
;
breq STL03
; Loop
rjmp STL01
STL02:
;cli
std Z+1, XL
; Critical Section
std Z+2, XH
; Update Counter
;sei
; leave Critical Section
rjmp
STL06
; Exit
STL03:
ldi ZL, low(TimersPool)
ldi ZH, high(TimersPool)
ldi Counter, TimersPoolSize
STL04:
ld Tmp2, Z
; Value / Counter
cpi Tmp2, $FF
; Search for Empty Timer
breq STL05
subi ZL, Low(-3)
; Skip Counter
sbci ZH, High(-3)
; Z+=2
24

dec Counter
;
breq STL06
; No Empty Timer
rjmp STL04
STL05:
cli
st Z, OSRG
; Set Event 
std Z+1, XL
std Z+2, XH
sei
STL06:
pop Counter
pop Tmp2
pop ZH
pop ZL
ret
;=============================================================================
; Процедура подсчета CRC8 области памяти
;=============================================================================
;
Counter - количество байт
;
ZL - начало адресного пространства
CRC8:
push tmp4
push tmp3
push tmp2
ldi
tmp3,0x18
; загрузка полинома
mov
tmp4,tmp3
; в регистр HiCRC
clr
OSRG
; обнуление CRC регистра
CRC8_Loop:
ldi
tmp2,8
; указываем 8 бит для подсчета ;
ld
tmp3,Z+
; берем байт из буфера
25

CRC8_Bit_Loop:
push
tmp3
; сохранение байта в стеке
eor
tmp3,OSRG
; xor байта и регистра CRC
lsr
tmp3
; сдвигаем младший бит получившегося байта 
в перенос
brcc
CRC8_Zero_0
; проверяем младший разряд байта
eor     OSRG,tmp4
; если там 1, то CRC xor полином
CRC8_Zero_0:
ror
OSRG
; если там 0, то просто сдвиг CRC регистра
pop
tmp3
; возвращаем байт на место
lsr
tmp3
; и сдвигаем его
dec
tmp2
;
brne
CRC8_Bit_Loop
; переход на цикл проверки слеующего бита
dec
Counter
;
brne
CRC8_Loop
; переход на следующий байт буфера
pop tmp2
pop tmp3
pop tmp4
ret
Wait255:
push
Counter
ser
Counter
Wait255_loop:
nop
nop
nop
nop
nop
26

dec
Counter
cpi
Counter, 0x00
brne
Wait255_loop
pop
Counter
ret
=================================================================================
Подпрограмма управления LCD дисплеем:
;===========LCDDefine=============================================================
.equ DATA_PORT
= PORTB
; LCD Data Port
.equ DATA_PIN
= PINB
.equ DATA_DDR
= DDRB
.equ CMD_PORT
= PORTB
; LCD Control Port
.equ CMD_PIN
= PINB
.equ CMD_DDR
= DDRB
.equ E
= 3
.equ RW
= 2
.equ RS
= 1
.equ SPEED
= 14
; 14 для XTAL=16MHz, 10 для XTAL=8MHz, 6 для XTAL=4MHz
==================================================================================
; LCD Init
.equ 
LCD_CLR           = 0      
; DB0: clear display
.equ 
LCD_HOME         
= 1      
; DB1: return to home position
.equ  
LCD_ENTRY_MODE    = 2      
; DB2: set entry mode
.equ 
LCD_ENTRY_INC    
= 1      
; DB1: increment
.equ 
LCD_ENTRY_SHIFT   = 0      
; DB2: shift
.equ 
LCD_ON
      
= 3      
; DB3: turn lcd/cursor on
.equ  
LCD_ON_DISPLAY   
= 2      
; DB2: turn display on
27

.equ  
LCD_ON_CURSOR      = 1      
; DB1: turn cursor on
.equ  
LCD_ON_BLINK      
= 0      
; DB0: blinking cursor
.equ  
LCD_MOVE          
= 4      
; DB4: move cursor/display
.equ 
LCD_MOVE_DISP       = 3      
; DB3: move display (0-> move cursor)
.equ  
LCD_MOVE_RIGHT      = 2      
; DB2: move right (0-> left)
.equ  
LCD_F
        = 5      
; DB5: function set
.equ 
LCD_F_8B
   
= 4      
; DB4: set 8BIT mode (0->4BIT mode)
.equ  
LCD_F_2L
= 3      
; DB3: two lines (0->one line)
.equ  
LCD_F_10D
= 2     
; DB2: 5x10 font (0->5x7 font)
.equ  
LCD_CGRAM           = 6     
; DB6: set CG RAM address
.equ  
LCD_DDRAM           = 7     
; DB7: set DD RAM address
 
.equ SCR_L
= 0b00011000
; Сдвиг экрана влево
.equ SCR_R
= 0b00011100
; Сдвиг экрана вправо
.equ CUR_L
= 0b00010000 
; Сдвиг курсора влево
.equ CUR_R
= 0b00010100
; Сдвиг курсора вправо
==================================================================================
;===========LCDMacros==============================================================
; Init Config
.MACRO
LIB_LCD_Init
; Инициализация LCD
RCALL InitHW
; Настроить контрольный порт
RCALL LCD_DELAY
; Подождать
WR_CMD
(1<<LCD_F)|(0<<LCD_F_8B)
; Выдать функции в порт. Команда инициализации адресации ДВА РАЗА!!!
WR_CMD
(1<<LCD_F)|(0<<LCD_F_8B)
; Выдать функции в порт. Команда инициализации адресации ДВА РАЗА!!!
WR_CMD
(1<<LCD_F)|(0<<LCD_F_8B)
; Выдать функции в порт. Команда инициализации адресации ДВА РАЗА!!!
28

WR_CMD
(1<<LCD_F)|(0<<LCD_F_8B)|(1<<LCD_F_2L) 
; Так как на 4 байтах нельзя передать сразу второй байт
WR_CMD
(1<<LCD_CLR)
;0x01
WR_CMD
(1<<LCD_ENTRY_MODE)|(1<<LCD_ENTRY_INC)
;0x06
WR_CMD
(1<<LCD_ON)|(1<<LCD_ON_DISPLAY)|(0<<LCD_ON_CURSOR)|
(0<<LCD_ON_BLINK)
;0x0C
WR_CMD
(1<<LCD_HOME)
.ENDM
==================================================================================
;Write Data
.MACRO
WR_DATA
LDI
R17,@0
RCALL DATA_WR
.ENDM
==================================================================================
;Write CMD
.MACRO
WR_CMD
LDI
R17,@0
RCALL CMD_WR
.ENDM
==================================================================================
; Read Data
.MACRO
RD_DATA
RCALL DATA_RD
.ENDM
==================================================================================
; Read CMD
.MACRO
RD_CMD
RCALL CMD_RD
.ENDM
==================================================================================
;Set COORD
;Syntax LCD_COORD X,Y
29

.MACRO LCD_COORD
LDI
R17,(1<<LCD_DDRAM)|(@0+0x40*@1)
RCALL CMD_WR
.ENDM
==================================================================================
;Shift SCREEN/CURSOR
.MACRO
SHIFT
LDI
R17,@0
RCALL CMD_WR
.ENDM
==================================================================================
;LCD Clear
.MACRO
LCDCLR
LDI 
R17,(1<<LCD_CLR)
RCALL CMD_WR
.ENDM
==================================================================================
;Write CGRAM
.MACRO WR_CGADR
LDI
R17,(1<<LCD_CGRAM)|(@0)
RCALL CMD_WR
.ENDM
;Write DDRAM
.MACRO WR_DDADR
LDI
R17,(1<<LCD_DDRAM)|(@0)
RCALL CMD_WR
.ENDM
;
===========LCDProc===================================================================
InitHW:
CBI
CMD_PORT,RS
; Выставляем нужные уровни на управляющих выводах
CBI
CMD_PORT,RW
; Порты на выход
CBI
CMD_PORT,E
; И сразу же выставляются на 1
30

SBI
CMD_DDR,RS
SBI
CMD_DDR,RW
SBI
CMD_DDR,E
RCALL PortIn
; Порт данных на вход
RET
==================================================================================
BusyWait: CLI
; Ожидание флага занятости контроллера дисплея
RCALL PortIn
; Порты на вход
CBI
CMD_PORT,RS
; Идет Команда!
SBI
CMD_PORT,RW
; Чтение!
BusyLoop: SBI
CMD_PORT,E
; Поднять строб
RCALL LCD_Delay
; Подождать
IN
R16,DATA_PIN
; Считать байт
PUSH R16
Сохранить его в стек. Дело в том, что у нас R16 убивается в LCD_Delay
CBI
CMD_PORT,E
;   Бросить   строб   -   первый   цикл   (старший   полубайт)
RCALL LCD_Delay
; Подождем маленько
SBI
CMD_PORT,E
; Поднимем строб
RCALL LCD_Delay
; Подождем 
CBI
CMD_PORT,E ; Опустим строб - нужно для пропуска второго полубайта
RCALL LCD_Delay
; Задержка снова
POP
R16
; А теперь достаем спрятанны байт - в нем наш флаг. Может быть.
ANDI R16,0x80
; Продавливаем по маске. Есть флаг?
31

BRNE BusyLoop
; Если нет, то переход
BusyNo:
SEI
; Разрешаем прерывания.
RET
==================================================================================
; Запись команды в дисплей. Код команды в R17
CMD_WR:
CLI
; Запрет прерываний
RCALL BusyWait
; Ждем готовности
CBI
CMD_PORT,RS
; Идет команда!
RJMP WR_END
; Переход на запись
;-----------------------------------------------------------------------------------------
; Запись данных в дисплей. Код данных в R17
DATA_WR: CLI
; Запрет прерываний
RCALL BusyWait
; Ждем готовности
SBI
CMD_PORT,RS
; Идут данные!
WR_END:
CBI
CMD_PORT,RW
; Запись!
SBI
CMD_PORT,E
; Поднять строб
RCALL PortOut
; Порт настроить на выход!
PUSH R17
; Сохраним данные которые будем выводить в стеке
ANDI R17,0xF0
; Отдавим по маске данным младшую тетраду.
IN
R16,DATA_PORT
; Возьмем из порта данных старое значение
ANDI R16,0x0F
; Отдавим ему старшую тетраду
PUSH R16
; Сохраним результа в стеке. Пригодится
OR
R16,R17; Склеим младшую тетраду из порта со старшей тетрадой данных 
OUT
DATA_PORT,R16
; Выдадим этого мутанта в порт.
32

RCALL LCD_Delay
; Подождем
CBI
CMD_PORT,E
; Бросим строб вниз - данные ушли в индикатор
RCALL LCD_Delay
; Подождем
 
SBI
CMD_PORT,E
; Поднимем строб
POP
R16
; Достанем из стека младшую тетраду из порта
POP
R17
; И данные которые мы выводим
SWAP R17
; Поменяем тетрады местами у байта данных 
ANDI R17,0xF0
; Отдавим младшую тетраду
OR
R16,R17
; Склеим младшую тетраду из порта с старшей тетрадой данных (бывшая младшая)
OUT
DATA_PORT,R16
; Выдадим в порт
RCALL LCD_Delay
; Подождем
CBI
CMD_Port,E
; Бросим строб
RCALL PortIn
; Порт вернем в прежнее состояние - на вход
SEI
; Разрешим прерывания
RET
; Возврат
==================================================================================
; Чтение команды из дисплея. Результат в R17
CMD_RD:
CLI
; Запрет прерываний
RCALL BusyWait
; Ждем контроллер
CBI
CMD_PORT,RS
; Команда!
RJMP RD_END
; Идем на чтение
;-----------------------------------------------------------------------------------------
; Чтение команды из дисплея. Результат в R17
DATA_RD: CLI
; Запрет прерываний
RCALL BusyWait
; Ждем контроллер
SBI
CMD_PORT,RS
; Данные!
33

RD_END:
SBI
CMD_PORT,RW
; Чтение!
SBI
CMD_PORT,E
; Поднимаем строб
RCALL LCD_Delay
; Ждем
IN
R17,DATA_PIN
; Читаем из порта байт 
CBI
CMD_PORT,E
; Бросем строб вниз
ANDI R17,0xF0
; Отдавливаем ему младшую тетраду
SWAP R17
; Обмениваем тетрады местами
RCALL LCD_Delay
; Ждем
SBI
CMD_PORT,E
; Поднимаем строб
MOV
R16,R17
; Прячем старшую тетраду в R16
IN
R17,DATA_PIN
; Берем еще один байт
CBI
CMD_PORT,E
; Бросаем строб
ANDI R17,0xF0
; Отдавливаем младшую тетраду
OR
R17,R16
; Склеиваем результат с старшим байтом
SWAP R17
; Разорваичаем байт. Т.к. первой выходила старшая тетрада
SEI
; разрешаем прерывания
RET
; Возврат.
==================================================================================
PortIn:
IN
R16,DATA_DDR
; Данные из DDR в регистр
ANDI R16,0x0F
; Отдавливаем старшую тетраду - нам нужно сохранить младшую и обнулить старшую
OUT
DATA_DDR,R16
; Выдаем результат в порт.
IN
R16,DATA_PORT
; Берем данные из порта 
ORI
R16,0xF0
; Выставляем все биты старшей тетрады, не трогая младшую
OUT
DATA_PORT,R16
; Выдаем в порт
RET
34

==================================================================================
PortOut:
IN
R16,DATA_DDR
; Данные из ДДР в регистр
ORI
R16,0xF0
; Выставляем все биты старшей тетрады, не трогая младшую
OUT
DATA_DDR,R16
; Выдаем данные в порт
RET
=================================================================================
LCD_Delay: LDI
R16,SPEED
; Задержка на несколько тактов. Для того чтобы дисплей 
L_loop:
DEC
R16
; Успевал обрабатывать данные
BRNE L_loop
RET
=================================================================================
Подпрограмма управления дисплеем в графическом режиме:
===========LCDDefine===============================================================
.dseg
LIB_LCD_GS_Step:
.byte

; Следующее событие в очереди
LIB_LCD_GS_Buffer:
.byte

; 1 - data; 0 - cmd
.cseg
.equ LIB_LCD_GS_Reset_P
= PORTD
; Reset (active low)
.equ LIB_LCD_GS_Reset_N
= PIND
.equ LIB_LCD_GS_Reset_D
= DDRD
.equ LIB_LCD_GS_Reset_I
= 5
.equ LIB_LCD_GS_Commit_P
= PORTD
; Storage Register
.equ LIB_LCD_GS_Commit_N
= PIND
35

.equ LIB_LCD_GS_Commit_D
= DDRD
.equ LIB_LCD_GS_Commit_I
= 6
.equ LIB_LCD_GS_CLK_P
= PORTD
; Clock Register
.equ LIB_LCD_GS_CLK_N
= PIND
.equ LIB_LCD_GS_CLK_D
= DDRD
.equ LIB_LCD_GS_CLK_I
= 2
.equ LIB_LCD_GS_Data_P
= PORTD
; Data Register
.equ LIB_LCD_GS_Data_N
= PIND
.equ LIB_LCD_GS_Data_D
= DDRD
.equ LIB_LCD_GS_Data_I
= 7
;
Номер бита шины управления дисплея
.equ LIB_LCD_GS_Line_CS1
= 1
; 1 - on; 0 - off
.equ LIB_LCD_GS_Line_CS2
= 2
; 1 - on; 0 - off
.equ LIB_LCD_GS_Line_RST
= 3
; 1 - work; 0 - reset 
.equ LIB_LCD_GS_Line_RW
= 4
; 1 - read; 0 - write
.equ LIB_LCD_GS_Line_DI
= 5
; 1 - data; 0 - instruction
.equ LIB_LCD_GS_Line_E
= 6

.equ LIB_LCD_GS_Line_DEBUG
= 7
====================================================================================
;Write Data
.MACRO
LIB_LCD_GS_Write_CMD
36

cli
; Останавливаем прерывания
 
push
XH
push
XL
ldi
XL, @0
ldi
XH, @1
ori
XL, (1<<LIB_LCD_GS_Line_RST)
; Маска
rcall
LIB_LCD_GS_Write
pop
XL
pop
XH
sei
; Разрешаем прерывания
.ENDM
.MACRO
LIB_LCD_GS_Write_Data
cli
; Останавливаем прерывания
 
push
XH
push
XL
ldi
XL, @0
ldi
XH, @1
ori
XL, (1<<LIB_LCD_GS_Line_RST)|(1<<LIB_LCD_GS_Line_DI)
; Маска
rcall
LIB_LCD_GS_Write
pop
XL
pop
XH
sei
; Разрешаем прерывания 
37

.ENDM
=====================================================================================
LIB_LCD_GS_Init:
sbi
LIB_LCD_GS_Reset_D, LIB_LCD_GS_Reset_I
; Настроили на выход
sbi
LIB_LCD_GS_Reset_P, LIB_LCD_GS_Reset_I
; Поднимаем строб
sbi
LIB_LCD_GS_Commit_D, LIB_LCD_GS_Commit_I
; Настроили на выход
cbi
LIB_LCD_GS_Commit_P, LIB_LCD_GS_Commit_I
; Опускаем строб
sbi
LIB_LCD_GS_CLK_D, LIB_LCD_GS_CLK_I
; Настроили на выход
cbi
LIB_LCD_GS_CLK_P, LIB_LCD_GS_CLK_I
; Опускаем строб
sbi
LIB_LCD_GS_Data_D, LIB_LCD_GS_Data_I
; Настроили на выход
cbi
LIB_LCD_GS_Data_P, LIB_LCD_GS_Data_I
; Опускаем строб
ret
=====================================================================================
LIB_LCD_GS_Write:
push
OSRG
ldi
OSRG, (1<<LIB_LCD_GS_Line_E) 
; Маска
eor
XL, OSRG 
rcall
LIB_LCD_GS_SyncReg
rcall
LIB_LCD_GS_Transmit
eor
XL, OSRG
rcall
LIB_LCD_GS_SyncReg
rcall
LIB_LCD_GS_Transmit
eor
XL, OSRG
rcall
LIB_LCD_GS_SyncReg
38

rcall
LIB_LCD_GS_Transmit
pop
OSRG
ret
=====================================================================================
LIB_LCD_GS_SyncReg:
;
XL - CMD
;
XH - Data
 
push
ZH
push
ZL
ldi
ZL, low (LIB_LCD_GS_Buffer)
; Загружаем адрес буффера.
ldi
ZH, High(LIB_LCD_GS_Buffer)
; Старший и младший байты.
st
Z+, XL
st
Z, XH
pop
ZL
pop
ZH
ret
=====================================================================================
LIB_LCD_GS_Transmit:
; Останавливаем прерывания
push
OSRG
; Сохраняем регистр
push
Counter
; Сохраняем регистр
in 
OSRG,SREG
; Save Sreg
push 
OSRG
; Сохранение регистра состояния SREG
push
ZH
push
ZL
ldi 
Counter, 2
; Выставляем количество байт
39

ldi
ZL, low (LIB_LCD_GS_Buffer)
; Загружаем адрес буффера.
ldi
ZH, High(LIB_LCD_GS_Buffer)
; Старший и младший байты.
sbi
LIB_LCD_GS_Reset_P,  LIB_LCD_GS_Reset_I
; Поднимаем строб
cbi
LIB_LCD_GS_Commit_P, LIB_LCD_GS_Commit_I
; Опускаем строб
LIB_LCD_GS_Transmit_ByteLoop:
; Цикл отправки байта
push
Counter
ldi
Counter, 8
; Выставляем количество бит
ld
OSRG, Z+
; Читаем байт из буфера
LIB_LCD_GS_Transmit_BitLoop:
cbi
LIB_LCD_GS_CLK_P, LIB_LCD_GS_CLK_I
; Опускаем строб
lsl
OSRG
; Старший бит в перенос
brcc
LIB_LCD_GS_Transmit_bit_put0
; Если в переносе 0 то переходим
LIB_LCD_GS_Transmit_bit_put1:
sbi
LIB_LCD_GS_Data_P, LIB_LCD_GS_Data_I
; Поднимаем строб
rjmp
LIB_LCD_GS_Transmit_bit_sync
LIB_LCD_GS_Transmit_bit_put0:
cbi
LIB_LCD_GS_Data_P, LIB_LCD_GS_Data_I
; Опускаем строб
rjmp
LIB_LCD_GS_Transmit_bit_sync
LIB_LCD_GS_Transmit_bit_sync:
sbi
LIB_LCD_GS_CLK_P, LIB_LCD_GS_CLK_I
40

; Поднимаем строб
dec
Counter
cpi
Counter, 0
brne
LIB_LCD_GS_Transmit_BitLoop
pop
Counter
dec
Counter
cpi
Counter, 0
brne
LIB_LCD_GS_Transmit_ByteLoop
sbi
LIB_LCD_GS_Commit_P, LIB_LCD_GS_Commit_I
; Поднимаем строб
cbi
LIB_LCD_GS_Reset_P,  LIB_LCD_GS_Reset_I
; Опускаем строб
pop
ZL
pop
ZH
pop 
OSRG
; Восстанавливаем регистр состояния SREG
out 
SREG,OSRG
; Восстанавливаем регистр
pop 
OSRG
; Разрешаем прерывания 
RCALL
LCD_Delay
ret
=====================================================================================
;
Functions High
LIB_LCD_GS_On:
LIB_LCD_GS_Write_CMD (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b00111111
ret
LIB_LCD_GS_Off:
LIB_LCD_GS_Write_CMD (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b00111110
ret
LIB_LCD_GS_Load:
LIB_LCD_GS_Write_CMD   (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2),   0b00111111
41

;
Display ON
LIB_LCD_GS_Write_CMD   (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2),   0b01000011
;
Set Address
LIB_LCD_GS_Write_CMD   (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2),   0b10111011
;
Set Page
LIB_LCD_GS_Write_CMD   (1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2),   0b11000001
;
Display Line
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
LIB_LCD_GS_Write_Data(1<<LIB_LCD_GS_Line_CS1)|(1<<LIB_LCD_GS_Line_CS2), 0b01010101
ret
;LIB_LCD_GS_COORD:
;LIB_LCD_GS_SetY:
=====================================================================================
Подпрограмма реализации сетевого интерфейса
;=============================================================================
; Данные в памяти
;=============================================================================
.equ UART_Packet_Size
= 12
.dseg
UART_Address:
.byte
1
UART_Packet_CRC8:
.byte
1
UART_R_Count:
.byte
1
UART_R_SAddress:
.byte
1
UART_R_DAddress:
.byte
1
42

UART_R_Command:
.byte
1
UART_R_Data:
.byte
8
UART_R_Data_CRC:
.byte
1
UART_S_Count:
.byte
1
UART_S_SAddress:
.byte
1
UART_S_DAddress:
.byte
1
UART_S_Command:
.byte
1
UART_S_Data:
.byte
8
.
UART_S_Data_CRC:
.byte
1
.cseg
;==========================================================================
; Macro
;==========================================================================
.MACRO mk_uart_crc8 
; @0 = UART_[R|S]_Address
; OSRG - Out
push
Counter
ldi
Counter, UART_Packet_Size-1
; Пакет из 11+crc байт
ldi ZL, low(@0)
ldi ZH, high(@0)
rcall 
CRC8
pop
Counter
.ENDMACRO
;
Добавить управление драйвером приема
.MACRO mk_uart_irq_rx_enable
sbi 
UCSRB, RXCIE
.ENDMACRO
.MACRO mk_uart_irq_rx_disable
cbi
UCSRB, RXCIE
.ENDMACRO
.MACRO mk_uart_irq_tx_enable
sbi
UCSRB, TXCIE
sbi
UCSRB, UDRIE
.ENDMACRO
.MACRO mk_uart_irq_tx_disable
43

cbi
UCSRB, TXCIE
cbi
UCSRB, UDRIE
.ENDMACRO
.MACRO mk_uart_packet_clear
push
OSRG
push
Counter
clr
OSRG
ldi
ZL, low(@0)
ldi
ZH, high(@0)
ldi
Counter, UART_Packet_Size-1
rcall
UART_Packet_Clear
pop
Counter
pop
OSRG
.ENDMACRO
;=============================================================================
; Команда начала отправки буффера
;=============================================================================
UART_SendBuffer:
StateSave
; Сохраняем состояние в стек
clr
ZL
; Очищаем регистр для адреса ячейки
clr
ZH

lds
Counter, UART_S_Count
; Читаем значение счетсчика
cpi
Counter, 0x01
; Проверяем на 0x01
brne
UART_SendBuffer_Exit
; Нет, валим
mk_uart_irq_rx_disable
; Запрещаем прием данных
sbis 
UCSRA,UDRE
; Пропуск если нет флага готовности
rjmp
UART_SendBuffer_Wait 
; ждем готовности - флага UDRE
ldi
ZL, UART_S_Count 
; Записываем начальное положение буфера 
add
ZL, Counter
; Суммируем и получаем [адрес байта для записи]
ld
OSRG, Z
; Считываем из памяти нужный бай
out
UDR, OSRG
; Отсылаем текущий байт в порт
INC
Counter
; Увеличиваем текущее положение каретки на 1
44

STS
UART_S_Count, Counter
; Сохраняем каретку
mk_uart_irq_tx_enable
; Разрешаем передачу данных
rjmp UART_SendBuffer_Exit
UART_SendBuffer_Wait:
SetTimerTask TS_UART_SendBuffer, 5
;  Вызываем сами себя через 5 милисекунд
UART_SendBuffer_Exit:
StateRestore
; Восстанавливаем состояние из стека
ret
;=============================================================================
; Процедура разбора входяшего пакета(полного)
;=============================================================================
UART_ReciveParse:
StateSave
; Сохраняем состояние в стек
lds
Counter, UART_R_Count
; Читаем значение счетсчика
cpi
Counter, 0xFF
; Проверяем стоп бит
brne
UART_ReciveParse_Exit
; Стоит не стоп бит, пропускаем обработку
lds
Counter, UART_S_Count
; Читаем значение счетсчика
cpi
Counter, 0xFF
; Проверяем стоп бит
brne
UART_ReciveParse_Wait
; Стоит не стоп бит, подождем 50 миллисекунд
lds
Counter, UART_R_Command
; Читаем из памяти команду
lsl
Counter
; Сдвигом влево умножаем содержимое Counter на два.
ldi
ZL, low (UART_Commands*2)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(UART_Commands*2)
; Старший и младший байты.
clr
OSRG 
; Сбрасываем регистр OSRG - нам нужен ноль.
add
ZL, Counter 
; Складываем младший байт адреса. Если возникнет переполнение
adc
ZH, OSRG 
; То вылезет флаг переноса.
45

lpm
Counter,Z+
; Загрузили в Counter адрес из таблицы
lpm
OSRG,Z
; Старший и младший байт
movw ZH:ZL,OSRG:Counter 
; забросили адрес в Z 
ijmp
; Переходим к обработке команды
UART_ReciveParse_Wait:
SetTimerTask TS_UART_ReciveParse, 5
;  Вызываем сами себя через 5 милисекунд
UART_ReciveParse_Exit:
StateRestore
; Восстанавливаем состояние из стека
ret
UART_ReciveParse_Return:
lds
Counter, UART_S_Count
; Читаем значение счетсчика
cpi
Counter, 0x01
; Проверяем на наличае начального положения каретки
brne
UART_ReciveParse_ClearAll
; Не стоит: значит сносим буффера и включаем прерывания
lds
OSRG, UART_Packet_CRC8
; Получаем параметр о CRC8
cpi
OSRG, 0x00
; Если параметр 0x00 
;breq
UART_ReciveParse_SetAddrs
; то пропускаем проверку CRC8
mk_uart_crc8 UART_S_Count+1
; Расчитываем CRC8 (выхлоп в OSRG)
sts
UART_S_Data_CRC, OSRG
; Сохраняем контрольную сумму
UART_ReciveParse_SetAddrs:
lds
OSRG, UART_R_SAddress
; Считываем исходяший адрес
sts
UART_S_DAddress, OSRG
; Вписываем адрес получателя
lds
OSRG, UART_Address
; Считываем адрес устройства
sts
UART_S_SAddress, OSRG
; Вписываем исходяший адрес
46

lds
OSRG, UART_R_Command
; Считываем номер команды
sts
UART_S_Command, OSRG
; Вписываем номер команды
rcall UART_SendBuffer
; Вызываем функцию отправки первого байта
rjmp UART_ReciveParse_Clear
; Сносим входящий буфер
UART_ReciveParse_ClearAll:
; Сносим данные и выставляем нули
mk_uart_packet_clear 
UART_R_Count
mk_memory_set
UART_R_Count, 0x01
mk_memory_set
UART_S_Count, 0xFF
mk_uart_irq_tx_disable
; Запрещаем передачу данных
mk_uart_irq_rx_enable
; Разрешаем прием данных
rjmp UART_ReciveParse_Exit
UART_ReciveParse_Clear:
; Сносим данные и выставляем нули
mk_uart_packet_clear 
UART_R_Count
mk_memory_set
UART_R_Count, 0x01
rjmp UART_ReciveParse_Exit
;=============================================================================
; Список команд протокола
;=============================================================================
; 0x00 - Ping
; пинговалка, спросили - ответили
UART_Command_00:
mk_memory_set UART_S_Count, 
0x01
; Выставляем каретку, для отправки
mk_memory_set UART_S_Data, 
0x07
;
Копируем LIB_1Wire_DS1820_Strachpad
47

;
push 
OSRG
;
push
Counter
;
push
ZL
;
push
ZH
;
push
XL
;
push
XH
;
ldi
Counter, 8
;
ldi
ZL, low (LIB_1Wire_DS1820_Strachpad) ; Загружаем адрес нашей таблицы.
;
ldi
ZH, High(LIB_1Wire_DS1820_Strachpad) ; Старший и младший байты.
;
ldi
XL, low (UART_S_Data)
; Загружаем адрес нашей таблицы.
;
ldi
XH, High(UART_S_Data)
; Старший и младший байты.
;
UART_Command_00_data_loop:
;
ld
OSRG, Z+
;
st
X+, OSRG
;
;
dec 
Counter
;
cpi
Counter, 0x00
;
brne
UART_Command_00_data_loop
;
;
pop
XH
;
pop
XL
;
pop
ZH
;
pop
ZL
;
pop
Counter
;
pop
OSRG
rjmp UART_ReciveParse_Return
; Возвращаемся в процедуру проверки буффера
;=============================================================================
UART_Command_01:
mk_memory_set UART_S_Count, 
0x01
; Выставляем каретку, для отправки
mk_memory_set UART_S_Data, 
0x00
48

Debug_Led_Yellow_On
push 
OSRG
push
Counter
push
ZL
push
ZH
push
XL
push
XH
ldi
Counter, 2
ldi
ZL, low (UART_R_Data)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(UART_R_Data)
; Старший и младший байты.
ldi
XL, low (LIB_LCD_GS_Buffer)
; Загружаем адрес нашей таблицы.
ldi
XH, High(LIB_LCD_GS_Buffer)
; Старший и младший байты.
UART_Command_01_data_loop:
ld
OSRG, Z+
st
X+, OSRG
dec 
Counter
cpi
Counter, 0x00
brne
UART_Command_01_data_loop
rcall 
LIB_LCD_GS_Transmit
pop
XH
pop
XL
pop
ZH
pop
ZL
pop
Counter
pop
OSRG
; Восстанавливаем регистр
49

Debug_Led_Yellow_Off
rjmp UART_ReciveParse_Return
; Возвращаемся в процедуру проверки буффера
;=============================================================================
UART_Command_02:
mk_memory_set UART_S_Count, 
0x01
; Выставляем каретку, для отправки
mk_memory_set UART_S_Data, 
0xff
Debug_Led_Yellow_Off
push 
OSRG
push
ZL
push
ZH
ldi
ZL, low (UART_R_Data)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(UART_R_Data)
; Старший и младший байты.
ld
OSRG, Z
;
call
LIB_Power_Update
pop
ZH
pop
ZL
pop
OSRG
rjmp UART_ReciveParse_Return
; Возвращаемся в процедуру проверки буфера
;=============================================================================
UART_Commands: 
.dw UART_Command_00, UART_Command_01, UART_Command_02
=============================================================================
UART_Packet_Clear:
st
Z+, OSRG
dec
Counter
brne
UART_Packet_Clear
50

ret
==============================================================================
Основной файл прошивки (generic)
.include "m32def.inc"
; Используем Mega32
;=============================================================================
.include "RTOS-Define.asm"
; Наши все определения переменных
.include "RTOS-Macros.asm"
; Все макросы у нас тут
.include "RTOS-Interrupts.asm"
; Все вектора прерываний
;=============================================================================
.ORG INT_VECTORS_SIZE
; Конец таблицы прерываний
;=============================================================================
.include "RTOS-Network.asm"
; Все операции с сетью.+
;=============================================================================
.include "RTOS-InterruptsProcs.asm"
; Все обработчики прерываний
;=============================================================================
; Library Code
;=============================================================================
.include "LIB-LCD.asm"
; LCD экран.
.include "LIB-LCD-GraphShift.asm"
; LCD экран графический на сдвиговых регистрах
;
.include "LIB-Power.asm"
; Релюшки.
.include "LIB-1Wire-DS1820.asm"
; DS1820 Датчик темпиратуры
;
.include "LIB-I2C.asm"
; I2C
;
.include "LIB-I2C-PCF8583.asm"
; PCF8583 - Часы
;
.include "LIB-SPI-SDCard.asm"
; S D Card
;
.include "LIB-SPI-AD7705.asm"
; AD7705 - 2-/3-Channel 16-Bit, Sigma-Delta ADCs
;=============================================================================
; Main code
;=============================================================================
Reset:
.include "RTOS-Init.asm"
; Все инициализации тут.
;=============================================================================
; Library Code
;=============================================================================
;
LCD
51

LIB_LCD_Init
rcallLIB_LCD_GS_Init
rcallLIB_LCD_GS_On
rcallLIB_LCD_GS_Load
;
rcall
LIB_Power_Init
rcallLIB_IR_Init
rcallLIB_1Wire_DS1820_Init
;
;
I2C RTS
;
LIB_IIC_Init
;
SPI
;
LIB_SPI_Init
;
rcall
LIB_SPI_SDCard_Init
;
rcall
LIB_SPI_AD7705_Init
;
LIB_SPI_AD7705_Device_On
; Выбираем устройство
rcall
SW_Display_Init
; Начинаем отрисовку
;=============================================================================
; Background
;=============================================================================
Background:
rcall
Debug_LedBlink
MainLoop:
wdr
; Reset Watch DOG (Если не "погладить" "собаку". то она устроит reset для процессора)
rcall 
ProcessTaskQueue
; Обработка очереди процессов
rcall 
Idle
; Простой Ядра
rjmp 
MainLoop
; Основной цикл микроядра РТОС
;=============================================================================
; все задачи которые будет выболнять микроядро
;=============================================================================
Idle:
NOP
RET
;-----------------------------------------------------------------------------
;Task1:
RET
;-----------------------------------------------------------------------------
;Task2:
RET
52

;-----------------------------------------------------------------------------
Task3:
RET
;-----------------------------------------------------------------------------
Task4:
RET
;-----------------------------------------------------------------------------
Task5:
RET
;-----------------------------------------------------------------------------
Task6:
RET
;-----------------------------------------------------------------------------
Task7:
RET
;-----------------------------------------------------------------------------
Task8:
RET
;-----------------------------------------------------------------------------
Task9:
RET
;-----------------------------------------------------------------------------
Debug_LedBlink:
SetTimerTask TS_Debug_LedBlink, 500
;
rcall
LIB_SPI_AD7705_Init
;
rcall
LIB_SPI_AD7705_Configure_CH1
;
LIB_SPI_RWtest
;
rcall
LIB_SPI_AD7705_Read_CH1
;
rcall LIB_SPI_AD7705_Read
;
;LIB_SPI_Device_On
;
sbis UCSRA, UDRE
;
rjmp Skip
;
lds
OSRG, LIB_SPI_AD7705_CH1_Data_H
;
out 
UDR, OSRD
;
rcall
Debug_SD
Skip:
53

lds
OSRG, Debug_Led_Red_State
cpi
OSRG, 0
breq
Light
sbic
Debug_Led_Red_N, Debug_Led_Red
rjmp
Dark
Light:
Debug_Led_Red_On
ldi
OSRG, 0xFF
sts
Debug_Led_Red_State, OSRG
RET
Dark:
Debug_Led_Red_Off
ldi
OSRG, 0x00
sts
Debug_Led_Red_State, OSRG
RET
;Debug_SD:
;
ldi
ZL, low(LIB_SPI_SDCard_Buffer)
;
ldi
ZH, high(LIB_SPI_SDCard_Buffer)
 

clr
LIB_SPI_SDCard_AdrHH
; Очищаем Адресацию

clr
LIB_SPI_SDCard_AdrHL

clr
LIB_SPI_SDCard_AdrLH

clr
LIB_SPI_SDCard_AdrLL
;
rcall
LIB_SPI_SDCard_ReadSector
54

; ======
;
ldi
ZL, low(LIB_SPI_SDCard_Buffer)
;
ldi
ZH, high(LIB_SPI_SDCard_Buffer)

clr
LIB_SPI_SDCard_AdrHH
; Очищаем Адресацию

clr
LIB_SPI_SDCard_AdrHL

clr
LIB_SPI_SDCard_AdrLH

clr
LIB_SPI_SDCard_AdrLL
;
rcall
LIB_SPI_SDCard_ReadSector
;
ldi
ZL, low(LIB_SPI_SDCard_Buffer)

ldi
ZH, high(LIB_SPI_SDCard_Buffer)
;
ser 
Counter
;
ML:
;
ld
OSRG, Z+
; Считываем из памяти нужный бай
;
ML2:
;
sbis UCSRA, UDRE
;
rjmp ML2
;
out
UDR, OSRG
; Отсылаем текуший байт в порт
;
dec 
Counter
;
brne 
ML
;
ret
;=============================================================================
; RTOS Here
;=============================================================================
.include "RTOS-Kernel.asm"
; Подклчюаем ядро ОС
TaskProcs: 
55

.dw Idle
; [00] 
.dw UART_ReciveParse
; [01] 
.dw UART_SendBuffer
; [02] 
.dw LIB_1Wire_DS1820_Task
; [03] LIB_1Wire_DS1820_Task
.dw Task4
; [04] 
.dw LIB_IR_Task
; [05] 
.dw Task6
; [06] 
.dw Task7
; [07] 
.dw SW_Display_Update
; [08]
.dw
Debug_LedBlink
; [09]
;============================================================================
Управление внешними устройствами при помощи электромагнитных реле:
.equ LIB_Power_P
= PORTC
.equ LIB_Power_D
= DDRC
.equ LIB_Power_N
= PINC
.dseg
LIB_Power_RAM:
.byte
1
; Буффер для приема\\передачи
.eseg
LIB_Power_EEROM:
.byte
1
; Буффер для приема\\передачи
.cseg
LIB_Power_Init:
ser
OSRG
; 0xFF
out
LIB_Power_D, OSRG
; Инициализируем порт на выход
; Read from EEROM to RAM

ret
;
OSRG - New Status
LIB_Power_Update:
push
ZL
56

push
ZH
out
LIB_Power_P, OSRG
ldi
ZL, low (LIB_Power_RAM)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(LIB_Power_RAM)
; Старший и младший байты.
st
Z, OSRG
pop
ZH
pop
ZL
ret
;
OSRG - Status
LIB_Power_Read:
ret
Работа с датчиком температуры:
.equ LIB_1Wire_DS1820_D
= DDRD
;
.equ LIB_1Wire_DS1820_P
= PORTD
;
.equ LIB_1Wire_DS1820_N
= PIND
;
.equ LIB_1Wire_DS1820_DQ
= 4
; DQ 
.dseg
LIB_1Wire_DS1820_Step:
.byte

; Следующее событие в очереди
LIB_1Wire_DS1820_Strachpad:
.byte

; Текущее значение
LIB_1Wire_DS1820_Buffer:
.byte

; Временный буффер
.cseg
.equ LIB_1Wire_DS1820_TaskId
= 3
; ID основного процесса библиотеки
.equ LIB_1Wire_DS1820_TaskParseId= 0xFF ; ID процесса, который надо запустить при получении данных
=====================================================================================
.MACRO LIB_1Wire_DS1820_TaskSet
ldi
OSRG, @0
sts
LIB_1Wire_DS1820_Step, OSRG
SetTask LIB_1Wire_DS1820_TaskId
.ENDM
57

.MACRO LIB_1Wire_DS1820_TaskSetTimer
ldi
OSRG, @0
sts
LIB_1Wire_DS1820_Step, OSRG
SetTimerTask
LIB_1Wire_DS1820_TaskId, @1
.ENDM
=====================================================================================
LIB_1Wire_DS1820_Init:
LIB_1Wire_DS1820_TaskSetTimer 0x00, 100
ret
=====================================================================================
LIB_1Wire_DS1820_Task:
push
XH
push
XL
push
ZH
push
ZL
push
OSRG
push
Counter
lds
XL, LIB_1Wire_DS1820_Step
; Читаем из памяти команду
lsl
XL
; Сдвигом влево умножаем содержимое Counter на два.
ldi
ZL, low (LIB_1Wire_DS1820_Commands*2)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(LIB_1Wire_DS1820_Commands*2)
; Старший и младший байты.
clr
XH 
; Сбрасываем регистр OSRG - нам нужен ноль.
add
ZL, XL 
; Складываем младший байт адреса. Если возникнет переполнение
adc
ZH, XH 
; То вылезет флаг переноса.
lpm
XL,Z+
; Загрузили в Counter адрес из таблицы
lpm
XH,Z
; Старший и младший байт
58

movw ZH:ZL,XH:XL 
; забросили адрес в Z 
ijmp
; Переходим к обработке команды
LIB_1Wire_DS1820_Return:
pop
Counter
pop
OSRG
pop
ZL
pop
ZH
pop
XL
pop
XH
ret
=====================================================================================
LIB_1Wire_DS1820_Command_00:
; Инициализация преобразования
rcall 
LIB_1Wire_DS1820_Reset 
; вызов обнуления линии
ldi 
OSRG, 0xCC
; пропуск идентификации
rcall 
LIB_1Wire_DS1820_WriteByte
ldi 
OSRG, 0x44 
; начало преобразования
rcall 
LIB_1Wire_DS1820_WriteByte
LIB_1Wire_DS1820_TaskSetTimer 0x01, 10
rjmp
LIB_1Wire_DS1820_Return
;================
LIB_1Wire_DS1820_Command_01:
; Получение данных
rcall 
LIB_1Wire_DS1820_Reset 
; вызов обнуления линии
ldi 
OSRG, 0xCC
; пропуск идентификации
rcall 
LIB_1Wire_DS1820_WriteByte
ldi 
OSRG, 0xBE 
; запрос на данные
rcall 
LIB_1Wire_DS1820_WriteByte
59

LIB_1Wire_DS1820_TaskSet 0x02
rjmp
LIB_1Wire_DS1820_Return
;================
LIB_1Wire_DS1820_Command_02:
; Получение данных
ldi
Counter, 9
ldi
ZL, low (LIB_1Wire_DS1820_Buffer)
; Загружаем адрес нашей таблицы.
ldi
ZH, High(LIB_1Wire_DS1820_Buffer)
; Старший и младший байты.
LIB_1Wire_DS1820_Command_02_loop:
rcall
LIB_1Wire_DS1820_ReadByte
st
Z+, OSRG
dec
Counter
brne
LIB_1Wire_DS1820_Command_02_loop
LIB_1Wire_DS1820_TaskSet 0x03
rjmp
LIB_1Wire_DS1820_Return
;================
LIB_1Wire_DS1820_Command_03:
 Подсчет контрольной суммы и копирование в рабочую область
ldi
ZL, low(LIB_1Wire_DS1820_Buffer)
 
ldi
ZH, high(LIB_1Wire_DS1820_Buffer)
ldi
Counter, 8
rcall
CRC8
; Считаем контрольную сумму буффера
ld
OSRD, Z
cp
OSRG, OSRD
; Если не сходится то пропускаем копирование
brne
LIB_1Wire_DS1820_Command_03_skip
cli
; Копирование памяти! ОТРУБАЕМ ПРЕРЫВАНИЯ
ldi
XL, low(LIB_1Wire_DS1820_Strachpad)
; Копируем буфер в страчпад
60

 
ldi
XH, high(LIB_1Wire_DS1820_Strachpad)
ldi
ZL, low(LIB_1Wire_DS1820_Buffer)
 
ldi
ZH, high(LIB_1Wire_DS1820_Buffer)
ldi
Counter, 8
LIB_1Wire_DS1820_Command_03_loop:
ld
OSRG, Z+
st
X+, OSRG
dec
Counter
brne
LIB_1Wire_DS1820_Command_03_loop
sei
; Включаем прерывания
ldi
OSRG, LIB_1Wire_DS1820_TaskParseId
; Загружаем ID процедуры обработки
cpi
OSRG, 0xFF
; Если 0xFF то пропускаем обработку
breq
LIB_1Wire_DS1820_Command_03_skip
SetTask
LIB_1Wire_DS1820_TaskParseId
; Ставим в очередь процедуру обработки
LIB_1Wire_DS1820_Command_03_skip:
LIB_1Wire_DS1820_TaskSet 0x00
rjmp
LIB_1Wire_DS1820_Return
;================
LIB_1Wire_DS1820_Commands: 
.dw
 
LIB_1Wire_DS1820_Command_00,
 
LIB_1Wire_DS1820_Command_01, 
LIB_1Wire_DS1820_Command_02, LIB_1Wire_DS1820_Command_03
=====================================================================================
LIB_1Wire_DS1820_Reset:
cbi
 
LIB_1Wire_DS1820_P, LIB_1Wire_DS1820_DQ
sbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  220 
; обнуление 600мкс
rcall 
LIB_1Wire_DS1820_Delay
61

cbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  220 
; принятие импульса присутствия 600мкс
rcall 
LIB_1Wire_DS1820_Delay
ret
=====================================================================================
;
IN - OSRG  - Command
LIB_1Wire_DS1820_WriteByte:
push
Counter
ldi 
Counter,8
LIB_1Wire_DS1820_WriteByte_loop:
lsr
OSRG
; Старший бит в перенос
brcs 
LIB_1Wire_DS1820_WriteByte_loop_put_1
; пререход если CF=1
LIB_1Wire_DS1820_WriteByte_loop_put_0:
push
OSRG
cbi
 
LIB_1Wire_DS1820_P, LIB_1Wire_DS1820_DQ
sbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  26 
; 70мкс
rcall 
LIB_1Wire_DS1820_Delay
cbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
rjmp
LIB_1Wire_DS1820_WriteByte_loop_wait
LIB_1Wire_DS1820_WriteByte_loop_put_1:
push
OSRG
cbi
 
LIB_1Wire_DS1820_P, LIB_1Wire_DS1820_DQ
sbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  1
; 2,7мкс
rcall 
LIB_1Wire_DS1820_Delay 
cbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  20
; 60мкс - продление "1"
rcall 
LIB_1Wire_DS1820_Delay
rjmp
LIB_1Wire_DS1820_WriteByte_loop_wait
LIB_1Wire_DS1820_WriteByte_loop_wait:
ldi 
OSRG,  1
; 2,7мкс
rcall 
LIB_1Wire_DS1820_Delay 
pop
OSRG
dec 
Counter
62

brne 
LIB_1Wire_DS1820_WriteByte_loop
; проверка счетчика
pop
Counter
ret
=====================================================================================
LIB_1Wire_DS1820_ReadByte:
push
Counter
push
OSRD
clr
OSRD
ldi
Counter, 8
LIB_1Wire_DS1820_ReadByte_loop:
cbi
 
LIB_1Wire_DS1820_P, LIB_1Wire_DS1820_DQ
sbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  1
; 2,7мкс
rcall 
LIB_1Wire_DS1820_Delay 
cbi
LIB_1Wire_DS1820_D, LIB_1Wire_DS1820_DQ
ldi 
OSRG,  3
; 2,7мкс
rcall 
LIB_1Wire_DS1820_Delay 
sbic 
LIB_1Wire_DS1820_N, LIB_1Wire_DS1820_DQ
; читаем бит с DQ и пропускаем переход если бит пустой
rjmp 
LIB_1Wire_DS1820_loop_get_1
LIB_1Wire_DS1820_loop_get_0:
clc
rjmp
LIB_1Wire_DS1820_loop_render
LIB_1Wire_DS1820_loop_get_1:
sec
;
rjmp
LIB_1Wire_DS1820_loop_render
LIB_1Wire_DS1820_loop_render:
ror 
OSRD
ldi 
OSRG,  22
; 2,7мкс
rcall 
LIB_1Wire_DS1820_Delay 
dec
Counter
brne
LIB_1Wire_DS1820_ReadByte_loop
mov
OSRG, OSRD
pop
OSRD
pop
Counter
63

ret
=====================================================================================
;
IN - OSRG 
LIB_1Wire_DS1820_Delay:
push
Counter
LIB_1Wire_DS1820_Delay_loop:
ldi 
Counter, 3
; 2,75uS*wreg
LIB_1Wire_DS1820_Delay_loop_sub:
nop
dec 
Counter
brne
LIB_1Wire_DS1820_Delay_loop_sub
dec 
OSRG
brne
LIB_1Wire_DS1820_Delay_loop
pop
Counter
ret
=====================================================================================
Реализация I2C протокола:
..MACRO LIB_IIC_Init
mk_register_set
TWBR,0xC0
; Настройка частоты работы TWI
mk_register_set
TWSR, (1<<TWPS1|1<<TWPS0)
.ENDM
; Даем старт на линию I2C
IIC_START:
mk_register_set
TWCR,1<<TWINT|1<<TWSTA|1<<TWEN|0<<TWIE
IIC_S:
IN
OSRG,TWCR
ANDI OSRG,1<<TWINT
BREQ IIC_S
; Ждем пока передатчик IIC выполнит старт
RET
;-----------------------------------------------------------------------------
;Посылаем байт по IIC 
IIC_BYTE:  
OUT
TWDR,OSRG
64

mk_register_set
TWCR,1<<TWINT|1<<TWEN|0<<TWIE
IIC_B:
IN
OSRG,TWCR
ANDI OSRG,1<<TWINT
; Ждем пока передатчик пошлет байт
BREQ IIC_B
RET
;-----------------------------------------------------------------------------
; Принять байт. 
IIC_RCV:
mk_register_set
TWCR,1<<TWINT|1<<TWEN|1<<TWEA|0<<TWIE
IIC_R:
IN
OSRG,TWCR
ANDI OSRG,1<<TWINT
BREQ IIC_R
; Ждем пока байт будет принят
RET
;-----------------------------------------------------------------------------
; Принять последний байт. 
IIC_RCV2:
mk_register_set
TWCR,1<<TWINT|1<<TWEN|0<<TWEA|0<<TWIE
IIC_R2:
IN
OSRG,TWCR
ANDI OSRG,1<<TWINT
; Ждем пока байт будет принят
BREQ IIC_R2
RET
;-----------------------------------------------------------------------------
; Сгенерировать STOP
IIC_STOP:
mk_register_set
TWCR,1<<TWINT|1<<TWSTO|1<<TWEN|0<<TWIE
IIC_ST:
IN
OSRG,TWCR
ANDI OSRG,1<<TWSTO
BREQ IIC_ST
; Ждем пока не будет готов стоп.
RET
Реализация часов и календаря:
65

.equ
LIB_SPI_AD7705_D
= DDRB
;
.equ
LIB_SPI_AD7705_P
= PORTB
;
.equ
LIB_SPI_AD7705_N
= PINB
;
.equ
LIB_SPI_AD7705_MOSI
= 5

.equ
LIB_SPI_AD7705_MISO
= 6

.equ
LIB_SPI_AD7705_SCK
= 7

.equ
LIB_SPI_AD7705_DRDY
= 2
;
.equ
LIB_SPI_AD7705_CS
= 1
;
=====================================================================================
.MACRO 
LIB_SPI_AD7705_Device_On
cbi
LIB_SPI_AD7705_P, LIB_SPI_AD7705_CS
;   Опускаем 
строб(линия инверная)
.ENDM
.MACRO 
LIB_SPI_AD7705_Device_Off
sbi
LIB_SPI_AD7705_P, LIB_SPI_AD7705_CS
;  Поднимаем 
строб
.ENDM
=====================================================================================
LIB_SPI_AD7705_COM:
sbis
UCSRA, UDRE
rjmp
LIB_SPI_AD7705_COM
out
UDR, OSRG
ret
=====================================================================================
LIB_SPI_AD7705_Init:
cbi
LIB_SPI_AD7705_D, LIB_SPI_AD7705_DRDY
; Порт ны вход
sbi
LIB_SPI_AD7705_P, LIB_SPI_AD7705_DRDY
; С поддяжкой в 100к до питания
sbi
LIB_SPI_AD7705_D, LIB_SPI_AD7705_MOSI
; Порт на выход
sbi
LIB_SPI_AD7705_D, LIB_SPI_AD7705_SCK
; Порт на выход
sbi
LIB_SPI_AD7705_D, LIB_SPI_AD7705_CS
; Порт на выход
sbi
LIB_SPI_AD7705_P, LIB_SPI_AD7705_CS
; Поднимаем строб
66

cbi
LIB_SPI_AD7705_D, LIB_SPI_AD7705_MISO
; Порт ны вход
sbi
LIB_SPI_AD7705_P, LIB_SPI_AD7705_MISO
; С поддяжкой в 100к до питания
mk_register_set GICR, (1<<INT2)
; Включаем прерывание на DRDY
;
mk_register_set SPCR,     ((1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(0<<SPI2X)|(1<<SPR1)|(1<<SPR0))
;
mk_register_set SPCR, ((1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(0<<SPI2X)|(1<<SPR1)|(1<<SPR0))
mk_register_set SPCR, 0b1011111 
ret
=====================================================================================
;
OSRG - Input byte
LIB_SPI_AD7705_WriteToReg:
LIB_SPI_AD7705_Device_On
; Выбираем устройство
out
SPDR, OSRG
; Начать передачу
LIB_SPI_AD7705_WriteToReg_wait:
sbis
SPSR, SPIF
; Ожидаем конца  передачи
rjmp
LIB_SPI_AD7705_WriteToReg_wait
LIB_SPI_AD7705_Device_Off
; Выбираем устройство
in
OSRG, SPDR
; Чтение данных
rcall
LIB_SPI_AD7705_COM
ret
=====================================================================================
LIB_SPI_AD7705_Read:
rcall
LIB_SPI_AD7705_Wait_DRDY
push
OSRG
push
Counter
ldi
Counter, 2
LIB_SPI_AD7705_Device_On
; Выбираем устройство  
LIB_SPI_AD7705_Read_loop:
clr
OSRG
out
SPDR, OSRG
67

; Начать передачу
LIB_SPI_AD7705_Read_loop_wait:
sbis
SPSR, SPIF

Ожидаем конца  передачи
rjmp
LIB_SPI_AD7705_Read_loop_wait
in
OSRG, SPDR
rcall
LIB_SPI_AD7705_COM
dec
Counter
brne
LIB_SPI_AD7705_Read_loop
LIB_SPI_AD7705_Device_Off
; Выбираем устройство
pop
Counter
pop
OSRG
ret
=====================================================================================
LIB_SPI_AD7705_Configure_CH1:
push
OSRG
ldi
OSRG, 0x20
; Send to Comm Reg: Next Write Clk
rcall
LIB_SPI_AD7705_WriteToReg
ldi
OSRG, 0x01
; Send to ClkReg: Clock Bits and Update rate
rcall
LIB_SPI_AD7705_WriteToReg
ldi
OSRG, 0x10
; Send to Comm Reg: write setup
rcall
LIB_SPI_AD7705_WriteToReg
ldi
OSRG, 0x44
; Send to Setup: FSYNC, Gain, Conditions, Self Calibration
rcall
LIB_SPI_AD7705_WriteToReg
rcall
LIB_SPI_AD7705_Wait_DRDY
pop
OSRG
ret
LIB_SPI_AD7705_Read_CH1:
push
OSRG
ldi
OSRG, 0x38
rcall
LIB_SPI_AD7705_WriteToReg
rcall
LIB_SPI_AD7705_Read
pop
OSRG
ret
=====================================================================================
68

LIB_SPI_AD7705_Wait_DRDY:
;
sbic 
LIB_SPI_AD7705_N, LIB_SPI_AD7705_DRDY
;   читаем   бит   с   DRDY   и 
пропускаем переход если бит пустой
;
rjmp 
LIB_SPI_AD7705_Wait_DRDY
ret
 
Реализация Micro SD интерфейса:
.def
LIB_SPI_SDCard_CMD
= r19
; r16
.def
LIB_SPI_SDCard_CRC
= r20
; r17
.def
LIB_SPI_SDCard_AdrHH
= r24
; r4
.def
LIB_SPI_SDCard_AdrHL
= r25
; r5
.def
LIB_SPI_SDCard_AdrLH
= r26
; r6
.def
LIB_SPI_SDCard_AdrLL
= r27
; r7
.dseg
LIB_SPI_SDCard_Buffer:
.byte
512
; Буффер для приема\\передачи
.cseg
.equ
LIB_SPI_SDCard_D
= DDRA
.equ
LIB_SPI_SDCard_P
= PORTA
.equ
LIB_SPI_SDCard_N
= PINA
.equ
LIB_SPI_SDCard_CardDetect
= 0
; Cable Select AD7705
=====================================================================================
LIB_SPI_SDCard_Init:
; Hardware
cbi
LIB_SPI_SDCard_D, LIB_SPI_SDCard_CardDetect
; Настроили на вход
; Software
LIB_SPI_Device_Off
; Выбираем устройство
LIB_SPI_Device_On_SD
; Выбираем устройство
ldi
Counter, 10
; 10 раз отсылаем FF
LIB_SPI_SDCard_Init_loop:
 
ser
OSRG
; 0xFF
69

 
rcall
LIB_SPI_Transmit
dec
Counter
 
brne
LIB_SPI_SDCard_Init_loop
LIB_SPI_Device_On_SD
; Выбираем устройство
ser
OSRG
; 0xFF - Так вроде однозначнее получается
 
rcall
LIB_SPI_Transmit
 
clr
LIB_SPI_SDCard_AdrHH
; Очищаем Адресацию
 
clr
LIB_SPI_SDCard_AdrHL
 
clr
LIB_SPI_SDCard_AdrLH
 
clr
LIB_SPI_SDCard_AdrLL
ldi
LIB_SPI_SDCard_CMD, 0x40
; Отправляем команду переключения в SPI (RESET)
ldi
LIB_SPI_SDCard_CRC, 0x95
rcall
LIB_SPI_SDCard_SendCommand
andi
OSRD, 0x01
; Проверка на in_idle_state = 1
breq
LIB_SPI_SDCard_Init_Fault
;ldi
LIB_SPI_SDCard_CMD, 0x48
; Отправляем команду проверки рабочих условий (напряжение, ...)
;ldi
LIB_SPI_SDCard_CMD, 0x7A
; Отправляем команду чтения регистра OCR
LIB_SPI_SDCard_Init_wait_idle:
ldi
LIB_SPI_SDCard_CMD, 0x77
; Команда APP_CMD - следующая команда будет из расширенного набора
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
ldi
LIB_SPI_SDCard_CMD, 0x69
; Инициализация карты и сообщение ей о том, что High Cap не поддерживается
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
andi
OSRD, 0x01
; Проверка на in_idle_state = 0
brne
LIB_SPI_SDCard_Init_wait_idle
; Нужно подавать эту команду, пока карта не выйдет из idle state
ldi
LIB_SPI_SDCard_AdrLH, 2
ldi
LIB_SPI_SDCard_CMD, 0x50
; Установка размера блока в 512 байт
70

 
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
rjmp
LIB_SPI_SDCard_Init_OK
; Все хорошо
=====================================================================================
LIB_SPI_SDCard_Init_Fault:
clc
ret
=====================================================================================
LIB_SPI_SDCard_Init_OK:
sec
ret
=====================================================================================
;
LIB_SPI_SDCard_CMD | LIB_SPI_SDCard_CRC
;
LIB_SPI_SDCard_AdrHH - LIB_SPI_SDCard_AdrLL
LIB_SPI_SDCard_SendCommandWithoutCRC:
ser
LIB_SPI_SDCard_CRC
; 0xFF
LIB_SPI_SDCard_SendCommand:
ser
OSRG
; 0xFF
rcall
LIB_SPI_Transmit
; Пустой байт
mov
OSRG, LIB_SPI_SDCard_CMD
rcall
LIB_SPI_Transmit
; Команда
mov
OSRG, LIB_SPI_SDCard_AdrHH
rcall
LIB_SPI_Transmit
; Старший бит агрумента
mov
OSRG, LIB_SPI_SDCard_AdrHL
rcall
LIB_SPI_Transmit
; 3й байт
mov
OSRG, LIB_SPI_SDCard_AdrLH
rcall
LIB_SPI_Transmit
; 2й байт
mov
OSRG, LIB_SPI_SDCard_AdrLL
rcall
LIB_SPI_Transmit
; Старший бит агрумента
71

mov
OSRG,LIB_SPI_SDCard_CRC
;
rcall
LIB_SPI_Transmit
; CRC
ser
OSRG
; Выходной байт [при выполнении команды инициализации здесь
rcall
LIB_SPI_Transmit
; проскакивает 3F, что можно перепутать с R1]
LIB_SPI_SDCard_SendCommand_loop:
; Ожидание ответа
ser
OSRG
rcall
LIB_SPI_Transmit
tst
OSRD
brmi
LIB_SPI_SDCard_SendCommand_loop
push
OSRD
; Если ответ формата R2 - в r0 будет его значение
ser
OSRG
rcall
LIB_SPI_Transmit
mov
r0, OSRD
pop
OSRD
mov
OSRG, OSRD
andi
OSRG, 0x7E
breq
LIB_SPI_SDCard_SendCommand_Ok
ori
OSRG, 0x80
; Код ошибки
LIB_SPI_SDCard_SendCommand_Fault:
clc
LIB_SPI_SDCard_SendCommand_Ok:
ret
=====================================================================================
; Чтение блока данных r4..r7 в Z+
LIB_SPI_SDCard_ReadSector:
LIB_SPI_Device_Off
; Выбираем устройство
LIB_SPI_Device_On_SD
; Выбираем устройство
rcall
LIB_SPI_SDCard_Mul512
72

ldi
LIB_SPI_SDCard_CMD, 0x51
; Read single block
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
LIB_SPI_SDCard_ReadSector_wait:
ser
OSRG
rcall
LIB_SPI_Transmit
 
cpi
OSRD, 0xFE
; Карта готова к передаче данных
 
breq
LIB_SPI_SDCard_ReadSector_do
mov
OSRG, OSRD
 
andi
OSRG, 0xF0
 
brne
LIB_SPI_SDCard_ReadSector_wait
; Карта еше не готова
ori
OSRD, 0x40
; Старшие четыре бита = 0 - это ситуация ошибки чтения
rjmp
LIB_SPI_SDCard_ReadSector_Fault
; Ошибка!!
LIB_SPI_SDCard_ReadSector_do:
clr
Counter
; Выгружаем данные из карты
LIB_SPI_SDCard_ReadSector_do_loop:
ser
OSRG
rcall
LIB_SPI_Transmit
st
Z+, OSRD
ser
OSRG
rcall
LIB_SPI_Transmit
st
Z+, OSRD
 
dec
Counter
brne
LIB_SPI_SDCard_ReadSector_do_loop
ser
OSRG
; CRC
rcall
LIB_SPI_Transmit
ser
OSRG
; CRC
rcall
LIB_SPI_Transmit
ser
OSRG
rcall
LIB_SPI_Transmit
rjmp
LIB_SPI_SDCard_ReadSector_Ok
=====================================================================================
73

LIB_SPI_SDCard_ReadSector_Ok:
LIB_SPI_Device_Off
; Выбираем устройство
 
sec
 
ret
=====================================================================================
LIB_SPI_SDCard_ReadSector_Fault:
LIB_SPI_Device_Off
; Выбираем устройство
clc
ret
=====================================================================================
; Запись блока данных r4..r7 из Z+
LIB_SPI_SDCard_WriteSector:
LIB_SPI_Device_Off
; Выбираем устройство
LIB_SPI_Device_On_SD
; Выбираем устройство
rcall
LIB_SPI_SDCard_Mul512
ldi
LIB_SPI_SDCard_CMD, 0x58
; Write single block
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
ldi
OSRG, 0xFE
rcall
LIB_SPI_Transmit
LIB_SPI_SDCard_WriteSector_do:
clr
Counter
; Заряжаем данные в карту
LIB_SPI_SDCard_WriteSector_do_loop:
ld
OSRG, Z+
rcall
LIB_SPI_Transmit
ld
OSRG, Z+
rcall
LIB_SPI_Transmit
 
dec
Counter
brne
LIB_SPI_SDCard_WriteSector_do_loop
ser
OSRG
74

rcall
LIB_SPI_Transmit
; Игнорируемые байты контрольной суммы
ser
OSRG
rcall
LIB_SPI_Transmit
ser
OSRG
; Пустой байт
rcall
LIB_SPI_Transmit
 Ожидаем кода подтверждения
andi
OSRD, 0x1F
 
cpi
OSRD, 0x05
 
breq
LIB_SPI_SDCard_WriteSector_wait
; Данные были приняты
 
ori
OSRD, 0x60
; Ошибка приёма данных
 
rjmp
LIB_SPI_SDCard_WriteSector_Fault
LIB_SPI_SDCard_WriteSector_wait:
; Здесь мы висим, ждём выполнения записи
 
ser
OSRG
rcall
LIB_SPI_Transmit
 
cpi
OSRD, 0xFF
 
brne
LIB_SPI_SDCard_WriteSector_wait
ldi
LIB_SPI_SDCard_CMD, 0x4D
; Проверка записи
rcall
LIB_SPI_SDCard_SendCommandWithoutCRC
 
tst
r0
 
breq
LIB_SPI_SDCard_WriteSector_Ok
 
clr
OSRG
; Ошибка R2, код ошибки в r0
 
rjmp
LIB_SPI_SDCard_WriteSector_Fault
=====================================================================================
LIB_SPI_SDCard_WriteSector_Ok:
LIB_SPI_Device_Off
; Выбираем устройство
sec
 
ret
=====================================================================================
LIB_SPI_SDCard_WriteSector_Fault:
LIB_SPI_Device_Off
; Выбираем устройство
clc
ret
=====================================================================================
LIB_SPI_SDCard_Mul512:
ldi
OSRG, 0x20
; Код возможной ошибки
75

tst
LIB_SPI_SDCard_AdrLL
brne
LIB_SPI_SDCard_Mul512_Fault
; Будут потеряны биты адреса
tst
LIB_SPI_SDCard_AdrLH
brmi
LIB_SPI_SDCard_Mul512_Fault
mov
LIB_SPI_SDCard_AdrLL, LIB_SPI_SDCard_AdrLH
mov
LIB_SPI_SDCard_AdrLH, LIB_SPI_SDCard_AdrHL
mov
LIB_SPI_SDCard_AdrHL, LIB_SPI_SDCard_AdrHH
clr
LIB_SPI_SDCard_AdrHH
lsl
LIB_SPI_SDCard_AdrHL
rol
LIB_SPI_SDCard_AdrLH
rol
LIB_SPI_SDCard_AdrLL
sec
ret
LIB_SPI_SDCard_Mul512_Fault:
clc
ret
76

Павел Максович Сви
Георгий Станиславович Кучинский
77


 

А также другие работы, которые могут Вас заинтересовать

9304. Первичная хирургическая обработка ран. Профилактика раневой инфекции 17.91 KB
  Лекция №23 Первичная хирургическая обработка ран. Профилактика раневой инфекции. Первичная - это первое по счету вмешательство, проведенное по первичным показаниям, обусловленным характером ранения с целью профилактики раневой инфекции. Вторичн...
9305. Специфическая острая хирургическая инфекция 19.72 KB
  Лекция №24 Специфическая острая хирургическая инфекция Столбняк (tetanus - тяну, вытягиваю) - зооантропонозное бактериальное острое инфекционное заболевание с контактным механизмом передачи возбудителя, характеризующееся поражением нервной...
9306. ВИЧ-инфекция в хирургии (хирургические маски СПИДа) 19.43 KB
  Лекция №26 ВИЧ-инфекция в хирургии (хирургические маски СПИДа) ВИЧ-инфекция - вирусная антропонозная инфекция, характеризующаяся медленным течением с прогрессирующим развитием иммунодефицита, приводящая к летальному исходу в результате присоеди...
9307. Перитонит. Проблемы и современные принципы лечения 20.48 KB
  Лекция №27 Перитонит. Проблемы и современные принципы лечения. Патогенез перитонита: Инвазия бактерий Снижение потребления кислорода клетками Высвобождение токсинов Воспалительный отек брюшины Тахикардия Аутовенозное шунтирование в легких Нарушение ...
9308. Договор контрактации 26.5 KB
  Тема №8: Договор контрактации. Понятие договора. Договор контрактации - отдельный вид договора купли-продажи - признан регулировать отношения, связанные с закупками сельскохозяйственных организаций и крестьянско-фермерских ...
9309. Договор энергоснабжения 54 KB
  Тема №9: Договор энергоснабжения. ФЗ от 26.03.2003 Об электроэнергетике ФЗ от 14.04.1995 О государственной регистрации тарифов на электрическую и тепловую энергию в РФ ФЗ от 3.04.1996 Об энергоснабжении ФЗ от 30.12.2004 Об основах регулирован...
9310. Договор дарения. Отказ от дарения. Отмена дарения 44 KB
  Тема №10: Договор дарения. Понятие и форма договора. По договору дарения одна сторона (даритель) безвозмездно передает/обязан передать другой стороне (одаряемому) вещь в собственность или имущественное...
9311. Рента и пожизненное содержание с иждивением 51 KB
  Тема №11: Рента и пожизненное содержание с иждивением. Общие положения договора ренты. По договору ренты одна сторона (получатель ренты) предает другой стороне (плательщику ренты) в собственность имущества, а плательщик...
9312. Общие положения об аренде 66.5 KB
  Тема №12: Общие положения об аренде. Понятие и заключение договором аренды. Договор аренды (имущественного найма) - это обязательство, по которому арендодатель обязуется предоставить арендатору имущество за плату во временное владение и пол...