Управление изображением на мониторе через COM порт

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

МАХ работает вполне нормально на него жалоб нет.
Касательно порта. Вы учли, что биты RTS и DTR инвертируются в 550-м контроллере? Т.е. почти наверняка инвертируются и у вас в порту. Так что запись единицы в соответствующий бит приводит к появлению нуля на выходе порта, а ноль подается плюсом.
Утешили :) я так понимаю 550 контролер стоит на материнке и вещь стандартная поэтому такая инверсия будет происходить на всех компах куда бы я не сунулся?
По поводу сброса шифтика - ну написано же в даташите, что он ресетится нулем. Зачем было 5В присовывать?
повлияла легкая паника организованная "перевернутым миром" нулей и единиц.Сейчас посмотрел внимательней --действительно 0 нужно было присунуть.
По поводу загорания светиков ("иногда не всех") - у вас разрешение буфера в шифтике сидит на нуле перманентно. Т.е. на выход сразу идет содержимое регистра хранения. А там после подачи питания теоретически может быть что угодно (там ведь триггеры), если только нет автоматического сброса. Но я уверен, что его нет.
Один товарищ посоветовал повесить конденсатор на сброс в пару 1-2 нФ.но прада не помогло.Но вообще это малая беда.
Почему у вас загораются не те светодиоды - не представляю пока. Вы не могли бы как-то изложить суть алгоритма, чтобы мне не вникать в гнусный бейсик?
"RTC выступает в качестве входа последовательных данных (serial data input), Тх- в качестве сигнала сдвига (shift register clock input), DTR - в качестве сигнала записи (защёлки) (storage register clock input)"
это автор.
как я понимаю по ТхD просто генерация
а как выводится данные RTS не совсем понимаю,у меня 3 кнопки-клона по их нажатию или не нажатию как раз и формируется блок который уходит на регистр.
кнопки организованы не по отдельности,а блоком For i = 0 To 3
LED_on(i) = False
Next i

Но финт в том что не работает и исходная программа откуда я это дернул,при нажатии ввод -т.е. отправки сосотояния виртуальных кнопок в порт все загорается причем независимо от того нажаты были кнопки или нет т.е. при защелкивании регистра там откуда ни возьмись одни 1 ,или как вариант RTS не переключается и регистр считывает ее как 1 и только 1

И про конденсатор кстати напомнили,кренка грелась,хотя ток маленький,я поставил 0,1 мкФ -хватит?

Код: Выделить всё

Sub ComPortOut()    'подпрограмма вывода  на СОМ-ПОРТ
Dim NumDec, Bit(8) As Integer

    MSComm1.DTREnable = True 'срез регистра-защелки
  For i = 0 To 3        ' выдача на порт байта (первым идёт старший бит LED_on(7))
    If LED_on(3 - i) = True Then
        MSComm1.RTSEnable = True 'данные на регистр сдвига
    End If
    If LED_on(3 - i) = False Then
        MSComm1.RTSEnable = False   'данные на регистр сдвига
    End If

    MSComm1.Output = Chr(255) 'импульс сдвига
 Next i
  '------------------------------------------
           Do
        DoEvents                        '
         BufferPort = BufferPort & MSComm1.Input 'скачиваем из буфера порта в строковую переменную BufferPort данные до
       Loop Until MSComm1.InBufferCount = 0 'тех пор, пока в нём не останется ни одного байта (счётчик=0)
        BufferPort = ""
   '------------------------------------------
    MSComm1.DTREnable = False   'фронт- запись в защёлку регистра сдвига

End Sub
(\_(\
(=' :') радиоКотЭ
(,('')('')
Реклама
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

я так понимаю 550 контролер стоит на материнке и вещь стандартная поэтому такая инверсия будет происходить на всех компах куда бы я не сунулся?
Он на материнке конечно не стоит, там нечто встроенное, но это самый что ни на есть стандарт. Везде так должно быть.
Один товарищ посоветовал повесить конденсатор на сброс в пару 1-2 нФ.но прада не помогло.
Собсгря как это могло помочь, если в даташите ни слова про какую-либо предустановку регистра хранения после старта? Вот регистр сдвига можно сбросить при помощи RС-цепи на вывод MR.
"RTC выступает в качестве входа последовательных данных (serial data input), Тх- в качестве сигнала сдвига (shift register clock input), DTR - в качестве сигнала записи (защёлки) (storage register clock input)"
это автор.
как я понимаю по ТхD просто генерация
У вас по TXD передается 0xFF. Т.е. пойдет нулевой старт-бит, затем 8 единичных бит данных (или у вас порт настроен на иное их число?), затем бит четности и единичные стоповые биты. Получится типа импульс. Уж не знаю, может бит четности как-то гадит, проверьте его неиспользование. По-хорошему надо бы глянуть на осциллографе сигнал TXD. Должен быть импульс, но все бывает.
И про конденсатор кстати напомнили,кренка грелась,хотя ток маленький,я поставил 0,1 мкФ -хватит?
Кондер должен быть не любой, а тот, который указан в даташите именно на эту кренку. Обычно это единицы и десятки мкФ (в виде электролита или крупной керамики) и пресловутые 100 нФ в виде керамики (те же 100 нФ должны быть и на входе).
Знание - сила!
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Он на материнке конечно не стоит, там нечто встроенное, но это самый что ни на есть стандарт. Везде так должно быть.
ради интереса,зачем так сделано?
У вас по TXD передается 0xFF. Т.е. пойдет нулевой старт-бит, затем 8 единичных бит данных (или у вас порт настроен на иное их число?), затем бит четности и единичные стоповые биты. Получится типа импульс. Уж не знаю, может бит четности как-то гадит, проверьте его неиспользование. По-хорошему надо бы глянуть на осциллографе сигнал TXD. Должен быть импульс, но все бывает.
Т.е. выдается не серия импульсов 1 импульс ТхD 1 или 0 на RTS он считал,и так далее,а 1 импульс длительностью 8 бит и за это время он синхронно считывает данные с RTS.
Вот настройки порта в программе MSComm1.Settings = "115200,N,8,1" 115200 скорость обмена данными -правда каким боком она здесь не знаю и она ли это
N -тоже загадка
8 вероятно число бит
1 тоже не знаю
Осцилом давно бы поглядел очень не зотелось его на компьютерный стол тягать,места мало, но постараюсь посмотреть.
Кондер должен быть не любой, а тот, который указан в даташите именно на эту кренку. Обычно это единицы и десятки мкФ (в виде электролита или крупной керамики) и пресловутые 100 нФ в виде керамики (те же 100 нФ должны быть и на входе).
даташит конкретно на свою не обнаружил но аналог L7805 выходной 0.1 мкф ,а входной 0.33 мкф

вот полностью программа к которой я пририсовал пару своих функций,но она работает аналогично -т.е. не работает

Код: Выделить всё

Option Explicit
Private i, k As Integer
Private BufferPort  As String
Private LED_on(8) As Boolean

Private Sub Command1_Click(Index As Integer)
LED_on(Index) = True
Command1(Index).BackColor = vbRed
End Sub

Private Sub Command2_Click()
Call ComPortOut
End Sub

Private Sub Command3_Click()
For i = 0 To 7
LED_on(i) = False
Command1(i).BackColor = &H8000000F
Next i
End Sub

Private Sub Form_Load()
For i = 0 To 7
LED_on(i) = False
Command1(i).BackColor = &H8000000F
Next i
        MSComm1.CommPort = 1
        MSComm1.Settings = "115200,N,8,1"
        MSComm1.PortOpen = True
        MSComm1.RTSEnable = True
        MSComm1.DTREnable = True
End Sub


Sub ComPortOut()    'подпрограмма вывода  на СОМ-ПОРТ
Dim NumDec, Bit(8) As Integer

    MSComm1.DTREnable = True 'срез регистра-защелки
  For i = 0 To 7        ' выдача на порт байта (первым идёт старший бит LED_on(7))
    If LED_on(7 - i) = True Then
        MSComm1.RTSEnable = True 'данные на регистр сдвига
    End If
    If LED_on(7 - i) = False Then
        MSComm1.RTSEnable = False   'данные на регистр сдвига
    End If

    MSComm1.Output = Chr(255) 'импульс сдвига
 Next i
  '------------------------------------------
           Do
        DoEvents                        '
         BufferPort = BufferPort & MSComm1.Input 'скачиваем из буфера порта в строковую переменную BufferPort данные до
       Loop Until MSComm1.InBufferCount = 0 'тех пор, пока в нём не останется ни одного байта (счётчик=0)
        BufferPort = ""
   '------------------------------------------
    MSComm1.DTREnable = False   'фронт- запись в защёлку регистра сдвига

End Sub

(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

ради интереса,зачем так сделано?
Не представляю даже. Видимо были причины. Скорее всего доводы общего характера про преимущественную передачу активного состояния нулем (частое решение для ТТЛ-схем).
Осцилом давно бы поглядел очень не зотелось его на компьютерный стол тягать,места мало, но постараюсь посмотреть.
Обязательно надо. Из настроек порта не особо ясно, что и как там настроено.
даташит конкретно на свою не обнаружил но аналог L7805 выходной 0.1 мкф ,а входной 0.33 мкф
Ладно, оставляй 100 нФ на выходе.
Знание - сила!
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

в общем на осцилографе я смог увидедь только то что идет серия импульсов т.е. пики импульсов длительность одного импульса примерно 1-1.5 мс появляются только в момент нажатия Command2,посчитать мне их не удалось.
попробовал в другой программе,с того же сайта , там идет ШИМ модулирование посредством порта --но там тоже все плывет синхронизировать не удается.
(\_(\
(=' :') радиоКотЭ
(,('')('')
Реклама
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Бида бида. Хотя я уверен, что все окейно на TXD, но сделай вот что. Пусть у тебя DTR будет подавать импульсы сдвига на шифтик (тогда сможешь четко дать программный импульс). А вот TXD пусть уже подает импульс на регистр хранения.
Знание - сила!
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

сейчас попробую,кстати регистр нулем тоже не сбрасывается

Попробовал -не получилось,ругается на Next i я его пытался совать по разным участкам.я слабо придставляю что это за оператор,да и если бы TxD управлял защелкой --тм же серия импульсов --она бы (защелка) скакала туда-сюда.
Пробовал написать автору на почту но такой почты уже не существует(

Код: Выделить всё

Sub ComPortOut()   
Dim NumDec, Bit(8) As Integer

    MSComm1.DTREnable = True 
  For i = 0 To 7        
    If LED_on(7 - i) = True Then
        MSComm1.RTSEnable = True 
    End If
    If LED_on(7 - i) = False Then
        MSComm1.RTSEnable = False  
        Next i
    End If
    Next i
    Private Sub Timer1_Timer()
    MSComm1.DTREnable = False 
    Timer1.Enabled = False
    End Sub
    If MSComm1.DTREnable = False Then Timer1.Enabled = True
    MSComm1.DTREnable = True
    Next i

(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

сейчас попробую,кстати регистр нулем тоже не сбрасывается
Как ты это определил?
Попробовал -не получилось,ругается на Next i я его пытался совать по разным участкам.я слабо придставляю что это за оператор,
Это оператор перехода на следующий шаг цикла - завершает собой цикловые скобки в бейсиках. Ессна должен быть один такой оператор на каждый цикл.
да и если бы TxD управлял защелкой --тм же серия импульсов --она бы (защелка) скакала туда-сюда.
Серии там быть не должно. Должен быть ОДИН импульс. Но я тебе потому и предложил его сунуть в защелку, что защелке пофиг сколько раз на нее подать импульс. Если содержимое шифтика неизменно, то даже если вдруг пойдет несколько импульсов, то просто одно и то же несколько раз перепишется.

Твою программу я вообще не понял. Алгоритм нужен такой - выставил на RTS нужное, затем подал импульс на DTR (выставил DTR в ноль, потом в единицу, потом снова в ноль, ну или в обратном порядке) . Потом пошел на следующий ход цикла. А потом вывел байт 0xff в порт.
Знание - сила!
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

2 FRIM@N с СОМ-портом удобно работать через WinAPI. СОМ-порт открывается как обычный файл с помощью CreateFile. В Бейсике внешние функции из WinAPI цепляются с помощью Declare.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Как ты это определил?
MR на массу замкнул и защелкнул через порт
Алгоритм нужен такой
если я выставлю RTS потом опдам на DTR единицу у меня загорится первый светодиод,а потом после сигнала сдвига и еще 1 цикла он сдвинется,это все по моему нужно бы делать без вывода на выходы регистра пока все не устаканится.Т.е. выставляется некоторая последовательность из 4 бит которую формируют кнопки потом идет синхронно 1 бит RTS -сигнал сдвига ,1 бит -сигнал сдвига ,а уже потом защелка и загорелся нужный светодиод,в принципе больше 1 светодиода за раз и не нужно.Например по нажатию нужной кнопки на экране RTS переключилась как 1-0-0-0 1 светодиод, 0-1-0-0 2 светодиод ну и т.д. отсюда вопросы нужно ли синхронно переключать RTS и сигнал сдвига,и как сформировать последовательность для RTS --засунуть в таймер

MSComm1.RTSEnable = True
MSComm1.RTSEnable = False
MSComm1.RTSEnable = True
MSComm1.RTSEnable = True?

А частота прерывания это частота с которой он будет выдавать куски по 8 бит? может быть в BIOSе я тогда что-то отчудил?

\\\попробовал еще раз махнуть TxD и DTR

программу вот так изменил --никакого эффекта ,светодиоды так же все разом загораются

Код: Выделить всё

Private Sub Timer1_Timer()
MSComm1.DTREnable = False
MSComm1.DTREnable = True
End Sub
Sub ComPortOut()    'ïîäïðîãðàììà âûâîäà  íà ÑÎÌ-ÏÎÐÒ

Dim NumDec, Bit(8) As Integer

    MSComm1.DTREnable = True 'ñðåç ðåãèñòðà-çàùåëêè
  For i = 0 To 7        ' âûäà÷à íà ïîðò áàéòà (ïåðâûì èä¸ò ñòàðøèé áèò LED_on(7))
    If LED_on(7 - i) = True Then
        MSComm1.RTSEnable = True 'äàííûå íà ðåãèñòð ñäâèãà
    End If
    If LED_on(7 - i) = False Then
        MSComm1.RTSEnable = False   'äàííûå íà ðåãèñòð ñäâèãà
    End If
     Timer1.Enabled = True
 Next i

'------------------------------------------
           Do
        DoEvents                        '
         BufferPort = BufferPort & MSComm1.Input 'ñêà÷èâàåì èç áóôåðà ïîðòà â ñòðîêîâóþ ïåðåìåííóþ BufferPort äàííûå äî
       Loop Until MSComm1.InBufferCount = 0 'òåõ ïîð, ïîêà â í¸ì íå îñòàíåòñÿ íè îäíîãî áàéòà (ñ÷¸ò÷èê=0)
        BufferPort = ""
   '------------------------------------------
    MSComm1.Output = Chr(255) 'èìïóëüñ ñäâèãà
End Sub


(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

MR на массу замкнул и защелкнул через порт
Странно. Должно было сработать. Точно подал защелкивание?
,это все по моему нужно бы делать без вывода на выходы регистра пока все не устаканится.
Естественно, я же так и написал - задвигаешь в регистр биты, а потом высылаешь в порт 0xFF (мы же уже соединили TXD с входом защелкивания).
отсюда вопросы нужно ли синхронно переключать RTS и сигнал сдвига,
Зачем это? Выставил RTS, а потом при помощи импульса на DTR двигаешь значащий бит в шифтик.
и как сформировать последовательность для RTS --засунуть в таймер
Зачем?
А частота прерывания это частота с которой он будет выдавать куски по 8 бит? может быть в BIOSе я тогда что-то отчудил?
Кто? Где? Это о чем вообще?
программу вот так изменил --никакого эффекта ,светодиоды так же все разом загораются
Я туго представляю с какой частотой вообще работает твой таймер. Убери его нафиг и подавай импульс в цикле. Прямо операторы из обработчика таймера вставь вместо его разрешения в цикле.
Знание - сила!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Кто? Где? Это о чем вообще?
ну еще в декабре когда только началась эта история я полез в биос искать адрес порта :))) по незнанию
Странно. Должно было сработать. Точно подал защелкивание?
я сначала пощелкал просто из программы кнопку ввод,потом выпилил все лишнее оставив только 2 голых кнопки которые включали DTR в или 1 и пощелкал ими.
и как сформировать последовательность для RTS --засунуть в таймер


Зачем?
я имел в виду как задвинуть бит в нужную ячейку регистра --просто DTRом сдвинуть? т.е. 1 импульс сдвига DTR он в 1 ячейке 4 импульса -в 4 той?ячейки через которые я двигал -в них не останется единиц?Переключение происходит только при единице или вообще при любом изменении лог. уровня?
Я туго представляю с какой частотой вообще работает твой таймер. Убери его нафиг и подавай импульс в цикле. Прямо операторы из обработчика таймера вставь вместо его разрешения в цикле.
я поставил интервал 1 мс,но завтра попробую просто в цикле как вы сказали.

Меня смущает то что автор вроде как воплощал свои идеи в железе и как бы долно работать без запинок.монтаж проверил 100500 раз там 3 вывода собственно заблудится негде((.
еще как вариант попробую в понедельник на другом компьютере если получится.
(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

я имел в виду как задвинуть бит в нужную ячейку регистра --просто DTRом сдвинуть? т.е. 1 импульс сдвига DTR он в 1 ячейке 4 импульса -в 4 той?ячейки через которые я двигал -в них не останется единиц?Переключение происходит только при единице или вообще при любом изменении лог. уровня?
Сдвиговый регистр работает так - если нужно, чтобы в регистре оказалось, например, 00010001, нужно подать на вход 0, затем дать импульс сдвига, потом опять ноль и импульс, потом еще раз ноль и импульс, потом единицу и импульс, ну и далее. Если поставить единицу и дать четыре импульса, то будет четыре единицы.
Знание - сила!
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

это значит, с помощью COM порта пытаемся во внешний сдвиговый регистр вслепую (без проверки полученного результата) вдвинуть некое число? Ыыыы.
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Ну в общем-то в статье откуда это все почерпнуто автор таким способом выводил время на 4 разрядный индикатор-и как бы успешно,там фото было.

Попробовал еще вот так,коментарии аброкадаброй пошли, но в общем 2 кнопка должна была по задумке зажечь 2 светодиод ,а 3 вообще ничего не зажигать --забить все нулями.Итог все тот же --все светодиоды загораются.

И еще 1 у автора выход TxD был запаралелен с RxD ,а у меня нет,я исправил но положение не изменилось.пробовал также давать 1 на вход даных регистра резистором с с + и пытаться импульсами сдвига с порта эту единицу записать --ноль эмоций.Есть версия что во всем виноват Лужков и это дохлый регистр,через недельку возможно привезут другой.
(\_(\
(=' :') радиоКотЭ
(,('')('')
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Серии там быть не должно. Должен быть ОДИН импульс.
может таки сделать серию?Регистр сменил думая что попалил его слишком мощными светодиодами,светодиодам убавил яркости регистр сменил,и ничего не сменилось совершенно та же клиническая картина что и была,меня посетила мысль что вывод 13 который переводит выводы из высокоомного состояния в рабочее путем подачи на него "0" посажен на массу напряму,может не стоит так жестко с ним,может стоит через резистор?И еще одно регист упорно не хочет писать в себя "1" на отключенный от остальной схемы вход даных подавалась единица через резистор, и в это время щелкали защелкой --итог на выводах 0000 светодиоды горят :(
автор просил M74HC595,а я поставил M74HC595BL вроде как особой разницы быть не долно но вдруг я что-то не знаю,в даташитах эти доп. буквы не мелькают нигде.

Появился еще 1 интересный момент 1\0 инвертируются в порту и должны инвертироваться в МАХ но не инвертируются,я пробовал просто сменить все тру на фальш но из этого ничего не вышло


вот это место мне непонятно совершенно,кто может разжевать что-бы было понятно как редактировать, и при смене всех
True\False местами по исполнению этого блока все равно срабатывает защелка регистра -хотя по идее не должна.

Код: Выделить всё

Sub ComPortOut()    'подпрограмма вывода  на СОМ-ПОРТ
Dim NumDec, Bit(8) As Integer

    MSComm1.DTREnable = True 'срез регистра-защелки
  For i = 0 To 7        ' выдача на порт байта (первым идёт старший бит LED_on(7))
    If LED_on(7 - i) = True Then
        MSComm1.RTSEnable = True 'данные на регистр сдвига
    End If
    If LED_on(7 - i) = False Then
        MSComm1.RTSEnable = False   'данные на регистр сдвига
    End If

    MSComm1.Output = Chr(255) 'импульс сдвига
 Next i
  '------------------------------------------
           Do
        DoEvents                        '
         BufferPort = BufferPort & MSComm1.Input 'скачиваем из буфера порта в строковую переменную BufferPort данные до
       Loop Until MSComm1.InBufferCount = 0 'тех пор, пока в нём не останется ни одного байта (счётчик=0)
        BufferPort = ""
   '------------------------------------------
    MSComm1.DTREnable = False   'фронт- запись в защёлку регистра сдвига

End Sub
(\_(\
(=' :') радиоКотЭ
(,('')('')
Ответить

Вернуться в «Интеграция с ПК»