Перейти к содержанию

Философия аппаратного SPI - чем занять МК?


Рекомендуемые сообщения

Только что, ARV сказал:

Синхронизация обновления значения в регистре требуется далеко не всегда.

Действительно не убирается :) !!! синхронизация с чем???

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

Я вас не понимаю

тут получается что вы подменили понятия, потому что я имел ввиду четко определенную синхронизацию, из определения которой происходит требование ее наличия. :)

но это совсем сложно, не заморачивайтесь :)

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Просто я понял так, что вы считаете, что без синхронизации с моментом обновления регистра читать из него при помощи DMA и складывать в память бессмысленно... И потому возразил: смысл есть. Но понять вас, профессионалов, и вправду не всегда просто :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3 часа назад, my504 сказал:

В случае непрерывного перезапуск не требуется.

Я уже объяснил, почему циклический режим неприменим почти нигде при работе с внешним железом. Непрерывно лить большие потоки данных надо нечасто. Гораздо чаще работа идет по принципу запрос-ответ. И пока нет запроса, слать ничего не надо. Либо на МК просто валятся порции данных через какой-то промежуток времени. Я не говорю, что DMA - то плохо. Но лепить его в каждую дырку - это, по меньшей мере, бред. Любой ресурс МК надо использовать грамотно и проблемы отпадут сами собой =)

 

2 часа назад, my504 сказал:

При попытке Барса выдать какие то формальные правила применения ДМА.

Вы пытаетесь выдать ровно такие же правила, но для своей области применения.:crazy:

3 часа назад, my504 сказал:

А Вы не пробовали загружать в основном цикле некий параметр внешнего устройства, который висит на SPI (или  I2C), при этом сам обмен автоматически и непрерывно поддерживается DMA? Там для обмена вообще непрерывно шлется эта переменная и адресный байт впереди. Запустили - забыли. Считаем в суперлупе и иногда модифицируем переменную, которая и засылается в это внешнее устройство.

Нет, таких задач пока не было.

 

3 часа назад, ruhi сказал:

какую проблему решает копирование значения регистра в память посредством ДМА,

Тот же FSMC интерфейс...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, BARS_ сказал:

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

Произвольно взятые примеры из ТОЛЬКО ОДНОГО  разрабатываемого прибора, который у меня на столе сейчас.

1. Загрузка удаленного на 6 метров STN дисплея через мост UART-RS485-UART-I2C. Пакеты по 1057 байт В ОДНУ СТОРОНУ. Никаких запросов нет. Просто попеременно посылается 2 буфера. Один работает на ДМА-УАРТ, второй загружается из софта. Драйвер возвращает указатель на доступный к загрузке массив.

2. Загрузка DDS (частота синусоиды). SPI ТОЛЬКО В ОДНУ СТОРОНУ. Небольшие пакеты (8 слов по 16 бит) с рейтом 8 мбит.

3. Внешний АЦП-SPI загрузка в одну сторону по реквестам от цепочки семплирующий ШИМ - синхронный Output Compare. Сам ШИМ является запуском преобразования, от него запускается  Output Compare, который и создает запросы на транзакции.

Могу взять другое серийное устройство - там половина интерфейсов на ДМА не имеют никаких запросов, а те,которые как бы имеют,  используют для запроса-ответа РАЗНЫЕ КАНАЛЫ ДМА, то есть каждый из них тоже односторонний.

18 минут назад, BARS_ сказал:

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

Я как раз ОТВЕРГАЮ какие либо "правила", предлагая включить здравый смысл и понимание механизма работы ДМА.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

В новой аттине не всё так однозначно. SPI флаги (впрочем, как и АЦП-ные) при входе в прерывание сами не сбрасываются. Необходимо выполнить какое-то условие или вручную записать "1". Флаг DREIF (пустой буфер на передачу) так и вообще сбрасывается только в момент записи данных в буфер. И больше никак. Вот и как в таких условиях работать? На повестке дня - трансивер. Это значит, что будет передача всего одного байта и прием трех байт. Период передачи - пара раз в секунду. Поэтому принято решение ничего не трогать и работать "по старинке". Любой другой вариант порождает накладные расходы и увеличивает интервал общения с трансивером.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, parovoZZ сказал:

Любой другой вариант порождает накладные расходы и увеличивает интервал общения с трансивером.

О каких "накладных расходах" может идти речь, когда речь идет о СЕКУНДАХ?

По поводу флагов. Вы пытаетесь привести флаги к событиям, но есть такое мнение, что они могут соответствовать СОСТОЯНИЯМ. Это другой подход. Он ничем не хуже, а часто и лучше.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

13 часа назад, my504 сказал:

Вы пытаетесь привести флаги к событиям, но есть такое мнение, что они могут соответствовать СОСТОЯНИЯМ. Это другой подход. Он ничем не хуже, а часто и лучше.

Так вот это я и называю "по старинке".

Ссылка на комментарий
Поделиться на другие сайты

По какой еще "старинке"? 

Любые автоматические действа с флагами хороши только для стандартных задач.

Не вижу никаких проблем для Вашего проекта. К чему это ворчание?

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Я запрашиваю значение регистра. Функция выглядит так:

	//... Передать и принять байт данных
 uint8_t SPI_ReadByte(uint8_t data)
 {
	uint8_t temp;

	while(!(SPI0.INTFLAGS & SPI_DREIF_bm));			// проверка готовности буфера 

	SPI0.DATA = data;								// помещаем данные в буфер. Флаг DREIF очищается

	SPI0.INTCTRL = SPI_RXCIE_bm;					// разрешаем прерывание после приема байта (и только его)

	Sleep(SLPCTRL_SMODE_IDLE_gc);					// 

	while(!(SPI0.INTFLAGS & SPI_RXCIF_bm));			// удостоверимся, что есть непрочитанный байт в буфере приема

	temp = SPI0.DATA;								// читаем приемный буфер. Флаг RXCIF очищается

	return temp;
 }

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

В 09.05.2019 в 07:13, my504 сказал:

О каких "накладных расходах" может идти речь

о потере времени между сеансами общения.

Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, parovoZZ сказал:

о потере времени между сеансами общения.

Потере на то, чтобы крутиться в пустом цикле?

Вы издеваетесь над здравым смыслом. При скважности "сеансов общения" в десятки тысяч - сброс флага за 1 маш.цикл  НИКАК НА ПРОИЗВОДИТЕЛЬНОСТЬ НЕ ВЛИЯЕТ.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

В 08.05.2019 в 15:02, ARV сказал:

что без синхронизации с моментом обновления регистра читать из него при помощи DMA и складывать в память бессмысленно...

у @my504 там получалось что надо значение регистра по приходу слова копировать в ячейку памяти по ДМА (видимо по событию прерывания от SPI),

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

во первых не пропустить момент обновления;

во вторых успеть (прочитать значение) до следующего момента обновления (за время СПИ-айного байта значит, понятно что если СПИ-ай медленный -это во-ще не проблема - пиши как хочешь, то есть задача становится реальной только при определенных условиях, скорость СПИ-ай в данном случае является таким условием актуальности задачи).

Другими словами: основная проблема здесь это наличие вот этого периода разрешенного чтения, за который надо успеть вычитать вновь пришедшее значение!!!

Так вот, если вы используете ДМА, в данном случае, этот период разрешенного чтения сокращается (из регистра еще надо скопировать и только потом можно читать!!!), может быть совсем чуть чуть сокращается, но опять же, повторю:

задача становится реальной только при определенных условиях, скорость СПИ-ай в данном случае является таким условием актуальности задачи

по мне так все это очевидно, но такое разжевывание помогает в том числе себя проверить, что тоже ни когда не вредно :) !!!  Вот человек который все знает/понимает на основании этого давит авторитетом, но разжевать не умеет, скорее всего что то все таки не знает и не понимает :) опыт показывает!!!

Есть и другие проблемы, в СПИ-ай должен быть бит (флаг) переполнения буфера чтения - как раз для отслеживания ситуации с затиранием не прочитанного значения, и при использовании ДМА его не получится использовать!

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

В 10.05.2019 в 15:42, my504 сказал:

Потере на то, чтобы крутиться в пустом цикле?

Поясню.

1-ый вариант. Кладем данные в буфер и ждем в цикле поднятия соответствующего флага. Как только флаг поднялся, читаем буфер и уходим из функции (или выполняем следующую инструкцию, если функция встроена).

2-ой вариант. Кладем данные в буфер, каким-либо образом отмечаем отправленную команду и уходим из функции (-//-). Далее уходим на прерывание, сбрасываем флаг, читаем буфер, каким-либо образом помечаем, что получены данные, выходим из прерывания. В основном цикле производим проверку новых данных.

2-ой вариант подлиннее будет. Разумеется, что если у нас дисплей и нам с него взять нечего(!), то 2-ой вариант в самый раз, особенно если буфер "длинный".

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Привет. Не очень по заголовку, но не хочу плодить темы.

Пытаюсь общаться дисплеем nokia1202 при помощи atmega16(asm) посредством шины spi

Посылка содержит 9 бит, где старший - указатель команда/данные, и так как spi незнакома для меня, сделал имитацию spi в виде ногодрыга, для проверки дисплея - и все заработало.

Ногодрыг сидел на пинах (MOSI) PB5 и (SCK) PB7  штатного SPI без инициализации самого SPI

Все законно:

JkqLNs.png

После, переписал с использованием шины, сначала ногодрыгом отправка первого бита(признака команда/данные), а далее запуск аппаратного spi и отправка. Не заработало, на пинах тишина.

Вырезал все, упростил до минимума,  оставил лишь инициализацию SPI и циклическую отправку одного байта, без 9 бита - не работает.

При прогоне в AVRStudio обнаружил, что программа застревает сразу,  на проверке бита окончания передачи SPIF регистра SPSR. Он не взводится после инициализации SPI. Если при инициализации взвести его вручную, то в AVRStudio программа начинает работать, бит SPIF обнуляется при записи данных в регистр SPDR, и после отправки взводится.

Но в железе все так же не работает(тишина на пинах). Уверен, наступил на какие-то стандартные грабли, но не понимаю какие. В даташите перечитал все особенности с пином SS, но в режиме master нет никаких тонкостей, все просто как двери.

.include "m16def.inc"

ldi r16, low(ramend)
out spl, r16
ldi r16, high(ramend)
out sph, r16

init:
; Конфигурация портаВ
ldi r16, 0xFF			; Порт В на выход
out DDRB, r16
; Конфигурация SPI
ldi r16, 0b01010000	
out SPCR, R16	
						;SPIE <<0 Прерывания выключены
						;SPE  <<1 SPIenable
						;DORD <<0 MSB first
						;MSTR <<1 Master mode
						;CPOL <<0 SPI MODE0
						;CPHA <<0 SPI MODE0
						;SPR1 <<0 Clock fosc/4
						;SPR0 <<0 Clock fosc/4;

ldi r16, 0x80			; На всякий случай, взвод флага готовности
out SPSR, R16

ldi r16, 0b10101010	    ; байт с данными для отправки в SPI


main:
sbis SPSR,SPIF			; Ожидаем флага готовности
RJMP main
OUT SPDR, r16			; Отправляем данные в регистр
rjmp main




 

Изменено пользователем godrik
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • "Инфицировать" - знаю. "Идентифицировать" - тоже знаю. А вот  не знаю...
    • посмотрел ту старую тему на Радиокоте - 2011 год, как давно это было... там участвует Леонид Иванович, который считается очень большим специалистом по линейным блокам питания. но тут он проявил полное непонимание работы ДГС, и даже упорствовал в этом своем непонимании. и даже из своих экспериментов (в конце темы) пришел к неправильным выводам. к чему там приплели гармоники, мне непонятно. но могу сказать, что даже преподаватели и научные работники институтов тоже могут заблуждаться. опечатки нет - в приведенной формуле в самом деле не входят падения на диодах. посмотрел бегло эту древнюю статью Томского института. в этих "наворотах" в их формулах не разбирался, мне это не надо. количество витков обмоток трансформатора вообще ни при чём. как я выше сказал, ДГС работает только в паузе (мертвом времени). а какое напряжение приложено к обмоткам ДГС во время импульса - тут ни с какого боку. вот смотри: во время импульса к каждой обмотке ДГС приложено напряжение (амплитуда импульса с обмотки трансформатора) минус (падение на диоде) и минус (выходное напряжение). возьмём комповый БП, который может работать в широком диапазоне входного напряжения. и эта разность во время импульса будет вообще не соответствовать отношению витков вторичных обмоток. а во время паузы эдс каждой обмотки ДГС точно соответствует числу витков. и чтобы каждая эдс была "правильной", эдс должна быть равна (выходное напряжение) плюс (падение на открытом диоде). откуда тебе должно быть понятно, что соотношение витков ДГС должно быть пропорционально величине (выходное напряжение) плюс (падение на открытом диоде) для каждого выхода. но поскольку числа витков могут быть только целыми числами, то точное соотношение практически невозможно выполнить. поэтому приходится мириться с приближенными (округленными) значениями. это округление даст некоторую ошибку в выходных напряжениях, так как эдс обмотки минус падение на диоде даст не точно желаемое выходное напряжение. но обычно такое отклонение от желаемого значения не является критическим. но чтобы эти отклонения от желаемых значений выходных напряжений были минимальны, может потребоваться мотать избыточные числа витков ДГС, это позволит более точно выдержать соотношения эдс каждой обмотки.
    • Если установить рассеиватель предназначенный для боковой подсветки на нижнюю, то он банально не будет рассеивать  
    • @Romanchek82 Фиг с ним с проводимостью, в зависимости от добавок такая смазка может сработать как абразив на мягких материалах (привет позолоте и меди). У себя в таких переключателях использую или конститутивную силиконовую, или PAG. 
    • Я в курсе, но речь-то не о гитарных преампах и других гитарных примочках, а об УНЧ. Ну круто, чё. А почему сразу не на +/-200? Качать ланзаром, так киловатты.  
    • О том и речь. Так Ланзар и собирают первым после микросхем потому, что надо больше мощности. Буквально вчера мне писАли в ЛС с просьбой запилить плату Ланзара под 5-6 пар выхлопа с питанием +-100.  Ну а хренли мелочиться.
  • Похожий контент

×
×
  • Создать...