Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Плизззз VB\VC++ и ASM51 (нужна программа из 5 строк)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
IncreMan
Люди добрые, спасите...

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

Вот что нужно:
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.

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


Заранее благодарен!
andron86
VisualC++ для comporta!!
Проверенно - работает!
IncreMan
Спасибо, сейчас посмотрю, попытаюсь что-то понять
IncreMan
Посмотрел, но как адаптировать под то что мне надо не имею представления, можешь подсказать, или помочь?
andron86
В проект прикрепи С и h файлы из того что скачал. Ну и ипользуй функции ComOpen и ComWrite.
IncreMan
Ок, понял то, что ничего не понял, потому как в с++ не соображаю, учил С и то не долго и не много, ты мог бы сделать, если не трудно?
andron86
А там C++помоему и нету - простой С и API функции.
Тебе тут и надо-то диалоговый проект создать, button и editcontrol положить, ну а потом eventи обработать и всё. Вот тебе ссылка, там есть и VisualC++, думаю сам быстро разберёшся!
IncreMan
Я только взглянул мне в глазах потемнело.

У меня есть приблизительный код на VB который отправляет эксадецимальное значение, а мне надо не значение а 2 строки по 16 символов, а вот какой функцией перевернуть все 16 символов в ascii код и отправить их по одному не знаю.

Мне больше половины всего кода не надо, надо только 2 поля ввода ограниченных до 16 символов, а при нажатии на send они переводяться в ascii код (потом видимо в hex) и отправляються на com1port!

Вот код который у меня есть:
Код
Public dat As String
Public tim As String
Public CurrentTime As String
Public x, z As Integer

Private Sub Command3_Click()

End Sub

Private Sub Form_Load()
    Timer2.Enabled = True       'Show clock and date'
    Combo1.AddItem "Summer"
    Combo1.AddItem "Winter"
    Combo1.AddItem "Manual"
    Combo1.AddItem "Activate"
     ' MSComm1.CommPort = 1
     ' MSComm1.Settings = "9600,n,8,1"
   If MSComm1.PortOpen = True Then
      MSComm1.PortOpen = False
   End If
End Sub
Private Sub Command1_Click()                 'Manual'
  dat = Text1.Text
  tim = Text2.Text
  Label2.Caption = dat & " " & tim
  Command1.Enabled = False
  Command2.Enabled = True
End Sub
Private Sub Command2_Click()                     'Start'
   x = 0
   z = 0
   Timer1.Enabled = True
   Command2.Enabled = False
   Combo1.Enabled = False
End Sub
Private Sub Combo1_Click()                          'Choosing the Mode'
  CurrentTime = Format(Time, "hh:mm")
  Select Case Combo1.ListIndex
     Case 0
        tim = "20:09"
        Label2.Caption = "Every day at: " & tim
        Command2.Enabled = True
     Case 1
        tim = "19:58"
        Label2.Caption = "Every day at: 19:00"
        Command2.Enabled = True
     Case 2
       Label2.Caption = " "
       Command1.Enabled = True
      ' Command2.Enabled = True
     Case 3
       tim = CurrentTime
       Command2.Enabled = True
    End Select
End Sub

Private Sub Label1_Click()

End Sub

Private Sub Label2_Click()

End Sub

Private Sub MSComm1_OnComm()

End Sub

Private Sub Text1_Change()

End Sub

Private Sub Text2_Change()

End Sub

Private Sub Text3_Change()

End Sub

Private Sub Text4_Change()

End Sub

Private Sub Timer1_Timer()              'Main Timer'
    CurrentTime = Format(Time, "hh:mm")
    x = x + 1
   ' Text1.Text = x
    Text2.Text = tim
    Text3.Text = CurrentTime
    
    If CurrentTime = tim Then
      If z = 0 Then                            'Checks if sent '
        If MSComm1.PortOpen = False Then
           MSComm1.PortOpen = True
        End If
        MSComm1.Output = Hex(255)
        Text1.Text = Hex(255)
        z = 1
        x = 0
      End If
      Call cw
    End If
  
End Sub
Public Function cw()
  Label2.Caption = "Evrithing vorks "
  Text4.Text = x
  
  If x = 5 Then                    ' Time period in sec - x'
   If MSComm1.PortOpen = False Then
      MSComm1.PortOpen = True
   End If
   MSComm1.Output = Hex(170)
   Text1.Text = Hex(170)
   Label2.Caption = "  "
   MSComm1.PortOpen = False
   Combo1.Enabled = True
   Timer1.Enabled = False
  End If
End Function
Private Sub Timer2_Timer()           'Secondary timer for clock and date '
Label1.Caption = Date & "  " & Time
End Sub
bialix
Позвольте встрять: если нужна действительно программа из 5-ти строк, то смотреть надо не на С++, а на Python. Если с Visual Basic знаком, то Python освоить будет просто.

Процедура отправки строки в СОМ-порт при помощи Питона:

ser = serial.Serial(port="COM1", baudrate=9600)
ser.write('My string')

Я бы посоветовал не заморачиваться с диалоговыми окнами, полями ввода двух строк, а прямо из интерпретатора засылать строки. Тебе ж это все для отладки надо, не так ли?
IncreMan
Скорее это надо для красоты wink.gif
Но это часть проблемы, я не могу посылать в порт сразу весь string, а только chars по отдельности, потому как микроконтроллер может принимать через серийный порт только одно hex значение.
bialix
Говорят, что человека нужно оценивать не по ответам, а по вопросам.

Ваши вопросы показывают насколько всё, что вы спрашиваете, далеко от вас. Если нужно по-быстрому сделать и забыть (типа курсового), то вам стоило предложить за подобную консультацию энную сумму.

Если же вы хотите этим заниматься дальше, то стоит начинать с азов.
andron86
Супер bialix!
Я тоже так подумал!
Muxamor
А зачем замарчиваться с С++! Если вам нужно это только для отладки то тогда стандартный виндовский Гиппер терминал вам в помощь плюйте из него все что хотите в МК . Ну а в МК делайте с ней все что хотите!
ксочик кода для приема в МК могу скинуть есл инужно!
giran
Цитата(IncreMan @ Apr 4 2006, 19:12) *
Надо написать малюсенькую программу но вот как это реализовать не знаю.


ну если малюсенькую, то делал что-то подобное года 3 назад:
Код
Public Num As String

Private Sub Command1_Click()
    Pr = "byt"
    Num = InputBox$(Pr, , Num)
        
      
      
End Sub

Private Sub Command2_Click()
      MSComm1.CommPort = 1
      MSComm1.Settings = "9600,N,8,1"
      MSComm1.PortOpen = True
      Timer1.Enabled = True
End Sub

Private Sub Command3_Click()
Timer1.Enabled = False
MSComm1.PortOpen = False

End Sub

Private Sub Timer1_Timer()
Label1.Caption = Num
  MSComm1.Output = Num
End Sub

Вводишь в инбокс символы, которые будут выведены на СОМ порт (ASCII код переменной NUM) с периодом заданным в Timer1, или я что-то не понял? Прикрепил весь проект.
IncreMan
Огромное, спасибо, попробую что-то с этим сделать,
а это действительно курсовая, и энная сумма приемлимо, но уже завтра здавать, вроде всё сковырял, единственная проблема осталась в том, что отправляя например символ "A" приходит "U", или вообще закарючка, я проверил, получаеться что отправляя к примеру 7Ah приходит FAh. Пока не могу понять в чём дело, потому как если я из МК отправляю в компьютер, то всё принимаеться как надо, а наоборот не хочет.

В любом случае, как только всё закончу, выложу, готовый вариант, чтоб другим на пользу было, если вдруг пригодиться!
vet
Ну, если портится последний бит, логичнее всего предположить несовпадение скоростей приёма и передачи. Отрегулируйте baud-rate микроконтроллерного UART.
IncreMan
Не совсем последний бит, вместо 7Ah получил FAh, а вместо FFh получил 75h!

Вот код, сделал, но сейчас другая проблема, отправляю к примеру с компа 7Fh а получаю FAh, соответственно на экране не то что нужно, изза чего может быть такая фигня?
Код
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



Код
         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


Формула настройки таймера (TH1)

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
Muxamor
Скорей всего скорости другой причины нету !
У меня такойже глюк был ! С приходом символа запускадлсь еще одна подпрограмма ! За счет этого МК не успевал! выризал подпрограмму и все стало нармально!
IncreMan
Ты прав,
может ли быть такое,что МК получил прерывание, начинает его выполнять и ещё до момента как RI сбрасывается комп отправляет второй символ, и получается, что МК не закончив одно прерывание начинает второе, из-за этого портится значение.
Если это так, то возможно какое нужно задать время ожидания между отправляемыми знаками?
(я имею ввиду в программе на ВБ)
giran
Кусок кода из рабочей программы:
Код
;===================================================================
; передача символа по протоколу RS232, скорость 9600, data = 8, nonparity,
; 1 stopbit, 4 Мгц, символ в R1
;===================================================================
COMM
    MOVWF    R1
     movlw .8
     movwf R0
     bcf  PORTA,TxD                          ; стартовый бит
     call delay_95mks
     call delay_8mks
    
m_PutChar_RS232_01              ; данные
     rrf R1                    ;в R1-байт на передачу
     btfss STATUS,C
     bcf  PORTA,TxD
     btfsc STATUS,C
     bsf  PORTA,TxD                      
     call delay_95mks  
     decfsz R0,f
     goto m_PutChar_RS232_01

     bsf  PORTA,TxD                           ; стоповый бит
     call delay_95mks
     call delay_8mks
;    rrf Char_RS232, f
     return

delay_95mks
     movlw .22
     movwf  TEMP
     nop
     decfsz TEMP, f
     goto $-2
     nop
     nop
     return

delay_8mks
     nop
     nop
     nop
     nop
     return

а вообще, зацикли посылку байта и посмотри осциллографом, и сразу будет понятно, где теряются биты
miga
Цитата(giran @ Apr 11 2006, 16:06) *
Кусок кода из рабочей программы ...


И какое это имеет отношение к ASM51?
giran
Цитата(miga @ Apr 12 2006, 05:19) *
И какое это имеет отношение к ASM51?

Извиняюсь, попутал слегка.
Viktor_
Вообщем правильно тебе говорят забей на всё пиши в Гипере или, что намного намного лучше из програмки Теликс(если что у меня есть, где то 1 метр весит). А вообше у мен ztcnm своя прога которая посылае данные через ком порт. Тут самое главное организовать свой протокол передачи, короче некоторые вспомогательные символы которые будут говорить контроллеру о том что сейчас будут идти символы и после говорить что всё - конец символам. Для этого я испльзовал символы которые в природе не используются - например символ с кодом 01. Вообщем если тебе нужно передать четыре цыфры: 1, 2, 3, 4, на ком порт ты посылаешь следующую последовательность : 01 31 32 33 34 01. (31 - код "1", и т.д.)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.