Помогите с алгоритмом!

Общие вопросы функционирования и программирования МК, обсуждение типовых алгоритмов...
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2962
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Помогите с алгоритмом!

Сообщение rhf-admin » 12 апр 2011, 19:44

8-битный таймер, 16-битный предделитель, 16-битный постделитель.
Итого, 16*2^8*16*4/Fosc=13,1 мс максимум, но можно выделить для этого пользовательский регистр, записать в него какое-то значение и декрементировать при установке флага TMR2IF (ага этот флаг говорит о том, что отсчитано "предделитель*PR2*постделитель*4/Fosc" секунд) и так до нуля. Получим возможность отсчитать до 256 интервалов таймера, т.е. максимально свыше 3-х секунд. Но в этом случае во первых надо будет учитывать время, затрачиваемое на операции декремента и сравнения, а во вторых контроллер в это время не сможет ничем другим заниматься.

P.S. Хотя, нет. Это же всё можно оформить в подпрограмме прерывания, тогда проц будет свободен.
С уважением, администрация сайта.

Андрей
Читатель
Читатель
Сообщения: 8
Зарегистрирован: 20 фев 2011, 19:21

Re: Помогите с алгоритмом!

Сообщение Андрей » 13 апр 2011, 02:59

RHF, спасибо за оперативный ответ...
Я пока обдумаю, что Вы написали...
Да, но мне надо, чтобы проц был свободен и мог заниматься так сказать "Другими делами"...
Надо сделать подпрограмму обработки прерываний по переполнению TMR2?????????????????????????????
А то, что с декрементом дополнительный регистр надо будет вводить в этой подпрограмме или нет?

Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2962
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Помогите с алгоритмом!

Сообщение rhf-admin » 13 апр 2011, 15:54

Примерно так:
В основной программе:
1) настраиваем предделитель и постделитель как нам надо
2) загружаем нужное значение PR2
3) записываем в какой-то пользовательский регистр (пусть будет Counter) сколько раз должен отработать таймер, чтобы отсчитать нужное время
4) включаем таймер и разрешаем прерывания от него и глобальные
5) занимаемся своими делами

В подпрограмме прерывания:
1) проверяем флаг TMR2IF (узнаём от таймера ли прерывание)
2) если от таймера, то
decfsz Counter
goto exit
call Podprogramma ; - делаем то, что нам надо сделать по истечении заданного интервала
exit
3) сбрасываем флаг таймера и выходим из прерывания
С уважением, администрация сайта.

Андрей
Читатель
Читатель
Сообщения: 8
Зарегистрирован: 20 фев 2011, 19:21

Re: Помогите с алгоритмом!

Сообщение Андрей » 13 апр 2011, 20:34

RHF, я понял идею, спасибо огромное за подробное описание действий!!!
rhf-admin писал(а): Итого, 16*2^8*16*4/Fosc=13,1 мс
Я правильно понял, что 13,1 мс получится максимум это, если мы предделитель и постделитель поставим 1:16 (уменьшим частоту =>увеличится время)

Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2962
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Помогите с алгоритмом!

Сообщение rhf-admin » 14 апр 2011, 01:16

Да, всё правильно.
С уважением, администрация сайта.

Ответить