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

Зацикливание Кода На Несколько Повторений.


hardbar

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

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

ЗЫ: если не так подписал тему.

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

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

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

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

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

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

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

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

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

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

Может. Поставить чтоб в регистер +1 и каждый раз проверать если не дошло до константы в начало кода. Так работать будет??

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

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

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

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

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

У меня получилось в вести код в цикл командой Brlo

.def zad=r17
.equ kal=4
m1:
clr temp
out portb,temp
ldi temp,0b00000100
out portb,temp
rcall wait1
inc zad
cpi zad,kal
brlo m1
clr zad

Но я не смог сделать задержку между повторением команд. и теперь у меня не 4 импульса а один но длиный.

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

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Для управления битами порта есть команды попроще. А в чём проблема с задержкой?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Скорее так.

ldi temp,4
m1:
cbi portb,2
rcall wait1
sbi portb,2
rcall wait1
dec temp
brne m1

И пауза и импульс должны быть обозначены нужной длительностью.

Изменено пользователем Григорий Т.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

А можно её в коде показать

MOV "регистр","количество проходов"

M: nop

.

. ' тело цикла

.

DJNZ "регистр", М

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

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Да, Вы правы! похоже нет.

Тогда, делаем декремент и сравнение разными командами.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Вот сделал. Работает.

.include "tn13adef.inc"
.list
.def temp=r16
.def zad=r17
.equ kdel=50
.equ kal=4
.cseg
.org 0
ldi temp,ramend
out spl,temp
ldi temp,0b11111111
out ddrb,temp
ldi temp,0b00000000
out portb,temp
ldi temp,0x05
out tccr0b,temp
ldi temp,0x80
out acsr,temp

main:
m1:
clr temp
out portb,temp
rcall wait1
ldi temp,0b00000100
out portb,temp
rcall wait1
inc zad
cpi zad,kal
brlo m1
clr zad


rcall wait1


m2:
clr temp
out portb,temp
rcall wait1
ldi temp,0b00001000
out portb,temp
rcall wait1


clr temp
out portb,temp


inc zad
cpi zad,kal
brlo m2
clr zad


rcall wait1

rjmp main


wait1:
push temp
push zad
ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cpi temp,kdel
brlo wt1
pop zad
pop temp
ret



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

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Но мне кажется что для моей задачи очень много кода. Прошу прокоментрировать. Или это нормально.

Задача:мерцание 4 раза led1 мерцание 4 раза led2. Бесконечный цикл

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Григорий Т.

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

Вот укороченый код.

l.include "tn13adef.inc"
.list
.def temp=r16
.equ kdel=50
.cseg
.org 0
ldi temp,ramend
out spl,temp
ldi temp,0b11111111
out ddrb,temp
ldi temp,0b00000000
out portb,temp
ldi temp,0x05
out tccr0b,temp
ldi temp,0x80
out acsr,temp
main:
ldi temp,4
m1:
sbi portb,2
rcall wait1
cbi portb,2
rcall wait1
dec temp
brne m1

rcall wait1
ldi temp,4
m2:
sbi portb,3
rcall wait1
cbi portb,3
rcall wait1
dec temp
brne m2

rcall wait1
rjmp main

wait1:
push temp
ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cpi temp,kdel
brlo wt1
pop temp
ret


Вот что получилось. Самое то что надо было.

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

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Попробуй еще так:

.list
.def temp=r16
.equ kdel=50
.cseg
.org 0

ldi temp,ramend
out spl,temp
ser temp
out ddrb,temp
clr temp
out portb,temp
ldi temp,0x05
out tccr0b,temp
ldi temp,0x80
out acsr,temp
clr r18

main:
ldi r17,ob00000100
rcall cicle
rcall wait1
ldi r17,ob00001000
rcall cicle
rcall wait1
rjmp main

cicle:
ldi temp,4
m1:
out portb,r17
rcall wait1
out portb,r18
rcall wait1
dec temp
brne m1
ret

wait1:
clr r19,0
out tcnt0,r19
wt1:
in r19,tcnt0
cpi r19,kdel
brlo wt1
ret

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

Как вариант. Но я пока придержусь. Того что есть.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Но мне кажется что для моей задачи очень много кода.

Вот те раз. В моем примере кода меньше, при той же функциональности, а ему уже не надо.

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

А я убрал еще дублирующий цикл.

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

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

Возьму на заметку ваши слова. А про регистры самое то.

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

Потихоньку дошел до прерываный. Но вот немогу понять почему не работает. Вроде бы код верен. Прошу посмотреть если что подправить.

.include "tn13adef.inc"
.list
.def temp=r16  ;переименуем регистр под удобное имя
.equ kdel=50   ;добавим конатснту
.equ kdel2=100 ;добавим константу

.cseg
.org 0    ;начальный адрес
rjmp reset;прерывание по сбросу
rjmp int_0;прерывание по порту int0

reset:             ;
ldi temp,ramend    ;чтото с памятю связано
out spl,temp       ;
ldi temp,0b11111100;настройка порта на
out ddrb,temp      ;вод.вывод
ldi temp,0b00000011;подтяжка резистрами
out portb,temp     ;установка в порте лог.0
ldi temp,0x05      ;пред-делитель 
out tccr0b,temp    ;таймера
ldi temp,0x80      ;отключение
out acsr,temp      ;чегото там
sei                ;завершенеи прерывание по сбросу

main:            ;имя части програмы
ldi temp,10      ;запись в РОН числа 10
m1:              ;имя части програмы
sbi portb,2      ;установка порта в 0
rcall wait1      ;вызов задержки
cbi portb,2      ;установка порта в 1
rcall wait1      ;вызов задержки
dec temp         ;РОН:=РОН-1
brne m1          ;проверка РОНа не 0 ли да едем дальше не
rcall wait1      ;возвращаемся по метке 
ldi temp,10      ;запись в РОН числа 10
m2:
sbi portb,3   ;установка порта в 0
rcall wait1   ;вызов задержки
cbi portb,3   ;установка порта в 1
rcall wait1   ;вызов задержки
dec temp      ;РОН:=РОН-1
brne m2       ;проверка РОНа не 0 ли да едем дальше не
rcall wait1   ;возвращаемся по метке 
rjmp main     ;безусловный переход

int_0:       ;метка вызова прерываный по порту int0
m3:
sbi portb,2  ;установка порта в 0
rcall wait2  ;вызов задержки
cbi portb,2  ;установка порта в 1
rcall wait2  ;вызов задержки
m4:
sbi portb,3  ;установка порта в 0
rcall wait2  ;вызов задержки
cbi portb,3  ;установка порта в 1
rcall wait2  ;вызов задержки
reti         ;конец прерывания

wait1:       ;Все что снизу задержка на таймере.
push temp
ldi temp,0
out tcnt0,temp
wt1:
in temp,tcnt0
cpi temp,kdel
brlo wt1
pop temp
ret

wait2:
push temp
ldi temp,0
out tcnt0,temp
wt2:
in temp,tcnt0
cpi temp,kdel2
brlo wt2
pop temp
ret

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

Очень люблю спасибку.

Спасибка ни кого еще не убила.

Професия: Електро-механик.

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

hardbar, очень полезная привычка, да и просто, признак хорошего тона, писать комментарии к коду. Чем подробнее, тем лучше. Что именно не работает, и как должно?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

hardbar, вам совет - разбивайте программу на смысловые блоки.

Для этого можно использовать всевозможные символы:

;-----------------------------------------------------------------------------------
; Объявление переменных, констант
; и сопоставление имен
;-----------------------------------------------------------------------------------
   .equ cSeg1 = 0x01 ;Первый сегмент
;........................................................................................................
   .def tmp0 = r16 ;Временный регистр 0

;====================================================
; Основной цикл
;====================================================
main:
   nop
   nop

   ldi tmp0, cSeg1
   out PORTA,tmp0

   rjmp main
;====================================================

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

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

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

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

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

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

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

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

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

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

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

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

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

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