Собственная библиотека для ADAM 5510 |
Ответить | Страница <1 234 |
Автор | |||
Участник Присоединился: 02 Декабрь 2010 Online Status: Offline Публикации: 68 |
Опубликовано: 20 Декабрь 2011 16:01 |
||
вы тестируете библиотеку которую я выложил на C или свою на паскале?
|
|||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|||
Помоему Вы всё очень усложняете со своими функциями. Не надо универсальных, надо под конкретную задачу (но самому понимать принцип работы СОМ порта). Практика показывает что С3.1 очень неоптимально компилирует код.
Для примера привожу код: инициализации, обработчика прерывания и старта обработки буфера передачи. Код после компиляции 485 байт (и это не наименьший код, можно оптимизировать). Сделано на ASM для ADAM 5510 (работа с вакуумфлуоресцентным дисплеем серии Century, производимых фирмой IEE, через СОМ1). ;-------------------------------------------------------------------- ; можно подключить к проекту UltraLogik в виде функционального блока. ; ; (C) Copyright 2010 by Vel ;-------------------------------------------------------------------- public Start_COM1, Ini_COM1 DGROUP group DATA DATA segment byte public 'DATA' assume ds:DGROUP Star_INT_0Ch dd 0 ; Адрес старого обработчика перывания 0Ch Start_Data db 0 ; Переменная для контроля начала передачи db 0 Shet_Size_Data dw 0 ; счетчик передаваемых данных Byffer_Peredahi db ; начало буффера для передачи символов (1E - кирилица) dd 0 ;+4 байта dd 0 ;+4 байта dd 0 ;+4 байта dd 0 ;+4 байта DATA ends SYSTEM segment byte public 'CODE' assume cs:SYSTEM, ds:DGROUP ;-------------------------------------------------------------------- ;;;; < Обработчик прерывания СОМ 1 > ;;;; ;-------------------------------------------------------------------- New_INT_0Ch: ; Начало нового обработчика прерывания (0Ch) ; (INT 0Ch) - прерывание последовательного порта СОМ1 ; вызывается, если порт СОМ1 получил данные. push ax ; Сохранить ax в стек push ds ; Сохранить ds в стек push dx ; Сохранить dx в стек push bx ; Сохранить bx в стек Indet_INT: ;;;;;;{идентификация прерывания} mov dx, 3FAh ; Адресс порта в dx (03FAh для чтения) - регистр in al, dx ; Считать данные из порта 03FAh в al and al, 07h ; Логическое И, обнуление 3-7 бит (00000111b) cmp al, 2 ; Сравнение al с 2 (00000010b)-буфер передачи пуст. Сбрасывается после записи в 03F8h je Vix_INT ; если равно, то на Vix_INT (прерывание по завершению передачи символа) ;;;;;;{сброс остальных прерываний} ; --------------------------------------------------------------------------- ;(сброс - пришли данные) mov dx, 03F8h ; Адресс регистра передачи данных в dx in al, dx ; Считать данные из порта 03F8h в al jmp short $+2 ;(сброс - состояние BREAK или ошибка) mov dx, 03FDh ; Адресс регистра состояние break или ошибка в dx in al, dx ; сбрасываем прерывание чтением из рег. состояния линии jmp short $+2 ; задержка ;(сброс - изменилось состояние модема) mov dx, 03FEh ; Адресс регистра состояния линии в dx in al, dx ; сбрасываем прерывание чтением из регистра jmp short $+2 jmp Exit_Indet_INT ; на выход ; --------------------------------------------------------------------------- Vix_INT: ; прерывание по завершению передачи символа ;;;;;;{передача символа} mov bx, Shet_Size_Data ; получаем значение счетчика cmp bx, 16 ; сравнение jge Exit_Indet_INT ; если больше или равно, то на метку, иначе inc Shet_Size_Data ; инкремент, увеличиваем на 1 mov al, byte ptr Byffer_Peredahi+bx ; считываем значение из буффера передачи mov dx, 03F8h ; адрес порта out dx, al ; пишем в порт ;=============================== Exit_Indet_INT: ; послать в контроллер прерывания - прерывание обработано mov dx, 0FF22h mov ax, 0Ch out dx, ax pop bx pop dx pop ds pop ax iret ; возвращение в основную программу ;============================================================================= ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Инициализация СОМ 1 Ini_COM1 proc pascal near push ds ; сохранить ds в стек push es ; сохранить es в стек push bx ; сохранить bx в стек push dx ; сохранить dx в стек mov ax, 350Ch ; АН = 35h, AL = номер прерывания (0Ch) ; (INT 0Ch) - прерывание последовательного порта СОМ1 ; вызывается, если порт СОМ1 получил данные. int 21h ; функция DOS: определить адрес старого обработчика ; (ES:BX) mov word ptr Star_INT_0Ch, bx ; В bx смещение mov word ptr Star_INT_0Ch+2, es ; В es сегментный адресс mov ax, cs ; В ax адресс сегмента из cs (cs:SYSTEM) mov bx, ds ; сохраняем ds в bx mov ds, ax ; Установить ds на :SYSTEM (ds:SYSTEM) assume ds:SYSTEM lea dx, New_INT_0Ch ; Вычисление эффективного адреса New_INT_0Ch mov ax, 250Ch ; АН = 25h, AL = номер прерывания (0Ch) ; сегментный адрес в DS ; смещение в DX int 21h ; функция DOS: установить новый обработчик прерывания (0Ch) mov ds, bx ; Востановить ds:DGROUP из bx assume ds:nothing ;;;;;;{запрещение прерывания} mov dx, 0FF28h ; Адресс порта в dx in ax, dx ; Считать данные из порта 0FF28h в ax and al, 0EFh ; Логическое И, обнуление 4 бита (11101111b) out dx, ax ; Записать данные (ax) в порт (dx - (0FF28h)) ;;;;;;{сбрасываем регистр данных} mov dx, 3F8h ; чтением из порта 03F8h in al, dx ; Считать данные из порта 3F8h в al jmp short $+2 ; задержка ;;;;;;{сбрасываем регистр состояния линии} mov dx, 3FDh ; чтением из порта 3FDh in al, dx ; Считать данные из порта 3FDh в al ; 03FDh (для чтения) - регистр состояния линии jmp short $+2 ; задержка ;;;;;;{сбрасываем регистр состояния модема} mov dx, 3FEh ; чтением из порта 3FDh in al, dx ; jmp short $+2 ; задержка ;;;;{режим ввода делителя} mov dx, 3FBh ; mov al, 80h ; 7: бит DLAB : 1 = порты 3F8h и 3F9h в режиме ввода делителя out dx, al ; jmp short $+2 ;;;;;;(Запись в Регистр управления модемом) mov al, 00001100b ; (0Ch) Запись в Регистр управления модемом ; 0: 1 = установить выход DTR ; 1: 1 = установить выход RTS ; 2: 1 = установить OUT1 (не используется) ; 3: 1 = установить OUT2 (разрешить прерывания от RS-232) mov dx, 3FCh out dx, al jmp short $+2 ;;;;;;{младший байт делителя} mov dx, 3F8h mov al, 06h ; скорость 19 200 ; задаем делитель скорости (0006h - 19200) out dx, al ; jmp short $+2 ;;;;;;{старший байт делителя} mov dx, 3F9h ; mov al, 0 ; Скорость 19 200 out dx, al ; jmp short $+2 ;;;;;;{буферизация FIFO}(отключаем) mov al, 00000000b ; бит 0 : Разрешение использования буферизации при приеме и предаче ; бит 1 : Сброс приемного буфера FIFO ; бит 2 : Сброс буфера FIFO передатчика ; биты 6-7: Установка значения числа символов в приемном буфере FIFO для ; инициирования прерывания (FIFO Trigger Level) ; 00 - 1 бит mov dx, 3FAh out dx, al jmp short $+2 ;;;;;;{режим работы} mov dx, 3FBh mov al, 00000011b ; Режим работы ; 0-1: число битов данных : 11 = 8 бит ; 2 : число стоп-битов : 0 = 1 стоп бит ; 3-4: тип четности : X0 = нет ; 5 : постоянная четность: 0 = отмена постоянной четности ; 6 : : 1 = имитировать обрыв линии ; 7 : бит DLAB : 0 = порты 3F8h и 3F9h в обычном режиме out dx, al jmp short $+2 ;;;;;;(Запись в Регистр управления прерываниями) mov al, 00000010b ; (5) Запись в Регистр управления прерываниями ; 0: прерывание по приему символа ; 1: прерывание по завершению передачи символа ; 2: прерывание по обрыву линии или ошибке в линии ; 3: прерывание по изменению состояния модема (любой из линий CTS, DSR, RI и DCD) mov dx, 3F9h out dx, al jmp short $+2 pop dx ; восстановить dx основной программы pop bx ; восстановить bx основной программы pop es ; восстановить es основной программы pop ds ; восстановить ds основной программы retn Ini_COM1 endp ;-------------------------------------------------------------------- ; Подпрограмма Start_COM1 используется для передачи данных из буффера ; для передачи символов (16 байт) на дисплей Start_COM1 proc pascal near ;=============================== Push dx ; сохраняем регистр bx assume ds:DGROUP ;;;;;;{передача символа} mov Shet_Size_Data, 0 ; записываем значение счетчика mov al, 1Eh ; записываем (1E - кирилица для дисплея) mov dx, 03F8h ; адрес порта out dx, al ; пишем в порт ;=============================== pop dx ; востанавливаем регистр dx ret ;все остальное додумает ассемблер (T320+) Start_COM1 endp SYSTEM ends end |
|||
Vel
|
|||
Действительный член Присоединился: 15 Октябрь 2003 Категория: Belarus Online Status: Offline Публикации: 141 |
|||
к POISON:
Вашу - переведённую на Паскаль |
|||
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|||
Ололо. Холостой выхлоп. Только Вам не нужно - вот только Вы и не пользуйтесь "благами". Пишите на своем АСМЕ еще и еще... И еще. Больше мне сказать нечего.
А кто говорил что используется только BC 3.х? Не надо под одну гребенку грести. А также нужно внимательно читать тему с начала.
Ну и зачем оно, когда уже выложены рабочие исходники на Си? Вы б лучше выложили код для работы c модулями I/O, хоть даже на асме. Вот где был бы огромный плюс и помощь. А так - всё пустое... |
|||
Новичок Присоединился: 03 Июль 2003 Online Status: Offline Публикации: 7 |
|||
К Vel_
(..можно подключить к проекту UltraLogik в виде функционального блока) Для какого UL написано "16" или "32"? Насколько, я знаю там есть заморочки процедур на ASM. Те , которые работают в UL16 - не работают в UL32. Вы с этим не сталкивались? |
|||
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|||
Что - то пока никто ничего дельного не предьявил (полезного кода) - а только какие - то левые разговоры не в тему.
|
|||
Участник Присоединился: 02 Декабрь 2010 Online Status: Offline Публикации: 68 |
|||
так в этих функция нет вызова сброса Watchdog'a. Вы можете сами добавить сброс если это необходимо. |
|||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|||
К Воробьеву Написано для "16", у 32 сегменты данных и кода "сишные", в этом и заморочка. Ul 16 написан универсальным (код библиотек и компилятор на Tasm, оболочка на делфи 1). Если кому надо красивый и оптимальный код, то декомпилируйте 80x86.lib или cpp80x86.lib из Ul16, там ВСЁ есть. Можете сразу использовать обектные файлы из этих библиотек в своих проектах и нет необходимости в (полезном коде). (для kuzulis)
|
|||
Vel
|
|||
Действительный член Присоединился: 15 Октябрь 2003 Категория: Belarus Online Status: Offline Публикации: 141 |
|||
к kuzulis:
Вы считаете, что перевести на Паскаль легко?? я уже пятый день тупо этим занимаюсь... Что мне Вам говорить?? |
|||
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|||
2 Semelenov,
Я не в Ваш адрес говорил, а в адрес Vel_. Будьте внимательнее ;) А насчет того, что никто ничего полезного еще не предъявил - разве это не так? Я не поверю, что у людей - АСУ-шников, которые постоянно работают с PLC такого типа нет никаких наработок, которыми они могли бы поделиться. В частности, на данный момент необходимы наработки по доступу к модулям I/O. Того что уже выложено на гуглокод явно недостаточно и по-хорошему нужно дорабатывать и развивать. У poison еще кое что есть, а именно API для работы с таймерами, которое позволяет создавать таймеры любого количества и разрешения (там по умолчанию сейчас 1 мсек), но можно переделать и доработать код. В отличие от таймеров предоставляемых адвантехом, у которых жестко 5 мсек. Если кому это надо - просите poison-а выложить и это. |
|||
Ответить | Страница <1 234 |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |