RSOut str area\n неработает
|
|
msv_gen |
Дата: Ср, 29.04.2015, 18:23 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 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 в какую сторону рыть?
|
|
|
|
MiXaS |
Дата: Чт, 30.04.2015, 09:43 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата msv_gen ( ) вывод заканчивается первым НУЛЕВЫМ байтом А с чего вы это взяли? Может у Вас последний байт = 0. А где код? Где настройки этой команды? Какая частота генератора? Напишите простой отдельный код, который бы только слал в порт те же данные и посмотрите. если не получится, прикрепите свой маленький код, а мы посмотрим
|
|
|
|
msv_gen |
Дата: Чт, 30.04.2015, 17:18 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
У меня все работает прекрасно. Я Специально для ВАС сделал примерчик. Смотрите в архиве. Я кажется знаю в чем у вас проблема. Вам нужно хорошенечко изучить модификаторы. Также рекомендую разобраться в каком формате вы собираетесь передавать свои данные. В моем примере передача данных идет в формате ASCII кода. Также данные можно передавать в десятичном и других форматах. Если вам нужно передавать и строковые переменные и значения цифр полученные в результате расчетов, то можно просто прибавить 48 к переменной, которую нужно передать и отправить в десятичном формате, например. У Вас не получалось из-за того, что значение переменной = 0, а передавали вы в формате ascii, если открыть таблицу ascii кодов, то вы увидите, что 0 - это не печатный символ, поэтому вы и не видели принятых данных. Вообще рекомендую для изучения работы с последовательным портом воспользоваться монитором ком порта. Их очень много, я использовать compump. Там вы можете выставить формат передачи и приема и тогда увидите, что вы принимаете свои нули + 2 байте, которые как-то отображаются. Успехов
|
|
|
|
msv_gen |
Дата: Пн, 04.05.2015, 22:22 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата msv_gen ( ) первым НУЛЕВЫМ байтом " Как это понимать? Если у вас 1 байт =f2. Цитата msv_gen ( ) А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232 Это тоже не понятно. Если вы имеете введу аппаратно, то да, нужно как и на других устройствах ставить соответствующий преобразователь уровней. Если вы про софт, так у вас изначально неправильное направление, так как для нормального обмена нужно использовать модуль USART или EUSART, а также работать с прерыванием, например, прилетел новый байт, идем в прерывание и записываем весь фрейм в буфер, а пото обрабатываем его в основном коде, потом формируете ответ, если того требует протокол. Сформулируйте вопрос, получите ответ. Как формулируете вопрос, так и получаете ответ. Все просто.
|
|
|
|
msv_gen |
Дата: Вт, 05.05.2015, 16:42 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 06.09.2013
Статус:
Offline
|
Цитата MiXaS ( ) Цитата msv_gen ()первым НУЛЕВЫМ байтом " Как это понимать? Если у вас 1 байт =f2. посылка, если считать синхро, 12 байт, вот на первом байте (из 12) который будет = 0 вывод и прекращается (Сам не сразу понял проблему - все посылки должны быть одинаковой длинны, а у меня лог курс гривны показывает ). 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 06.09.2013
Статус:
Offline
|
Цитата AndrF ( ) Цитата msv_gen ()А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232 А он и не может быть предусмотрен - в контроллерах нет таких выводов. Зато есть UART из которого с помощью соответствующей микросхемки-преобразователя легко делаются все вышеупомянутые. Хоть с опторазвязкой. Впрочем, об этом уже писал MiXaS.
И у вас PicBasic или Proton? Протон, но вообще то от него (ПРОТОНА) и не требуется выдавать +/- 12 вольт (RS232) - я нигде не говорил про железо, но зачем прекращать передачу если попался байт = 0. Конечно если прописать вывод КАЖДОГО БАЙТА, то он передаст... В общем то это вопрос идеологии / назначения Протона зависящий от разработчиков... Возможно они считают что обмен возможен только с алфавитно цифровыми индикаторами в которым не может передаваться байт = 0, а если программист это "прощелкал" то он долго будет искать - где же собака зарыта... Кстати даже в Протоне в "ASCII table" NUL есть и = естественно 0, правда почему то таблица заканчивается 7F наверно поэтому и приходится вместо русских букв для вывода писать их коды...
|
|
|
|
Matrix252005 |
Дата: Чт, 07.05.2015, 13:45 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
ТАК!!.. Цитата msv_gen ( ) Протон, но вообще то от него (ПРОТОНА) и не требуется выдавать +/- 12 вольт (RS232) - я нигде не говорил про железо А тогда как это понимать? Цитата msv_gen ( ) А пока вывод: в PicBasic штатно не предусмотрен обмен информацией / данными по RS485 / RS232 Цитата msv_gen ( ) но зачем прекращать передачу если попался байт = 0. Конечно если прописать вывод КАЖДОГО БАЙТА, то он передаст... С чего вы это взяли? Вы пробовали мой пример? Открывали монитор порта и смотрели что там прилетает. Я заранее знаю ответ - НЕТ! Я постоянно пишу на протоне сетевые устройства с RS485 или RS232, чаще всего использую или MODBUS или свой протокол. Там тоже есть нули и они прекрасно передаются и принимаются. Может вы уже сформулируете нормальный вопрос, чтобы получить ответ?!
|
|
|
|
AndrF |
Дата: Пт, 08.05.2015, 08:23 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 03.02.2012
Статус:
Offline
|
IMHO - у него проблема скорее не на стороне контроллера, а в программе принимающей стороны...
|
|
|
|
MiXaS |
Дата: Пт, 08.05.2015, 10:42 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата AndrF ( ) IMHO - у него проблема скорее не на стороне контроллера, а в программе принимающей стороны... Я тоже так думаю. Особенно если принимающая сторона самописная и установлена не та кодировка. Ну что поделать если человек упорно не хочет следовать советам.
|
|
|
|
Romario |
Дата: Вт, 12.05.2015, 16:03 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
58
Замечания:
±
На сайте с 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 понять не могу?
|
|
|
|
MiXaS |
Дата: Вт, 12.05.2015, 17:39 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Romario, Я никогда не работал с 12f, но могу предположить, что что-то у Вас с генератором. Я у себя уже не раз замечал такую историю. Когда отсутствует Xtal, программы как-то странно выполняется, а иногда и не выполняется, хотя в мануале написано, что все должно работать, если кварц 4МГц, а Xtal отсутствует. Либо у Вас рассинхронизация. Вы посылвете байт, а он начитает читаться не сразу, а пока не закончится delayms 500, что может привести к подобному
|
|
|
|