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

Таймер В Tiny13 На Асме


HOT ICE

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

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

Я написал код но он у меня не работает по крайней мере в протеусе.

Вот код

;Выполняемые функцыи_____________________________
.device ATTINY13
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\tn13def.inc"
.list
;================================================
;Объявления
.def temp=r17
.def chik=r16
.def kol=r18
.def tim=r19

;================================================
rjmp Init
;НАЧАЛО программ

Init:


ldi  temp,0b000000;Определяяем входы и выходы порта B порт B0=0
out  DDRB,temp;

ldi  temp,0b000000;Включаем подтяжку для входов порта B подтяжка отключена
out  PortB,temp;и задаём начальные состояния входов
;Конфигурацыя таймера
ldi chik,0b000101;//Конфигурацыя таймера 1000000/1024  Сделать частоту 976 Гц
out TCCR0B,chik;//загружаю  это значение






;================================================
;Основное тело программы 
Start:
ldi tim,61;Начальное значение щётчика61
ldi kol,16;Начальное значение маркера16
Timeloop:;///////////////////////////
out TCNT0,temp;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
brne Timeloop;Если не равны возвращаюсь к цыклу
subi tim,-61;если равны Прибавляю 61 к tim
dec kol;уменьшаю маркер на еденицу
cpi kol,0;Сравниваю маркер kol c нулём
breq ek;и если kol=0 перехожу к ek



ek:;
sbi portB,0;устанавливаю порт PB0 в 1;
rjmp Start;Возврат к метке START

Для того чтобы сформировать задержку в даном коде это для 1сек я делаю следующее:

Определяю сколько раз Таймер достигает определённого значения,В данном случае я должен ждать пока он отщитает 976 раз (продёт одна сек),Это аналогично если бы таймер достиг значения 61 в общей сложности 16 раз.61x16=976/

Я проверяю не равно ли содержимое таймера 61,прибавляю для того чтобы можно было определять дальше,и при каждом достижениии таймером 61 я отнимаю от 16 единицу для определения сколько раз уже наступило событие,когда место 16 стало 0 должен выполняться другой участок кода ek:

Надеюсь написал понятно,хотя сам немного запутался.

Помогите пожалуйста

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

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

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

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

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

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

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

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

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

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

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

По коду:

1.

...
Timeloop:;///////////////////////////
out TCNT0,temp;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
brne Timeloop;Если не равны возвращаюсь к цыклу
..

В живом устройстве сдесь был бы бесконечный цикл.

2.

...
subi tim,-61;если равны Прибавляю 61 к tim
...

Лучше использовать adiw, а то как-то не по-людски:)

3.

...
breq ek;и если kol=0 перехожу к ek

ek:;
...

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

Мне кажется этот код стоит переписать.

P.S.: Я рекомендую Вам пользоваться AVR Studio для освоения данного МК.

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

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

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

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

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

1. Считать нужно КОЛИЧЕСТВО ПЕРЕПОЛНЕНИЙ ТАЙМЕРА БЕЗ ЕГО ПРЕДВАРИТЕЛЬНОЙ УСТАНОВКИ.

2. Для общего масштабировния времени применяется ПРЕДДЕЛИТЕЛЬ ТАЙМЕРА.

3. Для окончательной юстировки периода осчета, ПОСЛЕДНИЙ цикл счета таймера может быть сделан с предзагрузкой.

4. Предзагрузка таймера выполняется ДОПОЛНИТЕЛЬНЫМ КОДОМ НЕОБХОДИМОЙ ВЕЛИЧИНЫ ПЕРЕСЧЕТА.

5. Программные счетчики делают с помощью команд декремента с ветвлением(переходом) по НУЛЮ. При этом в начале работы эти счетчики загружают ДОПОЛНИТЕЛЬНЫМ кодом величины пересчета.

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Вот ещё пара замечаний по коду (по общей стратегии все сказал my504):

Timeloop:;///////////////////////////
out TCNT0,temp;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
brne Timeloop;Если не равны возвращаюсь к цыклу

Здесь ошибка, очевидно просто невнимательность. Должно быть так:

Timeloop:;///////////////////////////
in temp, TCNT0;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
brne Timeloop;Если не равны возвращаюсь к цыклу

А вот здесь

dec kol;уменьшаю маркер на еденицу
cpi kol,0;Сравниваю маркер kol c нулём
breq ek;и если kol=0 перехожу к ek

строка cpi kol,0; лишняя, т.к. команда dec и так установит флаг нуля (Z) при kol=0

Ну и после строки breq ek;и если kol=0 перехожу к ek очевидно должен быть например rjmp xx;если kol<>0 перехожу к xx

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

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

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

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

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

Спасибо за ответы попробую чтото переделать.

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

По ответу my504 я в принцыпе понял что человек хочет объяснить но как это реализовать не знаю.

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

HOT ICE, расписать в АСМе с ходу могу for PIC, only. Для атмелей нужно копаться в системе команд, извините лень...

Я на них не пишу... Но если вы просто разберетесь, где предделитель таймера, как его установить, как выглядит команда инкремента с ветвлением по нулю - ВАМ ТУТ ЖЕ ВСЕ СТАНЕТ ЯСНО. Для этого нужен ТОЛЬКО ДАТАШИТ. Откройте его и если чего непонятно - ВЕЛКАМ! Все разжуем... Но ВМЕСТЕ с Вами, а не ВМЕСТО Вас...

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

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

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

Спасибо вам за помощь,я изменил програму в протеуе работает,думаю в железе тоже будет.

ТОлько вот ещё вопрос получился-я знаю что за 976 тактов проходит секунда это с самым большим делителем при частоте 1000000/1024=976 тактов/сек.

Нахожу сомножители ну и делаю те операцыи которые в коде.

НО получается если нужно например 3 минуты а это 180 секунд тоесть 175680 тактов.Как мне тут быть ведь сомножитель не должен привышать 256.Тоесть максимально получается 65025примерно.

Или мне просто нужно ждать пока он достигнет 255 вот таким образом "in temp, TCNT0"сравнивать с макс значением "cp temp,255;"если равно прибавлять еденицу к переменной в которой будет количество достижений "subi dos,-1 "(adiw-в TINY не работает,так написано в книге и копмилятор тоже не хавает)И когда она достигнеть 688раз делать то что мне нужно.Правильно? <_< А разве переменная может хранить такое число?

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

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

Пример.

Имеем тактовую частоту, поступающую на предделитель таймера 1МГц.

Установим предделитель, скажем на 10 (цифры условны, просто чтобы в уме считать...), тогда на таймер придет 100 кГц (т.е. период 10 мкс).

Скажем нам необходимо иметь сетку установок времени 64 сек через 1 сек.

Тогда 16 разрядный таймер имеет полный пересчет 65536. Значит первое переполнение пропускаем, а во втором загружаем таймер кодом равным 65536-(100000-65536)=31072.

В результате получаем после второго переполнения таймера ровно 1 сек.

Теперь делаем пятиразрядный счетчик на отдельном байте(ячейке). Для этого загружаем в нее, например ДОПОЛНИТЕЛЬНЫЙ КОД числа 56. Это будет: 256-56=200. Далее инкрементируем эту ячейку после КАЖДОГО ВТОРОГО ПЕРЕПОЛНЕНИЯ ТАЙМЕРА. Как эта ячейка переполнится (в регистре статуса бит переноса станет равным 1 сразу за таким инкрементом), так время 56 сек достигнуто.

That`s all!!!

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

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

Теперь делаем пятиразрядный счетчик на отдельном байте(ячейке)

Спс

Вот этого не понял,точнее не знаю как делать совсем.

Остальное попробую написать код выложу для критики и поправокю

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

Просто я в примере взял максимальное число 64. Поэтому нужно только шесть(я описку допустил, сорри), а не восемь разрядов, но это никак на работу программы не влияет. Можете заменить в моем тексте пять на восемь и 64 на 256, respectively.

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

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

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

Блин это ужастно мне самому неудобно обращаться за каждой мелочью но я перед этим сижу и не могу понять почему но так и не понимаю

Делаю как мне кажется правильно ход действий расписан в коде,а оно не работает(В протеусе Задержка работала,а вот что всё начиналось при нажатии на кнопку нет(Но именно нужно чтоб при нажатиии сначало задавались эти параметры ldi tim,256

ldi kn,256

Я их в будущем хочу изменять в зависимости от кнопки

Init:


ldi  temp,0b000011;Определяяем входы и выходы порта B порт B0=0
out  DDRB,temp;

ldi  temp,0b000011;Включаем подтяжку для входов порта B подтяжка отключена
out  PortB,temp;и задаём начальные состояния входов
;Конфигурацыя таймера
ldi chik,0b000101;//Конфигурацыя таймера 1000000/1024  Сделать частоту 976 Гц !Предделитель
out TCCR0B,chik;//загружаю  это значение






;================================================
;Основное тело программы 
Start:



in	kol,PINB; копируется состояние порта если кн нажата, то соотв бит будет =0
sbrs	kol,1; эта команда пропустит следующую, если бит kol.1=1
; то есть если  кнопка не нажата
rjmp Start;И пока не будет нажата то проверяться

shitat:	   ;Это если нажата,задать начальные значения и делать код пока не истечёт время и програма вернётся
;к метке START и начнёт снова всё делать

ldi tim,256
ldi kn,256

Timeloop:;///////////////////////////



in temp, TCNT0;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
brne Timeloop;Если не равны возвращаюсь к цыклу
subi tim,-61;если равны Прибавляю 61 к tim
dec kn;уменьшаю маркер на еденицу



breq ek
rjmp shitat;если kol<>0 перехожу к Timeloop

ek:;ВКЛ СВЕТОДИОД

sbi portB,0;устанавливаю порт PB0 в 1;



rjmp Start;Возврат к метке START

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

Или мне просто нужно ждать пока он достигнет 255 вот таким образом "in temp, TCNT0"сравнивать с макс значением "cp temp,255;"если равно прибавлять еденицу к переменной в которой будет количество достижений "subi dos,-1 "(adiw-в TINY не работает,так написано в книге и копмилятор тоже не хавает)

adiw работает нормально, испытано неоднократно. Детальнее прочтите на стр.7 http://atmel.com/dyn/resources/prod_documents/2535S.pdf

Напишите процедуру делающую секундную задержку и потом вызываете её необходимое количество раз.

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

Че-то я не понял, у тебя что компилятор спокойно проглотил такое??? :

   ldi tim,256
ldi kn,256

А почему бы тебе не пользоваться симулятором АВР-студио? Там бы все мелкие (да и крупные) косяки и выловил сам, прощёлкав пошагово своё творение...

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

Че-то я не понял, у тебя что компилятор спокойно проглотил такое??? :

   ldi tim,256
ldi kn,256

А почему бы тебе не пользоваться симулятором АВР-студио? Там бы все мелкие (да и крупные) косяки и выловил сам, прощёлкав пошагово своё творение...

Да проглатил,у мен АВР-студио.Тут такой прикол что в компиляторе на кнопке получается оно зацыкливается и ждёт нажатия на кнопку а в протеусе при вкл прост о через 13 сек вкл светодиод и ему не важно нажата кнопка или нет,вот это меня и смущает не могу понять это я не правильно делаю ,компилятор глючит или протеус

.Да точно можно и вызывать количество раз которое нужно.

Спс

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

Там в АВР-студио есть опции ассемблера и можно выбрать старый вариант 1, или новый 2.

Сейчас проверил, действительно версия1 асма только предупреждает об ошибке, обрезает до 8 бит и нормально компилирует. А вот более продвинутая версия 2 просто ругается на "out of range" и дальше процесс не идет.

Ну и тем не менее, я не понял,

ldi tim,256

ldi kn,256

Все-таки что было задумано записать в tim и kn? Сейчас получается 0.

ps Ведь все это прекрасно видно в симуляторе: содержимое всех регистров, флагов, таймеров и т.д. - можно же легко увидеть в каком месте ступор. И нажатие кнопки симулируетя тоже..

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

Там в АВР-студио есть опции ассемблера и можно выбрать старый вариант 1, или новый 2.

Сейчас проверил, действительно версия1 асма только предупреждает об ошибке, обрезает до 8 бит и нормально компилирует. А вот более продвинутая версия 2 просто ругается на "out of range" и дальше процесс не идет.

Ну и тем не менее, я не понял,

ldi tim,256

ldi kn,256

Все-таки что было задумано записать в tim и kn? Сейчас получается 0.

ps Ведь все это прекрасно видно в симуляторе: содержимое всех регистров, флагов, таймеров и т.д. - можно же легко увидеть в каком месте ступор. И нажатие кнопки симулируетя тоже..

туи 255 должно быть записано должно быть,самая большая задержка.

Чтото не нахожу этой опцыии.

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

Всё то что хотел я сделал задержка примерно до одного часа получается на таймере 0.

Спасибо за идеи и за помощь.

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

Уже проверил на железе,работает!)

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

Рано радовался(

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

Почему?Ведь первый раз его нет <_<

Вот в очередной раз код,кстати в протеусе он теперь тоже не работает,это мне вообще странно

.device ATTINY13
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\tn13def.inc"
.list
;================================================
;Объявления
.def temp=r17
.def chik=r16
.def kol=r18
.def tim=r19
.def kn=r20
.def per=r21
.def etalon=r22
.def taim=r23
;================================================

;НАЧАЛО программ

Init:


ldi  temp,0b000011;Определяяем входы и выходы порта B порт B0=0
out  DDRB,temp;

ldi  temp,0b000010;Включаем подтяжку для входов порта B подтяжка отключена
out  PortB,temp;и задаём начальные состояния входов
;Конфигурацыя таймера
ldi chik,0b000101;//Конфигурацыя таймера 1000000/1024  Сделать частоту 976 Гц !Предделитель
out TCCR0B,chik;//загружаю  это значение





ldi etalon,1;колво раз вызова програмы ek сколько должна вызваться
;================================================
;Основное тело программы 
Start:

in temp,pinb

sbrc temp,1; эта команда пропустит следующую, если бит temp.0=0
rjmp start;Если нет то назад Это кнопка

sbi PORTB,0;Если да то вкл,и шагать на задержку







Timeloop:;///////////////////////////
ldi per,0;сколько раз EK прошол
ldi tim,61;Начальное значение
ldi kn,16;Начальное значение  секунд.

in temp, TCNT0;Записываю состояние таймера 0 в temp
cp  temp,tim; Сравниваю с 61
rjmp timeloop	;Если не равны возвращаюсь к цыклу
subi tim,-61;если равны Прибавляю 61 к tim
dec kn;уменьшаю маркер на еденицу

breq ek
rjmp timeloop;если kn<>0 перехожу к Timeloop

ek:

subi per,-1;колво раз задержек
cp per,etalon;сравниваю
breq bb;равны к BB
rjmp timeloop;не равны назад к цыклу
bb:
cbi PORTB,0;выкл и назад к старту.

rjmp Start;Возврат к метке START

Зацыкливание впринцыпе есть в Timeloop:;///////////////////////////

ldi per,0;сколько раз EK прошол

ldi tim,61;Начальное значение

ldi kn,16;Начальное значение секунд.

in temp, TCNT0;Записываю состояние таймера 0 в temp

cp temp,tim; Сравниваю с 61

rjmp timeloop ;Если не равны возвращаюсь к цыклу

subi tim,-61;если равны Прибавляю 61 к tim

Но ведь первый раз то проходит.

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

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

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

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

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

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

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

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

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

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

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