Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Rsin и Rsout (Непонятки.)
Rsin и Rsout
xxxmonejall Дата: Сб, 04.02.2012, 17:19  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 04.02.2012
anatol Дата: Сб, 04.02.2012, 17:48  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Device = 16F84A
А USART в этом проце есть?
xxxmonejall Дата: Сб, 04.02.2012, 18:26  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Жаль но нет:(
anatol Дата: Сб, 04.02.2012, 22:33  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Так я не понял - вопросы остались или тема закрыта? angry
xxxmonejall Дата: Сб, 04.02.2012, 22:38  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Остались, все та-же проблема:(
anatol Дата: Вс, 05.02.2012, 00:46  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Команды RSOut и RSIn - не для аппаратного USART. Это программный.
xxxmonejall, думаю, проблема в формате передаваемых и принимаемых значений. Передача и прием по USART производится путем передачи строковых переменных. Если, например, ты отправил цифру 56, то приемник поймает символ "56".
xxxmonejall Дата: Ср, 15.02.2012, 22:38  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Прикрепления: 3740429.zip (36.2 Kb)
ivan_fd Дата: Ср, 15.02.2012, 23:38  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Так возможно, что с проги Вы посылаете символ 2, а в контроллере Вы сравниваете с цифрой?
xxxmonejall Дата: Ср, 15.02.2012, 23:53  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Глупый вопрос наверное: А какая собственно разница? Ели это так, то как перевести символ в цифру или наоборот???
ivan_fd Дата: Чт, 16.02.2012, 00:27  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Как это какая разница? Если перевести символ в число, то 2 будет равно 50. Вы посмотрите терминалом, что Вы передаете.
ЯНДЕКС Дата: 16.02.2012
xxxmonejall Дата: Чт, 16.02.2012, 00:37  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

В терминале тоже 2.
ADMIN Дата: Чт, 16.02.2012, 04:21  |                                                                                                                Сообщение # 13
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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

Прикрепления: Convertor.exe (22.0 Kb)
xxxmonejall Дата: Вс, 04.03.2012, 17:11  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Уважаемый ADMIN, сделал все так как вы сказали в посте 13.
Но ничего не получилось, настроил все регистры как вы выше сказали, но когда я посылаю в усарт что с пк, прерывание не происходит. В чем может быть проблема????
Прилагаю саму программу:
Прикрепления: PIC16F877A_USAR.bas (3.2 Kb)
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Rsin и Rsout (Непонятки.)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: