Сообщение от Роман Ефимов
|
Насчет задержак. Нашел программу, которая расчитывает, но не на си, зато говорит, сколько машинных циклов нужно МК дурью маится.
i++; или i--; это ведь один такт МК? Попробую это под pic16f877 подогнать.
|
Давайте для начала расставим точки над "и". Такт - один период тактового генератора, например, если у Вас стоит кварц 4 МГц, один период (он же такт) составит:
T=1/f=1/4000000=0,00000025s (секунды)=0,00025ms (милисекунды)=0,25us(микросекунды)
Соответственно, если частота тактового генератора меньше и равна 1 МГц, то такт составит 1us, а если больше , например, 8 МГц то такт равен 0,125us (микросекунды). Голая ариХметика.
Машинный цикл в МК PIC16 занимает 4 такта, т.е. для 1 МГц МЦ=4us, для 4 МГц - МЦ=4х0,25=1us (удобно для подсчета времянок), для 8 МГц - МЦ=0,5us. Опять голая ариХметика.
Большинство (но не все) ассемблерных команд в PIC выполняются за
1 МАШИННЫЙ ЦИКЛ, т.е. 4 такта задающего генератора (будь то кварц, или встроенный RC генератор). Так что никогда не путайте два этих понятия для PIC-контроллеров. Когда ткнетесь в другие, тогда и разговор будет другой, например, в AVR ASM-команда занимает один такт.
В СИ все в зависимости от степени "испорченности" компиллятора. Например, если ваше число I расположено в регистре МК, то оно увеличится на единицу всего одной командой ассемблера INCF I,1 и займет действительно 1 МЦ. Если же оно торчит х.з. где, то сначала оно будет помещено в аккумулятор W, потом там увеличено на единицу и только потом переписано на старое место уже увеличенное, а это уже как минимум 3 МЦ.
Ну а теперь, сами решайте, что Вы там наколбасили в тексте.
Далее, непонятно такое стремление к суперточным задержкам для LCD. Если Вы внимательно смотрели в даташиты, а точнее в таблицы времянок, то не могли не заметить, что большинство задержек ограничены только СНИЗУ (в таблицах указаны только минимальные значения). Ну, иногда приведены и максималки, но это, обычно, задержки между ФРОНТАМИ, а никак не длительности самих сигналов. Так на хрена Вам суперточность в задержках?, Да еще какими то причудливыми "фигурами высшего пилотажа" типа:
Цитата:
|
i++; i++; i--; i--;
|
Во-первых, все драйверы простых ЖК-индикаторов - девайсы достаточно медленные, т.е. вывод на индикацию "хорошо заточенной картинки" займет уйму времени. Конечно, если Вы только и собираетесь, что "порномультфильм" воспроизвести на индикаторе, то это по барабану. Но, иногда ведь в "нормальной" программе МК надо и что-то полезное сделать: обработать прерывания, опросить АЦП, датчики, порты (или изменить состояние последних) и т.п.
Во-вторых, нафига все эти ужимки и прыжки с I++ и I--, когда практически во всех компиляторах СИ есть подключаемая библиотека для точных задержек DELAY. Если где-то в середине программы ее применение с большими задержками может и помешать, то при стартовой инициализации ЖК лучше и не придумаешь.
Ну, и в-третьих, а чем Вас так пугает ассемблер? Ассемблерные вставки допустимы в программах на СИ практически во всех компилляторах с соответствующими командами спереди и сзади, так что для суперточности можно использовать и ASM, тем более, что вот там можно достаточно точно рассчитать - сколько это действо займет в реальном времени. А изучить хотя бы основные команды ассемблера для PIC16 - дело пары вечеров. Их там в общей сложности меньше чем букв в русском алфавите, да и в дальнейшем это поможет. В частности, например, в CCS PICC, если Вы действительно хотите получить задержку в 4 МЦ это выглядело бы так:
Код:
|
#asm
nop
nop
nop
nop
#endasm |
Надо меньше - уберите лишние
nop - нет операции (занимает 1 МЦ), надо больше - добавьте. И будет практически гарантированно столько, сколько "отвешено в граммах" (отсутствие гарантии только, если в этом момент разрешены прерывания и они прискакали).