- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Master_Slave_Check();
if (CtrlBrd_Mode == 1) //MasterMode
{
SSPC_Check_Proc();
Read_ADC();
Logic();
RS_Enable();
Obmen_RS();
//CAN_Enable();
//Obmen_CAN();
//if (SoftFlag.Flag1.bit.History_Wr_Req)
//{
// SoftFlag.Flag1.bit.History_Wr_Req = 0;
// Write_History();
//}
HAL_IWDG_Refresh(&hiwdg); //Dog reset
Migalka(); //Working LED blink
}
else if (CtrlBrd_Mode == 0) //SlaveMode
{
Slave_DeInit();
while(1)
{
Master_Slave_Check();
if (CtrlBrd_Mode == 1) //если плата снова стала мастером, когда сдох основной мастер,
HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
HAL_IWDG_Refresh(&hiwdg); //Dog reset
Migalka();
}
}
}
/* USER CODE END WHILE */
}
Так реализовал параллельную работу двух одинаковых плат управления, одна из которых висит в режиме ожидания.
HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
Неужели только так можно перезагрузить контроллер? Вот x86, помнится, перезагружался через контроллер клавиатуры, но тут вроде бы должна быть соответствующая инструкция... ну или через while(1); // Укуси меня собака
(на x86 WDT не перезагружает процессор, а выдает сигнал на соответствующий выход, и если на плате он не разведен на Reset, то рестарт становится нетривиальной задачей...)
{
if ((Discrete1_State == 1) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
CtrlBrd_Mode = 1;
if ((Discrete1_State == 0) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
CtrlBrd_Mode = 0;
if ((Discrete1_State == 0) && ((Discrete2_State == 0) || (Discrete3_State == 0)))
CtrlBrd_Mode = 1;
}
//первый вход - просто перемычка, я сам задаю, кто мастер, а кто слэйв. Другие два входа нюхают выходы со второй платы.
//Не очень надежно, но другого пока не высрал)
Есть шанс, что после включения основной платы она сразу же станет мастером, а резервная плата узнает об этом только на следующей итерации.
> перемычка
1 - основная плата, 0 - резервная?
> выходы со второй платы
Единичка выставляется на эти выходы при старте контроллера и никогда не убирается. Ноль - обрыв провода или сдох контроллер?
Я правильно понял логику?
З.Ы. Что лежит в CtrlBrd_Mode изначально?
Ккй бгр )))
2) Приоритет определяется адресом: при передаче адреса происходит одновременный мониторинг шины, несовпадение переданного бита означает присутствие на шине устройства с бóльшим приоритетом.
3) Сражаются, пока один не отгрызет пенис другого
4) При возникновении коллизии запускается алгоритм определения (например, CSMA/CD: генерируется сигнал помехи, чтобы партнер тоже перешел в режим определения, затем после [квази]случайной задержки и отсутствии приема происходит повтор передачи)
Дык ардуина - это и есть атмега. Просто распаянная на плату и с готовыми железными и софтовыми модулями.
http://rw6ase.narod.ru/00/rk1/mrk2_8.jpg
Под них сложно мозг вывернуть... Но да, большинство практических задач они решают даже без кобенаторов.
Блин, на deathworld marathon пиздец какой-то. Начальные ресурсы прямо в упор к зергушатникам. Полчаса ныкался в ближайшем лесу. Отресёрчил турельки, построил парочку. С радости добавил ещё пару майнеров. Набежало штук 50 местных обитателей, кровь-кишки-гейм-овер. Какие тут логические цепи...
всегда так писал, проблем не было.
& - указывает на адрес объекта в памяти МК. Только так можно передавать структуру или массив в функцию и наоборот.
Вообще, это какие-то HAL-овские заморочки, в кококоторые я до конца не въехал. Начал осваивать данный МК месяц назад, ранее кокококодил под TI TMS320F280x и Миландровские камни.
* ISO C Standard: 7.16 Boolean type and values <stdbool.h>
*/
#ifndef _STDBOOL_H
#define _STDBOOL_H
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else /* __cplusplus */
/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
#endif /* __cplusplus */
/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined 1
#endif /* stdbool.h */