Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как писать на COM1 порт?  (Прочитано 25807 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
IncreMan
Гость
« : 04-04-2006 16:23 » 

Люди добрые, спасите...

Надо написать малюсенькую программу но вот как это реализовать не знаю.

Вот что нужно:
1. На VisualBasic или VisualC++ написать малюсенькую программу в которой будет 2 строки ввода, каждая ограничена до 16 символов. Нажимая на кнопку send инфа из этих строк отправляестья в COM1 порт.

2. На Assembler-51 (для микроконтроллера 8051/31) написать прогу которая будет принимать эту инфу.

Всё это необходимо для того, чтобы отобразить на 2 строчках LCD то, что написали в компе. Программа для вывода на LCD уже есть, осталось вышеперечисленное. Наверное также важно чтобы к строкам в программе на VB или VC++ добавлялся какой-то символ обозначающий для проги на asm-51 что это 1 или 2 строка. Мне сказали что реально реализовать за счёт внутреннего RAM в микроконтроллере 8031, поэтому думаю будет наилучьшим вариантом, запись полученной инфы из компа в адреса RAM, а оттуда будет выдоваться всё на LCD.

Буду признателен любой помощи!!!!
Плиззз, очень надо!!!!


Заранее благодарен!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-04-2006 06:57 » 

Ты представление  о среде прогрммирования имешь? (VisualBasic или VisualC++)
Хелпом пользоваться умеешь?
Поиском пользоваться умеешь?

Задача проста, как 2 пальца об асфальт
Что ты предпринял?

Как разделить строки?
возможны несколько вариантов
1 Число символов в строке LCD дисплея ограничено Заполняешь каждую строку в конце пустыми символами
2 Конец строки ограничиваешь символом "конец строки" (0xD или 0xA). Конец сообщения 0x0)
3 Передаешь количество символов в каждой строке, а потом содержимое
4
5
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-04-2006 07:02 » 

Что касается 51
опять же несколько вариантов
Самое главное - настраиваешь UART см мануал по контроллеру - там это описано по слогам!

Выбираешь способ получения
Обработка по прерыванию
Обработка в цикле по готовности порта

И все!

Делов на NNN минут (я эти два поста дольше писал)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #3 : 06-04-2006 16:09 » 

Еслибы, микроконтроллер принимает то только одно значение через регистр sbuf
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 06-04-2006 17:24 » 

IncreMan, это не проблема. Последовательный порт м/к может генерировать прерывания по приему байта и по окончанию передачи. Напиши обработчик прерывания. Данные можно буферизировать (напр. организовать в RAM кольцевой буфер).
У меня раньше были такие наработки, но к сожалению код не сохранился.

Согласись, что писать за тебя мы не будем, но на помощь расчитывать можешь.

Начни придумывать как сделать и спрашивай детали!


У тебя м/к занят только этой задачей?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 07-04-2006 06:39 » 

О, это уже ближе к телу
Я же описал, два варианта работы с портом
1. В цикле - по ожиданию готовности порта
2. По прерыванию

Рассмотрим первый вариант
ожидаем готовности
читаем из буфера
передаем в подпрограмму обработки LCD
вернулись назад

Второй вариант
Для буфера выделяем память, и ячейку для указателя(ей)
Программа крутится в основном цикле
В основном цикле проверяется готовность БУФЕРА

По приходу прерывания, принятый байт кладятся в буфер по адресу в указателе, сдвигается указатель (инкременируется или декрементируется). Проверяется на переполнение, взводится или не взводится флаг готовности буфера.

Все!
ждем твоего кода
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 07-04-2006 08:17 » 

Второй вариант гибче и лучше с точки зрения энергопотребления, т.к. основной цикл можно останавливать на ожидание прерываний. Если основной цикл ничем тяжелым не занят, то достаточно одного-двух байт для буфера приема. С буфером передачи сложнее - требуется реализация блокировки при переполнении буфера.
 
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 07-04-2006 11:44 » 

Можно я скажу - я не бейсике не программил, только на С++. Если я правильно понял вы предлагаете под виндой программно ожидать прерывания порта?
Я такое пытался сделать, надо было свой (вернее оливети) протокол реализовать - наилучшее решение оказалось драйвер написать.
Всё остальное было сделано средствами АПИ. Скорость достаточная. Тем более что передавать надо 32 байта. Так что я бы предложил всё-таки первый вариант.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 07-04-2006 12:01 » 

не, на данном этапе мы обсуждаем программирование для микроконтроллера, до бейсика мы еще не дошли.
кроме Sbuf мы еще ничего не увидели, но это хорошее начало для интересующегося (учащегося).
Вот и хочется увидеть код, хоть какой-то

то IncreMan, цветом сообщение раскрасить смог, будешь код вставлять - заключи его в тэги

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 07-04-2006 12:06 » 

Ок понял
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
IncreMan
Гость
« Ответ #10 : 10-04-2006 09:19 » 

Вот код, сделал, но сейчас другая проблема, отправляю к примеру с компа 7Fh а получаю FAh, соответственно на экране не то что нужно, изза чего может быть такая фигня?
Код: (Text)
Public line1HEX As String
Public line1spHEX As String
Public line1LCD As String
Public line1spLCD As String
Public line1 As String
Public line1len As String
Public line2hex As String
Public line2spHEX As String
Public line2LCD As String
Public line2spLCD As String
Public line2 As String
Public line2len As String
Public DataLCD As String
Public DataLCDlen As String
Public ix As Integer
Public iy As Integer
Public i1 As Integer
Public i2 As Integer

Private Sub Clear_Click()
   
    Text1.Text = ""
    Text2.Text = ""
   
    If MSComm1.PortOpen = False Then
       MSComm1.PortOpen = True
    End If
   
    MSComm1.Output = "                                " '32 space characters
   
End Sub

Private Sub Form_Load()
   
    MSComm1.CommPort = 1                'Set operating for COM1 port'
    MSComm1.Settings = "9600,n,8,1"     'Set operating on 9600bps, no parity, 8-bit, stop bit'
    If MSComm1.PortOpen = True Then
       MSComm1.PortOpen = False
    End If
   
End Sub

Private Sub Send_Click()
   
    DataLCD = line1LCD & line2LCD
   
    If MSComm1.PortOpen = False Then
       MSComm1.PortOpen = True
    End If
   
    DataLCDlen = Len(DataLCD)

    Dim result()
    ReDim result(DataLCDlen)

    For iy = 1 To DataLCDlen
        result(iy - 1) = Mid(DataLCD, iy, 1)
        result(iy - 1) = Asc(result(iy - 1))
        MSComm1.Output = result(iy - 1)
    Next
   
End Sub

Private Sub Text1_Change()

    line1HEX = ""
    line1spHEX = ""
   
    line1LCD = ""
    line1spLCD = ""
   
    line1 = Text1.Text
    line1len = Len(line1)

    If Text1.Text = "" Then
       Text3.Text = ""

    Else
        Dim result()
        ReDim result(line1len)

        For ix = 1 To line1len
            result(ix - 1) = Hex(Asc(Mid(line1, ix, 1)))
            line1HEX = line1HEX & result(ix - 1) & " "
        Next
            If line1len < 16 Then
               For i1 = line1len + 1 To 16
               line1spHEX = line1spHEX & Hex(32) & " "
               line1spLCD = line1spLCD & " "
               Next
               line1HEX = line1HEX & line1spHEX
               line1LCD = line1 & line1spLCD
            Else
               line1LCD = line1
            End If
   
        Text3.Text = line1HEX
       
    End If

End Sub

Private Sub Text2_Change()
   
    line2hex = ""
    line2spHEX = ""
   
    line2LCD = ""
    line2spLCD = ""
   
    line2 = Text2.Text
    line2len = Len(line2)

    If Text2.Text = "" Then
       Text4.Text = ""

    Else
        Dim result()
        ReDim result(line2len)

        For ix = 1 To line2len
            result(ix - 1) = Hex(Asc(Mid(line2, ix, 1)))
            line2hex = line2hex & result(ix - 1) & " "
        Next
            If line2len < 16 Then
               For i2 = line2len + 1 To 16
               line2spHEX = line2spHEX & Hex(32) & " "
               line2spLCD = line2spLCD & " "
               Next
               line2hex = line2hex & line2spHEX
               line2LCD = line2 & line2spLCD
            Else
               line2LCD = line2
            End If
   
        Text4.Text = line2hex

    End If
   
End Sub
 


Код: (Text)

         ORG 0000H  
         LJMP START
 
         ORG 0100H
  START: MOV SP,#30H            ;magdir mahsanit le push ve pop ktovet 30h
         LCALL CLRLCD
         MOV DPTR,#1200H        ;agdarat ktovet le mahrozet rishona
         LCALL NEXT
         LCALL LINE2
         MOV DPTR,#1210H        ;agdarat ktovet le mahrozet shnia
         LCALL NEXT
         MOV TMOD,#00100000B      ; AGDARAT MODE2 LE TIMER1, AGDARAT EFSHUR ALYADEY TR1 BILVAD
         MOV SCON,#01010000B      ; AGDARAT SHIDUR 8-BIT, EFSHUR KABALA DEREH PORT TURI
         MOV TCON,#00000101B      ; AGDARAT DIRBUN KATZE
         MOV IE,#10010000B        ; ADLAKAT MAAREHET PSIKOT, ADLAKAT PSIKAT PORT TURI
         MOV IP,#00010000B        ; AGDARAT ADIFUT LE INTERRUPT0 HITZONI
         MOV TH1,#0FDH            ; AGDARAT ZMAN SHEL TIMER LE 9600BPS
         SETB TR1                 ; AFALAT TIMER1      

    NEW: MOV R2,#32D
         MOV R1,#50H

   WAIT: JNB RI,WAIT              ; MEHAKE AD LE KABALAT NATUN, KAASHER MITKABEL 1 NATUN ITKABEL, PSIKA MUFELET
         MOV A,SBUF
         MOV @R1,A
         INC R1
         CLR RI
         DJNZ R2,WAIT
         LCALL SHOW2
         LJMP NEW
      $: SJMP $

  SHOW2: LCALL CLRLCD
         LCALL NEXT2
         LCALL LINE2
         LCALL NEXT3
         RET
         
  NEXT2: MOV R7,#16D            ;agdarat lulaa le 16 otiot shel shura
         MOV R1,#50H
   LAK2: CLR A
         MOV A,@R1
         LCALL WRTLCD
         INC R1
         DJNZ R7,LAK2
         RET

  NEXT3: MOV R7,#16D            ;agdarat lulaa le 16 otiot shel shura
         MOV R1,#60H
   LAK3: CLR A
         MOV A,@R1
         LCALL WRTLCD
         INC R1
         DJNZ R7,LAK3
         RET

   NEXT: MOV R7,#16D            ;agdarat lulaa le 16 otiot shel shura
    LAK: CLR A
         MOVC A,@A+DPTR
         LCALL WRTLCD
         INC DPTR
         DJNZ R7,LAK
         RET

 CLRLCD: MOV A,#38H             ;agdarat rezolutziya
         LCALL COMMAND
         MOV A,#0CH             ;tadlik masah, tehabe saman
         LCALL COMMAND
         MOV A,#0DH             ;tadlik masah, saman meavhev
         LCALL COMMAND  
         MOV A,#01H             ;timhak masah, saman le athala
         LCALL COMMAND  
         MOV A,#02H             ;saman le athala
         LCALL COMMAND
         RET

COMMAND: PUSH DPL
         PUSH DPH
         CLR P1.0
         MOV DPTR,#2000H        ;agdarat ktovet masah
         MOVX @DPTR,A           ;haavarat milat bakara le masah
         LCALL DELAY
         POP DPH
         POP DPL
         RET

 WRTLCD: PUSH DPH
         PUSH DPL
         SETB P1.0              ;bakaha le ktiva la masah
         MOV DPTR,#2000H        ;ktovet masah
         MOVX @DPTR,A           ;avarat tav me zikaron le masah
         LCALL DELAY
         POP DPL
         POP DPH
         RET

  LINE2: MOV A,#0C0H            ;agdarat saman be shura shnia
         LCALL COMMAND
         RET        
   
  DELAY: MOV R3,#05H
     L5: MOV R4,#0FFH
     DD: DJNZ R4, DD
         DJNZ R3,L5
         RET

 DELAY1: LCALL DELAY
         LCALL DELAY
         LCALL DELAY
         RET

         ORG 1200H
         DB  'THE NEW LEVEL OF'
         ORG 1210H
         DB  '-ADVERTISEMENT!-'

    SOF: SJMP $
         END
 
« Последнее редактирование: 19-12-2007 21:55 от Алексей1153++ » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 10-04-2006 09:47 » 

приведи формулу настройки таймера (TH1)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #12 : 10-04-2006 10:24 » 

кажеться так speedinbaud=[(2^smod)/32]*[Fosc/(12(256-TH1))]

smod = 0 или 1 (0 single rate, 1 double rate)
Fosc = 11.0592Mhz
speedinbaud = 9600

соответственно TH1 = 253 dec или FD hex

Так учили.

А вот например эта прога которая отправляет из МК в комп работает нормально

Код:
         org 0000h
         ljmp start

         org 0100h
start: mov tmod,#20h
         mov scon,#01000000b
         mov th1,#0fdh
         setb tr1
    ho: mov a,#'y'
         mov sbuf,a
         jnb ti,$
         clr ti
         mov a,#'e'
         mov sbuf,a
         jnb ti,$
         clr ti
         mov a,#'s'
         mov sbuf,a
         jnb ti,$
         clr ti
         sjmp ho
         end
« Последнее редактирование: 19-12-2007 21:57 от Алексей1153++ » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 10-04-2006 11:47 » 

должно работать 
внимательно посмотри все специальные регистры, може и я чего-то не досмотрел Жаль

Код:
           MOV     SCON,#052H     ;настройка порта
           ORL     TMOD,#020H
           MOV     TH1,#0FDH
           ORL     PCON,#080H
           SETB    TR1
« Последнее редактирование: 10-04-2006 11:53 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #14 : 10-04-2006 22:09 » 

Пробовал, не получаеться. SCON,#052H - это настройка работы transmit to pc
Что-то тут не правильно. Я уверен что какая-то мелочь, а вот найти её никак не могу!!!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 11-04-2006 06:21 » 

Тут без "железяки" не обойтись. Может проблема в кабеле, в контактах.
Чудес на свете не бывает.
Ок.
переписываем поограммку так чтоб она принимала один байт и выводила его на LCD
с гипертеримнала посылаешь по одному символу и смотришь что получилось.
потому что по
Цитата
отправляю к примеру с компа 7Fh а получаю FAh
судить сложно.


Процессор 12 мГцовый?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #16 : 11-04-2006 07:07 » 

Частота кристалла 11.0592 Мгц
Объясни как отправлять через терминал, я знаю только как принимать.
У меня вин 2000.
Спасибо!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 11-04-2006 07:13 » new

просто "тыкаешь" кнопки - и все, каждый тык - один символ
если хочешь увидеть что отправляешь - в настройках включи "эхо"
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #18 : 11-04-2006 07:14 » 


Может ли быть такое,что МК получил прерывание, начинает его выполнять и ещё до момента как RI сбрасывается комп отправляет второй символ, и получается, что МК не закончив одно прерывание начинает второе, из-за этого портится значение.
Если это так, то возможно какое нужно задать время ожидания между отправляемыми знаками?
(я имею ввиду в программе на ВБ)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 11-04-2006 07:32 » 

я не увидел прерываний.
Данные принимаются побитно.  после прихода определенного числа битов (что определено настройками) взводится флаг RI, который ты и анализируешь
Ты заполняшь буфер, по указателю в R1, пока ты его (буфер) не заполнишь - ничего на дисплей выдано не будет.
Ты работаешь по первому варианту, который я описывал.
можно попробывать следующее
принять символ и отправить
используя гипертерминал
Код:
        org 0000h
         ljmp start

         org 0100h
start: mov tmod,#20h
         mov scon,#01000000b
         mov th1,#0fdh
         setb tr1
ho:
         jnb ri,$
         mov a,sbuf
         clr ri
         mov sbuf,a
         jnb ti,$
         clr  ti
         sjmp ho
         end
[code]
[/code]
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #20 : 11-04-2006 07:49 » 

Попробую, спасибо,
но смысл в том , что пока я не получу 32 знака на экран ничего не выводится!
Это можно увидеть в коде программы.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 11-04-2006 09:04 » 

здесь код приема байта и выдчи на LCD
Код:
   
WAIT: JNB RI,WAIT             
         MOV A,SBUF
         LCALL WRTLCD
         LJMP WAIT
   
« Последнее редактирование: 11-04-2006 09:07 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
IncreMan
Гость
« Ответ #22 : 11-04-2006 09:18 » 

Спасибо, попробую!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines