Система доступа на Atmega1280 + совмещение загрузчика и прошивки в одном проекте.

Вот в этой статье шла речь о том, как совместить прошивку для микроконтроллера с загрузчиком. Ибо при прошивании МК через программатор, загрузчик затирается. А надо чтоб этого не происходило. Об этом и немного другом пойдет речь.

Итак есть вот такое самодельное устройство.



Это контроллер доступа в здание. С левой стороны подключаются 24 вот таких считывателя на расстоянии до 300 метров.


Считыватели работают с вот такими ключами по протоколу Wigand 26.


С правой стороны контроллера можно подключить 24 реле, которые управляют замками в дверях. Когда выход включил реле, то на плате загорается соответствующий зеленый светодиод. Удобно для визуализации процесса. Входы к которым подключены считыватели защищены мощнецкими супрессорами.


На дисплей контроллера выводится различная текущая информация. Например текущее время, номер считываемого ключа и пр.


Ядром контроллера является стоногая Atmega1280 со 128кб флеша на борту 8кб SRAMA и 4кб EEPROMA. Неплохо, разогнаться можно.



ИНТЕРФЕЙСЫ ДЛЯ ОБЩЕНИЯ С ВНЕШНИМ МИРОМ

Вот они.


Как видим есть USB порт. Прямо в плату я встроил вот такой высокоскоростной USB программатор. А что делать, как никак 128 кило флеша. Надо шить быстро и реактивно. Да и деталей в этом программаторе особо и нету.


Так же вывел два СОМ порта. Хотя у этого микроконтроллера их 4. Но мне хватит двух. Через один COM порт контроллер общается с центральной системой управления зданием. Считывается текущее время и другая служебная информация. А через другой COM происходит загрузка данных об обновленных ключах, с помощью встроенного загрузчика в Atmega. Это делает человек сидящий в офисе находящийся очень далеко от контроллера. Ну и через этот же порт контроллер скидывает инфо наверх о происходящих событиях с ключами. Ну вот вкратце о железе все. В итоге отладка и написание прошивки выглядели как то так.


СБОРКА КОНТРОЛЛЕРА.
Паял все вручную. Собрал три таких контроллера. Один будет работать, а два других будут лежать в коробочке. Впрочем их все можно при необходимости подключить в один шлейф по RS485. Но пока в этом нет необходимости. Кстати о пайке. Я всегда паял глицерином купленным в аптеке. Паял себе и паял и был очень доволен. Но однажды в один прекрасный день в магазе я увидел «Глицерин гидразин». Непонял — подумал я, «что за гадость»? И купил себе флакончик за 40 руб. Когда стал паять, то приятно удивился. Паять им намного лучше чем обычным глицерином. Он лучше обтекает место пайки, само олово лучше схватывается и обтекает спаиваемое место. Никаких шлаков, соплей, грязи. Получается все чистое и аккуратное. В итоге пайка просто брутальная the best of tne best (лучшая из лучших). Смывается все обычной водой. Ненужен ни спирт ни ацетон. В общем очень настоятельно рекомендую паяльщикам-глицеринщикам перейти на данный элексир. Ну и паяю я всегда безканифольным ПОС61. На радостях ломанулся в магаз прикупить еще пару бутылечков и очень сильно обломался, уже все разобрали, другой химии вагон, а глицерин разобрали. Осталась только литровая бутылка на прилавке. Пришлось купить 1литр сразу. Хватит на 200 лет. Мало ли куда еще его можно применить. Например перед сном в глаза закапывать для лучшего зрения. (шутка конечно, а то вдруг ктонить и вправду закапает).


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

ЗАГРУЗЧИК.
Сидел вот думал, какой бы выбрать загрузчик для своего самопала. Посмотрел статью товарища тракториста о загрузчиках. Сперва побаловался с этим немецким загрузчиком. Вроде запустил, вроде работает, но как то криво. То загрузит прошивку и все вроде пучком. А бывает загрузит, а она не стартует. Колупался, колупался в итоге заколупался. Кинул. Взялся колупать китайский загрузчик. И сразу все пошло как по маслу. Просто чики-пуки. Ну и на нем остановился. А раз остановился, значит немного о нем расскажу. Сей загрузчик поддерживает интерфейсы полнодуплексный RS232(15 м), RS422(1200 м. четырех проводной), полудуплексный RS485(1200 м. двух проводной).

Наш товарищ китаец написал его в AVRstudio4, а я как бы уже давно распрощался с этой версией. Давно уже подсел на Atmelstudio6. Скачал я его проект и выдрал оттуда исходный код. Создал проект в Atmelstudio6 для Atmega1280. Слил туда его исходники. Проект если что в топике. Сам загрузчик состоит из 5 файлов, bootldr.h, bootldr.c, bootcfg.h, aes.c, pc1crypt.c. Основной файл для настроек это bootcfg.h. Другие файлы особо не нужны и туда можно даже не нырять, но я все равно нырял.

Вот он bootcfg.h.
#ifndef _BOOTCFG_H_
#define _BOOTCFG_H_        1

//define uart buffer's length размер буффера.
#define BUFFERSIZE         128

//system clock(Hz) частота кварца в герцах
#ifndef F_CPU
#define F_CPU              14745600UL
#endif

//baudrate скорость USART
#define BAUDRATE           115200UL

/*Boot section start address(byte)
define BootStart to 0 will disable this function
Адрес загрузочной секции 2 * word/ адрес указывается в байтах. 
Для Atmega1280 
1.  512 words начало секции - 0xFE00, конец - FFFF.
2. 1024 words начало секции - 0xFC00, конец - FFFF.
3. 2048 words начало секции - 0xF800, конец - FFFF.
4. 4096 words начало секции - 0xF000, конец - FFFF.*/
#define BootStart          2 * 0xFC00

/*verify flash's data while write
ChipCheck will only take effect while BootStart enable also
Проверка записи данных во флэш память, этот параметр работает 
только если используется параметр BootStart*/
#define ChipCheck          1

/*In SafeMode, it will not jump to user application till update successfully
Включение безопасного режима, будет установлен флаг в EEPROM. При этом не 
произойдет переход к основной программе пока прошивка не будет успешно обновлена.*/
#define SafeMode           1

/*In SafeMode, it will set a flag in EEPROM
В режиме SafeMode установится флаг в EEPROM*/
#define FlagAddr           E2END

/*Bootloader launch  0:comport password  1:port level
Режим активации загрузчика 
0-через USART, 1-через любой свободный пин микроконтроллера*/
#define LEVELMODE          0

#define LEVELPORT          D
#define LEVELPIN           PD7
//port level  1:High  0:Low
#define PINLEVEL           0

/*max wait password time = TimeOutCnt * timeclk
timeout count
Период времени ожидания пароля загрузчиком.*/
#define TimeOutCnt         10

//basic timer interval(ms) интервал в мс.
#define timeclk            500

//max wait data time = TimeOutCntC * timeclk
//send 'C' command count отправка символа 'C' хосту.
#define TimeOutCntC        10

//password length, длинна пароля
#define CONNECTCNT         1

//password пароль
#if (LEVELMODE == 0)
unsigned char ConnectKey[] = {'s'};
#endif

//comport number: 0/1/2.. //выбор номера USART
#define COMPORTNo          3

//enable watchdog /включение сторожевого таймера
#define WDG_En             1

//enable RS485/RS422 mode /выбор интерфейса связи RS485/RS422 если 0 то выбран RS232
#define RS485              0
//RS485/RS422 send control port /выбор пина управления передачи данных на прием/отправку.
#define RS485PORT          E
#define RS485TXEn          PE2

//enable LED indication /выбор индицирующего светодиода о работе загрузчика 1-вкл 0-выкл
#define LED_En             1
//LED control port
#define LEDPORT            L
#define LEDPORTNo          PL7

//some old kind of AVR need special delay after comport initialization
//Дополнительная задержка после инициализации USART, некоторым МК это нужно, например Atmega8
#define InitDelay          0

//communication checksum method   0:CRC16  1:add up
//выбор метода контрольной суммы 0-XMODEM 1-обычное суммирование.
#define CRCMODE            0

/*Verbose mode: display more prompt message
Режим подсказок. Загрузчик будет отправлять на хост подсказывающие сообщения о 
своем состоянии. 1-вкл 0-выкл.*/
#define VERBOSE            1

//prompt messages /это сообщения которые загрузчик будет выводить на хост.
#if VERBOSE
#if LEVELMODE
const char msg6[] = "bootloader mode.";
const char msg7[] = "application mode.";
#else
//waiting for password
const char msg1[] = "waiting for password.";
#endif
//timeout
const char msg2[] = "timeout.";
//waiting for data
const char msg3[] = "waiting for data.";
//update success
const char msg4[] = "update success.";
//update fail
const char msg5[] = "update fail.";
#endif

//enable decrypt buffer /включить функцию шифрования данных 1-вкл 0-выкл.
#define Decrypt            0

//crypt algorithm /алгоритм шифрования
//PC1 Cipher Algorithm with 128 bits key
#define PC1_128            1
//PC1 Cipher Algorithm with 256 bits key
#define PC1_256            2
//AES Cipher Algorithm with 128 bits key
#define AES_128            3
//AES Cipher Algorithm with 256 bits key
#define AES_256            4
//выбор режима шифрования
#define Algorithm          AES_128

#if Decrypt

#if (Algorithm == PC1_128) || (Algorithm == AES_128)
//Define decrypt key: 128b
unsigned char DecryptKey[16] ={
  0xd0, 0x94, 0x3f, 0x8c, 0x29, 0x76, 0x15, 0xd8,
  0x20, 0x40, 0xe3, 0x27, 0x45, 0xd8, 0x48, 0xad,
};
#elif (Algorithm == PC1_256) || (Algorithm == AES_256)
//Define decrypt key: 256b
unsigned char DecryptKey[32] ={
  0xd0, 0x94, 0x3f, 0x8c, 0x29, 0x76, 0x15, 0xd8,
  0x20, 0x40, 0xe3, 0x27, 0x45, 0xd8, 0x48, 0xad,
  0xea, 0x8b, 0x2a, 0x73, 0x16, 0xe9, 0xb0, 0x49,
  0x45, 0xb3, 0x39, 0x28, 0x0a, 0xc3, 0x28, 0x3c,
};
#endif
#endif
#endif

Настройки я вроде как перевел, должно быть все понятно. Если что спрашивайте. Активировать загрузчик можно либо через любой пин микроконтроллера либо через USART, послав туда символ или группу символов. В моем случае нужен последний вариант, поэтому я активировал его. В UART будет посылаться символ 's'.

После настроек в файла bootcfg.h можно компилировать проект, чтобы получить долгожданный *.hex.Я так и сделал и сразу обломался. Все данные начинались с 0x0 адреса флешь памяти. А нам надо чтоб они легли в секцию загрузчика. В Atmega 1280 секция загрузчика состоит из 4х частей.

1. 512 words начало секции — 0xFE00, конец — 0xFFFF.
2. 1024 words начало секции — 0xFC00, конец — 0xFFFF.
3. 2048 words начало секции — 0xF800, конец — 0xFFFF.
4. 4096 words начало секции — 0xF000, конец — 0xFFFF.

Загрузчик вмещается в 1024 слова. Значит его надо вклинить в секцию с адреса FC00. Для этого в студии вот здесь надо написать строку .text=0xFC00


Снова компилируем и получаем наш загрузчик в нужном месте памяти.

Теперь только осталось программатором залить получившийся hex файл в микроконтроллер. А если надо загрузчик допустим для Atmega16? В моем же проекте надо просто сделать необходимые изменения и перекомпилировать проект. В проекте выбрать:
1.Другой процессор Atmega16.
2.Изменить
define BootStart          2 * 0x1C00
3.Изменить .text=0x1C00
4.Перекомпилировать проект.
5.Залить получившийся hex файл в проц. Все.

Сам загрузчик в проце работает с утилитой AVRUBD.exe. Она лежит там же в проекте.


Если нет желания возиться с настройками в файле bootcfg.h, то можно сгенерировать этот файл самой утилитой. И потом сгенеренный файл bootcfg.h просто скопировать в мой проект и скомпилировать. Это все. Для этого надо в утилите открыть вкладку Auto Config Code


Выбрать нужный режим работы загрузчика и нажать на кнопку Make. Все, файл bootcfg.h с нужными настройками будет создан.

После заливки прошивки в чип, надо как то подружить загрузчик в чипе с утилитой. Для этого открываем это окно Option и делаем там необходимые настройки для COM порта.

Чтобы дальше не заморачиваться с остальными настройками утилиты, нажимаем на кнопку Import в этом же окне и выбираем из директории студии наш же файл bootcfg.h. При этом необходимые настройки из этого файла импортируются в утилиту и сохраняются. Так что эта процедура делается один раз. Ну а далее нажимаем в утилите на кнопку File/load и выбираем нашу основную прошивку для проца. Нажимаем на Download и если все пучком, то произойдет загрузки прошивки в проц. По крайней мере у меня все заработало с первого раза.

Загрузчик так же поддерживает шифрование данных при передаче. По умолчанию оно отключено. Включается в файле bootcfg.h так
#define Decrypt            1

Можно выбрать 4 варианта шифрования тут же в bootcfg.h

#define Algorithm AES_128
#define Algorithm AES_256
#define Algorithm PC1_128
#define Algorithm PC1_256

Если выбран вариант PC1_128 или PC1_256, тогда студия подключит дополнительный файл к проекту pc1crypt.c Если выбран вариант AES_128 или AES_256, тогда подключиться файл aes.c. Ясно что тогда загрузчик уже не влезет в 1024 слова. А вот в секцию 2048 слов уже влазит. Если будете использовать, то не забудьте поменять строку с .text=0xFС00 на .text=0xF800. Так что для Atmeg16 про шифрование забудьте ибо у нее секция загрузчика максимум 1024 слова. Ну вроде с загрузчиком разобрались.

Все что выше это было вступление, теперь об основном.
А дальше что? А дальше если залить проект программатором, то загрузчик удалится. А надо чтоб остался. В комментах, в статье указанной выше, было много разных вариантов как это сделать. Я пошел таким путем. Получившийся *.hex файл загрузчика переконвертировал в *.bin файл. Это можно сделать и утилитой загрузчика. Получился массив данных типа такой

0x0C,0x94,0x72,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC, 0x0C,0x94,0x92,0xFC,0x0C,0x94,0x92,0xFC,
.......
.......
0x12,0xE0,0xA0,0xE0,0xB2,0xE0,0xE0,0xE2, 0xFE,0xEF,0x01,0xE0,0x0B,0xBF,0x02,0xC0,
0x07,0x90,0x0D,0x92,0xA0,0x35,0xB1,0x07, 0xD9,0xF7,0x1B,0xBE,0x13,0xE0,0xA0,0xE5,
0xB2,0xE0,0x01,0xC0,0x1D,0x92,0xAA,0x35, 0xB1,0x07,0xE1,0xF7,0x0E,0x94,0x43,0xFD,
0x0C,0x94,0x0E,0xFF,0x0C,0x94,0x00,0xFC, 0xCF,0x92,0xDF,0x92,0xEF,0x92,0xFF,0x92,
0x0F,0x93,0x1F,0x93,0xCF,0x93,0xDF,0x93, 0xEC,0x01,0x40,0x91,0x53,0x02,0x50,0x91,
0x54,0x02,0x60,0x91,0x55,0x02,0x70,0x91, 0x56,0x02,0x83,0xE0,0xFA,0x01,0x60,0x93,
0x5B,0x00,0x80,0x93,0x57,0x00,0xE8,0x95, 0x07,0xB6,0x00,0xFC,0xFD,0xCF,0x10,0x92,
Осталось этот массив данных разместить в основной проект под адресом 0xFC00. Да вот только как это сделать на СИ? В асме легко. Указываешь директиву .ORG 0xFC00 и все. Остальной код под этой директивой находится после адреса 0xFC00. А в СИ как? Товарищ e_mc2 любезно подсказал. Вот так:

volatile const uint8_t data[] __attribute__((section (".bootloader_data"))) = {...};

В настройках компилятора не забыть так же прописать такую строку


Адрес в строке надо указывать в байтах, а не в словах FC00x2=1F800. После компиляции наш загрузчик в виде массива данных разместится в нужной секции загрузчика. Все. Теперь если заливаем проект программатором, то заливаем и загрузчик. Если заливаем через загрузчик, то перезаписывается вся флеш память вместе с загрузчиком. Цель достигнута. Осталось теперь активировать сам загрузчик на расстоянии. Для этого можно послать допустим символ 's' в СОМ порт платы. Приняв символ, сразу прыгаем в секцию загрузчика. Для этого в основном проекте я написал такой кусок кода:

#define BOOT_SECTION  0xFC00//адрес загрузочной секции 1024 слова.
void(*pBootloader)(void) ;  //объявление указателя на функцию

ISR(USART3_RX_vect)  //прием пришедших байтов
{
	if (UDR3=='s')
	{
		pBootloader = (void(*)())BOOT_SECTION;//инициализируем указатель
		pBootloader ();                       //уходим на начало секции загрузчика
	}	
}
Получив байт 's' сразу из прерывания по приему байта прыгаем на адрес FC00. Загрузчик активируется и ждет прошивку. Если она не пришла, то через некоторый период времени управление передается на адрес 0x0 флешь памяти. Основная прога стартует с начала.

Массив ключей расположил понятно что во флешь памяти. Ключ состоит из трех байт. Первый байт номер зоны, а следующих два сам номер ключа. Получается что максимальное число ключа может быть 255,65535, а всего ключей 256x65535=16776960 почти 17 миллионов вариантов.
typedef struct
{
	uint8_t	 zone;		//Зона
	uint16_t key;		//Номер ключа
	uint8_t	 shedul;	//Расписание
	uint8_t	 door[3];	//Двери
} keys;

typedef keys keys_s[];

 const keys_s PROGMEM key=
{
    /*Доступ к дверям №1- №24, расписание №1(доступ в любое время) */
        {125,	43314,	1, {0b11111111,0b11111111,0b11111111}}, /*Петя Пупкин*/
	{125,	43315,	1, {0b11111111,0b11111111,0b11111111}}, /*Вяся Покрышкин*/
	{125,	43316,	1, {0b11111111,0b11111111,0b11111111}}, /*Иванов*/
	{125,	43317,	1, {0b11111111,0b11111111,0b11111111}}, /*Петров*/
	{125,	43318,	1, {0b11111111,0b11111111,0b11111111}}, /*Vga*/
	{125,	43319,	1, {0b11111111,0b11111111,0b11111111}}, /*e_mc2*/
	{125,	43320,	1, {0b11111111,0b11111111,0b11111111}}, /*Logic*/

    /*Доступ к дверям №1, №2, №3, №4, расписание №2 */
	{15,	43321,	2, {0b00001111,0b00000000,0b00000000}},	/*dravlas*/
	{15,	43322,	2, {0b00001111,0b00000000,0b00000000}},	/*kisoft*/
	{15,	43323,	2, {0b00001111,0b00000000,0b00000000}}, /*papandopala*/	
	{15,	43324,	2, {0b00001111,0b00000000,0b00000000}},	/*dekar*/
	{15,	43325,	2, {0b00001111,0b00000000,0b00000000}},	/*signaller*/
        {0,0}	
};

//Функция проверки ключа.

uint8_t check_key(uint8_t in_zone, uint16_t in_key, uint8_t in_dor)
{	
	uint16_t i = 0;
   
	while ((pgm_read_byte(&key[i].zone != 0)) &&  (pgm_read_word(&key[i].key) != 0))
	{
		if ((pgm_read_byte(&key[i].zone) == in_zone) && (pgm_read_word(&key[i].key) == in_key))
		{
			// Проверим расписание
			if (shedule_on(pgm_read_byte(&key[i].shedul)-1) == 0)
			{
				return 0;
			}

			// Проверим дверь
			if (in_dor<=0 || in_dor >24 )
			{
				return 0;
			}
			
			if (in_dor <= 8)
			{			
				if (BitIsSet(pgm_read_byte(&key[i].door[0]),in_dor-1))
				{
					return 1;
				}
			}
			else if (in_dor <= 16)
			{
				if (BitIsSet(pgm_read_byte(&key[i].door[1]),in_dor-9))
				{
					return 1;
				}
			}
			else if (in_dor <= 24)
			{
				if (BitIsSet(pgm_read_byte(&key[i].door[2]),in_dor-17))
				{
					return 1;
				}
			}
					
			return 0;
		}
	 
		i ++;
	}

	return 0;
}
Понятно что в таком виде через Atmelstudio не очень удобно забивать данные. Нужна прога верхнего уровня. Мой коллега начал ее писать. Написал. В итоге прога верхнего уровня и загружает обновленные данные в контроллер. В итоге получилось так: скомпилировал прошивку для данного контроллера. Получился *hex файл. Только в скомпилированной прошивке нет ключей, а есть только пустая подготовленная секция для них. (точнее три секции)

typedef struct
{
	uint8_t	 zone;		//Зона
	uint16_t key;		//Номер ключа
	uint8_t	 shedul;	//Расписание
	uint8_t	 door[3];	//Двери
} keys;

 typedef keys keys_s[4608];//4681 это максимум.

 keys_s key  __attribute__((section (".key_data")))  = {}; //Секция 1
	 
 keys_s key1 __attribute__((section (".key1_data"))) = {}; //Секция 1
	
 keys_s key2 __attribute__((section (".key2_data"))) = {}; //Секция 1
Готовый *.hex файл переконвертировали в *.bin файл, который скормили базе данных. Ну и в итоге прога верхнего уровня подставляет данные о ключах в данный бин файл в нужные адреса и загружает этот бин файл в контроллер доступа.

Так как секции для ключей во флеш памяти три, то и слегка изменился процесс проверки ключа на доступ. Весь проект для контроллера лежит в топике. Кому надо, можно глянуть.

В итоге контроллер впихнул в ящик и получилось вот что:


Система работает хорошо. Все довольны. Очень важную роль играет сам кабель. Сечение, емкость, где проложен. В идеале, чем короче расстояние от считывателя до контроллера, тем лучше.

Но на мой взгляд есть и недостатки. Например коммерческие системы имеют другое исполнение. (распределенное) Например один контроллер доступа на 2 двери. Если тебе надо подключить 24 двери, то покупаешь 12 контроллеров и вешаешь их по всему зданию. И такая система отчасти имеет преимущество. Сдох один контроллер, просто его меняешь и все. На время замены контроллера не работает только две двери. А если сдохнет контроллер в моем случае, то навернется вся система. Это конечно минус. Но этот минус перетекает и в плюс. Мой контролер на 24 двери стоит намного дешевле коммерческого контроллера на 2 двери. Да в любом случае и любой ситуации будут и плюсы и минусы. Идеала нету. Имел я дело и с дорогущими контроллерами доступа NSTAR. Один такой контроллер стоит 600 евро и всего на две двери. Софт кривой. Я не смог даже его поставить. Приглашал компьютерщиков. Да и сами контроллеры порой сдыхали по непонятной причине через 2 — 3 года работы. Так что в коммерческих системах слегка разачарован из-за цены. Если брать продвинутый софт для коммерческих систем, то мне назвали такую цену, что у меня уши в трубочку скрутились. На три дня пропал аппетит. Хотя тоже можно понять, кушать всем хочется. Компоненты для системы брал здесь по гуманным ценам.

P.S
А я вот подумал. Что если вместо этих считывателей подключить считыватели 1-wire типа что в домофонах стоят? Они дешевле в разы стоят. Правда вот реализовать опрос 24 таких считывателя в системе, это еще тот головняк. Там же все по таймингу происходит. Это пока контроллер от первого дойдет до 24 го считывателя, это ж сколько времени пройдет?
Файлы в топике: Bootloader_ATmega1280.zip

Комментарии (81)

RSS свернуть / развернуть
И купил себе флакончик за 40 руб.
А потом полез почитать в инет что же это за гидразин такой и захоронил эту гадость на ближайшей свалке токсичных отходов, от греха подальше.
0
Не ну если сделать свое рабочее место толковым то почему нет? Например вентилятор или вытяжку?
0
Подозреваю, что это просто безводный глицерин. На крайний случай чутка активированный.
Обрати внимание, что автор его сравнивает с аптечным, а даже с просто ХЧ это небо и земля.
0
Тут лучше химиков потыкать палочкой. Один знакомый химик (не распиздяй) перекрестился и посоветовал мне захоронить ЭТО подальше. Т.к. ядовитый он.

В качестве глицеринового флюса отлично зарекомендовал себя ФТС. Там флюс, спирт, 1% салициловой кислота и все.
0
Хм… так если это такая ядерно убойная вещ «массового поражения», то каким боком это вообще продается любому прохожему? Не является ли это нарушением закона?
0
Хлорный отбеливатель тоже ядовит. Но продается без проблем. Концентрация там не настолько большая чтобы убивать сразу. Но дышать этим я бы не стал.
0
-7
Вот нахера еще и здесь срать своими смищьными картинками?
Шёл бы ты отсюда, петушок…
+2
Не, ты чуть недопонял. Я не подвергаю сомнению ядовитость гидразина. Я сильно сомневаюсь что его (гидразин) вообще могли в открытую продажу выпустить. А в качестве слегка активированного флюса просто отлично идет глицерин+салицилка. Да и сам по себе глицерин тоже прекрасно работает.
0
однако согласно состава там гидразин. паяет правда зараза на отличненько…
0
Почитал про глицерин… Оказывается та еще дрянь:
[wiki] Глицерин при дегидратации образует токсичный акролеин.

Т.е. акролеин является одним из продуктов термического разложения глицерина.
А я, дурень, в нем платы лудил сплавом Розе :(
0
Чтобы глицерин разложить до акролеина его надо градусов до 500 нагреть, вряд ли у тебя это бы получилось на плите. Да и результат там слезоточивый.
0
Здесь было предупреждение.
0
Это типичная страшилка. Чтобы получился акролеин, нужно греть глицерин при ограниченном подводе воздуха, повышенном (несколько атмосфер) давлении, да еще и до довольно высоких температур. ЕМНИП, глицерин при этом еще и достаточно чистым должен быть. Что, как понимаете, в наших условиях практически не реализуемо.
0
Ты имеешь ввиду эту статью?
0
Интересно все же, из чего оный флюс реально состоит. У производителя ничего вразумительней этой ветки нет…
0
Про гидразин вот тут всё написано.
0
AVRUBD.exe- входит в комплектом вместе из бутлоадером? А из консольными командами она работает, то есть замутил батник и им пользуешся? То есть она отсилает на уарт атмеги «s» и она переходит в режим самопрограммирования? Хочу такое присобачить к своиму пинборду 1.1, чтоб прям из аврстудии без нажатия ресета переводить пинборду в режим самопрограммирования.
0
В программе опция есть, отсылать перед пошивкой команду сброса

0
Зброс збросом, а консольный режим поддерживается? Мне нужно накатать в аврстудии консольную команду, которая будет автоматом при компиляции, отсылать хекс на прошивку в контролер.
0
Не знаю, не пробовал.
0
Ну да качай файл из топика Bootloader_ATmega1280.zip. Там и проект и сама консоль для загрузчика. Можно отсылать s или любой другой символ, это ты сам выбираешь в консоли какой символ слать.
Хочу такое присобачить к своиму пинборду 1.1
Я себе уже так давным давно сделал. Вот насчет батника не знаю, попробуй. Кстати там есть функция в AVRUBD.exe. Нажимаешь на кнопку Make и сама утилита генерирует bat файл. По видимому это то что тебе нужно.
+1
Да это и хотел узнать. Спс!
0
Говорю как химик — Гидразину ОДНОЗНАЧНО НЕ МЕСТО В КВАРТИРЕ.ВЫСОКОТОКСИЧНЫЙ КАНЦЕРОГЕН.
0
Но там же не буквально гидразин? Типа разбавленный? Если вентилятором пользоваться, то тоже думаешь никак?
0
Это делает человек сидящий в офисе находящийся очень далеко от контроллера
А максимальной длины линии для протокола RS-232 хватает?
0
На последней фото видно что там стоят преобразователи RS232<->RS485. А в RS485,422 длинна линии может достигать 1.2 км. Именно по RS585 и RS422 работает система.
0
Кстати RS232 это не протокол, это физический интерфейс связи между устройствами, его рекомендованная длинна 15 м.
0
тут нужно оговаривать, что максимальная длинна линии зависит от скорости. 15м, если не ошибаюсь, это для скорости 19200
0
Сурово и круто.
Однако, один контроллер на вся здание это не есть гуд: пучки проводов в одно место и не дай бог где-то электрики подвяжутся к такому пучку или оборвёт кто — долго будешь искать багу.

Распределённой система делается чтобы минимизировать прокладку кабелей одной сигнальной витой парой с RS485.
Есть и достаточно дешёвые решения например: www.skd-gate.ru/
Обычно подобные системы в россии строят на болиде — там хороший интерфейс раздачи прав по зонам и визуализации происходящего для охранника на посту. Решение не самое бюджетное но надёжное. + можно охранку адресную интегрировать и при желании пожарку.

Есть для больших расстояний преобразователь RS485-LAN-RS485 от болида мы так по оптике скд и охранку двух зданий связывали в единую систему.
0
один контроллер на вся здание это не есть гуд
Ну да я написал что это минус системы.

Распределённой система делается чтобы минимизировать прокладку кабелей одной сигнальной витой парой
В какой то мере да. Но еще надо учесть что каждому контроллеру надо подвести питание. Обычно это 220V. Это еще одна линия. Если по уму то нельзя бросать силовой кабель соплей по всему зданию. Каждый контроллер должен запитываться от своего ближайшего силового щитка. Возникают телодвижения с организацией и подводкой питания. В моем случае этот вопрос вообще не стоял. Плата питается от соседнего шкафа, там уже есть 12 и 24 вольта.

и не дай бог где-то электрики подвяжутся к такому пучку или оборвёт кто
Ну тут наверное смотря как сделать. Если так как я сделал то не подвяжутся.
Для этого надо вскрыть этот бокс, и там видно что это слаботочка, а не силовуха.
0
Так питание так и так к замкам подводить, зачем для мк подводить отдельное?
0
Зачем на плате отдельный usb программатор, при наличии бутлоадера?
Хранение ключей во flash, с постоянной перепрошивкой как то, незнаю, странно… Почему не хранить ключи во eeprom и обновлять их по uart?
0
Зачем на плате отдельный usb программатор, при наличии бутлоадера?
Это резервный вариант загрузки данных.
Хранение ключей во flash, с постоянной перепрошивкой как то, незнаю, странно…
Почему странно? Ключи это обычные константы. Размер еепром к тому же мал для большого количества ключей, тогда надо внешнее еепром цеплять. А зачем? Если и так отлично работает.
0
А зачем? Если и так отлично работает.
потому что это как бы через жопу для авр
вот стм32 не имеет епром и ему можно писать во флеш программатором с произвольного адреса без извращений как у тебя
кстати загрузчик там уже встроен
-1
В качестве uart бутлоадера, наверное, лучше avr109 от атмела. Тогда прям из avrdude можно шить, или из avrstudio 4.
0
В качестве uart бутлоадера, наверное, лучше avr109 от атмела
В этом нет смысла. Так как программа верхнего уровня и прошивает контроллер. Утилитой загрузки данных оператор не пользуется. Мы внедрили поддержку протокола и механизм загрузки в саму прогу верхнего уровня. Поэтому ни studio ни утилита загрузчика вообще не нужны.
0
Мне одному кажется, что тут полная инструкция по заливке левых ключей в девайс?
0
Ну естественно левых. Ты думал я настоящие выложу?
0
А почему трассировка платы такая… кхм… укуренная?
-1
Ну уж как умел так и сделал.
0
Если что, то ничего личного, я просто не могу понять вот эти прямоугольные перелому в произвольных местах.
0
*переломы
0
Прямоугольные переломы? Какие именно? Там их вагон. Как прога дорожки пускала так и получилось. Это ж не СВЧ плата, где огромное значение имеет абсолютно все. Изгиб, ширина, длинна дорожки и пр.
0
0
Теперь понятно, так а в чем проблема то, что они там есть?
0
да нет никакой проблемы. просто непонятна причина такой неоптимальной прокладки трасс. я думал может в этом есть некий глубинный смысл))
0
Просто так проложились и все. Это ж никак не влияет на работу самой платы.
0
И чето блокировочников не видать(или на другой стороне?)- хотя конечно атмеги и так работают в основном, но лучше понатыкать ежели нет.

зы чОрная маска спасает от ворожения по фотографии :)
0
А что за блокировочники? Это что такое?
0
кондеры керамические
0
По питанию что ли? Есть с нижней стороны.
0
Если эта система контролирует не только входные двери но и например двери складов, кабинетов и т.п. То кабель от шкафа к магниту проходит по коридорам снаружи. И к нему есть доступ у лиц имеющих доступ в здание но не имеющих доступа к складу. В таком случае дверь можно открыть даже не имея доступа к шкафу с контроллером.
В случае применения распределенных контроллеров доступа их можно расположить внутри таких помещений и для доступа к кабелю магнита нужно проникнуть внутрь помещения, которое этим же магнитом и запирается.
0
То кабель от шкафа к магниту проходит по коридорам снаружи.
А с чего вы решили что в моем случае это тоже так сделано? Потому что сами так всегда делаете? Или видели что все так делают?
0
А как иначе это сделать если у вас один централизованный контроллер и несколько помещений в разных концах здания?
0
Ну вы даете чесс слово. В здании есть специальные ниши для прокладки кабельных линий. Эти ниши были запроектированы при постройке самого здания. Везде установлены специальные металлические лотки для кабельных линий. В коридорах нигде нету никаких кабелей. Абсолютно все кабели и силовые и контрольные проложены в стенах, нишах, лотках и пр. Никаких соплей нету. Это только в старых советских больницах все болтается над головой и по стенам коридора. Но не все же здания так построены.
-1
Вы зайдите в любой современный бизнес центр. Хоть один кабель вы увидите который проложен по стеночке коридора? Так только сейчас делают в старых ободранных общежитиях, которые скоро под снос пойдут.
0
Понятное дело что в кабельных лотках а не гвоздями прибиты. Я говорю про то что систему можно обойти подключившись к кабелю в месте где он доступен не авторизованному персоналу и открыть дверь без ключа.
-1
Если так рассуждать, то можно проникнуть куда угодно намного быстрее и проще, чем перебирать на лотке метровый слой проводов пытаясь разобраться где же там замок подключается. Просто выносишь дверь и заходишь куда тебе надо.
0
Меня поразила София (болгарская). В центре города по зданиям снаружи идет такая каша кабелей-проводов-соплей, что диву даешься. Ну да, не по новім бизнес-центрам, конечно.
+1
Дравласыч, ты имеешь ввиду так что ли?


Не я лучше сделал.
0
Индия?
0
Я не знаю, эта фотка давно у меня есть.
0
Вовсе не обязательно. Я похожие вещи в штатах видел. Там к старым домам частенько похожие паутины проводов идут. Вот, например:
Фотка сделана в самом центре Джерси Сити и это не самый большой клубок проводов, который мне там попадался.
0
по поводу разводки питания:
— у 220 нет ограничения по длине линии. Обычно в СКД применяются электромагнитные замки от 12В например ML-400 и у них линию питания лучше не делать более 30м. Подачу питания обычно делают от ближайшего щита через блок питания типа рапан 20 или скат 1200и7 (ну или другой похожий) обычно один блок питания на 2 ближайшие двери. Или тянут отдельную линию питания к точке. При совместной прокладке 220 и интерфейса используют кабель FTP.
— Большинство производителей считок рекомендуют длину каабеля от считки до прибора до 30м.
— RS484 допускает длину до 1000м без повторителей (паспорт болида говорит что до 3000м но на практике >1500 уже не работает).

Таки образом можно собрать всю систему в одну сеть. Для примера здание магазина Лерой-мерлен в екатеринбуге имеет длинну по перипетру как раз около 1500м. скд и охранка идут по периметру — двери, окна, есть ещё 3 отдельные ветки внутри для разграничения здания на сектора длины между контроллерами от 300м + всё это завязано на пожарку.

Гофра совсем не защитит кабель от помех в случае если рядом (до 50см) электрики проложат удава например на кондиционер или насос. Например что-то типа 5х25 и с китайским частотником на конце.

С другой стороны вся эти системы не дают 100% гарантии защиты и легко обходятся, особенно если знать как их делают.
Ваш проект безусловно приволен тем что он большой, сложный, и реально работает. однако в будущем рекомендую изучить примеры готовых устройств перед разработкой своего.

И я так понял здание у вас маленькое и с маленьким количеством посетителей… и будем надеяться система будет работать стабильно и добавление ключей будет редким.
0
Да нет здание очень большое. 4 этажа. Посетителей очень много. Я уже делал подобный проект еще раньше. Там тоже контроллеры самодельные на Atmega16. Один контроллер на 6 дверей. Правда их много и они соединены по Ethernet между собой. До сих пор работают. Эта система проще чем прошлая. Будет пахать и пахать как миленькая.
0
Я уже изучал примеры готовых устройств и имел дело с ними. В итоге от всего этого отказался. Дерут цены нечеловеческие. Даже и близко не смотрю в сторону коммерческих систем.
0
Та нет. Я тебе завидую даже что твоего умения хватает на такие сложные проекты и что они востребованы. Просто твоё решение несколько заднее и по моему снижает надёжность, ремонторигодность и поддержку системы, особенно если этим потом будут заниматься совсем левые люди. А так оно обычно и бывает сдал объект год гарантии и забыл, поскольку мало кто заключает контракт на ТО и сервис с теми кто монтировал поскольку монтажникам не выгодно заниматься обслуживанием. Я сам так слил 2 крупных объекта на обслуживание в другую контору. Таким образом я могу заниматься крупными проектами не дёргаясь по всяким косякам типа поломаной считки (пиканиска промахнулась мимо двери) или камеры на 7м от пола сбитой речтраком.
0
Дерут цены нечеловеческие. Даже и близко не смотрю в сторону коммерческих систем.
Только по причине цены?
Но, все же, возможно стоит присмотреться к самим решениям и, возможно, в каких-то случаях сделать самому так же, но дешевле?
0
Согласен с автором топика в том, что не всегда устройства от сильных вендоров отличаются хорошей ценой и нужной функциональностью — очень часто из пушки по воробьям. И тоже имею «подобное нишевое решение» и оно особенно интересно в той нише на которую рассчитано, а вот дальше может начаться вопрос поддержки, жизненного цикла и много других интересных вопросов которые трудно продумать наперед.
0
Кабель в лотках и нишах делают только в 2х случаях:
1. Система была заложена в прокт здания и здание имеет эти ниши и кроссовые комнаты, ну или большие электрощитовые…
2. Бюджет заказчика позволяет купить все эти лотки и кабелепроводы а не кинуть всё в гофре за фальшь потолком. Лотки достаточно дороги и не всякий потолок (стену, пол) можно разобрать (без привлечения общестроя к заделке дыр) для их монтажа. Там где разобрать можно это сильно увеличивает сроки работ и стоимость работы монтажников.
0
Чтобы объединить два hex файла основной программы и загрузчика — не нужно так извращаться, как указано в статье. Можно сделать проще: Открываем файл hex проекта в блокноте — удаляем последнюю строчку

:00000001FF
, означающую «конец данных», а после в конец копируем туда содержимое hex-файла загрузчика. Все. Две программы объединены. Можно сохранить получившийся пирог под другим именем
0
Хороший способ, но в данной ситуации менее удобен, чем тот который предложен. В способе описанном в статье, загрузчик всегда находится уже в проекте и в нужном месте флешь памяти. Если нужно подправить что то в коде, ты это спокойно делаешь. Про загрузчик даже не вспоминаешь. Он при компиляции программы сам автоматом будет находится в hex файле и в нужном месте. Нет необходимости лезть в hex файл и что то там вручную каждый раз после компиляции стирать/добавлять. Это ладно если один раз компильнул прогу залез в hex файл, что то подправил загрузил в девайс и забыл. А когда это делаешь десятки раз и каждый раз после этого лезть в hex файл, извини никак не лучший вариант. К тому же в твоем способе есть большой недостаток, нужно постоянно контролировать чтоб твоя основная прога не залелзла в бут сектор. А в моем способе это автоматом делает компилятор. Он это делает из-за того что в его настройках указана граница бут секции, дальше которой он просто не даст ничего записать.
0
Загрузчик предполагает, что удаленно будет грузиться некий блок данных. Так вот, вырезать блок загрузчика из общего массива данных куда более геморройнее, если будет необходимость эту замую загрузку произвести… Либо в загрузчике должен быть код, игнорирующий блоки данных, находящиеся в адресном пространстве его самого. Короче, данный подход облегчает начальное программирование, однако усложняет сам процесс перепрограммирования, так как рабочую версию нужно очистить от «мусора», коим является блок данных загрузчика
0
Так вот, вырезать блок загрузчика из общего массива данных куда более геморройнее
Не надо никому ничего вырезать. Сформированный hex файл вместе с проектом и загрузчиком отправляется на usart микроконтроллера. Загрузчик принимает все как есть и перезаписывает всю флеш память где должен быть проект, остальное игнорируется. В рабочей версии нету никакого мусора. Так специально сделано чтоб можно было загрузить проект либо удаленно через загрузчик либо локально через программатор и при этом загрузчик должен оставаться на месте в любом случае.

как рабочую версию нужно очистить от «мусора», коим является блок данных загрузчика
Блок данных загрузчика это не мусор это необходимая часть проекта которая должна быть там где она и находится.

Загрузка новых данных происходит с помощью нажатия одной кнопки в компьютере. Это все. Никаких лишних телодвижений и манипуляций с hex файлом. Не надо ничего открывать/вырезать/добавлять.
0
Либо в загрузчике должен быть код, игнорирующий блоки данных, находящиеся в адресном пространстве его самого.
Кажется, я указал этот вариант в предыдущем посте.
0
Без понятия, загрузчик я не писал, взял готовый, проверенный. Как он там работает и что в нем внутри особо сильно не разбирался. Абсолютно незачем.
0
Хорошо было бы проверить, а то невзначай затрет сам себя…
0
Система уже работает несколько месяцев, сделано не один десяток загрузок. Если бы и было что то, давно бы вылезло.
0
volatile const uint8_t data[] __attribute__((section (".bootloader_data"))) = {...};

а «PROGMEM» в этом случае не надо ставить?
0
Нет не надо.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.