Сообщение от al-s
|
(==) - это обозначает не равно
|
Означает "равно" в языке С, "не равно" будет "!="
Сообщение от al-s
|
условия прерывания для каждого вида задержки разные
|
Не, не так. Прерывание одно и то же: это прерывание основной программы при переполнении таймера.
Ну, можно по-другому сделать ...
Таймер - это счётчик внутри МК, пусть 16-битный, считает от 0000h до FFFFh. Считает - значит увеличивает своё зачение на 1 с каждый тиком, его можно в программе останавливать и снова запускать, а также изменять его значение. При достижении максимального значения FFFFh со следующим тиком счётчик сам сбрасывается в 0000h, "переполняется", при этом вырабатывается прерывание основной программы, если разрешено.
В Вашем случае, делаете тики таймера с периодом 10мс. Сначала таймер остановлен. Записываете в таймер значение задержки в мс, делённое на 10, со знаком минус. Например, для 1сек = FF9Ch, что есть "-100" в шестнадцатеричном виде. Таймер всё ещё стоит. В процедуре обработки прерывания таймера пишите команду остановки таймера и установку порта в 1.
Теперь всё готово для задержки. В нужный момент просто запускаете таймер. Таймер тикает сам по себе "FF9Dh","FF9Eh","FF9Fh","FFA0h" и т.д. c шагом 10мс. При переполнении, то есть ровно через 1сек, основная программа прерывается, выполняется обработчик прерывания, таймер останавливается, чтобы дальше не считал, и порт устанавливается в 1.
Для определения, какой именно порт надо устанавливать, перед задержкой занесите номер порта в какую-либо переменную, и в прерывании проанализируйте её, чтобы установить нужный порт.
procedure Timer_interrupt()
{
clear int_flag;
Stop_Timer;
if (portNumber ==0) Port0=1;
if (portNumber ==1) Port1=1;
if (portNumber ==3) Port3=1;
}
Main_Program
{
// do something
portNumber=1;
call Delay_ms(1000);
// do something
}
procedure Delay_ms(dt)
{
Timer= -1*dt/10;
Start_Timer;
}
Недостатки этого способа выработки задержки. Ошибка реальной величины задержки будет плавать от 0 до минус 9.9мс. При малых значениях задержки, типа десятки мс, весьма существенная ошибка, например, при ожидаемой задержке в 10мс может дать реальную задержку в 0.1 мс. А всё потому, что тики 10мс для таймера не синхронизированы с моментом запуска задержки.
Второй недостаток - невозможность одновременно запустить несколько задержек с разными величинами.
Если эти недостатки существенны - делайте, как описано в моём предыдущем посте.