Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/443: Рейтинг темы: голосов - 443, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37

PIC, SPI и сдвиговый регистр.

03.09.2012, 18:29. Показов 87260. Ответов 115
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые гуру!
Настал для меня период слезть с ардуино и перейти на следующий уровень общений с МК. К тому же понадобилось перепрошить одну девайсину на PIC16F877.
Как нельзя лучше, пришлась среда разработки для PIC под разные платформы, в частности под Mac я запустил все без проблем.
Hello world в виде морганий светодиода и считываний кнопки вроде проблем не вызвали, однако этап освоения SPI поставил в тупик, в связи с чем прошу у вас помощи.

Написал небольшой код, который по нажатию кнопки должен отправить данные по SPI в сдвиговый регистр 74HC595:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <pic16f877.h>
#include <stdyo.h>
#include <stdlib.h>
#include <htc.h>
 
int main() {
 
ADCON1 = 0x06; //Порт А будет работать как цифровой вход-выход
 
SSPEN = 1; //Бит включения SPI
SMP = 1; //Фаза выборки бита, опрос входа в конце выборки данных
CKP = 1; //Полярность тактового сигнала
CKE = 1; //Определение фронта, по которому будут передаваться данные
 
SSPM3 = 0; //0000 тактовый сигнал SPI будет работать от 1/4 скорости процессора
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;
 
TRISC0 = 1; //C0 как вход, для тактовой кнопки
TRISC3 = 0; //C3  SCK ведущий режим
TRISC5 = 0; //C5  SDO
TRISA5 = 0; //A5 SS линия
 
TRISD = 0x00; //Порт D как выход
PORTD = 0x00; //Низкий уровень на весь порт D
 
//Цикл программы
while (1) {
 
if (PORTCbits.RC0 == 1) { //Если нажата кнопка, выполняем блок
PORTDbits.RD4 = 1; //Высокий уровень для записи в сдвиговый регистр
SSPBUF = 0b00001111; //Передает байт в регистр
PORTDbits.RD4 = 0; //Низкий уровень для записи в сдвиговый регистр
}
 
}
 
}
Программу я решил постестить в виртуальной машине, в программе Proteus (Штука мне показалась весьма глючная, постоянно виснет при симуляциях, хотя может руки у меня кривые), в связи с чем создал схему и залил туда свой HEX.
Первоночальный запуск происходит как надо, кнопка отрабатывает как и задумано, в первых 4х регистрах высокий уровень, в остальных низкий.

<Изображение удалено>
Однако нажимая кнопку несколько раз, наблюдается смещение регистров, хотя каждый раз посылается по 8 бит...

<Изображение удалено>
В связи с этим вопрос, что в данной программе не так? Возможно по окончанию передачи нужно записывать еще какой то служебный бит что мы закончили?
И должен ли на выходе SCK высокий уровень, если мы ничего не передаем, в случае работы с 595?
Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2012, 18:29
Ответы с готовыми решениями:

Сдвиговый регистр без микроконтроллера
Добрый день, на работе грузчики притащили два огромных сегментных индикатора с азс, попросили как нибудь им его приспособить типа лампочки,...

Программный SPI для PIC
объясните пожалуйста реализацию SPI-интерфейса(передача 16 бит) для простейшего pic(12 серия), в котором нет аппаратного SPI. На языке C.

[VHDL] ПЛИС длинный сдвиговый регистр с параллельной загрузкой
Подтолкните в нужную сторону, никак не могу сообразить. С одной стороны поступают байты по 8-разрядной шине. Динные выдает контроллер...

115
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
05.09.2012, 01:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JikoKiy
Написал небольшой код, который по нажатию кнопки должен отправить данные по SPI в сдвиговый регистр 74HC595:
Код:
ADCON1 = 0x06; //Порт А будет работать как цифровой вход-выход

SSPEN = 1; //Бит включения SPI
SMP = 1; //Фаза выборки бита, опрос входа в конце выборки данных
CKP = 1; //Полярность тактового сигнала
CKE = 1; //Определение фронта, по которому будут передаваться данные

SSPM3 = 0; //0000 тактовый сигнал SPI будет работать от 1/4 скорости процессора
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;

TRISC0 = 1; //C0 как вход, для тактовой кнопки
TRISC3 = 0; //C3 SCK ведущий режим
TRISC5 = 0; //C5 SDO
TRISA5 = 0; //A5 SS линия

TRISD = 0x00; //Порт D как выход
PORTD = 0x00; //Низкий уровень на весь порт D

Начинаем с азов... инициализация МК...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    ADCON1 = 0x06; //Порт А будет работать как цифровой вход-выход
 
// Настраиваем PORTD в первую очередь, им управляется защёлка
 
TRISD = 0x00; //Порт D как выход
PORTD = 0x00; //Низкий уровень на весь порт D
 
// Настраиваем остальные порты
 
TRISC0 = 1; //C0 как вход, для тактовой кнопки
TRISC3 = 0; //C3  SCK ведущий режим
TRISC5 = 0; //C5  SDO
TRISA5 = 0; //A5 SS линия
 
// Настраиваем периферию... SPI
 
SMP = 1; //Фаза выборки бита, опрос входа в конце выборки данных
CKP = 1; //Полярность тактового сигнала
CKE = 1; //Определение фронта, по которому будут передаваться данные
 
SSPM3 = 0; //0000 тактовый сигнал SPI будет работать от 1/4 скорости процессора
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;
 
// Разрешаем работу SPI после полной настройки
 
SSPEN = 1; //Бит включения SPI
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
05.09.2012, 01:35
kuvotdo, ну устал же просить, убирайте длинный код под спойлер, тяжело ползать взад/вперед.
0
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
05.09.2012, 11:49
kuvotdo, а в чем разница порядка инициализации? Я в даташите вроде бы не нашел никаких данных про это. И в таком случае, где я должен объявлять прерывания? Это очень важная информация, я думаю что нужно собрать статью на эту тему, для таких ламеров как я это бы сильно упростило жизнь и приблизило к понимаю происходящих процессов.
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
05.09.2012, 17:39
Цитата Сообщение от JikoKiy
Залью с утра,
??????
0
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
05.09.2012, 18:37
Так я ж спросил, что конкретно залить, протеус или проект в исходниках? Выкладываю оба.
https://dl.dropbox.com/u/25702... %20SPI.zip - Протеус
https://dl.dropbox.com/u/25702... scan.X.zip - Исходники
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
05.09.2012, 19:01
JikoKiy, проект Proteusа - *.dsn и ваш исходник вместе с *.coff ....
0
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
05.09.2012, 20:09
https://dl.dropbox.com/u/25702578/SPI%20test.zip
Вот. Положил оба файла.
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
05.09.2012, 20:37
JikoKiy, Вы используете MPLABX , там все еще сырое .
Да и coff им генерируемый Proteus не видит...

ЗЫ. Не прав. Сейчас поставил MPLABX свежий и компилятор XC8. Все видится и работает .
Правда с шрифтами косяк. Почему я и не пишу комменты на кириллице...
картинко
<Изображение удалено>
0
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
05.09.2012, 23:37
То есть мой cof не видит, а точно такой же под другой платформой видит?
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
06.09.2012, 01:26
Цитата Сообщение от JikoKiy
То есть мой cof не видит, а точно такой же под другой платформой видит?
Нет и ваш видит , все работает. У меня 7.8 SP2 .
0
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 37
06.09.2012, 11:46
А у меня 7.10, наверняка в этом проблема. Сейчас попробую вашу версию.

Не помогло, явно что то делаю не так, наставте на путь истиный пожалуйста.
Жму паузу, в меню выбираю source code, и получаю пусто:

<Изображение удалено>
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
08.09.2012, 01:22
Попробуйте все пихнуть в одну папку и Proteusa файлы и исходник с coff.
В той же папке собрать.
На MACe еще не пробовал , ибо нету...
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
08.09.2012, 05:54
Цитата Сообщение от dosykus
ЗЫ . Не лишним будет NOP между дерганьем вывода защелки.
Для SWK это пустой звук,но это очень жесткие грабли. Читайте на тему ЧМЗ (RMW).
Описали бы в двух словах, в чем проблема-то?
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
08.09.2012, 10:41
Цитата Сообщение от btymdmom
Цитата Сообщение от dosykus
ЗЫ . Не лишним будет NOP между дерганьем вывода защелки.
Для SWK это пустой звук,но это очень жесткие грабли. Читайте на тему ЧМЗ (RMW).
Описали бы в двух словах, в чем проблема-то?

В двух словах :
Запись в порт происходит по схеме Read ->Modify->Write.
Так как в 16х нет защелки порта, при последовательной записи бит в порт ,
в определенной ситуации, уровень на пине установиться не успевает ...
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
08.09.2012, 10:56
Понятно. Спасибо

В заголовке темы PIC, в посте SWK написано что код для PIC, а я про AVR думаю
0
SWK
08.09.2012, 11:41
Цитата Сообщение от dosykus
Так как в 16х нет защелки порта...
????????????????? Читайте даташит.


И аналогично на всех осталных портах.
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
08.09.2012, 12:22
Приехали!!! ))))
Или вы издеваетесь??? ))))))))))))))))
Тогда попробуйте прочитать состояние защёлки порта... что... не получается??? ))))
Читаться то один фиг будет реальное состояние пина, а не защёлки... в отличие от 18-ых и 24-ых...))))
В этом-то и вся суть RMW... ))))))))
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
08.09.2012, 12:44
Цитата Сообщение от SWK
Цитата Сообщение от dosykus
Так как в 16х нет защелки порта...
????????????????? Читайте даташит.

Гы... SWK, я и не знал что все так запущенно .
Вы получаетесь последний из "могикан" , даже "птичья стая пастера" осознала RMW...
Параграф 9.10 учить наизусть :
http://ww1.microchip.com/downtoods/en/d ... 31009a.pdf
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
08.09.2012, 12:50
Цитата Сообщение от dosykus
Так как в 16х нет защелки порта,
Поправлю что бы не придирались : нет чтения защелки .
0
SWK
08.09.2012, 14:08
Цитата Сообщение от kuvotdo
Приехали!!! ))))
Или вы издеваетесь??? ))))))))))))))))
Тогда попробуйте прочитать состояние защёлки порта... что... не получается??? ))))
Читаться то один фиг будет реальное состояние пина, а не защёлки... в отличие от 18-ых и 24-ых...))))
Ну вот, завертелся, как на конце шкурка...

Вы - то писали, что НЕТ защелки. А что чтение идет непосредственно из порта (что вполне логично, и не только в PIC), - так это только для вас - откровение. Читается именно состояние ног, что толку читать защелку, которая определяет лишь состояние ног, назначенных на вывод?
В этом-то и вся суть RMW... ))))))))
Если вы имеете в виду вот это:




То это такая элементарщина, о которой лишний раз и упоминать - то не стоит. Просто это должно сидеть на уровне подсознания, и учитываться при проектировании, как и куча других мелочей. При моем более чем 40 летнем опыте занятий цифровой электроникой, напоминать мне о таких вещах - только пацан может, впервые о них прочитавший.
И я при отладке всегда проверяю форму и длительность стробов, особенно их фронты. И уж никогда они у меня не затянутся на 4 такта, как показано на рисунке. Если же его длина меньше такта (62,5 нс при 16 МГц), то про упомянутую проблему можете и не вспоминать.
И минимальную длительность строба в программе я заложил тоже намерянно. Если бы при отладке обнаружилась нестабильность или затянутость фронтов стробов, то вставить пустые команды между сменой состояния ног - ничего не стоило. Но все прекрасно работает и так, как и планировалось.

У меня - всегда все работает, даже неинтересно...

Но тем не менее, после изготовления очередной платы, я все тщательно проверяю. Не для перестраховки. Просто надежность - для меня всегда стояла высшим приоритетом.

Цитата Сообщение от dosykus
Гы... SWK, я и не знал что все так запущенно .
Вы получаетесь последний из "могикан" , даже "птичья стая пастера" осознала RMW...
Если вы постоянно на этом ловитесь - мне вас жаль... Действительно, как все у вас запущено...

Ну, я - то - не из вашей стаи, (нахватавшейся верхушек и всяких аббревиатур), к моему великому счастью.

Я знаю суть вещей, и мне этого достаточно. И мне пофигу, какими буквами очередной пацан их окрестит. Но чтобы вас разочаровать - я сразу понял, о чем речь. А Челябинский Моторный помянул просто, чтобы посмеяться над очередным выскочкой - Моськой. Если вы еще этого не поняли... И не мочите штаны от радости - повода нет.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2012, 14:08

Что такое регистр F в PIC-овском Assembler?
Здорово, всем. Что такое регистр F в PIC-овском Assembler? Т.е. это просто свободная ячейка ОЗУ?

Сдвиговый регистр 595N и SPI
Хотел бы запустить сабж с SPI для управления семисегментниками, да ещё с реализацией возможности подключать последовательно несколько таких...

STM32F1038 74hc595d*2 сдвиговый регистр по spi
Имеется ARM-PLC контроллер на stm32f103c8 https://plus.google.com/photos/10591585 ... 1263983601 У него есть 8 релейных выходов,...

ШД, Сдвиговый регистр и МК
Идея состоит в чём?! Есть Tiny13A, есть 155ир13, есть mosfit ы(либо транзисторы) допустим irf540n, униполярный ШД. Хотел намутить мини...

Сдвиговый регистр
http://iosyitistromyss.ru/sdvygovyj-registr.html http://iosyitistromyss.ru/img/storters/rikystir.GIF прочитал эту статью, и у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru