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

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

03.09.2012, 18:29. Показов 86810. Ответов 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
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
Цитата Сообщение от SWK
Но и утраивать без нужды время работы простой процедуры записи в регистр - смысла не вижу.
Говорим ни о чём... спорим ни о чём... в общем... весело живём... ))))))
Вы не видите смысла при решении своей задачи... и это понятно...
О задаче ТСа вообще ничего не известно... )))))))
Получается, что смысл вообще состоит в том, чтобы его не видеть... )))))))))))
0
SWK
04.09.2012, 18:53
Цитата Сообщение от kuvotdo
Получается, что смысл вообще состоит в том, чтобы его не видеть... )))))))))))
Смысл - не в том, что есть только белое или черное. Есть еще и масса полутонов. И то, что для одного уже кажется темным, для другого - еще достаточно светлое. И спорить об этом нечего. Каждый выбирает то, что его устраивает.

Для одного - стакан наполовину полон. Для другого - наполовину пуст... Чего спорить - то?
К сожалению, хватает еще фанатиков, цепляющихся к каждому слову и пытающихся из всего сделать проблему. Не нравится - не ешь. Чего спорить - то?
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
Цитата Сообщение от JikoKiy
А может быть это и не SPI никакой...
У стандартного SPI обычно используется сигнал SS, на котором мастер выставляет 0 до начала передачи и держит его до ее окончания. Конец 0 на SS приводит приемник SPI слэва в исходное состояние. И в стандартном SPI идет 2х сторонний обмен. Содержимое буферов мастера и ведомого побитно меняется местами. В конце передачи в мастере оказывается содержимое буфера слэва, и наоборот. Хотя иногда может использоваться и передача только в одну сторону, и не использоваться SS (или программно использоваться вместо него другой вывод).

Если у мастера SPI разрешена работа SS, то подачей на него "0" можно перевестьи его в режим слэва.

Ну, и еще есть всякие нюансы...
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
04.09.2012, 19:36
SWK Смотрите.
Причем все это можно оптимизировать без каких либо зверских ухищрений.
35 против ваших 100 , причем у вас вывод одного байта у меня 3 . На 4 МГЦ - 400мкс .
Причем у вас для заполнения всех 595 нужно трижды вызвать вашу "процедуру" а это значит время исполнения в 3 раза больше.
И не пойте о ваших мультизадачных потребностях . Ваш стиль и микрапасксраль убивают все эти ваши супер фичи...
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
#define DAT  PORTC.RC0
#define CLK  PORTC.RC1
#define LATCH  PORTC.RC2
#define CARRY STATUS.C
#define CLK_STROB  CLK=1;#asm NOP #endasm ; CLK=0;
#define LATCH_STROB  LATCH=1;#asm NOP #endasm ; LATCH=0;
#define OUT_PORT PORTC
 
int8 buff[3];
 
void send_74595(void)
{
int8 index;
int8 bit_count ;
int8 temp;
for(index=1;index<4;index++)
{
temp=buff[index];
for(bit_count=0;bit_count<7;bit_count++)
{
temp<<=1;
if(CARRY)DAT=1;
else DAT=0;
CLK_STROB
 
}
}
LATCH_STROB
}
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
20:                  void send_74595(void)
21:                  {
22:                  int8 index;
23:                  int8 bit_count ;
24:                  int8 temp;
25:                 for(index=1;index<4;index++)
004    3001     MOVLW 0x1
005    00A9     MOVWF 0x29
006    0829     MOVF 0x29, W
007    3C03     SUBLW 0x3
008    1C03     BTFSS 0x3, 0
009    2823     GOTO 0x23
26:                 {
27:                      temp=buff[index];
00A    3024     MOVLW 0x24
00B    0729     ADDWF 0x29, W
00C    0084     MOVWF 0x4
00D    1383     BCF 0x3, 0x7
00E    0800     MOVF 0, W
00F    00AB     MOVWF 0x2b
28:                  for(bit_count=0;bit_count<7;bit_count++)
010    01AA     CLRF 0x2a
011    082A     MOVF 0x2a, W
012    3C06     SUBLW 0x6
013    1C03     BTFSS 0x3, 0
014    2821     GOTO 0x21
29:                     {
30:                      temp<<=1;
015    1003     BCF 0x3, 0
016    0DAB     RLF 0x2b, F
31:                      if(CARRY)DAT=1;
017    1C03     BTFSS 0x3, 0
018    281B     GOTO 0x1b
019    1407     BSF 0x7, 0
32:                      else DAT=0;
01A    281C     GOTO 0x1c
01B    1007     BCF 0x7, 0
33:                      CLK_STROB
01C    1487     BSF 0x7, 0x1
01D    0000     NOP
01E    1087     BCF 0x7, 0x1
34:
35:                     }
01F    0AAA     INCF 0x2a, F
020    2811     GOTO 0x11
36:                   }
021    0AA9     INCF 0x29, F
022    2806     GOTO 0x6
37:                    LATCH_STROB
023    1507     BSF 0x7, 0x2
024    0000     NOP
025    1107     BCF 0x7, 0x2
38:                  }
026    118A     BCF 0xa, 0x3
027    2873     GOTO 0x73
39:
40:
Не верите Proteus, завтра выложу скрины лог.анализатора - которые вы не любите...


<Изображение удалено>

Сейчас мы услышим : Мне это не надо, пишу как мне нравится.
0
SWK
04.09.2012, 21:48
Цитата Сообщение от dosykus
SWK Смотрите.
Причем все это можно оптимизировать без каких либо зверских ухищрений.
35 против ваших 100 , причем у вас вывод одного байта у меня 3 . На 4 МГЦ - 400мкс .
Ну и что в результате вы получили?
У меня можно выбрать любой из 3х регистров для загрузки, вы же тупо каждый раз гоните все 3.

Причем у вас для заполнения всех 595 нужно трижды вызвать вашу "процедуру" а это значит время исполнения в 3 раза больше.
Я вообще пишу в них не так часто, чаще меняю просто отдельные биты. Включаю / выключаю питание видеокамеры, включаю/выключаю или меняю уровень ее подсветки. Управляю шаговиком наводки камеры по вертикали или приводом поворота башни. И прочее в том же духе. И чего ради каждый раз гонять все 3 байта, увеличивая втрое время на это?

Что толку, что у вас меньше байт. Время пересылки все равно втрое больше. А поскольку я меняю не все три регистра сразу, а отдельные биты в одном из них - так для смены данных по вашему варианту все равно придется вызывать эту процедуру ТРИ раза, отдельно для каждого регистра, когда надо поменять его значения.

А то и несколько раз писать в один и тот же (например, меняя по 4 бита фаз для шагового двигателя). Где же тут выигрыш? Трижды писать во все три регистра - вместо трех записей по одному? Этот ваш довод - совсем ни к месту.

35 против ваших 100
Так у вас нет выбора буферного регистра, все ноги - на одном порту, (и их 3, а у меня - 5), код и данные используют только по одному банку, соответственно нет переключения банков в коде. Но, как я уже писал, это только для учебных программ на макетке, когда кроме этого примера, в контроллере больше ничего нет. Сферический конь в вакууме.
Я тоже могу сделать программу из одной только процедуры записи регистров, и она тоже будет маленькой...

И не пойте о ваших мультизадачных потребностях . Ваш стиль и микрапаскраль убивают все эти ваши супер фичи...
Это вы о чем?
Как раз мой стиль - это правильное написание мультизадачных программ реального времени, а не отдельных демок в несколько строк. И он оправдал себя за 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
Цитата Сообщение от SWK
Что толку, что у вас меньше байт. Время пересылки все равно втрое больше. А поскольку я меняю не все три регистра сразу, а отдельные биты в одном из них - так для смены данных по вашему варианту все равно придется вызывать эту процедуру ТРИ раза, отдельно для каждого регистра, когда надо поменять его значения.
У меня все 3 записываются быстрее чем ваш один, и это что нет выигрыша ???

Цитата Сообщение от SWK
А то и несколько раз писать в один и тот же (например, меняя по 4 бита фаз для шагового двигателя). Где же тут выигрыш? Трижды писать во все три регистра - вместо трех записей по одному? Этот ваш довод - совсем ни к месту.
См. выше.
Цитата Сообщение от SWK
Так у вас нет выбора буферного регистра, все ноги - на одном порту, (и их 3, а у меня - 5), код и данные используют только по одному банку, соответственно нет переключения банков в коде. Но, как я уже писал, это только для учебных программ на макетке, когда кроме этого примера, в контроллере больше ничего нет. Сферический конь в вакууме.
Я тоже могу сделать программу из одной только процедуры записи регистров, и она тоже будет маленькой...
Гы... о...утельная отмазка. Кто прочитает ничего не поймет, зато SWK выйдет сухим.
Нет уж уважаемый, это рабочий кусок код из работающего проекта.
И если компилятор микрапасксраля выкидывает такие фортеля как вы описываете - в топку его...
0
SWK
04.09.2012, 22:17
Цитата Сообщение от dosykus
И если компилятор микрапасксраля выкидывает такие фортеля как вы описываете - в топку его...
Что вы имеете в виду?
Как всегда, пустой срач без обоснования. Какие "фортеля"? О чем это вы?
А то читая таких как вы, кто-то и вправду усомнится в МикроПаскале. И будет разносить ваш срач по другим постам и форумам...

Как я уже писал, у меня программа - не ваш клочок, помещающийся в одном банке.
И компилятор делает все правильно, беря на себя заботу по ее размещению и коммутации банков. Это что ли вам не понравилось? А в вашем ("истинно правильном") С для PIC вы что, банки вручную переключаете?

Лишь бы что-то сболтнуть... А там - пусть другие за вас обьясняют...
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
04.09.2012, 22:27
Цитата Сообщение от SWK
Лишь бы что-то сболтнуть... А там - пусть другие за вас обьясняют...
Ну так это ваш стиль, не находите ?
И если от размера кода программы распухает размер код функции , то кто виноват - кодописатель или компилятор ?
Си прекрасно оперирует банками, и размер функции не вырастет, будь она одна в программе или в составе гигантского куска.
Будь то однофайловый проект или мультифайловый .
Так что это вы - что нибудь ляпнуть...
0
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 49
04.09.2012, 22:34
Цитата Сообщение от SWK
Этот ваш довод - совсем ни к месту.
Какому месту??? )))))))))
Здесь тема не про марсоходы-луноходы... ))))
Это вы о чем?
Как раз мой стиль - это правильное написание мультизадачных программ реального времени, а не отдельных демок в несколько строк. И он оправдал себя за 30 лет его использования.
И, как вы могли бы (если захотели), видеть по приложенному мной листингу, компилятор не добавил ни одного лишнего байта без особой на то необходимости.
Сохранив при этом максимум универсальности. Любые ноги любых портов, размещение буферов где угодно, использование без проблем любого числа загружаемых регистров.
PIC16C57 RTOS Reotyty Show... )))))))))))))))))
А ведь заметьте, все эти (плюс еще контроллер бамперов, общающийся только с ходовым, по SPI), - контроллеры работают в мультизадачном режиме, решая постоянно свои маленькие проблемы, - и в то же время нормально, без задержек, общаются в обе стороны с ЦК, а он, в свою очередь, через второй USORT - еще и с виртуальным пультом в компьютере (потом заменю ему шнурок радиоканалом, как по радиоканалу раньше общался с компом ходовой, пока не было центрального контроллера).
Неа... "не взлетит"... )))))))))))
Теперь, будет время - засуну все платы в корпус робота, соответственно сделав им нормальный крепеж, укорочу соединительные шнурки (сейчас примерно длиной по метру), и можно уже будет, наконец, заняться программированием поведения робота в целом. Навигацией, долговременным планировщиком, режимами исследования, охраны... В общем, делать из ЦК "мозги" для более - менее автономного его существования. Пусть руководит всем, получая изредка от компа лишь задачи общего типа.
"А мужики то думали..."... ))))))))))
Скрытая реклама незаконченного прототипа лунохода ""Бабай-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
Цитата Сообщение от SWK
И компилятор делает все правильно, беря на себя заботу по ее размещению и коммутации банков. Это что ли вам не понравилось? А в вашем ("истинно правильном") С для PIC вы что, банки вручную переключаете?
Да нравится вам Паскаль... ну и ладно... )))))))))
А если уж быть честным... я и СИ не всякие переношу... есть на то веские причины...
Просто интересно знать... какой толк в теме с исходником на СИ... от Паскаля заточенного под роботов... в чём тайный смысл??? ))))))))))))
0
SWK
04.09.2012, 23:11
Цитата Сообщение от kuvotdo
Просто интересно знать... какой толк в теме с исходником на СИ... от Паскаля заточенного под роботов... в чём тайный смысл??? ))))))))))))
А в чем смысл вашего трепа на пару страниц, затеянного вами с досикусом, да еще и ваша аллергия на Паскаль...

Что, в С - CASE, IF или FOR - иначе работают, что Сишникам их не понять? Или - begin и end - при замене их в С на фигурные скобки - приобретают какой - то сакральный смысл?

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

Я дал конкретно свой вариант реализации записи в 595 регистры, и кусок реально работающего кода. Нет, налетели, развели опять треп ни о чем. Вместо того, чтобы просто выложить в качестве альтернативы свои куски кода, а не препираться по поводу Паскаля и моих методов. Все равно это ни украшает форум, ни повышает вашего статуса на нем в глазах участников.

Люди же прекрасно видят, кто реально старается помочь, а кто просто флуд разводит, не показав еще ничего из своих наработок. Балтовня одна, да надувание щек для важности.
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
04.09.2012, 23:12
Цитата Сообщение от JikoKiy
Код:
while (1) {

if (PORTCbits.RC0 == 1) { //Если нажата кнопка, выполняем блок

PORTDbits.RD4 = 1; //Высокий уровень для записи в сдвиговый регистр
SSPBUF = regZ; //Передает байт в регистр
PORTDbits.RD4 = 0; //Низкий уровень для записи в сдвиговый регистр

while (!BF);
}

}

У вас ошибка. Защелку нужно дернуть после полной передачи .
И защелка это не как CS у SPI slave устройств . Логика работы иная.
Строб защелки это перезапись с сдвигового регистра на выходы.

Code
1
2
3
4
SSPBUF = regZ; //Передает байт в регистр
while (!BF);
PORTDbits.RD4 = 1; //Высокий уровень для записи в сдвиговый регистр
PORTDbits.RD4 = 0; //Низкий уровень для записи в сдвиговый регистр
На счет задержки. В старом Hi Tech были макросы в примерах . В новом не знаю , надо рыть.
Посмотрите на piclist...

ЗЫ . Не лишним будет NOP между дерганьем вывода защелки.
Для SWK это пустой звук,но это очень жесткие грабли. Читайте на тему ЧМЗ (RMW).
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
04.09.2012, 23:19
Цитата Сообщение от SWK
Я дал конкретно свой вариант реализации записи в 595 регистры, и кусок реально работающего кода. Нет, налетели, развели опять треп ни о чем. Вместо того, чтобы просто выложить в качестве альтернативы свои куски кода, а не препираться по поводу Паскаля и моих методов.
Уважаемый, это очень нехорошая тенденция видеть только свои посты как значимые.
Посмотрите мой пост, там как раз реально рабочая реализация софтового SPI.

Цитата Сообщение от SWK
Все равно это ни украшает форум, ни повышает вашего статуса на нем в глазах участников.
На статус нам фиолетово, мы не кармодрочеры.

Цитата Сообщение от SWK
Люди же прекрасно видят, кто реально старается помочь, а кто просто флуд разводит, не показав еще ничего из своих наработок. Балтовня одна, да надувание щек для важности.
Ну почему вы так уверены, что все это не ваше ???
Ну посмотрите на себя со стороны.
И спросим ТС, чем ему помог ваш "пример" ?
Code
1
По мне - так хоть на Алголе пишите, мне - то что? Нет, как увидят Паскаль - сразу на дыбы... Двойка в вузе по Паскалю была, что такие комплексы?
Мне по барабану, могу и на паскале. Вот только реализация у Микроелектроники гавно.
Да и мертвый он уже. Жалкие потуги со стороны дельфистов - один смех.
Да и новичкам это не нужно, везде С в основном...
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
04.09.2012, 23:49
Цитата Сообщение от dosykus
Мне по барабану, могу и на паскале. Вот только реализация у Микроелектроники гавно.
Да и мертвый он уже. Жалкие потуги со стороны дельфистов - один смех.
Да и новичкам это не нужно, везде С в основном...
Ну батенька, это вы зря. Никак не могут закопать С51, а тут вы взялись закапывать Паскаль. Нужно, не нужно, человек выберет сам.
0
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
04.09.2012, 23:54
Цитата Сообщение от omokost
а тут вы взялись закапывать Паскаль. Нужно, не нужно, человек выберет сам.
Однако вы невнимательны. Это именно SWK навязывает Паскаль. Как еще можно назвать выкладывание им примера ?
А выбор ТС уже сделал, и это С .
А причем здесь 51 ??? Им хоть бы хны. Обратите внимание на PSoC от Cypress ..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2012, 23:54
Помогаю со студенческими работами здесь

Что такое регистр 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 прочитал эту статью, и у...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru