Ответ: Надоело уже - смотрите
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Vjacheslav 17 февраля 2004 г. 14:17
В ответ на: Ответ: Gde Vy tam uvideli отправлено Dmitriyf 17 февраля 2004 г. 13:21

Вот пример процедуры, которая делает задержку (для Win 98)
Когда то уже давал неверующим - можете проверять.
Ссылка на автора обязательна!!
procedure TForm1.TDelay(Time: Integer); {Grivin V.P.}{ шаг задержки 100 мксек}
Label wait0;
const mask:byte = $20;
begin
{$IFDEF WIN32}
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
{$ENDIF}
asm
push ax;
push bx;
push cx;

{загрузка управляющего байта Cntrl в командный регистр таймера (с адресом 43h)}

{формат управляющего байта Cntrl - d7-d6 - номер программируемого канала (0-2),}
{ - d5-d4 - тип операции (0-3),}
{ - d3-d1 - номер режима (0-5),}
{ - d0 - формат информации.}

{ d7-d6 = 00 - номер программируемого канала 0
{ = 01 - номер программируемого канала 1
{ = 10 - номер программируемого канала 2
{
{ d5-d4 = 00 - запись значения счетчика в регистр,
{ = 01 - обращение только к старшему байту
{ = 10 - обращение только к младшему байту
{ = 11 - обращение сначала к младшему байту, а затем к старшему.
{
{ d0 = 0 - двоичные данные,
{ = 1 - двоично-кодированная десятичная форма.
{
{ Cntrl = 0B6h - канал 2, режим 3, двоичные данные, обращение сначала к младшему байту,
{ а затем к старшему .
{ Режим 3 - генерация меандра (скважность = 2)}

mov al, 0B6h;
out 43h, al;
{ 1 193 180 тактов в секунду ==> шаг таймера 0.1 mS соответствует числу 238}
mov ax, 238; { 238 примерно соответствует частоте 5 kHz }
{ 42h - адрес порта канала 2 }
out 42h, al; { запишем младший байт счетчика таймера }
mov al, ah; { сдвигаем старший байт в AL }
out 42h, al; { запишем старший байт счетчика таймера }
in al, 61h; { читаем текущую установку порта B }
mov cl, al; { сохраним ее в регистре cl }
{ or al, 3; включим динамик }
or al, 1; { откроем канал 2 }
out 61h, al;
in al, 61h; { читаем порт B }
and al, mask { выделим выход 2-го канала }
mov ah, al;
mov ecx, Time;
wait0: in al, 61h;
and al, mask;
cmp al, ah; { появилась ли новая полуволна }
je wait0; { ветвление, если нет }
mov ah, al;
dec ecx;
jnz wait0;
mov al, cl;
out 61h, al; { восстановим текущую установку порта B }

pop cx;
pop bx;
pop ax;
End;
{$IFDEF WIN32}
SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
{$ENDIF}
end;


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru