Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Как передать серию цифр по 4-х битной шине (Обмен данными между двумя мк через 4 битную шину)
Как передать серию цифр по 4-х битной шине
sanek Дата: Пн, 15.06.2009, 22:00  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

здравствуйте.возможно этот вопрс прост и не достоин вашего внимания но я никак немогу сообразить.
возникла задача, передать через четырех битную шину, от одного МК в другой, серию цыфр от 0 до 9 с сохранением каждой цыфры в отдельную переменную.как синхронезировать общение между МК по тойже 4-х битной шине?или это можно сделать без синхронизации?
(пробовал несколькими способами без синхрон.-цыфры либо терялись либо одна цыфра записывалась в несколько переменных)
ЯНДЕКС Дата: 15.06.2009
DIKTATOR Дата: Пн, 15.06.2009, 23:43  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Вопрос достоин меня biggrin .
по 4х битной шине можно передать 16цифр-1синхронизация
Пример прередачи и синхронизация:
==============================================================
теория:

данные
0000 - 0
0001 - 1
0010 - 2
0011 - 3
0100 - 4
0101 - 5
0110 - 6
0111 - 7
1000 - 8
1001 - 9

синхронизация
после включения оба мк ждут сигнала 1111 на всех 4х портах, и в зависимости от программы 1 из мк начинает чтото гнать на 2 мк(и слать его на 0011 буквы)) после того как переданы данные 1мк отправляет 1111 (разрыв),при этом 1мк может выполнять другую задачу ожидая когда на шине появятся данные отличные от 1111.

начало--данные--разрыв--данные--разрыв
1111------0011------1111-----0001-----1111
=============================================== ===============

Прогу чуть позже напишу.


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
DIKTATOR Дата: Вт, 16.06.2009, 01:25  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Code
ini:
clear
TRISB = %00000000
PORTB = %00000000
specPER var byte
dataCH1 var byte
dataCH2 var byte
dataCH3 var byte
dataCH4 var byte

start:
TRISB = %00001111
if portb = %00001111 then start2
'ваша прога
goto start

start2:
specPER = specPER + 1
if specPER = 1 then startCH1
if specPER = 2 then startCH2
if specPER = 3 then startCH3
if specPER = 4 then startCH4
goto startERR

startCH1:
if portb = %00001111 then startCH1
pauseus 10
dataCH1 = portb
goto start

startCH2:
if portb = %00001111 then startCH2
pauseus 10
dataCH2 = portb
goto start

startCH3:
if portb = %00001111 then startCH3
pauseus 10
dataCH3 = portb
goto start

startCH4:
if portb = %00001111 then startCH4
pauseus 10
dataCH4 = portb
goto start

startERR:
TRISB = %00000000
PORTB = %00000000  
portb = dataCH1
pauseus 20
portb = dataCH2
pauseus 20
portb = dataCH3
pauseus 20
portb = dataCH4
pauseus 20
end

Сейчас проверю работу в симуляторе.
-----------------------------------------------------------------
Проверил, работает всё абсолютно!!!
Скажу чесно я не знал что у меня получится, писал просто от головы.
dataCH1 = portb и portb = dataCH1 такого я в книге чака хелибейка не видел поэтому решил попробывать,работает!

В переменную dataCHхх моментально записываются данные порта Б когда if portb = %00001111 then startCHхх даёт отрицательный ответ, поэтому ради надёжности добавлена пауза 10 микросекунд. В симуляторе всё работает, а вот на практике проверять вам)

Программа работает так:
начать запись---данные---начать запись---данные---начать запись---данные---начать запись---данные
--------1111--------0011-----------1111---------0011-----------1111----------0011----------1111-----------0011
----------- ---------dataCH1----------------------dataCH2----------------------dataCH3----------------------dataCH4


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
sanek Дата: Вт, 16.06.2009, 20:04  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

Вот спосибо!!!
а синхронезирующий "1111"должен быть после каждой переданой цифры"1111-0001-1111-0010-1111-и т.д."если мне нужно передовать:сначало циф.1 потом циф.2 потом циф.3 и т.д.?

http://www.kodges.ru/10129-u....na.html книга по pbp там есть "dataCH1 = portb и portb = dataCH1 " в примерах.
еще раз спасибо.

Сообщение отредактировал sanek - Вт, 16.06.2009, 22:19
DIKTATOR Дата: Ср, 17.06.2009, 00:00  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Quote
Вот спосибо!!!
а синхронезирующий "1111"должен быть после каждой переданой цифры"1111-0001-1111-0010-1111-и т.д."если мне нужно передовать:сначало циф.1 потом циф.2 потом циф.3 и т.д.?

Да именно так надо передавать, но только в конце 1111 ставить ненадо, 1111 в моём примере означает что будет передана цифра поле того как 1111 изменит состояние. Тоесть программа начнёт записывать всё что угодно(0..14 цифры) сразу после того как 1111 изменится например на 1110, и это изменённое состояние(1110) будет записано в переменную.

А вам нужен только 4разрядная шина ? может последовательная тоже подойдёт?
Могу попробывать сделать пример с надёжной передачей данных через 1 проводок wink
Такое ощущение что я изобрету юсби happy


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
sanek Дата: Ср, 17.06.2009, 21:17  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

ЗДРАВСТВУЙТЕ.СПОСИБО ЗА ОТВЕТ, А ТО ВРЕМЕНИ НЕТ ПОСМОТРЕТЬ В ПРОТЕУСЕ .
МНЕ НУЖНА 4-Х РАЗРЯДНАЯ ШИНА ТАК КАК ПРИНИМАТЬ ДАННЫЕ ПРЕДПОЛОГАЕТСЯ С ДЕКОДЕРА DTMF.
НО ЕСЛИ ВАМ НЕ ТРУДНО Я БУДУ РАД ПРИМЕРУ ПРОГРАММЫ С ПЕРЕДАЧЕЙ ПО ОДНОМУ ПРОВОДУ.ДУМАЮ ЭТО ТОЖЕ ПРИГОДИТСЯ В МОЕМ ПРОЕКТЕ.
СПАСИБО ЕЩЕ РАЗ ЗА ПОМОЩЬ.(ЕСЛИ ТАК ДАЛЬШЕ ПОЙДЕТ ЭТО СКОРЕЕ БУДЕТ ВАШ ПРОЕКТ ЧЕМ МОЙ biggrin )
sanek Дата: Пт, 19.06.2009, 22:05  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

здравствуйте.
ВОПРОС DIKTATORу:
ПАУЗА МЕЖДУ ПЕРЕДОВАЕМЫМИ ДАННЫМИ ДОЛЖНА БЫТЬ?
А ТО ЕСЛИ Я НЕ СТАВЛЮ ПАУЗУ ПРОГРАММА НЕ ЧИТАЕТ ДАННЫЕ
А ЕСЛИ СТАВЛЮ< PAUSEUS=0> МЕЖДУ ПЕРЕДОВАЕМЫМИ ЦИФРАМИ, ПРОГРАММА РАБОТАЕТ
DIKTATOR Дата: Пт, 19.06.2009, 23:51  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

мк который передаёт должен давать 1111 в шину и после этого удерживать 0011(цифра 3) некоторое время , например 20 микросекунд.
мк который принимает ждёт когда передающий отправит 1111 , если это произошло ждать 10 микросекунд (можно меньше) чтобы на шине был нормальный и устойчивый сигнал(я просто смотрел что происходит мк встроенные в плис), и затем сразу после паузы моментально записывает состояние порта.

С последователным интерфейсом помоч пока не могу, занет.
Скомпилированные программы проверяю в PIC Simulator IDE.


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
sanek Дата: Сб, 20.06.2009, 12:03  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

здравствуйте
передающий МК:1111,0001,pauseus 20,1111,0010,pauseus 20,1111,0011,pauseus 20,и т.д.-я правельно понял?
DIKTATOR Дата: Сб, 20.06.2009, 13:54  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Да правильно.
А ещё правильней сделать так:
PORTB = %00001111
pauseus 5
PORTB = %00000001
pauseus 20
PORTB = %00001111
pauseus 5
PORTB = %00000010
pauseus 20

Мк который проверяет наличие 1111 на шине может не успеть если программа будет такая:
PORTB = %00001111
PORTB = %00000001
pauseus 20
PORTB = %00001111
PORTB = %00000010
pauseus 20

А также желательно чтоб мк имели одинаковую частоту, или корректировать паузы изза разности в частоте.
В протеусе не занимаюсь этим, но если возможно то сделайте там обмен 2мк между собой на моём примере. В пик симуляторе программа работала когда я вручную выставлял на шину 1111 и 0011 , тоесть мк передающий может сколь угодно долго держать 1111 на шине, и сколь угодно 0011 к примеру(но обязательно с паузами), принимающий мк зависит от того какой сигнал на шине.

Мой пример способен тока передать информацию с одного мк на другой, для двунаправленной связи надо программу побольше делать, или вас однонаправленная связь устроит?


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
sanek Дата: Вс, 21.06.2009, 14:06  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

БЛИН программа получается худая но длинная боюсь все непоместится.
наверное придется искать другой путь.
суть моего проекта такова:
1)блок упровления(БУ)
2)несколько упровляемых блоков расположеных вразных частях города(УБ)
3)связь между ними по телефону с помощью DTMF
при включении блока упровления на жки появляется меню упровляемых блоков.
выбрав нужный нажимаем ОК, БУ дает команду телефону набрать номер выбранного УБ
УБ реагирует на вызов поднемает трубку и отсылает меню подключенных к нему устройств в БУ
выбираем из появившегося на жки подключеного к БУ меню, нужное устройство нажимаем ОК.
БУ дает в микрофон телефона команду в виде DTMF
УБ получив команду отсылает в БУ меню функций которые можно произвести с этим устройством.
снова выбераем нужную строчку в появившемся меню нажимаем ОК получаем результат
этот вариант с которым (огромное вам спасибо) вы мне помогли, наверное не подойдет так как только тексты меню займут всю память МК а там еще упровлять надо
можно наверное не парится и не передовать меню от одного МК другому а прописать их в МК БУ
есть какие нибуть идеи?
прекрипляю часть наших с вами трудов там фаил для протеуса.если у вас нет протеуса могу выслать по мылу портабельную версию.

Добавлено (21.06.2009, 14.06.29)
---------------------------------------------
а можно записать эту прогамму
PORTB=$00001111
PAUSEUS 20
PORTB=$00000101
PAUSEUS 20
PORTB=$00001111
как нибудь одной строкой(думаю врятли но всеже)?
А то у меня одно меню занимает около 320 строк а количество этих меню =16+упровление.

Прикрепления: 3684614.rar(61Kb)

Сообщение отредактировал sanek - Вс, 21.06.2009, 17:35
sanek Дата: Ср, 15.07.2009, 21:04  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

нашел один вариант, количество строк уменьшил в 3,5 раза
прикрепляю, может увидете где можно еще сократить

Добавлено (15.07.2009, 19.56.16)
---------------------------------------------
блин всю голову сломал как передать с одного мк на другой информацию для отоброжения на ЛСД (это меню)
4 строки по 10 символов причем используя четырех битный код(DTMF)
пробовал передовать одну букву как сумму двух цыфр, долго и памяти занемает много.
хотел откозатся от передачи и прописать все меню в отдельном мк(их должно быть 64)не влезает
поломав голову всетаки решил что нужно передовать с одного мк на другой но как это сделать придумать не могу
помогите намеком в каком напровлении мне двигатся.

Добавлено (15.07.2009, 21.04.32)
---------------------------------------------
я тут подумал может я зациклился на DTMF,существуют ли другие способы передачи команд и информации с одного МК на другой
через GSM телефоны в режиме реального времени.

Прикрепления: prinemayushiy.bas(6Kb) · variant_1.bas(5Kb) · variant_2.bas(5Kb)

Сообщение отредактировал sanek - Вс, 21.06.2009, 17:49
Dmitry Дата: Пт, 17.07.2009, 22:40  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (sanek)
можно наверное не парится и не передовать меню от одного МК другому а прописать их в МК БУ есть какие нибуть идеи?

Насколько я понял, вы пытаетесь четырехбитным кодом передавать текстовые символы меню?. Т.е. по два кода на один символ? Если да, то действительно, и долго, и памяти сожрет немеряно. Более правильно прописать все эти меню и подменю в блоке управления, а DTMF-ом передавать только ID (код то бишь) нужного меню. Или меню/подменю УБ будут меняться постоянно в процессе эксплуатации?

Quote (sanek)
хотел откозатся от передачи и прописать все меню в отдельном мк(их должно быть 64)

Вот это правильное решение

Quote (sanek)
не влезает

А в каком виде прописаны меню? Команду lookup для размещения меню в памяти МК не пробовали?
а если все-таки не влезает, то нет ничего проще - цепляем к двум любым ножкам флеш-память 24Схх и читаем ее командой I2CRead. Туда не только текст, туда и звуковой комментарий приятным женским голосом записать можно smile

Quote (sanek)
через GSM телефоны в режиме реального времени

В старых сименсах, я знаю, протокол общения с его встроенным модемом открытый, т.е. можно использовать такой телефон как модем, заставляя его позвонить, отправить смс-ку и т.п. с помощью АТ-команд. (командой serout). Или можно использовать обычный модем для аналоговой телефонной линии - тоже управляется AT-командами через serout. Этой же командой и байты передавать после установления соединения. Эти модемы сейчас уже почти никому не нужны, наверняка можно накупить по дешевке.

Сообщение отредактировал Dmitry - Сб, 18.07.2009, 00:31
sanek Дата: Пн, 20.07.2009, 19:01  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

Да меню/подменю УБ будут меняться постоянно в процессе эксплуатации.
и удобство передачи меню в том что не требуется постоянно перешивать блок упровления при появлении новых устройств подключаемых к блоку упровления.

Сообщение отредактировал sanek - Пн, 20.07.2009, 19:08
Dmitry Дата: Чт, 23.07.2009, 02:35  |                                                                                                                Сообщение # 15
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Если разновидностей устройств, подключаемых к УБ, конечное число (и их названия известны), а также известны все возможные пункты меню, которые могут быть в УБ, то лучше все-таки сделать табличку соответствия и каждому пункту меню и каждому устройству, подключаемому к УБ, назначить свой код, который и передавать в БУ. Я тоже раньше, когда писал базы данных, в поле, где могло быть всего десятка 2 фиксированных названий, все эти названия текстом и записывал, вместо того, чтобы сделать поле числовым и записать туда номер нужного названия. Потом понял, что неправ, развивать и переделывать базу было неудобно.
Форум Picbasic.ru » Программирование МК » PicBasicPro » Как передать серию цифр по 4-х битной шине (Обмен данными между двумя мк через 4 битную шину)
Страница 1 из 11
Поиск: