
%\newpage
\chapter{Специальные модули программного обеспечения}

Некоторые изменения были сделаны, чтобы сохранить место во Flash-памяти. Вывод на LCD дисплей номера выводов был 
сделан в форме «lcd\_data('1'+pin)».
Операция добавочного сохранения для каждого вызова «lcd\_testpin(uint8\_t pin)»
была добавлена к  lcd\_routines.c.\\

Псевдовызов в форме «\_delay\_ms(200)» выполнен, не как обращение к библиотеке и задержка осуществлена в цикле 
для каждого обращения. Если у Вас в программе будет много обращений к различным местам, то это будет занимать много 
памяти. Все эти псевдовызовы заменены вызовами моей, специально написанной, библиотеки, которая использует только 
74 байта Flash памяти (при \(8~MHz\)), но позволяет обращаться от wait1us () до wait5s () с 
шагом 1,2,3,4,5,10,20\dots 
Процедуры включают Watch Dog Reset для всех обращений выше \(50~ms\). Каждая  задержка обращения обычно  нуждается 
только в одной инструкции (2~Byte). Ожидание промежуточного обращения с величиной, такой как \(8~ms\), нуждается  
в двух обращениях (\(5~ms\) и \(3~ms\) или два обращения по \(4~ms\)). Я не знаю более экономичной реализации, 
когда используется много обращений  к задержкам в Вашей программе. Обращения не используют регистров, только SP 
в RAM для возвращения из подпрограмм (самое большее 28-байтовое пространство стека в текущей версии). Полный 
список функций:\\
wait1us(), wait2us(), wait3us(), wait4us(), wait5us(), wait10us(), \\
wait20us(), wait30us(), wait30us(), wait40us(), wait50us(), wait100us(), \\
wait200us(), wait300us(), wait400us(), wait500us(), wait1ms(),\\
wait2ms(), wait3ms(), wait4ms(), wait5ms(), wait10ms(),\\
wait20ms(), wait30ms(), wait40ms(), wait50ms(), wait100ms(),\\
wait200ms(),wait300ms(), wait400ms, wait500ms(), wait1s(),\\
wait2s(), wait3s(), wait4s() and wait5s();\\
Эти 36~функций с 37~командами включены в Watch Dog Reset! Нет реального способа сократить эту библиотеку. Если 
делается самая малая задержка обращения, то она не точно соответствует времени задержки. Только задержка обращения 
выше \(50~ms\) в одном цикле удлиняется до \(100~ms\) из-за интегрирования в Watch Dog Reset.\\

Часто используемая последовательность обращений «wait5ms(); ReadADC\dots();» заменена обращением
«W5msReadADC(\dots);».
То же самое сделано для последовательности «wait20ms(); ReadADC(\dots);» которая  заменена одним обращением
«W20msReadADC(\dots);».\\

Функция ReadADC  дополнительно написана на языке ассемблера для повышения эффективности работы кода. Функционально 
идентичная. C-версия функции ReadADC также доступна, как источник.
