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

Как Зделать Задержку 128 Tc ?


Anatole

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ну, в общем случае набором ничего не делающих номанд, суммарная длительность выполнения которых как раз и составляет 128Тс. Обычно такую длительность выполняют путём прогона пустого цикла плюс некоторое количество NOP'ов для точной доводки - так программа получается короче.

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

Удачи!

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ну, в общем случае набором ничего не делающих номанд, суммарная длительность выполнения которых как раз и составляет 128Тс. Обычно такую длительность выполняют путём прогона пустого цикла плюс некоторое количество NOP'ов для точной доводки - так программа получается короче.

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

Удачи!

Не ну первый вариант это фуфел)

Я вот сейчас делаю вариант с Опросом регистра ADCTL - там первый бит если преобразование завершено равен 1, если не завершено, тогда 0. занести содержимое ADCTL в аккумулятор а потом проверить на четность, то можно и дождаться до конца преобразования в АЦП.

Но тут одна лажа никак немогу разобраться с переходом к подпрограмме, вот что получается:

JSR

WAIT: LDA ADR $1030

JPO WAIT

RTS

где косяк?

Да и можно еще вопрос какова длительность NOP и какие еще есть ничего не делающие команды, и какова их длительность?

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

ничегон е делающая по идее только ноп ... длительность - 1 такт, тоесть у всех своя...

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

Не ну первый вариант это фуфел)

Да и можно еще вопрос какова длительность NOP и какие еще есть ничего не делающие команды, и какова их длительность?

Вовсе не фуфел.

Иной раз нет ничего проще и корректней пустого цикла. Я пользуюсь не только NOP, но и DIV и MUL. Все длительности команд в даташите описаны должны быть, плюс осциллограф.

А ты уверен с проверкой на чётность, что там больше другие биты в аккумуляторе не модифицируются?

Может надо погасить ненужные биты перед проверкой и проверять на ноль?

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

Вовсе не фуфел.

Иной раз нет ничего проще и корректней пустого цикла. Я пользуюсь не только NOP, но и DIV и MUL. Все длительности команд в даташите описаны должны быть, плюс осциллограф.

А ты уверен с проверкой на чётность, что там больше другие биты в аккумуляторе не модифицируются?

Может надо погасить ненужные биты перед проверкой и проверять на ноль?

В даташите http://www.datasheetarchive.com/search.php?q=MC68HC11A8P нету. Ну то что NOP вроде 2Тс длиться. А вот DIV и MUL незнаю...

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

Так что остается либо сделать 64 NOPа, либо найти длительность команд DIV и MUL, либо реализовать задержку с помощью таймера! Это вот только сделать я не знаю как....если кто знает поделитесь!

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

сделать 64 NOPа
Ну зачем же так много. Простой алгоритм из любого букваря по программированию, напр.:

- затолкнуть в стек аккумулятор и флаги;

- занести в аккумулятор величину N;

- уменьшать содержимое аккумулятора до тех пор, пока он не обнулится;

- вытолкнуть из стека флаги и аккумулятор

в зависимости от типа МК будет содержать примерно 5...7 команд. Надобно подобрать такое N, чтобы для него время выполнения этого алгоритма было менее отмеряемой задержки, а для N+1 - более. На разницу по времени между требуемыми Вам 128Тс и временем выполнения вышеуказанного цикла набрать NOPов - вряд ли их наберётся более пары десятков. Ну, если это будет п/п - учесть время на вызов и возврат.

Удачи!

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

Нужно сделать задержку 128 Tc (время счета) или 64мкс, вопрос собственно: как сделать так, чтобы МК ровно 128Тс ничего не делал?

Как известно временные задержки очень успешно выполняются с помощью 8 или 16 разрядных таймеров. Используя 8ми разрядный таймер (к примеру ATmega128) можно реализовать максимальную задержку в 64мс при тактовой частоте 4Мгц, при этом микроконтроллер действительно ничего не делает, а находится в режиме SLEEP. Время задержки определяется по формуле: Кделх256/4000000, где Кдел - коэффициент делителя тактовой частоты.

Вот пример программы для задержки 64мкс:

ldi r20,1<<TOIE0

out TIMSK,r20 ;Разрешение прерывания от таймера Т0

ldi r20,1 out TCCR0,r20 ;Коэффициент деления 1 (для задержки 64мкс) sei ;Разрешение прерывания

ldi tmp,1<<SE ;Переход в спящий режим

out MCUCR,tmp

sleep

При этом микроконтроллер можно не переводить в режим sleep, а заставить его выполнять в это время что-то другое вместо пустых NOPов или ещё чего-то

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

Нужно сделать задержку 128 Tc (время счета) или 64мкс, вопрос собственно: как сделать так, чтобы МК ровно 128Тс ничего не делал?

Как известно временные задержки очень успешно выполняются с помощью 8 или 16 разрядных таймеров. Используя 8ми разрядный таймер (к примеру ATmega128) можно реализовать максимальную задержку в 64мс при тактовой частоте 4Мгц, при этом микроконтроллер действительно ничего не делает, а находится в режиме SLEEP. Время задержки определяется по формуле: Кделх256/4000000, где Кдел - коэффициент делителя тактовой частоты.

Вот пример программы для задержки 64мкс:

ldi r20,1<<TOIE0

out TIMSK,r20 ;Разрешение прерывания от таймера Т0

ldi r20,1 out TCCR0,r20 ;Коэффициент деления 1 (для задержки 64мкс) sei ;Разрешение прерывания

ldi tmp,1<<SE ;Переход в спящий режим

out MCUCR,tmp

sleep

При этом микроконтроллер можно не переводить в режим sleep, а заставить его выполнять в это время что-то другое вместо пустых NOPов или ещё чего-то

Вот это уже что-то похожее на правду) А для какого МК эта команда, если не секрет? И на каком языке написана?

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

Вот это уже что-то похожее на правду) А для какого МК эта команда, если не секрет? И на каком языке написана?

Ну-ну.

Ты б хоть подсказал что ты собираешся делать вообще, пока будешь ждать окончания преобразования.

Нафига городить целый таймер, если делать параллельно с преобразованием ничего не будешь.

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

Вот твоя конструкция:

-прочитать байт из $1030;

-умножить его логически на 080h;

-проверить: если ноль, то преобразование пока не завершено;

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

А вот ждать конца преобразования просто по выдержке времени - не совсем корректно. Мало ли что в даташите написано про время. На заборах тоже пишут.

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

Ну-ну.

Ты б хоть подсказал что ты собираешся делать вообще, пока будешь ждать окончания преобразования.

Нафига городить целый таймер, если делать параллельно с преобразованием ничего не будешь.

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

Вот твоя конструкция:

-прочитать байт из $1030;

-умножить его логически на 080h;

-проверить: если ноль, то преобразование пока не завершено;

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

А вот ждать конца преобразования просто по выдержке времени - не совсем корректно. Мало ли что в даташите написано про время. На заборах тоже пишут.

Мне нужно просто сделать АЦП. У него четыре цикла преобразования, каждый длится по 32 Тс итого 128 Тс. Ждать до конца преобразования по выдержке времени, считаю самым простым вариантом, потому что во первых это самый точный в плане быстродействия вариант (по сравнению с опросом регистра о конце преобразования) во вторых в плане памяти менее емкий, чем забивать 64 NOPа, или что-то вроде того, и в третьих эта реализия программы не зависит от частоты на которой работает МК. Вот почему именно таймер..

А по поводу Вашей программы, я так понял, что бит в $1030 это ADCTL....можно вопрос, зачем его умножать на 80h? если проверить завершения преобразования можно элементарно с помощью JNZ и других J(CON). Этот случай я рассматривал...в плане быстродействия это не самый лучший вариант...

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

зачем его умножать на 80h? если проверить завершения преобразования можно элементарно с помощью JNZ
Это для того, чтобы биты, не причастные к процессу, не навели порчу на этот самый процесс. Ибо команде проверки на равенство нулю, так же, как и Вами упомянутой "Переход, если не нуль", с помощью которой Вы планируете проверять завершение преобразования, совершенно безразлично, содержимое какого бита отличается от нуля.

И еще: я как-то не очень то уверен, что JNZ в состоянии самостоятельно, без дополнительных команд, выполнить проверку на ноль.

Да, кстати - а какой у Вас всё ж таки МК? Ибо в своём после Вы указали даташит на MC68HC11A8P, в то время как в системах команд у Вас присутствуют JPO, JNZ. Ведь вроде как Моторола для мнемоники команд своих МК традиционно использует не джампы, а бренчи.

Удачи!

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

Нужно сделать задержку 128 Tc (время счета) или 64мкс, вопрос собственно: как сделать так, чтобы МК ровно 128Тс ничего не делал?

Как известно временные задержки очень успешно выполняются с помощью 8 или 16 разрядных таймеров. Используя 8ми разрядный таймер (к примеру ATmega128) можно реализовать максимальную задержку в 64мс при тактовой частоте 4Мгц, при этом микроконтроллер действительно ничего не делает, а находится в режиме SLEEP. Время задержки определяется по формуле: Кделх256/4000000, где Кдел - коэффициент делителя тактовой частоты.

Вот пример программы для задержки 64мкс:

ldi r20,1<<TOIE0

out TIMSK,r20 ;Разрешение прерывания от таймера Т0

ldi r20,1 out TCCR0,r20 ;Коэффициент деления 1 (для задержки 64мкс) sei ;Разрешение прерывания

ldi tmp,1<<SE ;Переход в спящий режим

out MCUCR,tmp

sleep

При этом микроконтроллер можно не переводить в режим sleep, а заставить его выполнять в это время что-то другое вместо пустых NOPов или ещё чего-то

Вот это уже что-то похожее на правду) А для какого МК эта команда, если не секрет? И на каком языке написана?

Во первых: был задан вопрос как сделать так, чтобы МК ничего не делал во время задержки 64мкс - NOP, не являяется таковой командой. И вообще нет таких команд, при которых МК "ничего не делает". Ничего не делает он только если находится в спящем режиме - sleep, при этом выполняется необходимая задержка.

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

зачем его умножать на 80h? если проверить завершения преобразования можно элементарно с помощью JNZ
Это для того, чтобы биты, не причастные к процессу, не навели порчу на этот самый процесс. Ибо команде проверки на равенство нулю, так же, как и Вами упомянутой "Переход, если не нуль", с помощью которой Вы планируете проверять завершение преобразования, совершенно безразлично, содержимое какого бита отличается от нуля.

И еще: я как-то не очень то уверен, что JNZ в состоянии самостоятельно, без дополнительных команд, выполнить проверку на ноль.

Да, кстати - а какой у Вас всё ж таки МК? Ибо в своём после Вы указали даташит на MC68HC11A8P, в то время как в системах команд у Вас присутствуют JPO, JNZ. Ведь вроде как Моторола для мнемоники команд своих МК традиционно использует не джампы, а бренчи.

Удачи!

По поводу JNZ...естественно, что ей совершенно безразлично, содержимое какого бита равно нулю...я просто подумал, что если значение бита изначально 00000000 а потом оно делается 10000000 то JNZ может уловить разницу, поправте меня, если я ошибаюсь. По поводу мнемоники согласен, ибо литература по МК МОТОРОЛА у меня Шагурин... а в даташите я не нашел списка команд, поэтому буду благодарен, если кто-то поделится литературой или ссылочками..

P.S. Я даже и не знал, что банальная программа, которая обеспечивает задержку 128 Тс с помощью таймера может быть такой сложной(((

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

я просто подумал, что если значение бита изначально 00000000 а потом оно делается 10000000 то JNZ может уловить разницу, поправте меня, если я ошибаюсь.
Просто в большинстве случаев команды условных переходов анализируют состояние регистра флагов (варианты названия: регистр состояния, слово состояния). Флаги всегда изменяются при выполнении логических/арифметических команд; команды же пересылки довольно часто состояния флагов не изменяют, т.е., напр., если для аккумулятора выполнить исключающее или с самим собой - установится флаг нуля, который после засылки в аккумулятор числа, отличного от нуля, из ячейки памяти может и не измениться. Все МК я, естественно, не знаю, и поэтому насколько это так для конкретного типа - надо смотреть особенности системы команд этого конкретного МК.

Удачи!

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

И все таки, коллеги, тема вопроса не раскрыта...

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

Спасибо!

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

буду благодарен, если кто-то поделится литературой или ссылочками..

Вот обобщённая таблица, в которую когда-то была сведена система команд микроконтроллера MC68HC11A8. Откуда скачал - не помню, да и сам лично с ней не работал.

В качестве благодарности с Вас при встрече семь маленьких... :)

Удачи!

mk_2_add_2.zip

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

  • 2 месяца спустя...

Есть такой вариант: в CVAVR есть волшебная функция delay_us(). Она написана на асемблере, если не нравиться С, можно выдернуть код из delay.lib

Электронщики всего мира объеденяйтесь!

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

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

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

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

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

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

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

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

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

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

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