|
|
|
|
Zandy,благодарю! надеюсь я стал ближе на один шаг к совершенству :D. |
|
|
. |
|
|
Упс,чё-то глюкнуло. |
|
|
Zandy : Если мы из подпрограммы, вызванной "call" выходим не по "returnу", а раньше, по goto, причем адрес возврата при этом уже становится ненужным. ИМХО не надобно так делать! Никто ж не мешает поставить goto на ту строку, где return написан. Или просто return вместо goto написать. А "выскакивать" из подпрограммы помимо return я бы не стал. |
|
|
Я вернулся. picmaniac, изучаю ваш код. С тайм-аутом все-таки какая-то заковыка. Буду опять думать. И еще, не знаю теперь, что делать. Соглашаться с вашим кодом или пытаться реализовывать алгоритмы, которые предлагал выше? Я ж понимаю, что можно по-разному делать. А вот, что лучше и что хуже - это все останется внутри пластмассового прямоугольничка с выводами . Конечному потребителю (в нашем случае Splav56_у ) ведь до лампочки, главное, чтоб работало. Еще вот тут интересное наблюдение. Здесь писал программу и забыл отключить компараторы при инициализации порта А. Мплаб это скушал и не поперхнулся. При симуляции в протеусе заметил странные глюки. Ничего такого в мплабе не было. Типа: В портеА B'11111111' Делаю bcf PORTA,4 В результате в порте 11110000. Или считываю порт А, в котором 11111111 в W, в W - 11110000. Т. е я хочу сказать, что получается, что симулятор мплаба менее совершенен, чем в протеусе? Попутно вопросик. Допустим я имеют вывод(ы) порта А, настроенный на вход. В реальности я этот вывод подтягиваю резистором к питанию. Т. е. при включении на этом выводе сразу должна быть 1. Как это можно просимулировать в мплабе? Он всегда выводы, настроенные на вход ставит в 00.. Лишь в процессе выполнения программы я могу с помощью стимулюса поставить там 1. |
|
|
По компараторам см. п.9.6 даташита, стр. 58. Здесь принципиально отвечать на такие вопросы не буду, чтоб люди привыкали хоть иногда в даташит смотреть. Must read!!! Там всё написано. По второму вопросику. Обычно в таких случаях я делаю "сброс", затем сразу до первого шага программы устанавливаю при помощи асинхронных стимулюсов требуемые уровни, а потом уже запускаю симуляцию.
|
|
|
Я тут в длительной отлучке был. Потом сеть не работала. Думали, что забросил? Не-е-ет. Характер не такой. Я смотрю, пока меня не было, тема куда-то ускакала уже. Короче сделал я задание по-своему. Так, как и предлагал ранее. Прерывания по таймеру 500 мкс. Имеем "накопительный" счетчик, который накапливает 8 периодов входного сигнала (в принципе без особых проблем и изменений в программе, можно и больше взять). Затем анализируем его и сбрасываем для подсчета следующих 8 периодов. Такой способ меня прельстил тем, что точность вычисления периода повышается в 8 раз, по сравнению с измерением одного периода, записью в 8 регистров и последующим усреднением. А тут я даже ничего усреднять не стал. Из этого числа я вычитаю число, соответствующее номинальной частоте (40 мс), умноженное на 8, затем вычисляю его модуль. В результате получаю значение отклонения, которое и обрабатываю математикой. Все наши пороги пересчитал для 8 периодов и с ними сравниваю. Благодаря этому упростилась и математика, правда все вычисления проделываю с 16-разрядным словом (два байта). Таймаут определяется в двух местах программы. В самом начале (по переполнению счетчика) и в процессе вычислений. Программа получилась небольшая, благодаря чему вся преспокойненько влезла в прерывания со всеми вычислениями, мигалками и прочими потрохами.  Весь проект находится тут http://www.zloy47.newmail.ru/freq.rar В папке "Алгоритм" находится графический алгоритм с объяснениями и расчетами по порогам. В папке "Протеус" - действующая модель ус-ва с подключенными генераторами по входам. Можно менять длительности входных частот. К нижнему каналу подключено 6 генераторов на разные частоты через "галетник". Можно менять входные частоты в процессе симуляции. Вроде все работает, как положено. Жду отзывов, замечаний, возражений.  |
|
|
picmaniac: Здесь принципиально отвечать на такие вопросы не буду, чтоб люди привыкали хоть иногда в даташит смотреть. Да вопрос-то не в том. Я ж говорю, читал я даташит и все поправил. Я про то, что симуляция в родном симуляторе мплаба не среагировала на эту ошибку. А симуляция в встроенном в мплаб окне "протеуса" сразу ее засекла. Вот я и спрашиваю Zandy: Т. е я хочу сказать, что получается, что симулятор мплаба менее совершенен, чем в протеусе? Правда эта связка: протеус +мплаб у меня по-прежнему глючит. Работает, но не всегда. Вылетает мплаб. Задавал этот вопрос, и на казусе, и тут - так никто и не ответил. 
|
|
|
Zandy: Жду отзывов, замечаний, возражений. Пока что совсем нет времени. А вообще посмотрю с интересом. Чуть позже. Только вот Протеус у меня 6.7.3, он этот проект не открывает... |
|
|
Ребята Пикоманы, а Вы можете сотворить на pic10F2ххххх генератор звуковой частоты, причем по лапке, чтобы шло переключение, скажем 7 и 11 кгц ( главное чтобы не кратно), лапку - на прерывание по изменению уровня ( если десятые это могут), потому что время реакции критично. На внутреннем генераторе! на 4 мгц - обработка прерывания ( и переключение тона) будет вряд ли больше пары-тройки десятков микросекунд. Если сделаете ( а возможно такой пример для pic10 просто готовый найдется), можно будет этот генератор подарить Юхе в качестве модулятора для его фоторадиосинхронизатора. Вообще-то это можно и на rfPIC12 сделать, но на отдельном генераторе -интереснее, поскольку он есть самостоятельная ценность. Прелесть в том,что это генератор из одного элемента ( внутренний генератор пика используется), а ближайший по минимуму аналог - это ОУ+R+C - три детальки. 
|
|
|
|
|