Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> COM-порт и ADuC812, добиться максимальной скорости 
:(
    Опции темы
baphonet
Дата 27.7.2005, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.7.2005

Репутация: нет
Всего: нет



Данные после обработки требуется отсылать на комп через com-порт. Как добиться максимальной скорости передачи данных? Пока это выглядит так (между каждым отправленным байтом вставляется задержка):

Код


$MOD812

;X    EQU P2.0    ; порт Р1.0 - данные по Х
;Y    EQU P2.1    ; порт Р1.1 - данные по Y

X    BIT P3.7    ; порт: данные по Х
Y    BIT P3.6    ; порт: данные по Y

X1L    EQU 20H    ; длительность низкого уровня по Х (МЛ.Б)
X1H    EQU 21H    ; длительность низкого уровня по Х (СТ.Б)
X2L    EQU 22H    ; длительность высокого уровня по Х (МЛ.Б)
X2H    EQU 23H    ; длительность высокого уровня по Х (СТ.Б)

Y1L    EQU 24H    ; длительность низкого уровня по Y (МЛ.Б)
Y1H    EQU 25H    ; длительность низкого уровня по Y (СТ.Б)
Y2L    EQU 26H    ; длительность высокого уровня по Y (МЛ.Б)
Y2H    EQU 27H    ; длительность высокого уровня по Y (СТ.Б)

ORG 00h
    JMP    MAIN        ;переход к главной подпрограмме
;============ ИНИЦИАЛИЗ ДЛЯ КОМПОРТА ========================
COMINIT:
    MOV    TMOD,#0A0H    ;инициализация
    MOV    TH1,#253    ;инициализация
    MOV    SCON,#050H    ;инициализация
    SETB    TR1        ;инициализация
    RET

;=== считывание данных с X акса и занесение в MEMORY =========
READ_X:                ;чтение с датчика

; . . .

    RET

;=== считывание данных с Y акса и занесение в MEMORY =========
READ_Y:
                ;чтение с датчика
; . . .  
    RET

;============= Вывод на ком-порт =========================
DE_SEND:
    MOV    R0,#00H

    MOV    SBUF,#10H    ;разделитель
    CALL    DELAY        ;
                ;===== X ======
    MOV    A,X1H        ;
    MOV    SBUF,A        ;отправляем старший байт

    ADD    A,R0        ;CHECKSUM
    MOV    R0,A        ;CHECKSUM
    CALL    DELAY        ;

; . . .
        RET
;===========================================================
MAIN:    
    CLR    EA        ;ЗАПРЕТ ВСЕХ ПРЕРЫВАНИЙ
    CALL    READ_X
    CALL    READ_Y
    CALL    COMINIT
    CALL    DE_SEND
    JMP    MAIN

;============== задержки для ком-порта =====================
DELAY:
    MOV    R5,#250
    DJNZ R5, $
    MOV    R6,#231
    
    DJNZ    R6,DELAY
    RET
END


Нормальную задержку тяжеловато будет подобрать, а с этой слишком большой интервал между отправками. Может это можно замутить при помощи прерываний? Как это будет выглядеть? И, кстати, где можно по-подробней почитать про работу с прерываниями в aduc812?
PM MAIL   Вверх
maxim1000
Дата 27.7.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



обычно, в COM-портах используется такой подход:
делается специальная линия от компьютера к устройству, которая показывает, готов ли компьютер принимать байты, как только линия говорит, что готов (не помню, 0 там или 1), посылается следующий байт (если, конечно, не все еще послались)
соответственно и в обратную сторону тоже делается такая линия
линии эти называются CTS и RTS (не помню какая из CTS, а какая RTS, но принцип у них одинаковый)
если этих линий нет, придется придумать маленький протокольчик над потоком байт:
например, после каждого принятого байта отсылать его обратно
таким образом можно добиться max/2 скорости
в принципе, думаю, если немного изменить схему, можно посылать следующий байт, пока передается подтверждение предыдущего, и таким образом преодолеть порог max/2, но там сложнее получится...


--------------------
qqq
PM WWW   Вверх
baphonet
Дата 27.7.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.7.2005

Репутация: нет
Всего: нет



А когда вообще с com-порта приходят прерывания? То есть в каком случае будет выполнен Код из какого-нибудь такого куска?
Код

;-------------------- прерывание с com-порта ------------------------------
ORG 023h
    ; . . . Код . . .
RETI

PM MAIL   Вверх
maxim1000
Дата 27.7.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата
А когда вообще с com-порта приходят прерывания

ну это зависит от реализации
в самом простом случае:
1. на посылку - когда закончился (или начал - зависит от наличия доп.буфера) посылаться очередной байт
2. на прием - когда что-то щакончило приниматься
бывают более "навороченные" контроллеры - сами занимаются CTS, RTS, поддерживают DMA
если же ни CTS, ни RTS нету, а засорять поток данных подтверждениями не хочется, можно сделать обработку этих сигналов в своей программе (только их надо завести на свободные флажки общего назначения)


--------------------
qqq
PM WWW   Вверх
PILOT
Дата 27.7.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



Придумываешь протокол обмена с квитированием, т.е. со служебными посылками.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
baphonet
Дата 28.7.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.7.2005

Репутация: нет
Всего: нет



Народ, а чтобы повысить скорость передачи в два раза, как именно надо юзать PCON.7 ? Просто вставить SETB PCON.7 после инициации порта?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.