Как стать автором
Обновить
4
0
Ермаков Алексей @Solgo

Разработчик

Отправить сообщение

Дорожки 0.25мм у меня тоже получаются отлично, вопрос в совмещении переходных отверстий на 2х сторонней печатной плате. Из-за того что фотошаблон нелинейно искажается при печати на лазерном принтере приходится делать на платах крупнее 5х5см переходные с внешним диаметром 2мм.

У меня к вам два вопроса:

1) Каков внешний диаметр переходного отверстия на ваших платах.

2) Каков максимальный размер (любой из двух) печатной платы с указанным в пункте 1 внешним диаметром переходных отверстий.

Тоже использую фоторезист, отработал технологию 0.25мм дорожки получаются без проблем. Что я не могу до сих пор побороть, так это изготовление фотошаблона.

Моя технология выглядит следующим образом:

1) Отрезание заготовки сверловка.

2) Печать фотошаблона на пленке на лазерном принтере, выдерживание фотошаблона в парах ацетона 20 минут чтобы тонер разбух и сделался более черным.

3) Сырая накатка фотошаблона, выдерживание при комнатной температуре 25минут, снимаю верхнюю пленку, на смоченную дистиллированной водой заготовку с фоторезистом устанавливаю фотошаблон. Ориентация установки по просверленным отверстиям, поэтому двухсторонние платы совмещаются без дополнительных усилий.

4) Засветка, выдержка 25 минут при комнатной температуре.

5) Проявка, травление.

Так вот какие бы пленки я не пробовал для лазерного принтера происходит нелинейный увод рисунка (величина искажений зависит от рисунка). приходится переходные отверстия делать с учетом этого эффекта. На платах до 5см на сторону могу сделать переходные отверстия с внешним диаметром 1 - 1.3 мм, на более крупных платах приходится делать до 2мм.

Как мне кажет в ЛУТ технологии эта проблема должна стоять сильнее.

И может у кого-нибудь есть технология изготовления фотошаблона с меньшими искажениями геометрии.

Причины можно перечислять долго, список получается большой, вот первые несколько:
— Прибор разрабатывался год назад, в тот момент на рынке еще не было такого количества микроконтроллеров китайского производства.
— Партия устройств предполагалась не очень большой и тратить время на освоение нового микроконтроллера смысла не было.
— Устройство достаточно ответственное, микроконтроллеры microchip применять в проде как то спокойнее, чем микроконтроллер который ты за месяц освоил.
— Даже с microchip микроконтроллерами много нюансов при достаточно подробном даташите и наличие errata. С новым микроконтроллером всякого рода "неожиданности" могут на порядок увеличить время разработки.

Но микроконтроллер интересный, спасибо за наводку, правда на Али он заметно дороже PIC10F322

В данном проекте не требовалась совместимость ни с какими другими устройствами, смысла использовать более "тяжелый" протокол не было никакого.

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

В приемнике с процессорным временем проблем нет, поэтому я не стал делать поиск кода по индексу. Еще одна причина в том, что из доступных 512 программных слов использовано 433, т.е. в лоб табличка просто не влезет.

Я не понимаю что такое "в общем случае". В разработке всегда решается конкретная задача исходя из ТЗ. Если будет задача передавать большее количество данных или поток данных (например аудио или видео поток) , то естественно будет использоваться другой протокол и другое железо. Можно придумать миллион вариантов синхросигналов и контроля целостности данных, но в данном конкретном случае описанном в статье, они будут хуже, так как не принесут улучшений, а только усложнят обработку.

Ваше предложение усложнит обработку на передающей и приемной стороне и при этом не принесет никаких улучшений. Изначально я делал пакет из трёх байт, 0xFF, 0x00, "байт с данными", но затем перешёл к описанном в статье варианту так как это сильно упростило обработку пакета с обоих сторон.

Толчком для переделки послужило то, что время между задним и передним фронтом тактовых импульсов чуть меньше 2мкс. И даже если микроконтроллер в базовом блоке ничего не делает, а только ждёт прерывания от SPI, то он все равно не успевает. И SPI входит в коллизию, так как передача байта уже началась, судя по переднему фронту тактового импульса, а тут происходит запись в буфер передатчика.

В моей реализации все три принятых подряд байта должны быть одинаковыми, если это не так, смена команды, помеха - пакет отбрасывается.

Насколько я понимаю, коды Рида-Соломона используются для обнаружения и коррекции ошибок за счет избыточности. Но для того чтобы их использовать данные уже должны быть корректно приняты в виде кадра, после этого надо потратить заметное по меркам 8 битного микроконтроллера время чтобы обработать этот кадр по соответствующему алгоритму.

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

При приеме со сдвигом на любое количество бит команда декодируется корректно.

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

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

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

Я тоже пытался вспоминать, но во-первых тридцать лет прошло с момента окончания политеха, во вторых специальность "Радиоэлектроника". Кроме кодов типа Манчестер и кодов Хэмминга вспомнить ничего не смог.

Это в моей реализации, если вы заходите использовать все 34 кода, ваша концепция разделения на нибблы уже не подойдет.

У меня нет синхрослова как такового, у меня все что передается это полезные данные.

"Кстати, в вашей реализации вместо 0x80-0x8F с тем же успехом можно использовать 0x10-0x1F - я правильно понимаю? "
Да вы правы, эта последовательность тоже обладает данными свойствами.

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

;*********************************************************************	
;Выхлоп в сдвиговые регистры	
SEND_DATA:
	movlw	SEND_DATA_2
	movwf	FSR
	movlw	SEND_MASK_INI
	movwf	MASK_SEND_REG
	movlw	NUM_SEND_BYTES
	movwf	CNT_SEND_BYTES
	movlw	NUM_SEND_BITS
	movwf	CNT_SEND_BITS
SEND_DATA_CIRCLE:	
	rlf	RX_DATA_NEW,f
	movf	INDF,w
	andwf	MASK_SEND_REG,w
	btfss	STATUS,STATUS_Z_POSITION
	goto	SEND_HIGH
	bcf	LATA,SER
	goto	SEND_SET_CLK
SEND_HIGH:
	bsf	LATA,SER
SEND_SET_CLK:
	bsf	LATA,SCK
	bcf	STATUS,STATUS_C_POSITION
	rrf	MASK_SEND_REG,f
	nop
	nop
	nop
	nop	;Нопы чтобы удлинить фронт так как на входе стоит резистор 4.7К
	nop	;Для защиты драйвера при программировании микроконтроллера.
	nop
	nop
	nop
	bcf	RX_DATA_NEW,RX_BIT
	btfsc	PORTA,RX
	bsf	RX_DATA_NEW,RX_BIT
	bcf	LATA,SCK
	decfsz	CNT_SEND_BITS,f
	goto	SEND_DATA_CIRCLE
;***Сохраняем принятые данные в буфер****
	movlw	RX_DATA_0 - SEND_DATA_0
	addwf	FSR,f
	movf	RX_DATA_NEW,w
	movwf	INDF
	movlw	RX_DATA_0 - SEND_DATA_0
	subwf	FSR,f
;**********************************	
	movlw	NUM_SEND_BITS
	movwf	CNT_SEND_BITS
	movlw	SEND_MASK_INI
	movwf	MASK_SEND_REG
	decf	FSR,f
	decfsz	CNT_SEND_BYTES,f
	goto	SEND_DATA_CIRCLE
	bsf	LATA,RCK
	bcf	LATA,RCK
;Конец функции отправки данных в сдвиговые регистры	
;Передача закончена декодируем принятые данные
;Проверяем на одинаковость
	movf	RX_DATA_0,w
	xorwf	RX_DATA_1,w
	btfss	STATUS,STATUS_Z_POSITION
	goto	CLEAR_WDT
	movf	RX_DATA_0,w
	xorwf	RX_DATA_2,w
	btfss	STATUS,STATUS_Z_POSITION
	goto	CLEAR_WDT
;Проверяем на диапазон 0x80-0x8F
	movlw	NUM_SEND_BITS-1
	movwf	CNT_SEND_BITS
RX_DATA_TEST_RANGE:	
	movlw	RX_CODE_BEGIN
	subwf	RX_DATA_1,w
	btfss	STATUS,STATUS_C_POSITION
	goto	RX_CODE_TEST_RLF
	movf	RX_DATA_1,w
	sublw	RX_CODE_END
	btfss	STATUS,STATUS_C_POSITION
	goto	RX_CODE_TEST_RLF
;Данные в диапазоне 0x80-0x8F декодируем
	movlw	MASK_RX_DATA
	andwf	RX_DATA_1,f
	movf	RX_DATA_1,w
	xorwf	MODE_REG,w
	btfsc	STATUS,STATUS_Z_POSITION
	goto	CLEAR_WDT//Данные уже в регистре режима
	movf	RX_DATA_1,w
	movf	RX_DATA_1,w
	xorwf	MODE_REG,w
	andlw	MASK_MODE_DATA
	btfss	STATUS,STATUS_Z_POSITION
	bsf	SYSTEM_FLAGS,MODE_INI
	movf	RX_DATA_1,w
	movwf	MODE_REG
	goto	CLEAR_WDT//Данные уже в регистре режима
;Данные не в диапазоне 0x80-0x8F сдвигаем влево	
RX_CODE_TEST_RLF:
	movf	CNT_SEND_BITS,w
	btfsc	STATUS,STATUS_Z_POSITION
	goto	CLEAR_WDT//данные приняты с ошибкой
	decf	CNT_SEND_BITS,f
	rlf	RX_DATA_0,f
	rlf	RX_DATA_1,f
	goto	RX_DATA_TEST_RANGE
CLEAR_WDT:	
	clrwdt
	goto	WAIT_TMR2

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

Как вы убедитесь что приемник принял сигнал без ошибки? После отправки какого количества команд вы сможете достоверно сказать, ну да, сейчас точно принял. Точно, точно..

В вашем варианте сообщение получается 11 бит. Буфер в SPI PIC16F18346 размером 8 бит. В предложенном вами варианте я буду вынужден постоянно записывать в буфер SPI. В моем варианте записал и забыл (SDI соединен с SDO в SPI SLAVE) и команда сама отправляется с каждой пачкой тактовых импульсов.

Посмотрел стоимость на mouser BC846BLT1G при партии 3000 штук стоит 0.027€, 74LVC1G17SE-7 - 0.043€. Резистор 0402 на 10К при партии 1000шт стоит 0.003€. Точек паек одинаковое количество по 5 в каждом варианте.
Остался вес BC846 + резистор 30мг + 0.65мг = 30.65мг. 74LVC1G17SE-7 - 6мг. Не думаю что разница в 49.3мг сыграет какую-то существенную роль, хотя в варианте с 74LVC1G17SE-7 надо еще дорожку питания прокидывать до микросхем, что "положительно" скажется на увеличении веса. Стоит признать что разница в 0.026€ не такая уж и большая, я думал что будет больше.

1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Нижний Новгород, Нижегородская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Разработчик РЭА
Middle
От 200 000 ₽
Circuitry
Development of printed circuit board
Electronics Development
PCB design
Verilog HDL
FPGA
Cortex-M3
Pic Microcontroller
STM32