Rsin и Rsout
|
|
xxxmonejall |
Дата: Сб, 04.02.2012, 17:19 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Доброго времени суток столкнулся с непонятным явлением, не могу понять в чем дело? Хотел попробовать как работают команды Rsin и Rsout. Сошкряпал маленькую программку. И столкнулся с проблемой: Команда Rsin принимает с виртуального порта 1 записывает ее и командой Rsout, все как-бы работает но вот сравнение переменной в которую была записана 1 с той же 1 не происходит. Что это может быть такое? Код прилагаю: Device = 16F84A Xtal = 4
'----------------------------Настройка-------------------------------------- Declare Rsout_Mode 0 Declare Rsout_Pin PORTB.0 Declare Serial_Baud 9600
Declare Rsin_Pin PORTB.1 Declare Rsin_Mode 0 Declare Rsin_Timeout 2000
Dim Waiting As Byte Waiting = 0
'---------------------------Программа---------------------------------------- main0: RSIn Waiting RSOut Waiting If Waiting = 1 Then Waiting = 0: RSOut "DATA OK" GoTo main0
|
|
|
|
anatol |
Дата: Сб, 04.02.2012, 17:48 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Device = 16F84A А USART в этом проце есть?
|
|
|
|
xxxmonejall |
Дата: Сб, 04.02.2012, 18:26 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Жаль но нет:(
|
|
|
|
anatol |
Дата: Сб, 04.02.2012, 22:33 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Так я не понял - вопросы остались или тема закрыта?
|
|
|
|
xxxmonejall |
Дата: Сб, 04.02.2012, 22:38 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Остались, все та-же проблема:(
|
|
|
|
anatol |
Дата: Вс, 05.02.2012, 00:46 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Вот здесь были http://terrarus.ucoz.ru/proton_plus_ide/index.html в частности http://terrarus.ucoz.ru/proton_plus_ide/proton/comands/rsin/rsin.html http://terrarus.ucoz.ru/proton_....ut.html
Только допустимо ли это все для контроллеров с ограниченной памятью и не имеющего аппаратного USART на борту - я не знаю.. Все время под рукой более "толковые" процы.
Сообщение отредактировал
anatol - Вс, 05.02.2012, 00:50
|
|
|
|
ADMIN |
Дата: Вс, 05.02.2012, 06:42 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Команды RSOut и RSIn - не для аппаратного USART. Это программный. xxxmonejall, думаю, проблема в формате передаваемых и принимаемых значений. Передача и прием по USART производится путем передачи строковых переменных. Если, например, ты отправил цифру 56, то приемник поймает символ "56".
|
|
|
|
xxxmonejall |
Дата: Ср, 15.02.2012, 22:38 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
И снова Здрасте:) У меня уже голова болит от всех этих контроллеров:)) Понял что USART это круто, взял PIC16f877A и понеслась, сошкряпал программку, ее я прилагаю в архиве, также там весь проект и прога написанная на VISUAL BASIC 2010(Она до конца не готова) Пока ее функция просто открыть порт и послать в него 2. Этого хватает что-бы посмотреть как работает контролер. Так вот собственно в чем проблема, часть программы:
Команда HSerIn принимает 2, заносит ее в переменную UPRAVLIENIE, выводит ее даже на ЛСД но потом сравнивая эту переменную с 2 ничего не происходит, программа начинает снова с начала, так как будто в переменой UPRAVLIENIE ничего нет. В чем может быть проблема, где ошибка???? Чтобы послать 2 с программы нужно открыть порт и нажать пуск.
Start: LED_CHEK = 1 DelayMS 500 LED_CHEK = 0 DelayMS 500
HSerIn 200, Start, [UPRAVLIENIE] Print At 1, 1, UPRAVLIENIE DelayMS 1000 Cls If UPRAVLIENIE = 1 Then GoTo main1 If UPRAVLIENIE = 2 Then GoTo main2 If UPRAVLIENIE = 3 Then GoTo main3 If UPRAVLIENIE = 4 Then GoTo main4 If UPRAVLIENIE = 5 Then GoTo main5
GoTo Start
|
|
|
|
ivan_fd |
Дата: Ср, 15.02.2012, 23:38 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Так возможно, что с проги Вы посылаете символ 2, а в контроллере Вы сравниваете с цифрой?
|
|
|
|
xxxmonejall |
Дата: Ср, 15.02.2012, 23:53 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Глупый вопрос наверное: А какая собственно разница? Ели это так, то как перевести символ в цифру или наоборот???
|
|
|
|
ivan_fd |
Дата: Чт, 16.02.2012, 00:27 | Сообщение # 11 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Как это какая разница? Если перевести символ в число, то 2 будет равно 50. Вы посмотрите терминалом, что Вы передаете.
|
|
|
|
xxxmonejall |
Дата: Чт, 16.02.2012, 00:37 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
В терминале тоже 2.
|
|
|
|
ADMIN |
Дата: Чт, 16.02.2012, 04:21 | Сообщение # 13 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Rxd микроконтроллера должен быть подключен к Txd COM-порта, а Txd микроконтроллера должен быть подключен к Rxd. И все будет в порядке. Кроме того, добавлю некоторое замечание: за то время, которое тратится на паузы после отображения информации, а также мигания светодиодом, с компьютера может прийти куча другой информации, которая во время пауз может быть потеряна. Поэтому лучше обрабатывать прием по USART в прерываниях. Нужно установить 3 бита, разрешающие прерывания - GIE, PEIE, и RCIE, а в обработчике сбрасывать флаг RCIF, считав принятое значение из RCREG. И не нужно никаких HSerIn.
Еще я бы переписал эту программу так (применительно к оптимизации): не эта конструкция
Code
Start: LED_CHEK = 1 DelayMS 500 LED_CHEK = 0 DelayMS 500
HSerIn 200, Start, [UPRAVLIENIE] Print At 1, 1, UPRAVLIENIE DelayMS 1000 Cls If UPRAVLIENIE = 1 Then GoTo main1 If UPRAVLIENIE = 2 Then GoTo main2 If UPRAVLIENIE = 3 Then GoTo main3 If UPRAVLIENIE = 4 Then GoTo main4 If UPRAVLIENIE = 5 Then GoTo main5
GoTo Start
а просто:
Code
Start: LED_CHEK = 1 DelayMS 500 LED_CHEK = 0 DelayMS 500
HSerIn 200, Start, [UPRAVLIENIE] Print At 1, 1, UPRAVLIENIE DelayMS 1000 Cls Print At 1, 1, "Main", UPRAVLIENIE
GoTo Start
И еще, если уж так надо сравнивать значения с цифрой, нужно из принятого значения отнимать 48 и все, получится то, что надо
|
|
|
|
xxxmonejall |
Дата: Пн, 20.02.2012, 19:39 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Да действительно если отнять 48 все работает. Пробовал сравнивать сразу с значениями Этих символов, также работает. Вот сошкряпал программку маленькую конвертер символов, что-бы каждый раз в шпаргалку не подглядывать:) Выкладываю тут же может и кому-то пригодится:)
Но также есть одна проблема, когда с пк считываю значения с порта командой ReadByte байт считывается без каракуль, а вот когда командой ReadExisting, или ReadLine то тогда одни каракули, в чем может быть проблема??? А подключение каналов связи (RX и TX) у меня правильное, просто ком порт в протеусе это связка двух виртуальных портов, а они между собой подключены правильно, программа подключается к порту номер 2.Добавлено (20.02.2012, 19:39) --------------------------------------------- Все разобрался просто перед переменой с которой посылаем информацию, поставил DEC и все заработало:) main1: Print At 1, 1, "Тестер" Выводим в первую строчку ЛСД ( Тестер ) Print At 2, 1, "Форснок" Выводим в вторую строчку ЛСД ( Форсунок ) Cls Очищаем ЛСД For I = 0 To 50000 Цикл kal: Метка повтора команды HSerIn 200, kal, [Wait ("DATAOK")] если DATAOK не пришло HSerIn 200, kal, [Wait ("DATAOK")] Ждем слово DATAOK для начала передачи FORS1 = ADIn 0 Опрос первого канала аца и запись этого значения в переменную FORS1 Print At 1, 1, Dec FORS1 Выводим на ЛСД переменную FORS1 HSerOut [Dec FORS1] Посылаем в USART значение переменой FORS1 в десятичной форме, вот здесь у меня была и вся загвоздка:) Next Метка возвращения цикла GoTo Start Вернуться к метке START
|
|
|
|
xxxmonejall |
Дата: Вс, 04.03.2012, 17:11 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Уважаемый ADMIN, сделал все так как вы сказали в посте 13. Но ничего не получилось, настроил все регистры как вы выше сказали, но когда я посылаю в усарт что с пк, прерывание не происходит. В чем может быть проблема???? Прилагаю саму программу:
|
|
|
|