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

Запуск программы в SRAM.

Всем h!

Собирается 3-х канальный синхронный генератор импульсов с претензией на прецизионность :)

На компе в проге для каждого канала задается начальная задержка импульса относительно общего старта, длительность и период. Прога по формуле высчитывает точную задержку до такта. Далее по COM-порту инфа, а точнее сгенеренный код программы для каждого гена передается на управлющий МК, который программит по шине 3 МК-генераторы. Предполагается, что 3 гены будут юзать один внешний клок ген. Частота 20 MHz. МК-ATMega48.

Гены слушают шину и ловят каждый свои данные и программят через STS SRAM после чего ждут команды на общий запуск.

Вапрос.

А запустит-ли МК код сгенеренной программы в SRAM? В протеусе все изюмительно работает, а вот в реале мона-ли так издеваться? ;)

Почему SRAM. Потому, что код нужен динамический, максимально быстрый и компактный. 10 килоциклов для FLASH уйдут за 16 часов.

Хранить параметры в SRAM и оттуда грузить - слишком медленно.

 

К примеру вот пока еще черновой сгенеренный код для имульса с начальной задержкой 15 тактов, длиной импульса t=15587453 такта и период-длина=2342356 тактов:

ldi r22,1 // high-state

ldi r23,0 // low-state

push r30 //-delay 15-

pop r30

push r30

pop r30

push r30

pop r30

lpm //-----------

S1:out 0x18,r22 // out high

ldi r26,0x17 //---- delay 15587453 ----

ldi r27,0x01

L1:ldi r28,0x3F

ldi r29,0x18

L0:sbiw r28,1

push r30

pop r30

nop

brne L0

nop

sbiw r26,1

brne L1

nop //----------------

out 0x18,r23 // out low

ldi r26,0x30 // ----- delay 2342356 -----

ldi r27,0x00

M1:ldi r28,0xA6

ldi r29,0x2F

M0:sbiw r28,1

brne M0

nop

sbiw r26,1

nop

brne M1

nop

nop

nop //--------------------

jmp S1

 

Он может незначительно увеличиваться в объеме, но в SRAM вроде должен влезть.

Изменено пользователем &y JOKER

Поделиться сообщением


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

Вапрос.

А запустит-ли МК код сгенеренной программы в SRAM?

АВР не умеет программы из ОЗУ выполнять, он может только программы из внутренней флеши.

Поделиться сообщением


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

от жыж блин...

ех было время када Z80 умел и из ПЗУ и из рамы... а тут даже регистр PC низя изменить. :(

тада еще вопрос, а кто-нить из моторол, пиков или не АВРов умеет с ОЗУ более продвинуто работать?

p.s. нафига тада в даташите рисовать это все как единое адресное пространство?

Изменено пользователем &y JOKER

Поделиться сообщением


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

p.s. нафига тада в даташите рисовать это все как единое адресное пространство?

 

Простите, но в даташите на какой AVR Вы увидели, что пространства кода и данных - общие?

Поделиться сообщением


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

Простите, но в даташите на какой AVR Вы увидели, что пространства кода и данных - общие?

видимо, сильное желание достигнуть цели ослепило меня, и я по любви и старой памяти к Z80 посчитал что всегда и везде адресное пространство едино как территориальное пространство Российской Федерации :)

Ну вот как-то вот так у меня получилось, что Data memory map каким-то образом вошло и в program memory. Логика подсказывала, что порядочные микроконтроллеры просто обязаны позволять делать с собой подобные вещи, иначе зачем их производить. :) Просто никада раньше с мк кроме 80ки не работал.

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

Изменено пользователем &y JOKER

Поделиться сообщением


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

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

 

Это - неверное логическое заключение. Про то, что ядро AVR8 суть типичный представитель семейства ЭВМ с гарвардской архитектурой Вы никогда не слышали?

Поделиться сообщением


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

Прога по формуле высчитывает точную задержку до такта. Далее по COM-порту инфа, а точнее сгенеренный код программы для каждого гена передается на управлющий МК, который программит по шине 3 МК-генераторы. Предполагается, что 3 гены будут юзать один внешний клок ген.

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

Похоже, Вы многое пропустили, лучше изучить и подтянуться.

Успехов.

P.S.Очень надеюсь, что Вы не "доктор".

Поделиться сообщением


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

кстати да, а в чем проблема делать все это одним мк ? на край найти какой нить с 3-мя 16-ти битными счетчиками? и еще проще, если у всех сигналов частота одна...

Поделиться сообщением


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

Это - неверное логическое заключение. Про то, что ядро AVR8 суть типичный представитель семейства ЭВМ с гарвардской архитектурой Вы никогда не слышали?

К сожалению, нет. Понимаю, что разные архитектуры заточены под разные задачи и имеют свои преимущества и недостатки, но в данном случае не совсем понятно, что мешало ATMel значительно расширить функционал мк. Какая разница откуда поступают данные для выполнения команды: flash или SRAM? Даже если у них разное адресное пространство.

 

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

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

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

На таймерах и прерываниях-это дополнительные такты, а мне важен минимальный шаг. Это дополнительные расчеты.

Что может быть проще, быстрее и точнее, чем заранее рассчитанный до такта алгоритм?

У меня была вполне конкретная задача: 3х канальный синхронный генератор импульсов, с возожностью автоматического перебора параметров импульса и управлением по COM-порту, скважностью до 2000000, шагом хотя-бы 0,05 us и минимальной длительностью 0,1 us. AVR теоретически позволял бы сделать такой девайс, если бы не вот это вот неожиданно всплывшее "но". :) Согласен, не очень симпатишно выглядит, зато теоретически работает как было задумано.

 

P.S.Очень надеюсь, что Вы не "доктор".

:) неа. Просто в далеком децтве у меня не было возможности проектировать и конструировать, а интерес и желание осталось.

 

Спасибо за критику - для меня это на самом деле имеет значение.

Оставшийся у меня вопрос: кто из мк таки умеет из оперативки запускать код?

Поделиться сообщением


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

Не спорю, можно и на x86 сделать

Я сказал - из современных :)

 

но мы не ищем легких путей.

То есть Вам "шашечки". Это Ваш выбор.

 

Оставшийся у меня вопрос: кто из мк таки умеет из оперативки запускать код?

Из массовых предлагаю три семейства - MSP430, STM32 и LPC2xxx.

Почитайте внимательно руководства, вполне может оказаться так, что все можно сделать на одном микроконтроллере

за два-три дня. Сейчас встроенные таймеры имеют блок COMPARE, который обычно и формирует импульсы.

Поделиться сообщением


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

и еще проще, если у всех сигналов частота одна...

в том-то и дело, что там вообще может быть все "не одно".

максимальная частота и минимальная длительность импульса, например:

ldi r22,1

ldi r23,0

 

s1: out 0x18,r22

out 0x18,r23

rjmp s1

 

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

А если одновременно на 3 канала надо синхронно и точно? Не писать же на каждый вариант отдельный код.

 

То есть Вам "шашечки". Это Ваш выбор.

:) не совсем, мне - "ехать". Просто принцип у меня: "бери от жизни все" :) - если есть еще возможность сделать лучше - нужно выжать все что можно. Если уж никак низя - тада другие варианты.

Готов смириться, что из меги в данном случае больше не выжать, но если работать будет сносно, то можно попробовать и пересмотреть исходные условия задачи. Ну будет шаг не 0,05 а 0,4 us, на низких частотах, воможно, и не будет столь актуально. Расчет был на максимум возможного, с запасом, как можно более точно.

 

Из массовых предлагаю три семейства - MSP430, STM32 и LPC2xxx.

пасиб, поизучаю.

 

Кстати, если кому нада, могу выложить прогу расчета задержки до такта. delay.h так не умеет. :laughing:

Диапазон от 1 до 20000000 тиков (дальше не тестил). Длина кода в среднем получается 20 строк. На 20 млн. не смог "разобрать по запчастям" 4 числа, но это собссно поправимо.

Изменено пользователем &y JOKER

Поделиться сообщением


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

А зачем программу в ОЗУ, ну храни в нем параметры твоих импульсоидов , задержек и периодов ,

принятых от старшего брата и пусть МК(или несколько) работает.

Изменено пользователем domowoj

Поделиться сообщением


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

Какая разница откуда поступают данные для выполнения команды: flash или SRAM? Даже если у них разное адресное пространство.

М-да. Фраза начисто сносит башку.

 

Оставшийся у меня вопрос: кто из мк таки умеет из оперативки запускать код?

Очевидно те, которые сделаны на фон-неймановской архитектуре.

Поделиться сообщением


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

взять какуюю нить Хмегу, связать там 2 таймера.. получить 32 разядный таймер... скважность сами посчитаете?

Изменено пользователем Duhas

Поделиться сообщением


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

А зачем программу в ОЗУ, ну храни в нем параметры твоих импульсоидов , задержек и периодов ,

принятых от старшего брата и пусть МК(или несколько) работает.

+1

Ограниченный кругозор не способствует решению задачи. Забудьте вы про Z80 равно как и про PDP11 и x86. Всё ушло и слава богу. Если бы эти процы были такие суперовые, то не погибли бы так бесславно. :)

Слава богу, для того, чтобы генерировать сигнал разной частоты и формы, сейчас не требуется переписывать программу. Для этого существуют таймеры. Они с этой задачей справляются лучше. В некоторых процах разрядность таймеров 32 бита (например LPC2xxx) и ещё прескалеры. Плюс частота таймера 60-72МГц. В atxmega таймеры работают на частоте, более высокой чем частота проца. При частоте проца 32МГц. Всё это позволяет получить более высокочастотный сигнал с большей точностью. При применении ШИМ можно также получать и синусоидальный сигнал, а также аналоговый сигнал произвольной формы.

 

Попробуйте ознакомится с сегодняшними процами и их возможностями. Пока вы спали мир ушёл далеко от исторических монстров типа Z80. :) Даже по системе команд.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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