не могу решить задачку.
Купил атмел нано328Р, которая с большой вероятностью lgt8. Это моя первая прога, и я уже вижу где можно было б сократить и оптимизировать, но задача обратная, или скорее задача как изложить последовательные шаги и заставить выполнять то, что хочу.
Меня удивило что в учебниках и базовых примерах используется инклюд.
Я поставил себе цель сделать БЛИНК без использования флагов, переносов, ветвлений, петелек и переходов. Единственый цикл это вся программа целиком. То есть каждый проход программы от первой до последней точки чуть чуть изменяет регистр, и при следующем проходе программы эти изменения используются и накапливаются.
вот что получилось (кстати, как в АВР студио 4 включить нумерацию строк?):
Код: Выделить всё
sbi 0x04, 5 ; edit
dec R16 ; здесь b7 будет 127раз 1 + 128й раз 1
inc R17 ; здесь b7 будет 127раз 0 + 128й раз 1
mov R31, R16 ; здесь и далее в R31 и 0x1E будем
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31 ; переворачивать b7 в b0
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ; перевернули
add R18, R31 ;здесь b7 сложится из 128раз
; перевернутых единиц R16 и перевернутых нулей R17
;а потом , после использования, вычтется из
;перевернутых нулей R16 и перевернутых единиц R17
mov R31, R18
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ;
sub R20, R31 ; здесь 2 ступень, аналоги№1 R16 R17
add R21, R31 ; из моргнувшей в R18 единички
mov R31, R17 ; sub end0 доделываем 1 ступень
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
sub R18, R31 ; после пользования моргнувшей
;в R18 единички 127 раз держим b7 в ноль
mov R31,R20 ; продолжаем 2 ступень
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ;
add R23, R31 ;аналог№1 R18
mov R31,R23
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ;
add R25, R31 ; здесь 3 ступень, аналоги№2 R16 R17
sub R26, R31
mov R31,R21 ; sub1
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ;
sub R23, R31 ; sub1
mov R31, R25
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E ;
add R27, R31;аналог№2 R18
mov R31, R27
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
sub R28, R31 ;здесь 4 ступень, аналоги№3 R16 R17
add R29, R31
mov R31, R26 ;sub2
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
sub R27, R31; sub2
mov R31, R28
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
add R30, R31 ;аналог№3 R18
mov R31, R30
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
add R19, R31 ; конец подсчета
;19 потому что просто для наглядности пропустил
mov R31, R29 ;sub3
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
asr R31
out 0x1E, R31
cbi 0x1E, 7
cbi 0x1E, 6
cbi 0x1E, 5
cbi 0x1E, 4
cbi 0x1E, 3
cbi 0x1E, 2
cbi 0x1E, 1
in R31, 0x1E
sub R30, R31 ; sub3
mov R31, R19
asr R31
asr R31 ; b7 зажигает pb5
out 0x05, R31 ; по задумке должно 128 гореть и гаснуть
jmp 0x0001
; но нет
в результате диод отбивает морзянку. Диод в основном горит и моргание в виде короткого потухания. Я это мог бы как нить предположить, что где то при переполнении регистра задваивается ноль, но это не все. Понаблюдав за диодом я почти уверен, что морзянка одна и та же, но каждый период ускоряется в геометрической прогрессии. То есть 1 период диод моргнул, на второй период быстрее, еще через пару раз он мерцает, и в конце просто тускнеет, и опять по кругу. Это догадки, но медленное моргание точно повторяется.
Поскольку никаких особенность в проге нет, то ошибка где то именно в рассуждениях. Я все, сдался самостоятельно разобраться, Вроде просто, но не могу больше, у меня так в школе наступал ступор и дальше уже ничего не помогало.
Ткните плиз!
спасибо (здесь блюдичко со сметаной)


