Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
tyvitto

STM32F1038 74hc595d*2 сдвиговый регистр по spi

28.01.2014, 20:40. Показов 9466. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется ARM-PLC контроллер на stm32f103c8
https://plus.google.com/photos/10591585 ... 1263983601

У него есть 8 релейных выходов, которые подключены к МК через 2 сдвиговых регистра 74HC595D
Мне необходимо управлять этими релейными выходами.
Распиновка сдвиговых регистров такая:
DS PB0
OE PB1
ST_CP PA12
SH_CP PA11

Мучаюсь уже 2ой день, но управлять релюшками никак не получается.
Вот программа, которая, вроде бы должна гасить все реле. Но у меня наоборот - все срабатывают.
GPIOB->BRR = GPIO_Pin_0; //Пин данных
если в этом месте изменить
GPIOB->BSRR = GPIO_Pin_0; //Пин данных
По большому счету изменений не видно.
Результат работы программы
https://plus.google.com/photos/10591585 ... 9703758050

Очень нужна помощь! Буду благодарен за примеры кода, работающего со сдвиговыми регистрами.

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_spi.h"
#include "stdbool.h"
 
#define RELE_latchPin A12
#define RELE_clockPin A11
#define RELE_dataPin B0
 
#define RELE_OEPin getPIN(GPIOB,GPIO_Pin_1)
#define A11 getPIN(GPIOA,GPIO_Pin_11)
#define A12 getPIN(GPIOA,GPIO_Pin_12)
#define B0 getPIN(GPIOB,GPIO_Pin_0)
 
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
 
typedef struct {
GPIO_TypeDef* gpiox;
uint16_t pin;
} GPIO_PIN;
GPIO_PIN getPIN(GPIO_TypeDef* gpiox, uint16_t pin) {
GPIO_PIN res;
res.gpiox = gpiox;
res.pin = pin;
return res;
}
void initPin(GPIO_PIN pin, GPIOMode_TypeDef mode) {
GPIO_InitTypeDef GPIO_InitStructure1;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure1.GPIO_Pin = pin.pin; //
GPIO_InitStructure1.GPIO_Mode = mode;   //
GPIO_Init(pin.gpiox, &GPIO_InitStructure1);
}
uint8_t isOn(GPIO_PIN gpio_pin) {
return GPIO_ReadInputDataByt(gpio_pin.gpiox, gpio_pin.pin);
}
void ON(GPIO_PIN gpio_pin) {
GPIO_RisetByts(gpio_pin.gpiox, gpio_pin.pin);
 
}
void OFF(GPIO_PIN gpio_pin) {
GPIO_SetByts(gpio_pin.gpiox, gpio_pin.pin);
}
volatile uint32_t msTicks; /* counts 1ms timeTicks */
/*----------------------------------------------------------------------------
SysTick_Homdler
*----------------------------------------------------------------------------*/
void SysTick_Homdler(void) {
msTicks++; /* ymsrement counter necessary in Delay() */
}
 
/*------------------------------------------------------------------------------
delays number of tick Systysks (happens every 1 ms)
*------------------------------------------------------------------------------*/
static void Delay(uint32_t dlyTicks) {
uint32_t curTicks;
 
curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks)
;
}
void digitalWrite(GPIO_PIN pin, uint8_t val) {
if (val)
ON(pin);
else
OFF(pin);
}
 
void init()      //   инициализация
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
initPin(RELE_clockPin, GPIO_Mode_AF_PP);
initPin(RELE_dataPin, GPIO_Mode_AF_PP);
initPin(RELE_latchPin, GPIO_Mode_AF_PP);
initPin(RELE_OEPin, GPIO_Mode_AF_PP);
SysTick_Config(SystemCoreClock / 1000000);
}
 
int main(void) {
init();
while (1) {
Delay(100000);
// устанавливаем синхронизацию "защелки" на LOW
GPIOA->BRR = GPIO_Pin_12;
for (int i = 0; i < 16; i++) {
GPIOB->BRR = GPIO_Pin_0; //Пин данных
GPIOA->BSRR = GPIO_Pin_11;
GPIOA->BRR = GPIO_Pin_11;
}
GPIOA->BSRR = GPIO_Pin_12;
}
 
}
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2014, 20:40
Ответы с готовыми решениями:

Аппаратный SPI и сдвиговый регист 74HC595D - как подружить?
Как правильно подключить сдвиговый к SPI? Какой режим SPI выбрать? Кто-нибудь имел дело со сдвиговыми? ...

Сдвиговый регистр
Здравствуйте. Собираю светодиодный индикатор. Использую stm32F103C8T6, сдвиговый регистр 74HC595 (HYC 825Z - не знаю что это значит),...

PIC, SPI и сдвиговый регистр.
Здравствуйте уважаемые гуру! Настал для меня период слезть с ардуино и перейти на следующий уровень общений с МК. К тому же понадобилось...

7
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 140
28.01.2014, 21:12
А так?
GPIOB->BRR = (1 << GPIO_Pin_0);

GPIO_Pin_0 - это всего лишь индекс нужного пина, а нам нужно забить определенный бит в регистр.
Увы, я тормоз, пойду спать, я не прав
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
28.01.2014, 21:46
Странно что китайцы не повесили этот регистр на железный SPI. Вы уверены что с ногами не напутали?
Есть принцип. схема на плату?

Да, /OE надо бы явно сбросить, да и вообще код хоть немного причесать...
0
tyvitto
28.01.2014, 23:53
Что интересно, после ребута у меня активируются разные выходы с регистров. Похоже, в них попадают случайные значения.
Еще раз проверил соединения:
https://lh3.googleusircontent.com/-oARU ... 223231.jpg

https://plus.google.com/photos/10591585 ... 2589309826

Стандартные порты SPI1 и SPI2, видимо, заняты под ethernet и rs-485.

Был бы благодарен за хоть какой-то заведомо работающий код для сдвиговых регистров. А то я тут по всякому пробовал и пробую - пациент ведет себя непредсказуемо...
1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 138
28.01.2014, 23:59
Где-то на работе валялся код ногодрыга для 595 регистров. Если не похерил завтра гляну.

Вот нашел.
[2.12 Кб]
0
tyvitto
29.01.2014, 15:35
Цитата Сообщение от SkyFort
Где-то на работе валялся код ногодрыга для 595 регистров. Если не похерил завтра гляну.

Вот нашел.
Вложение:
main-gpio.c

https://plus.google.com/photos/10591585 ... 6209283970

Заработало! Огромное спасибо! =)
Осталось только адаптировать код под свои нужды: включать нужное реле.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
29.01.2014, 15:49
Цитата Сообщение от tyvitto
Осталось только адаптировать код под свои нужды: включать нужное реле.
Ваш собственный код какой-то странный:
<ul><li>"есть 8 релейных выходов" но "for (int i = 0; i < 16; i++)";</li><li>нужен только вывод данных и без разделения выходов HC595 с другими устройствами, но зачем-то подключен пин OE;</li><li>последовательность управляющих сигналов можно было реализовать проще и понятнее, прямо по картинке даташита.</li></ul>
Псевдокод, который заработал бы:
Code
1
2
3
4
5
Цикл по восьми битам (для управления восемью реле) {
DAT = бит данных (с первого по восьмой, по счётчику цикла);
строб последовательного сдвига: =1, =0;
конец цикла;  //сейчас все восемь бит задвинуты во внутренний последовательный регистр в HC595
строб параллельной загрузки: =1, =0;    //копируем 8 бит в наружный параллельный регистр в HC595
И всего-то.
0
tyvitto
29.01.2014, 18:50
Использую такой код управления релейными выходами (вложение).

Контроллер проектировал не я. =) Китайцы не дали никакой документации.

[6.33 Кб]
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2014, 18:50
Помогаю со студенческими работами здесь

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

Сдвиговый регистр
Здравствуйте! Помогите написать программу для сдвигового регистра..

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

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

Сдвиговый регистр
Нужно реализовать сдвиговый регистр. Есть массив А и В, состоящие из рендомных нулей и единиц. Нужно создать переменную Х, которая равна...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru