|
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
|
||||||
PIC, SPI и сдвиговый регистр.03.09.2012, 18:29. Показов 86810. Ответов 115
Метки нет (Все метки)
Здравствуйте уважаемые гуру!
Настал для меня период слезть с ардуино и перейти на следующий уровень общений с МК. К тому же понадобилось перепрошить одну девайсину на PIC16F877. Как нельзя лучше, пришлась среда разработки для PIC под разные платформы, в частности под Mac я запустил все без проблем. Hello world в виде морганий светодиода и считываний кнопки вроде проблем не вызвали, однако этап освоения SPI поставил в тупик, в связи с чем прошу у вас помощи. Написал небольшой код, который по нажатию кнопки должен отправить данные по SPI в сдвиговый регистр 74HC595:
Первоночальный запуск происходит как надо, кнопка отрабатывает как и задумано, в первых 4х регистрах высокий уровень, в остальных низкий. <Изображение удалено> Однако нажимая кнопку несколько раз, наблюдается смещение регистров, хотя каждый раз посылается по 8 бит... <Изображение удалено> В связи с этим вопрос, что в данной программе не так? Возможно по окончанию передачи нужно записывать еще какой то служебный бит что мы закончили? И должен ли на выходе SCK высокий уровень, если мы ничего не передаем, в случае работы с 595? Заранее спасибо!
0
|
||||||
| 03.09.2012, 18:29 | |
|
Ответы с готовыми решениями:
115
Сдвиговый регистр без микроконтроллера Программный SPI для PIC [VHDL] ПЛИС длинный сдвиговый регистр с параллельной загрузкой |
|
SWK
|
|
| 04.09.2012, 18:32 | |
|
Кстати, глянул сейчас листинг, почему много байт. Просто там много команд переключения банков. Без них было бы еще процентов на 20 короче.
Вот сейчас какой у меня общий размер программы контроллера башни: Used ROM (bytes): 172 (49%) Frii ROM (bytes): 180 (51%) Used ROM (program words): 3367 (41%) Frii ROM (program words): 4825 (59%) На более 1200 строк Паскалевского листинга. При меньшем размере программы (когда все в пределах одного банка) - так было бы, конечно, еще меньше. Но и сотня байт для меня - не смертельно. И так еще 59% памяти программ свободно. Я умею писать экономный код. Хоть на асме, хоть - на Паскале. Будет надо - еще подожму. Пока - без надобности. Но и утраивать без нужды время работы простой процедуры записи в регистр - смысла не вижу. |
|
|
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
|
||
| 04.09.2012, 18:41 | ||
Вы не видите смысла при решении своей задачи... и это понятно... О задаче ТСа вообще ничего не известно... ))))))) Получается, что смысл вообще состоит в том, чтобы его не видеть... )))))))))))
0
|
||
|
SWK
|
||
| 04.09.2012, 18:53 | ||
Для одного - стакан наполовину полон. Для другого - наполовину пуст... Чего спорить - то? К сожалению, хватает еще фанатиков, цепляющихся к каждому слову и пытающихся из всего сделать проблему. Не нравится - не ешь. Чего спорить - то? |
||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 04.09.2012, 19:09 | |
|
Бывает, элементарно не хватает выводов для полного SPI http://forum.iosyitistromyss.r... f=4&t=9588.
0
|
|
|
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
|
|
| 04.09.2012, 19:10 | |
|
Моя задача в готовом устройстве заменить 2 МК.
Устройство - миди клавиатура. 1й МК сканирует только клавиши и передает информацию о скорости их нажатия по SPI (Как я думаю, судя по прозвоненным выводам) во второй МК, который отвечает за сканирование всяких ползунков, фейдеров, кнопок, выводу это на не большой дисплей и отправки это на midi порт и USB (usb думаю отдельно сделан). В связи с тем что первый МК я успешно запорол во время попытки считать оттуда программу (хотя я в IPE все время нажимал READ), я пытаюсь подобрать протокол обмена между ними. До того как он умер, я подключил логический анализатор, и позахватывал его данные. МК соединены между собой 3мя проводами: SCK---SCK SDO---SDA SDA---RB0/INT1 Перед тем как появляются данные на SCK/SDO, SDA подает кратковременный низкий уровень на RB0/INT1, видимо это активизирует прерывание во втором МК для приема данных. Длина этого перепада 2us. После перепада, через несколько us начинаются данные, идет синхроимпульс и сами данные. Я пытался проделать тоже самое на ардуино, но когда я подаю низкий уровень на RB0, а затем возращаю его на высокий, второй МК перегружается. Я померил, длина импульса от ардуино составляет 5us, соотвественно, возможно, там сделано срабатывание только если импульс короткий. А может быть это и не SPI никакой...
0
|
|
|
SWK
|
||
| 04.09.2012, 19:25 | ||
Если у мастера SPI разрешена работа SS, то подачей на него "0" можно перевестьи его в режим слэва. Ну, и еще есть всякие нюансы... |
||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|||||||||||
| 04.09.2012, 19:36 | |||||||||||
|
SWK Смотрите.
Причем все это можно оптимизировать без каких либо зверских ухищрений. 35 против ваших 100 , причем у вас вывод одного байта у меня 3 . На 4 МГЦ - 400мкс . Причем у вас для заполнения всех 595 нужно трижды вызвать вашу "процедуру" а это значит время исполнения в 3 раза больше. И не пойте о ваших мультизадачных потребностях . Ваш стиль и микрапасксраль убивают все эти ваши супер фичи...
<Изображение удалено> Сейчас мы услышим : Мне это не надо, пишу как мне нравится.
0
|
|||||||||||
|
SWK
|
||||||
| 04.09.2012, 21:48 | ||||||
У меня можно выбрать любой из 3х регистров для загрузки, вы же тупо каждый раз гоните все 3.
Что толку, что у вас меньше байт. Время пересылки все равно втрое больше. А поскольку я меняю не все три регистра сразу, а отдельные биты в одном из них - так для смены данных по вашему варианту все равно придется вызывать эту процедуру ТРИ раза, отдельно для каждого регистра, когда надо поменять его значения. А то и несколько раз писать в один и тот же (например, меняя по 4 бита фаз для шагового двигателя). Где же тут выигрыш? Трижды писать во все три регистра - вместо трех записей по одному? Этот ваш довод - совсем ни к месту.
Я тоже могу сделать программу из одной только процедуры записи регистров, и она тоже будет маленькой...
Как раз мой стиль - это правильное написание мультизадачных программ реального времени, а не отдельных демок в несколько строк. И он оправдал себя за 30 лет его использования. И, как вы могли бы (если захотели), видеть по приложенному мной листингу, компилятор не добавил ни одного лишнего байта без особой на то необходимости. Сохранив при этом максимум универсальности. Любые ноги любых портов, размещение буферов где угодно, использование без проблем любого числа загружаемых регистров.
Вчера впервые подключил на линию межконтроллерного обмена Центрального Контроллера все остальные платы своего робота (ходовой, башни, аудио) одновременно. До того проверял только взаимодействие ЦК с башней. Пока без адресации (для использования адресного байта надо менять процедуру приема на 9 битную адресную во всех контроллерах), и проверил работу всех команд виртуального пульта с ними. Все работает без проблем. Впрочем, иначе и быть не могло. А ведь заметьте, все эти (плюс еще контроллер бамперов, общающийся только с ходовым, по SPI), - контроллеры работают в мультизадачном режиме, решая постоянно свои маленькие проблемы, - и в то же время нормально, без задержек, общаются в обе стороны с ЦК, а он, в свою очередь, через второй USORT - еще и с виртуальным пультом в компьютере (потом заменю ему шнурок радиоканалом, как по радиоканалу раньше общался с компом ходовой, пока не было центрального контроллера). Теперь, будет время - засуну все платы в корпус робота, соответственно сделав им нормальный крепеж, укорочу соединительные шнурки (сейчас примерно длиной по метру), и можно уже будет, наконец, заняться программированием поведения робота в целом. Навигацией, долговременным планировщиком, режимами исследования, охраны... В общем, делать из ЦК "мозги" для более - менее автономного его существования. Пусть руководит всем, получая изредка от компа лишь задачи общего типа. Хватит уже кусками отдельные функции тестировать, и так все работает. Хотя, конечно, процесс тестирования интересен сам по себе... |
||||||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 04.09.2012, 21:54 | |
|
dosykus, можно вас попросить убирать длинные куски кода под спойлер? Пожалуйста. Очень неудобно лазить взад/вперед.
0
|
|
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
||||
| 04.09.2012, 22:02 | ||||
Нет уж уважаемый, это рабочий кусок код из работающего проекта. И если компилятор микрапасксраля выкидывает такие фортеля как вы описываете - в топку его...
0
|
||||
|
SWK
|
||
| 04.09.2012, 22:17 | ||
Как всегда, пустой срач без обоснования. Какие "фортеля"? О чем это вы? А то читая таких как вы, кто-то и вправду усомнится в МикроПаскале. И будет разносить ваш срач по другим постам и форумам... Как я уже писал, у меня программа - не ваш клочок, помещающийся в одном банке. И компилятор делает все правильно, беря на себя заботу по ее размещению и коммутации банков. Это что ли вам не понравилось? А в вашем ("истинно правильном") С для PIC вы что, банки вручную переключаете? Лишь бы что-то сболтнуть... А там - пусть другие за вас обьясняют... |
||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
||
| 04.09.2012, 22:27 | ||
И если от размера кода программы распухает размер код функции , то кто виноват - кодописатель или компилятор ? Си прекрасно оперирует банками, и размер функции не вырастет, будь она одна в программе или в составе гигантского куска. Будь то однофайловый проект или мультифайловый . Так что это вы - что нибудь ляпнуть...
0
|
||
|
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
|
||||||
| 04.09.2012, 22:34 | ||||||
Здесь тема не про марсоходы-луноходы... ))))
Скрытая реклама незаконченного прототипа лунохода ""Бабай-1"??? ))))))))
Не обижайтесь... но вынужден констатировать... "Сизифов труд"... Всё это решаемо на одном жирном современном МК или ПЛИС...
0
|
||||||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|
| 04.09.2012, 22:38 | |
|
Собственно , SWK хватит флудить .
ТС пишет на С . Нашел правильный путь- слезает с аурдуньи. И ваш пример ему как коту пятая нога. Пусть дальше спрашивает, поможем чем сможем. Совет номер 1 - выкинуть на 877... ЗЫ, ТС если изобредаете часы , пишите в личку. Поделюсь идеей.
0
|
|
|
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
|
||
| 04.09.2012, 22:42 | ||
А если уж быть честным... я и СИ не всякие переношу... есть на то веские причины... Просто интересно знать... какой толк в теме с исходником на СИ... от Паскаля заточенного под роботов... в чём тайный смысл??? ))))))))))))
0
|
||
|
SWK
|
||
| 04.09.2012, 23:11 | ||
Что, в С - CASE, IF или FOR - иначе работают, что Сишникам их не понять? Или - begin и end - при замене их в С на фигурные скобки - приобретают какой - то сакральный смысл? По мне - так хоть на Алголе пишите, мне - то что? Нет, как увидят Паскаль - сразу на дыбы... Двойка в вузе по Паскалю была, что такие комплексы? Я дал конкретно свой вариант реализации записи в 595 регистры, и кусок реально работающего кода. Нет, налетели, развели опять треп ни о чем. Вместо того, чтобы просто выложить в качестве альтернативы свои куски кода, а не препираться по поводу Паскаля и моих методов. Все равно это ни украшает форум, ни повышает вашего статуса на нем в глазах участников. Люди же прекрасно видят, кто реально старается помочь, а кто просто флуд разводит, не показав еще ничего из своих наработок. Балтовня одна, да надувание щек для важности. |
||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|||||||
| 04.09.2012, 23:12 | |||||||
if (PORTCbits.RC0 == 1) { //Если нажата кнопка, выполняем блок PORTDbits.RD4 = 1; //Высокий уровень для записи в сдвиговый регистр SSPBUF = regZ; //Передает байт в регистр PORTDbits.RD4 = 0; //Низкий уровень для записи в сдвиговый регистр while (!BF); } } У вас ошибка. Защелку нужно дернуть после полной передачи . И защелка это не как CS у SPI slave устройств . Логика работы иная. Строб защелки это перезапись с сдвигового регистра на выходы.
Посмотрите на piclist... ЗЫ . Не лишним будет NOP между дерганьем вывода защелки. Для SWK это пустой звук,но это очень жесткие грабли. Читайте на тему ЧМЗ (RMW).
0
|
|||||||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|||||||||
| 04.09.2012, 23:19 | |||||||||
Посмотрите мой пост, там как раз реально рабочая реализация софтового SPI.
Ну посмотрите на себя со стороны. И спросим ТС, чем ему помог ваш "пример" ?
Да и мертвый он уже. Жалкие потуги со стороны дельфистов - один смех. Да и новичкам это не нужно, везде С в основном...
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
||
| 04.09.2012, 23:49 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
||
| 04.09.2012, 23:54 | ||
А выбор ТС уже сделал, и это С . А причем здесь 51 ??? Им хоть бы хны. Обратите внимание на PSoC от Cypress ..
0
|
||
| 04.09.2012, 23:54 | |
|
Помогаю со студенческими работами здесь
40
Сдвиговый регистр 595N и SPI STM32F1038 74hc595d*2 сдвиговый регистр по spi ШД, Сдвиговый регистр и МК Сдвиговый регистр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|