а я бы делал так:
пусть CNT - счетный регистр, LMT регистр границы счета, STEP - регистр с приращением (1 или -1).
1. если CNT равно LMT, то 2, иначе 7
2. STEP инвертировать
3. если LMT равно 240, то 6
4. LMT = 240
5. перейти на 7
6. LMT = 80
7. CNT+STEP
8. перейти на 1
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV, это, похоже, работать будет. Я делал почти также, только вместо РАВНО (у Вас увидел) использовал brcc , brcs вместо breq и brne. Спасибо, а я, долгоёп, раз не додумался. Но проверю позже (код а не долгоёп я или нет).
Но спасибо - всем тоже
на условие надо попадать при выходе из диапазона, а не при попадании в него.
т.е должно быть не если (x>=80) то y=1;
если (x<=240) то y=-1;
x+y
a если (x<=80) то y=1;
если (x>=240) то y=-1
x+y
т.е при х от 80 до 240 не должно выполняться ни одно условие, тогда не будет топтания.
Добавлено after 3 minutes 7 seconds:
равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv писал(а):равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
не смотря на то, что я и сам в своём коде вместо жесткого равенства использую не жесткое сравнение >= или <=, никто никогда мне не смог объяснить, с какого перепугу счетчик в программе вдруг примет некорректное значение? я и сам не понимаю, но да, на равно не проверяю
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881195#p3881195"]Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?[/uquote]
Да, используются, ВСЕ используемые прерыванием регистры и срег сохраняются, я ж не совсем чайник.
Если что, тини 13, свободны только 2 регистра. В РАМе только стек.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881203#p3881203"]Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.[/uquote]
Да всё хорошо, ведь разобрались уже. Всё арбайт.
Прерывания запрещены. Код обмена я, в общем-то, списал из ДШ, только метки написал свои, и не стал оформлять подпрограммой, просто вставил внутренней частью своего цикла - 10 раз выдать на SPI код 0xFF. И оно не работает. Посмотрел в симуляторе, почему-то после первой или второй записи в SPDR гаснет бит MSTR (мастер) в SPXR, после чего навсегда гаснет бит SPIF в SPSR, и программа навсегда зацикливает в проверке под меткой L2. В реале тоже не работает - на бите 0х20 порта В (РВ5) висит светик, который зажигается при записи туда 1, так он не зажигается. ЧЯДНТ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ну в данном случае что subi r17,1 , что dec R17 делают одно и то же и по размеру одинаковы - по 2 байта.
Другое дело - если бы контроль не по Z, а по С выполнялся...
Demiurg писал(а):1- А сбрасывать флаг SPIF кто будет?
Угу, косяк. Но в примере кода в ДШ этого тоже нет, так, что косяк не совсем мой. Но да, не до конца вник в это чудо - аппаратный SPI.
Demiurg писал(а):2 - Вы оригинал? На куа subi вместо dec?!
Давно не программировал на асме, подзабыл, что там не так с флагами у команды DEC, разбираться еще и с этим поленился, а длина и количество тактов у DEC и SUBI одинаковы. Да, DEC работает со всеми регистрами, в отличие от SUBI, но "для попробовать" регистров и так выше крыши, а боевую программу все равно надо будет делать в прерываниях, т.е. писать заново...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
[uquote="Demiurg",url="/forum/viewtopic.php?p=3882329#p3882329"]1- А сбрасывать флаг SPIF кто будет?[/uquote]
Теперь мне ничего не понятно. Зачем его сбрасывать? Я не сбрасываю и всё работает.
И эту строку вообще не использую:
Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR
Доброго времени суток!
Изучаю внешние прерывания. При прогоне программы в AVRStudio4 и эмуляции внешнего прерывания на выводе PB1(INT0) (прерывание настроено по изменению уровня) иногда программа уходит в прерывание и возвращается из прерывания однократно, а иногда прерывание обрабатывается два раза, при этом в дополнительно устанавливается бит INTF0 в активное состояние, который при первом заходе в прерывание не сбрасывается, а сбрасывается при втором заходе в прерывание. Подскажите, может у меня ошибка в коде где то? Что не так я делаю. Далее программа .Сама программа написана только для понимания работы прерывания
Спойлер.DEVICE ATtiny13
.INCLUDE "tn13def.inc"
.DSEG
.ESEG
.CSEG
;****** INTERRUPT VECTORS **************************************************
.ORG $000
RJMP RESET ; Reset Handler
.ORG $001
RJMP EXT_INT0 ; EXT_INT0 ; IRQ0 Handler
.ORG $002
RJMP PCINT_0 ; PCINT0 ; PCINT0 Handler
Симулятор студии не всегда корректно отражает работу внутренней периферии мк. Поэтому нужно отталкиваться от знания архитектуры мк. Читайте толковые книги, даташиты.
Расставляем точки останова в критических местах ДО момента исполнения проверяемой команды и вручную меняем содержимое флажков во время останова исполнения симуляции.