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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
RSOut str area\n неработает
msv_gen Дата: Ср, 29.04.2015, 18:23  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 06.09.2013

Статус: Offline

RSOut str area\n, где n определяет количество выводимых байт - это согласно описания,
при отладке в PROTEUS получается, что вывод заканчивается первым НУЛЕВЫМ байтом
Выводим по RS485:
        RSOut syncro, 10, STRINGT2[0],STRINGT2[1],STRINGT2[2],STRINGT2[3],STRINGT2[4],STRINGT2[5], STRINGT2[6],STRINGT2[7]
здесь  получаем 10 байт
        'RSOut syncro, 10
        'RSOut str STRINGT2\8
а здесь только 2!!!
а проблема - как всегда не хватает памяти  - разница между двумя вариантами 31 байт
compiler ver 3.5.6.5
cpu16F887
в какую сторону рыть?
ЯНДЕКС Дата: 29.04.2015
MiXaS Дата: Чт, 30.04.2015, 09:43  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата msv_gen ()
вывод заканчивается первым НУЛЕВЫМ байтом
А с чего вы это взяли? Может у Вас последний байт = 0.
А где код? 
Где настройки этой команды? Какая частота генератора?
Напишите простой отдельный код, который бы только слал в порт те же данные и посмотрите. если не получится, прикрепите свой маленький код, а мы посмотрим
msv_gen Дата: Чт, 30.04.2015, 17:18  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 06.09.2013

Статус: Offline

Вообще то  там все как бы есть
Код
Device = 16F887
Declare Xtal = 20

'USART
'--------------------------Настройки команды Rsout-------------------------  
Declare Rsout_Pin PORTC.6  
Declare Rsout_Mode INVERTED  
Declare Serial_Baud 1200
DECLARE RSOUT_PACE 10  
'--------------------------Настройки команды Rsin--------------------------  
Declare Rsin_Pin PORTC.7   ' Подключить к PORTB.0 выход терминала
Declare Rsin_Mode 1        '  инвертировать принятые данные
Declare Rsin_Timeout 500   ' Ожидать приемка данных 0,5 сек
Dim STRINGT2[8] As Byte      'Stringt2 в 8 символов T2 (dh11) температура для передачи на модули
Dim syncro As Byte                    'Переменная для синхронизации ССОИ и МИ

syncro = $F2

STRINGT2[0]=0 :STRINGT2[1]=0 :STRINGT2[2]=0 :STRINGT2[3]=0 :STRINGT2[4]=0 :STRINGT2[5]=0 :STRINGT2[6]=0 : STRINGT2[7]=0  
         RSOut syncro, 10, STRINGT2[0],STRINGT2[1],STRINGT2[2],STRINGT2[3],STRINGT2[4],STRINGT2[5], STRINGT2[6],STRINGT2[7]  
  'здесь  получаем 10 байт  
         RSOut syncro, 10  
         RSOut str STRINGT2\8
проверка простая 1 вариант выдаст  на терминал 10 байт
2 вариант  ТОЛЬКО 2 т.е. "F2 0A"
ДАННЫЕ ПЕРЕДАЮТСЯ НА МОДУЛЬ и ТАМ должны приняться все 10 байт (точнее 12 там еще добавочка есть...)
если я передаю время 00-01-00 - то модуль не получит не одного байта! классные часы да с 24-59-59 до 10-00 время показывать не будут
MiXaS Дата: Сб, 02.05.2015, 12:06  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

У меня все работает прекрасно. Я Специально для ВАС сделал примерчик. Смотрите в архиве. Я кажется знаю в чем у вас проблема. Вам нужно хорошенечко изучить модификаторы. Также рекомендую разобраться в каком формате вы собираетесь передавать свои данные. В моем примере передача данных идет в формате ASCII кода. Также данные можно передавать в десятичном и других форматах. 
Если вам нужно передавать и строковые переменные и значения цифр полученные в результате расчетов, то можно просто прибавить 48 к переменной, которую нужно передать и отправить в десятичном формате, например. У Вас не получалось из-за того, что значение переменной = 0, а передавали вы в формате ascii, если открыть таблицу ascii кодов, то вы увидите, что 0 - это не печатный символ, поэтому вы и не видели принятых данных. Вообще рекомендую для изучения работы с последовательным портом воспользоваться монитором ком порта. Их очень много, я использовать compump. Там вы можете выставить формат передачи и приема и тогда увидите, что вы принимаете свои нули + 2 байте, которые как-то отображаются. Успехов
Прикрепления: msv_gen.zip (46.2 Kb) · 1346684.png (205.6 Kb)
msv_gen Дата: Пн, 04.05.2015, 22:22  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 06.09.2013

Статус: Offline

Цитата MiXaS ()
У меня все работает прекрасно. Я Специально для ВАС сделал примерчик. Смотрите в архиве. Я кажется знаю в чем у вас проблема. Вам нужно хорошенечко изучить модификаторы. Также рекомендую разобраться в каком формате вы собираетесь передавать свои данные. В моем примере передача данных идет в формате ASCII кода. Также данные можно передавать в десятичном и других форматах. Если вам нужно передавать и строковые переменные и значения цифр полученные в результате расчетов, то можно просто прибавить 48 к переменной, которую нужно передать и отправить в десятичном формате, например. У Вас не получалось из-за того, что значение переменной = 0, а передавали вы в формате ascii, если открыть таблицу ascii кодов, то вы увидите, что 0 - это не печатный символ, поэтому вы и не видели принятых данных. Вообще рекомендую для изучения работы с последовательным портом воспользоваться монитором ком порта. Их очень много, я использовать compump. Там вы можете выставить формат передачи и приема и тогда увидите, что вы принимаете свои нули + 2 байте, которые как-то отображаются. Успехов

Спасибо за попытку помочь, но вы не обратили внимание что я изначально писал "что вывод заканчивается первым НУЛЕВЫМ байтом "
еще раз БАЙТОМ!!!!
Протокол обмена информацией не должен накладывать никаких ограничений!!! (если это не вывод на устройство отображения информации, здесь может быть своя специфика)
Например более 30 лет назад я писал программу обмена между СМ1800 (К580ик80 8 дюймовые флопики + токовая петля 20 мА) и Roboton 1715 (Z80+RS232+ 5 дюймовые флопики) + Виктор собирал устройство согласования .... Передавалось что угодно,в т.ч. исполняемые файлы и базы данных .... Правда и программа была более 10 кБайт
В данном случае по RS485 в эту переменную нужно принять от модуля "1" данные о температуре и влажности в подвале (с DHT11) ... а потом передавать для отображения на другие модули...
Поскольку для отображения используются 7 сегментные самодельные индикаторы (8 разрядов), то при приеме будет идти дешифрация, но использование кодирования "0" ( h00) в ... приведет только к путанице... и еще большему увеличению кода...
А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232
Вы еще можете сказать про аналогию (UUE [Fido]), E-Mail, - где размер передаваемой информации БОЛЬШЕ размеров самого файла... но там совершенно другие возможности и ограничения

Сообщение отредактировал msv_gen - Пн, 04.05.2015, 22:33
MiXaS Дата: Вт, 05.05.2015, 01:13  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата msv_gen ()
первым НУЛЕВЫМ байтом "
Как это понимать? Если у вас 1 байт =f2. 
Цитата msv_gen ()
А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232
Это тоже не понятно. Если вы имеете введу аппаратно, то да, нужно как и на других устройствах ставить соответствующий преобразователь уровней. Если вы про софт, так у вас изначально неправильное направление, так как для нормального обмена нужно использовать модуль USART или EUSART, а также работать с прерыванием, например, прилетел новый байт, идем в прерывание и записываем весь фрейм в буфер, а пото  обрабатываем его в основном коде, потом формируете ответ, если того требует протокол. Сформулируйте вопрос, получите ответ. Как формулируете вопрос, так и получаете ответ. Все просто.
msv_gen Дата: Вт, 05.05.2015, 16:42  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 06.09.2013

Статус: Offline

Цитата MiXaS ()
Цитата msv_gen ()первым НУЛЕВЫМ байтом "
Как это понимать? Если у вас 1 байт =f2.
посылка, если считать синхро, 12 байт, вот на первом байте (из 12) который будет = 0 вывод и прекращается (Сам не сразу понял проблему - все посылки должны быть одинаковой длинны, а у меня лог курс гривны показывает biggrin ). 1-Синхро, 2 -код информации(что передается), 8 инфоррмационных байт, байт дня недели, будильника и последний байт управления исполнительными устройствами.
Да извиняюсь плохо искал "Can it be that the STR methode doesn't work with 16F series PIC?" - это на ихнем форуме...

Что касается USART , то пока не могу заставить перейти на 1200 - согласно доке на 16F88  TABLE 12-5: BAUD RATES FOR ASYNCHRONOUS MODES (CONTINUED) надо выставить SYNC = 0, BRGH = 0, BRG16 = 1 для FOSC = 20.000 MHz  и BAUD RATE 1200 SPBRG должно быть = 1041 - не могу  задать BRG16 = 1  и SPBRG - компилятор матерится...или скорость ЛЕВАЯ а RS485 это не СФЛНУ на 30 кМ. (Был у меня когда то на СМ1403 мультиплексор передачи данных - у него была токовая петля и СФЛНУ, 100 парный кабель ... ректор, проректора, даже партком был подключен)
Что касается прерываний, то у меня DS3231 каждую секунду за хвост дергает и счетчик который распределяет подзадачки по времени аля виндовс, например на 13 тике команда для ds18b20 а на 14 - обработка его ...
каждую секунду отправляется информация на модули... это 0,04992 сек при 2400 если верить протеусу.

Сообщение отредактировал msv_gen - Вт, 05.05.2015, 18:42
AndrF Дата: Ср, 06.05.2015, 08:41  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата msv_gen ()
А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232
А он и не может быть предусмотрен - в контроллерах нет таких выводов. Зато есть UART из которого с помощью соответствующей микросхемки-преобразователя легко делаются все вышеупомянутые. Хоть с опторазвязкой. Впрочем, об этом уже писал MiXaS.

И у вас PicBasic или Proton?

Цитата msv_gen ()
еще раз БАЙТОМ!!!!

Раньше работал с Протоном - бинарники передавались вполне нормально. Сейчас работаю с Swordfish - тоже с этим проблем нет.

Цитата msv_gen ()
Что касается USART , то пока не могу заставить перейти на 1200

По Протону уже не скажу, но в Swordfish скорости в его модуле задаются с 300. Хотя сейчас работаю с 115200. Вчера как раз возился с передачей контроллером на комп данных из 24С128...

Добавлено (06.05.2015, 08:41)
---------------------------------------------
Цитата msv_gen ()
doesn't work with 16F series PIC

От 16-х я уже отошел. О чем, собственно и не жалею. К тому же старье уже зачастую стоит дороже новых чипов, с большими возможностями. Для новых разработок сейчас выгодней использовать 24 или 32 серии. Правда у меня самого еще есть запасик 18-ой - добиваю его. Но для чего-то нового уже перейду на следующие серии...

Сообщение отредактировал AndrF - Ср, 06.05.2015, 08:48
msv_gen Дата: Чт, 07.05.2015, 13:04  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 06.09.2013

Статус: Offline

Цитата AndrF ()
Цитата msv_gen ()А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232
А он и не может быть предусмотрен - в контроллерах нет таких выводов. Зато есть UART из которого с помощью соответствующей микросхемки-преобразователя легко делаются все вышеупомянутые. Хоть с опторазвязкой. Впрочем, об этом уже писал MiXaS.

И у вас PicBasic или Proton?

Протон, но вообще то от него (ПРОТОНА) и не требуется выдавать +/- 12 вольт (RS232) - я нигде не говорил про железо, но зачем прекращать передачу если попался байт = 0. Конечно если прописать вывод КАЖДОГО БАЙТА, то он передаст...
В общем то это вопрос идеологии / назначения Протона зависящий от разработчиков... Возможно они считают что обмен возможен только с алфавитно цифровыми индикаторами в которым не может передаваться байт = 0, а если программист это "прощелкал" то он долго будет искать - где же собака зарыта... Кстати даже в Протоне в "ASCII table" NUL есть и = естественно 0, правда почему то таблица заканчивается 7F bash наверно поэтому и приходится вместо русских букв для вывода писать их коды...
Matrix252005 Дата: Чт, 07.05.2015, 13:45  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Цитата msv_gen ()
Кстати даже в Протоне в "ASCII table" NUL есть и = естественно 0, правда почему то таблица заканчивается 7F наверно поэтому и приходится вместо русских букв для вывода писать их коды...
Не примите это за хамство или еще что то, но ответ на Ваш вопрос прост: https://ru.wikipedia.org/wiki/ASCII
Просто есть стандарт, а дальше...


THE TRUTH IS OUT THERE.

С уважением, Николай.
MiXaS Дата: Чт, 07.05.2015, 14:44  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

ТАК!!..
Цитата msv_gen ()
Протон, но вообще то от него (ПРОТОНА) и не требуется выдавать +/- 12 вольт (RS232) - я нигде не говорил про железо
А тогда как это понимать?
Цитата msv_gen ()
А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232
 
Цитата msv_gen ()
но зачем прекращать передачу если попался байт = 0. Конечно если прописать вывод КАЖДОГО БАЙТА, то он передаст...
С чего вы это взяли? Вы пробовали мой пример? Открывали монитор порта и смотрели что там прилетает. Я заранее знаю ответ - НЕТ! 
Я постоянно пишу на протоне сетевые устройства с RS485 или RS232, чаще всего использую или MODBUS или свой протокол. Там тоже есть нули и они прекрасно передаются и принимаются. Может вы уже сформулируете нормальный вопрос, чтобы получить ответ?!
ЯНДЕКС Дата: 07.05.2015
AndrF Дата: Пт, 08.05.2015, 08:23  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

IMHO - у него проблема скорее не на стороне контроллера, а в программе принимающей стороны...
MiXaS Дата: Пт, 08.05.2015, 10:42  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата AndrF ()
IMHO - у него проблема скорее не на стороне контроллера, а в программе принимающей стороны...
Я тоже так думаю. Особенно если принимающая сторона самописная и установлена не та кодировка. Ну что поделать если человек упорно не хочет следовать советам.
Romario Дата: Вт, 12.05.2015, 16:03  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 58
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2007

Статус: Offline

Всем здравствуйте! У меня немного другая фигня с обменом по rs232 с 12f675.
Код
Device = 12F675

IOCB =   %00000000  
CMCON =  %00000111             
WPU =    %00000000
TRISIO = %00001000             
GPIO =   %00000000
ANSEL =  %01100000  
ADCON0 = %10000000  
             

Declare Rsin_Mode 0
Declare Rsin_Pin GPIO.3
Declare Rsin_Timeout 1000

Declare Rsout_Mode 0
Declare Rsout_Pin GPIO.5
Declare Serial_Baud 9600
GPIO.2 = 1  
DelayMS 2000
RSOut   "1",10,13
GPIO.2 = 0
Dim into As Word

begin:
GPIO.2 = 1  
  DelayMS 500     
  GPIO.2 = 0
  DelayMS 500

RSIn {begin}, into   
DelayMS 500  
RSOut   into,10,13      
  GPIO.2 = 1
DelayMS 2000

GoTo begin

  End

В протеусе код работает нормально. Передаю информацию в ASCII. 
На живом железе работает не так как ожидалось.
Я ему отправляю символ "1" код 49, а МК мне в терминал выдаёт символ с кодом 179. И в место кодов 10 и 13 выдаёт 130 и 227 соответственно. В общем мк шлёт ASCII коды в диапазоне 128 - 255, а не 0 - 127. К примеру на pic16f628a подобной проблемы не возникла и обмен идет как запрограммирован. 
В чём прикол у 12f675 понять не могу? nocomp
MiXaS Дата: Вт, 12.05.2015, 17:39  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Romario, Я никогда не работал с 12f, но могу предположить, что что-то у Вас с генератором. Я у себя уже не раз замечал такую историю. Когда отсутствует Xtal, программы как-то странно выполняется, а иногда и не выполняется, хотя в мануале написано, что все должно работать, если кварц 4МГц, а Xtal отсутствует. Либо у Вас рассинхронизация.  Вы посылвете байт, а он начитает читаться не сразу, а пока не закончится delayms 500, что может привести к подобному
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: