|
Плизззз VB\VC++ и ASM51 (нужна программа из 5 строк) |
|
|
|
Apr 4 2006, 14:12
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Люди добрые, спасите...
Надо написать малюсенькую программу но вот как это реализовать не знаю.
Вот что нужно: 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.
Буду признателен любой помощи!!!! Плиззз, очень надо!!!!
Заранее благодарен!
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 4 2006, 15:32
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
VisualC++ для comporta!! Проверенно - работает!
|
|
|
|
|
Apr 4 2006, 15:38
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Спасибо, сейчас посмотрю, попытаюсь что-то понять
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 4 2006, 15:51
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Посмотрел, но как адаптировать под то что мне надо не имею представления, можешь подсказать, или помочь?
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 4 2006, 16:18
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Ок, понял то, что ничего не понял, потому как в с++ не соображаю, учил С и то не долго и не много, ты мог бы сделать, если не трудно?
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 4 2006, 16:46
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
А там C++помоему и нету - простой С и API функции. Тебе тут и надо-то диалоговый проект создать, button и editcontrol положить, ну а потом eventи обработать и всё. Вот тебе ссылка, там есть и VisualC++, думаю сам быстро разберёшся!
Сообщение отредактировал andron86 - Apr 4 2006, 16:47
|
|
|
|
|
Apr 4 2006, 17:20
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Я только взглянул мне в глазах потемнело. У меня есть приблизительный код на 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
Сообщение отредактировал IncreMan - Apr 4 2006, 17:22
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 6 2006, 16:12
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Скорее это надо для красоты  Но это часть проблемы, я не могу посылать в порт сразу весь string, а только chars по отдельности, потому как микроконтроллер может принимать через серийный порт только одно hex значение.
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 7 2006, 08:30
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
Цитата(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, или я что-то не понял? Прикрепил весь проект.
|
|
|
|
|
Apr 10 2006, 09:06
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Огромное, спасибо, попробую что-то с этим сделать, а это действительно курсовая, и энная сумма приемлимо, но уже завтра здавать, вроде всё сковырял, единственная проблема осталась в том, что отправляя например символ "A" приходит "U", или вообще закарючка, я проверил, получаеться что отправляя к примеру 7Ah приходит FAh. Пока не могу понять в чём дело, потому как если я из МК отправляю в компьютер, то всё принимаеться как надо, а наоборот не хочет.
В любом случае, как только всё закончу, выложу, готовый вариант, чтоб другим на пользу было, если вдруг пригодиться!
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 10 2006, 11:38
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Не совсем последний бит, вместо 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
Сообщение отредактировал IncreMan - Apr 10 2006, 11:41
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 11 2006, 07:13
|

Группа: Новичок
Сообщений: 9
Регистрация: 4-04-06
Из: Израиль
Пользователь №: 15 789

|
Ты прав, может ли быть такое,что МК получил прерывание, начинает его выполнять и ещё до момента как RI сбрасывается комп отправляет второй символ, и получается, что МК не закончив одно прерывание начинает второе, из-за этого портится значение. Если это так, то возможно какое нужно задать время ожидания между отправляемыми знаками? (я имею ввиду в программе на ВБ)
--------------------
..:: Deeds Talk Loud Than Words ::..
|
|
|
|
|
Apr 11 2006, 12:06
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
Кусок кода из рабочей программы: Код ;=================================================================== ; передача символа по протоколу 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 а вообще, зацикли посылку байта и посмотри осциллографом, и сразу будет понятно, где теряются биты
|
|
|
|
|
Apr 11 2006, 23:19
|

Частый гость
 
Группа: Свой
Сообщений: 117
Регистрация: 6-04-05
Пользователь №: 3 928

|
Цитата(giran @ Apr 11 2006, 16:06)  Кусок кода из рабочей программы ... И какое это имеет отношение к ASM51?
|
|
|
|
|
Apr 12 2006, 02:10
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
Цитата(miga @ Apr 12 2006, 05:19)  И какое это имеет отношение к ASM51? Извиняюсь, попутал слегка.
|
|
|
|
|
Apr 14 2006, 06:18
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 13-01-06
Из: Томск
Пользователь №: 13 123

|
Вообщем правильно тебе говорят забей на всё пиши в Гипере или, что намного намного лучше из програмки Теликс(если что у меня есть, где то 1 метр весит). А вообше у мен ztcnm своя прога которая посылае данные через ком порт. Тут самое главное организовать свой протокол передачи, короче некоторые вспомогательные символы которые будут говорить контроллеру о том что сейчас будут идти символы и после говорить что всё - конец символам. Для этого я испльзовал символы которые в природе не используются - например символ с кодом 01. Вообщем если тебе нужно передать четыре цыфры: 1, 2, 3, 4, на ком порт ты посылаешь следующую последовательность : 01 31 32 33 34 01. (31 - код "1", и т.д.)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|