Страница 2 из 5

Re: Прерывания INT и TMR0

СообщениеДобавлено: 22 апр 2016, 05:23
Steve Key
a50 писал(а):На вход RB0 идут импульсы с частотой 50 Гц, нужно запустить таймер TMR0. Как это сделать?

В начале проги включи таймер, настрой макросом, затем опусти бит соответствующий, чтобы он остановился, а в прерывании поднимай этот бит.

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 22 апр 2016, 19:44
Иван
Эту тему я посмотрел. Там не нашел рабочий проект. Всё очень сложно и не понятно, зачем так наворочено.
Посмотрите как я обрабатываю прерывания. Может найдете ошибку.

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 22 апр 2016, 20:47
Steve Key
Что делают следующие строчки?
Код: выделить все
st_bit(option_reg, T0CS);
tmr0=1;
cr_bit(option_reg, T0CS);

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 23 апр 2016, 21:01
Иван
st_bit(option_reg, T0CS); Устанавливает бит T0CS в регистре ОPTION микроконтроллера.
tmr0=1; Загружает в таймер 1.
cr_bit(option_reg, T0CS); Сбрасывает бит T0CS в регистре ОPTION микроконтроллера.
Читайте Datasheet микроконтроллера, там есть описание этого регистра.
Здесь на сайте есть специалисты которые могут помочь в решении проблемы?

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 24 апр 2016, 07:20
Steve Key
a50 писал(а):st_bit(option_reg, T0CS); Устанавливает бит T0CS в регистре ОPTION микроконтроллера.
tmr0=1; Загружает в таймер 1.
cr_bit(option_reg, T0CS); Сбрасывает бит T0CS в регистре ОPTION микроконтроллера.
Читайте Datasheet микроконтроллера, там есть описание этого регистра.
Здесь на сайте есть специалисты которые могут помочь в решении проблемы?

Зачем?
Зачем?
Зачем?
Читал. Потому и спрашиваю.
Есть. Но — «помочь», а не «сделать за тебя»…

Я имел в виду, что ты расскажешь, так сказать, глубинный смысл этих команд в данной программе, для чего они используются здесь и сейчас… А, пока объясняешь, и сам поймёшь…

Итак, разверну вопрос: зачем ты переключаешь источник тактового сигнала таймера?
Зачем устанавливаешь единицу в его регистре?

В принципе, путь имеет смысл, но он не совсем корректен.
Я имел в виду снимать и ставить бит T0IF для остановки и запуска таймера, а для того, чтобы он начинал считать всегда с одного и того же значения, да, нужно записать в него начальное число для делителя (от него, кстати, будет зависеть время «выдержки» до следующего прерывания), важно понимать, для чего и почему это делается.

Кстати, задержки delay, насколько я понял, запрещают прерывания, то есть, нарушают работу программы, надо от них избавляться…

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 24 апр 2016, 07:22
Вячеслав
a50 писал(а):на сайте есть специалисты

На самолюбие давишь? Я туточки мимо проходил. Вижу троицу команд, которые быстро:
-останавливают таймер,
-записывают в него 1,
-запускают таймер.
Чем смотришь результат работы фрагмента? В Протеусе отдельно по прерыванию INT проверь работу каждой строки фрагмента отдельно. По значению регистра tmr0 увидишь результат работы команды. Работу совокупности строк иногда не заметишь на скорости их выполнения.

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 25 апр 2016, 08:20
Иван
На вход RB0 микроконтроллера подаю синхронизацию от сети 50 Гц, в виде прямоугольных импульсов с периодом 20 mS.
Все делаю на "железе" подаю реальную синхронизацию и смотрю осциллографом.
Прерывания от таймера нормально НЕ РАБОТАЮТ.
В таймере TMR0 не бита запуска и остановки счета. Когда мне нужно чтобы он не считал, переключаю его на счет импульсов со входа T0CKI, там импульсов нет, останавливаю счет, а когда нужно чтобы он считал, переключаю на внутренний генератор.
Прерывание INT работает, но из него таймер не запускается, а если и запускается, то не в каждом периоде синхронизации. Почему?
Что не правильно в примере.

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 25 апр 2016, 09:27
Иван
Нужно захватить синхронизацию по-INT таймером. Она не работает.

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 25 апр 2016, 09:29
mim
Не хочешь нарисовать все в Протеусу?

Re: Как запустить таймер в прерывании INT

СообщениеДобавлено: 25 апр 2016, 10:17
Владимир
TMR0 Preload должен быть связан с твоим потенциометром. Включать\ выключать таймер нужно битом делителя (не знаю как у Пиков)
Ацп нельзя так часто опрашивать. Опрашивать хотя бы раз за полуволну.
И какой то странный импульс на симистор, обычно его нужно подержать открытым 20мкс за полуволну, потом остановить таймер до следующей синхронизации. На след полуволне повторить.
Ну и вообще задачка для общего развития, потому как в димере с потенциометром МК не нужен :) , делай сразу кнупку/кнопки.