SEA> Но я понимаю зевса об удовлетворении процессом оптимизации, особенно мелких контроллеров. Просто совсем мелкие потеряли актуальность сейчас Эх, расскажу одну историю "Как я всех спас".
Как то ко мне пришел наш программист МК (Саша) и пожаловался, что задача не выполнима...
Я в то время у них не столько начальник был, сколько старший коллега. Рассказ Саши состоял в том, что Вова накосячил и поставил не подходящий МК. Проект вел не я, и вообще я не знал детали реализации, тонкости внутренней архитектуры и прочее. Саше я сказал - "оставляй макет, скинь мне ТЗ, и свои наработки. Попробую понять что делать". Также сходил к Вове, он разводит платы и в общех схемотехник. Попросил у Вовы посмотреть проект. Он мне показал, ничего не заподозрив.
В общем в одном месте надо было генерировать 2 частоты 25 КГц и 24.948024... КГц.
Короче 12МГц/480 и 12МГц/481. И чтобы это выходило на 2 ножки МК...
Если честно, то я бы поставил несколько корпусов "74HC" в соиках, и сделал бы аппаратный делитель. Место позволяло с огромным избытком, прошивать не надо, ремонт сводится только к замене микросхем, разница в стоимости отсутствует. Но Вова поставил кварцевый генератор на 12 МГц и ATTiny13, чтобы "по современному", а жесткая логика "ушла в прошлое и отмирает".
Сомременность Вовы, ИМХО, что он сэкономил только на труде монтажника, ведь впаять один соик8 проще, чем 4-5 соик 14-16. А вот, что программисту надо прошивку генератора на МК (КАРЛ!!!) писать - это он не учел.
В общем посмотрел я как написал все Саша. Было несколько версий на СИ, и ни одна нормально не работала, хотя написано было очень красиво, граммотно и прочее.
Так за трое плохосонных ночей я написал.
Моя прошивка состояла из чистого линейного алгоритма, без использования переферии, таймеров и даже без прерываний. Идея состояла в том, что надо поднять 2 ножки вместе, подождать нужное время в тактах, опустить одну ножку, и сразу следующей командой опустить вторую. На следующей такой операции написать 1 NOP между подьемами ножек...
Я написал подпрограмму управляемой задержки в тактах. Это не простая подпрограмма, пустой цикл выполняется не один такт, значит мы можем задать время кратно времени выполнения цикла, но не до такта. Поэтому, я сделал еще несколько подпрограмм, с разным количеством "NOP" внутри.
Иначе-говоря, в главном и бесконечном цикле моей программы вызывались всякие подпрограммы
задержек с аргументами и горы NOP`ов.
Принес я через четыре дня *.HEX и *.ASM Саше и отдал. И сказал ему: "Ничего не меняй".