[an error occurred while processing this directive]
Ответ: Вот он!
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

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

Отправлено Vjacheslav 11 ноября 2002 г. 18:04
В ответ на: Пользователи С++Builder 5.0,подсобите please... отправлено Boroda 10 ноября 2002 г. 02:35

Это годится для Windows 95/98/ME но не NT4/2000/XP - при этом точность не хуже 15 mksec.
Это для Delphi но проблем с переписью для C++ нет проблем.

procedure TForm1.TDelay(Time: Integer); { шаг задержки 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;
End;

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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru