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
|
|
« Ответ #1 : 05-04-2006 06:57 » |
|
Ты представление о среде прогрммирования имешь? (VisualBasic или VisualC++) Хелпом пользоваться умеешь? Поиском пользоваться умеешь?
Задача проста, как 2 пальца об асфальт Что ты предпринял?
Как разделить строки? возможны несколько вариантов 1 Число символов в строке LCD дисплея ограничено Заполняешь каждую строку в конце пустыми символами 2 Конец строки ограничиваешь символом "конец строки" (0xD или 0xA). Конец сообщения 0x0) 3 Передаешь количество символов в каждой строке, а потом содержимое 4 5
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #2 : 05-04-2006 07:02 » |
|
Что касается 51 опять же несколько вариантов Самое главное - настраиваешь UART см мануал по контроллеру - там это описано по слогам!
Выбираешь способ получения Обработка по прерыванию Обработка в цикле по готовности порта
И все!
Делов на NNN минут (я эти два поста дольше писал)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
IncreMan
Гость
|
|
« Ответ #3 : 06-04-2006 16:09 » |
|
Еслибы, микроконтроллер принимает то только одно значение через регистр sbuf
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 06-04-2006 17:24 » |
|
IncreMan, это не проблема. Последовательный порт м/к может генерировать прерывания по приему байта и по окончанию передачи. Напиши обработчик прерывания. Данные можно буферизировать (напр. организовать в RAM кольцевой буфер). У меня раньше были такие наработки, но к сожалению код не сохранился.
Согласись, что писать за тебя мы не будем, но на помощь расчитывать можешь.
Начни придумывать как сделать и спрашивай детали!
У тебя м/к занят только этой задачей?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #5 : 07-04-2006 06:39 » |
|
О, это уже ближе к телу Я же описал, два варианта работы с портом 1. В цикле - по ожиданию готовности порта 2. По прерыванию
Рассмотрим первый вариант ожидаем готовности читаем из буфера передаем в подпрограмму обработки LCD вернулись назад
Второй вариант Для буфера выделяем память, и ячейку для указателя(ей) Программа крутится в основном цикле В основном цикле проверяется готовность БУФЕРА
По приходу прерывания, принятый байт кладятся в буфер по адресу в указателе, сдвигается указатель (инкременируется или декрементируется). Проверяется на переполнение, взводится или не взводится флаг готовности буфера.
Все! ждем твоего кода
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #6 : 07-04-2006 08:17 » |
|
Второй вариант гибче и лучше с точки зрения энергопотребления, т.к. основной цикл можно останавливать на ожидание прерываний. Если основной цикл ничем тяжелым не занят, то достаточно одного-двух байт для буфера приема. С буфером передачи сложнее - требуется реализация блокировки при переполнении буфера.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #8 : 07-04-2006 12:01 » |
|
не, на данном этапе мы обсуждаем программирование для микроконтроллера, до бейсика мы еще не дошли. кроме Sbuf мы еще ничего не увидели, но это хорошее начало для интересующегося (учащегося). Вот и хочется увидеть код, хоть какой-то
то IncreMan, цветом сообщение раскрасить смог, будешь код вставлять - заключи его в тэги
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
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, соответственно на экране не то что нужно, изза чего может быть такая фигня? 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
|
|
« Последнее редактирование: 19-12-2007 21:55 от Алексей1153++ »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #15 : 11-04-2006 06:21 » |
|
Тут без "железяки" не обойтись. Может проблема в кабеле, в контактах. Чудес на свете не бывает. Ок. переписываем поограммку так чтоб она принимала один байт и выводила его на LCD с гипертеримнала посылаешь по одному символу и смотришь что получилось. потому что по отправляю к примеру с компа 7Fh а получаю FAh судить сложно. Процессор 12 мГцовый?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
IncreMan
Гость
|
|
« Ответ #16 : 11-04-2006 07:07 » |
|
Частота кристалла 11.0592 Мгц Объясни как отправлять через терминал, я знаю только как принимать. У меня вин 2000. Спасибо!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 11-04-2006 07:13 » |
|
просто "тыкаешь" кнопки - и все, каждый тык - один символ если хочешь увидеть что отправляешь - в настройках включи "эхо"
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
IncreMan
Гость
|
|
« Ответ #18 : 11-04-2006 07:14 » |
|
Может ли быть такое,что МК получил прерывание, начинает его выполнять и ещё до момента как RI сбрасывается комп отправляет второй символ, и получается, что МК не закончив одно прерывание начинает второе, из-за этого портится значение. Если это так, то возможно какое нужно задать время ожидания между отправляемыми знаками? (я имею ввиду в программе на ВБ)
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #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
|
|
« Ответ #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 » |
|
Спасибо, попробую!
|
|
|
Записан
|
|
|
|
|