[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: я делаю так...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Сергей Тюнькин 23 февраля 2002 г. 09:27
В ответ на: Можно ли на Win организовать связь по RS232 в реальном времени но с относительно невысокой скоростью? отправлено sl 23 февраля 2002 г. 00:27


обмен контроллера(PCF80c552) с HOST на скорости 57600 пакетом в
16 байт, организован в отдельно потоке с большим приоритетом. Host
посылает байт запроса и контроллер выплевывает кадр, обработка и
вывод графики. Написано на 5 дельфи. Привожу процедуру инициализации

//-------------------------------------------------------------------
const
{-- Регистровая модель порта ввода/вывода INTEL 8250 (COM1) --}
{---------------------- запись ---------- чтение -------------}

COM_Transmit = $3F8;
COM_Reciever_Buffer = $3F8;
COM_Divisor_LSB = $3F8;
COM_Divisor_MSB = $3F9;
COM_Interrupt_Enable = $3F9;
_COM_I_E_En_CTS_DSR_RI_DCD = $8; {xxxx1000}
_COM_I_E_En_Eror_Line = $4; {xxxx0100}
_COM_I_E_En_Done_Trn = $2; {xxxx0010}
_COM_Interrupt_Enable_En_Recive_Symbol = $1; {xxxx0001}

COM_Interrupt_Identification = $3FA;
_COM_II_Mode_Fifo_0 = $00; {00xxxxxx}
_COM_II_Mode_Fifo_1 = $80; {10xxxxxx}
_COM_II_Mode_Fifo_2 = $C0; {11xxxxxx}
_COM_II_Time_Aut = $08; {xxxx1xxx}
_COM_II_Sourse_Interrupt = $06; {xxxxx11x}
_COM_II_Sourse_Int_Modem = $00; {xxxxx00x}
_COM_II_Sourse_Int_Trn_Symb = $02; {xxxxx01x}
_COM_II_Sourse_Int_Rec_Symb = $04; {xxxxx20x}
_COM_II_Sourse_Int_Error = $06; {xxxxx11x}
_COM_II_Sourse_Int_Request = $01; {xxxxxxx1}

COM_FIFO_Control = $3FA;
_COM_FIFO_Interrupt_Level_1 = $00;
_COM_FIFO_Interrupt_Level_4 = $40;
_COM_FIFO_Interrupt_Level_8 = $80;
_COM_FIFO_Interrupt_Level_14 = $C0;
_COM_FIFO_DMA_Enable = $08;
_COM_FIFO_Reset_Transmit_FIFO = $04;
_COM_FIFO_Reset_Receiver_FIFO = $02;
_COM_FIFO_Enable_FIFO = $01;

COM_Line_Control = $3FB;
_COM_LC_Divisor_Latch_Access_Bit = $80;
_COM_LC_Break_Control = $40;
_COM_LC_Sticky_Parity = $20;
_COM_LC_Even_Parity_Even = $10;
_COM_LC_Parity_Enable = $08;
_COM_LC_Stop_Bits_2 = $04;
_COM_LC_Serial_Data_Bit_5 = $00;
_COM_LC_Serial_Data_Bit_6 = $01;
_COM_LC_Serial_Data_Bit_7 = $02;
_COM_LC_Serial_Data_Bit_8 = $03;

COM_Modem_Control = $3FC;
COM_Line_Status = $3FD;
_COM_LS_FIFO_Error_Status = $80;
_COM_LS_Transmitt_Emty = $40;
_COM_LS_Ready_Transmitter = $20;
_COM_LS_Break_Detected = $10;
_COM_LS_Framing_Error = $08;
_COM_LS_Parity_Error = $04;
_COM_LS_Overrun_Error = $02;
_COM_LS_Receiver_Data_Ready = $01;

SMS = $3FE ; { - Modem Status }

//******************************************************************************

procedure Init_Serial;
begin
asm
mov dx,COM_Line_Control
mov al,_COM_LC_Divisor_Latch_Access_Bit
out dx,al {будем настраивать порт 8250}

mov dx,COM_Divisor_LSB
mov al,$002
out dx,al {младший байт скорости обмена;}
{настраиваем порт на 57600 бод}
mov dx,COM_Divisor_MSB
mov al,$000
out dx,al {старший байт скорости обмена}

mov dx,COM_Line_Control
mov al,_COM_LC_Stop_Bits_2 or
_COM_LC_Serial_Data_Bit_8
out dx,al {"07" - 8 бит, 1 стоп, без проверки четности}

//FIFO
mov dx,COM_FIFO_Control
mov al,_COM_FIFO_Interrupt_Level_14 or
_COM_FIFO_Reset_Transmit_FIFO or
_COM_FIFO_Reset_Receiver_FIFO or
_COM_FIFO_Enable_FIFO
out dx,al
//in al,dx //проверка
end
end;


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

Ответы



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

E-mail: info@telesys.ru