ВУЗ:
Составители:
5. Обработка второй половины (тем временем ПДП автоматически продолжает
заполнять буфер сначала).
6. Переход к пункту 2.
Приведенный алгоритм позволяет, например, организовать фоновую запись
вводимых данных на жесткий диск даже при большой частоте ввода (до
300 кГц).
5.7.2. Единственным недостатком работы с каналом ПДП является выделение
памяти под буфера для ввода-вывода данных. Фирма
IBM оставила для совместимости
очень неудобные ограничения на формирование базового адреса для буфера ввода по
ПДП. Для правильной установки базового адреса необходимо представлять организацию
памяти
PC с точки зрения контроллера ПДП. Для контроллера ПДП вся память
разбивается на последовательные блоки по
128 К, при этом в стандартном режиме
контроллер ПДП может записывать данные только в один из этих блоков. Если после
записи очередного отсчета адрес следующего попадает на границу страницы, то
контроллер переходит на начало текущей страницы, а не на начало следующей
. Простым
способом выделения памяти является запись в указатель непосредственного адреса самой
старшей девятой страницы с адресом
SEG=8, OFFS=0x8000 Buffer=(int *) 0õ90000000.
При этом, если в программе требуется осуществлять динамическое распределение
памяти, то возможно предусмотреть проверку возвращаемых указателей на отсутствие
наложения на последнюю страницу памяти.
5.7.3.Одноканальный ввод в режиме ПДП
void DMAONE(int *Data, int NPoint, int Chan, int Rate, int Dmm );
Назначение. Инициализирует контроллер ПДП и плату АЦП в режим
одноканального ввода с канала Chan числа
Npoint отсчетов в массив Data. После
выхода из функции плата начинает вводить данные по каналу ПДП. Для проверки
завершения ввода и доступа к счетчику контроллера ПДП, позволяющего узнать, сколько
данных было введено, используются функции
DMA_TEST() или DMA_COUNTER().
Параметры:
1.
Data — целочисленный массив для данных;
2. NPoint — число вводимых отсчетов (1 <= NPoint <= 32768);
3.
Chan — номер канала АЦП;
4. Rate — интервал ввода (от 1 до 0xffff);
5. Dmm
— параметр, включающий режим автоинициализации. В случае, если
режим автоинициализации будет включен, после ввода
NPoint отсчетов плата вновь
продолжит ввод в буфер, начиная с адреса Data, до тех пор, пока канал ПДП и плата не
будут остановлены при помощи функции
DMA_OFF().
Dmm = 0
— режим автоиницализации выключен;
Dmm = 1 — режим автоинициализации включен.
Пример:
main()
{
int i, *Data, Chan=0, NPoint=100, Rate=10, Dmm=0;
// установим указатель на старшую страницу памяти
Data=(int far *) 0õ90000000;
// запустим ПДП на ввод
DMAONE(Data, NPoint, Chan, Rate, Dmm);
//дождемся завершения ввода
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »