Обсуждаем контроллеры компании Atmel.
Ответить

поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 03:28:53

ДД!

не могу решить задачку.

Купил атмел нано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 период диод моргнул, на второй период быстрее, еще через пару раз он мерцает, и в конце просто тускнеет, и опять по кругу. Это догадки, но медленное моргание точно повторяется.

Поскольку никаких особенность в проге нет, то ошибка где то именно в рассуждениях. Я все, сдался самостоятельно разобраться, Вроде просто, но не могу больше, у меня так в школе наступал ступор и дальше уже ничего не помогало.
Ткните плиз!

спасибо (здесь блюдичко со сметаной)
Вложения
blibl2.hex
(1.29 KiB) Скачиваний: 4
blibl2.asm
(3.48 KiB) Скачиваний: 6
Последний раз редактировалось Газзель! Сб фев 24, 2024 19:48:02, всего редактировалось 2 раз(а).

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 13:24:00

Мегу 328ю под ассемблером...
:cry:
Весьма смело как для начинающего.
8)
Однако без *.inc файла (m328Pdef.inc или m328def.inc - зависит от конкретного кристалла) даже авр студио 4.19 под ассемблером работать корректно не сможет. Там по умолчанию обязательное описание ресурсов МК. Плюс надо разобраться с начальной конфигурацией да текущим состоянием набора фуз-бит. Да и с настройкой проекта. (Как и с работой симулятора АВР студио).
У менее жирных кристаллов это заметно проще.
А тут еще и ардуиновская нанка - там ведь по умолчанию еще свой бутлоадер зашит да соответствующий ардуине набор фузов. Её сначала в "состояние с завода-изготовителя" перед подобным издевательством привести нужно.
Так что рекомендую в данном случае под ардуиноIDE на Си прожку делать, без излишнего садомазохизма.
Ежли охота под ассемблером поморочиться - то надо с чего то попроще начинать - тиньки 13 или 2313 к примеру...
:roll:
Или даже без самих МК - только в симуляторе прогнать прожку.
:wink:
Да и цель не слишком корректна - без циклов и подпрограмм даже простая замигайка кошмаром станет. Это же не автомат на рассыпухе и ПЗУ, как в древних (новогодних) замигайках делалось.
Микроконтроллер все таки!
:tea:

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 17:34:48

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

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

может я не разобрался, но тинки мне показались сложнее, они вроде как есть аналог полноценой архитектуры, а есть какието уменьшенные. Типа как пик 10 сложнее пик16

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 17:42:32

глупая задача порождает глупые решения...

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 17:48:40

а можно ткнуть в ошибку?

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 18:14:22

Газзель! Вот ты уже 26 постов настрочил, а код вставлять так и не научился?
И циклы, как я понимаю, ты ещё не освоил, не?

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 18:19:47

а спасибо, не знал такой фичи но помоему хуже стало

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 18:29:51

Для начала хотя бы узнать, чего хотелось той программой получить.
Простое описание словами ЧЕГО ХОТИМ ПОЛУЧИТЬ в результате.
Еще лучше график нарисовать.
А уж потом под словесное описание имеющимися средствами программу делать.
А так... Зачем гонять данные в регистрах? куда выводить, откуда читать?
И на кой вообще вся эта городушка нужна?
Заниматься изучением "а-ля хакер" того кода (без сопроводительного словесного описания задачи), что выложен... Как-то не слишком интересно...
:dont_know:

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 18:42:16

это БЛИНК или але ворлд.
Платка нано замечательна тем, что там уже распян светодиод PB5. В него выводится в последней строке. В регистрах по сути подсчитывается сколько раз программа была исполнена, но поскольку 256 тактов маловато для видимого моргания, то считается несколько ступеней 256*256*256= 16777216 и еще * на колво строк. каждая предидущая ступень это барьер для приращения в следующей. Ну как если бы третий таймер считал второй, а второй сичтал первый, только каждый таймер здесь вся прога целиком
Последний раз редактировалось Газзель! Сб фев 24, 2024 20:10:19, всего редактировалось 2 раз(а).

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 19:26:28

...
Последний раз редактировалось BOB51 Сб фев 24, 2024 20:30:00, всего редактировалось 1 раз.

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 19:53:28

добавил sbi 0x04, 5 и к сожалению jmp 0x0001 но я так понял для ардуины он по умолчанию на выход. по крайней мере ничего не меняется, кроме того что появляется цикл с 1 строки...

щас вложу еще малость долларов, но согласно учебнику можно и так и так.





EDIT
доллары $ не принимает, пишет

C:\arduino-1.6.13-windows\blibl2\blibl2.asm(13): error: x1E: Unknown instruction or macro
C:\arduino-1.6.13-windows\blibl2\blibl2.asm(13): error: syntax error, unexpected ','


адрес ИО регистра я как в даташите указан, так его и записал

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 20:14:58

Чего-то я не понял...
А при чем тут ардуино и ассемблер то???!
:shock:
Ну там конечно свой ассемблер в GCC имеется, но это совсем отдельная тема.
Префиксы $ относятся к avrasm2 из АВР студио!
В ардуино используется Си/С++ (смотри https://www.arduino.cc/reference/en/)...
:sleep:

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 20:17:26

BOB51 писал(а):должно быть
Код:
in R31, $0x1E
вот это и есть ахинизьм.
0x - уже означает шестнадцатеричную запись.

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 20:27:00

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

Да, Sbi 0x04, 5 явно нужно было, моя ошибка, но не помогло.

и еще интересное, если Cbi 0x04, 5 то светодиод всеравно очень тускло горит, типа как еслиб был ШИМ10%б и при этом еще и моргает по тому же алгоритму

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 20:28:50

Starichok51 писал(а):
BOB51 писал(а):должно быть
Код:
in R31, $0x1E
вот это и есть ахинизьм.
0x - уже означает шестнадцатеричную запись.

Согласен... К сожалению никогда не пользовался прямым указанием адресов регистров у АВРок.
Таки $ там нету...

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 20:45:14

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

Re: поезд из А движется пока из басейна вытекает... BLINK

Сб фев 24, 2024 21:37:18

я понимаю, но у меня нет цели написать быстро какую то длинную и сложную прогу, а сначала суметь заставить в лоб работать контроллер, а уж потом прибавлять к этому удобные фишечки

Re: поезд из А движется пока из басейна вытекает... BLINK

Вс фев 25, 2024 00:01:23

А что, плохой контроллер? Почему его надо заставлять? :shock:

Re: поезд из А движется пока из басейна вытекает... BLINK

Вс фев 25, 2024 05:15:35

Я начинал с ассемблера. И мой первый микроконтроллер был ATMEGA8535.
Купите, скачайте книгу Вольфганг Трамперт "AVR-RISC Микроконтроллеры". Там подробное описание архитектуры МК AVR. И примеры на ассемблере.
Так же нужно научить себя думать не ассемблерными категориями, а более объектно.
Также посоветую посмотреть в сторону конечных автоматов. На КА blink делается лехко.
State 0. Инициализация ввода вывода. Установка программного таймера. Установка изначального состояния лампочки. Установка State 1.
State 1. Ожидание таймера. Если время, не вышло, то выход. Если вышло, переключение выхода, установка программного таймера, выход.
Позже выберу время. Выложу свой пример.

Re: поезд из А движется пока из басейна вытекает... BLINK

Вс фев 25, 2024 16:51:21

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

нашел ошибку, что в К 25-26 перепутаны sub add, но на удивление стало хуже... КУДА ПРОПАЛА КНОПКА РЕДАКТИРОВАНИЯ В ПЕРВОМ СООБЩЕНИИ?!!!

методом перебора регистров на выход, ошибка должна быть сразу на втором этапе, где диод 8 раз мигает и 9 раз горит. Но самое интересное, что он мигает ! То есть 256*256, а он хоть и быстро, но именно мигает, а не мерцает.

А вот теперь для меня самое интересное. Процесс прошивания влияет на результат работы.

1. заливаю прошивку ниже, где на вывод взят R23, и получаю стабильный меандр блинка.
2. Reset и блинк пропадает, просто горит немного мерцая.
3. повтор -опять то же самое. Работает только и всегда перепрошив в любой последовательности и комбинации, и то же с ресетом.

Блик также исчезает если в начале добавить
cli
clr R16
clr R17
clr R18
clr R19
clr R20
clr R21
clr R22
clr R23
clr R24
clr R25
clr R26
clr R27
clr R28
clr R29
clr R30
clr R31
nop

и в конце соответственно

jmp 0x0011


Это получается при перепрошивке не происходит обнуление регистров?! Но даже в этом случае не ясно, что там може сохраниться, что блинк начинает работать.

вот сама прошивка:

Код:
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 ;

sub R25, R31 ; здесь 3 ступень, аналоги№2 R16 R17
add 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, R23
asr R31
asr R31 ; b7 зажигает pb5


sbi 0x04, 5
out 0x05, R23 ; по задумке должно 128 гореть и гаснуть
jmp 0x0000
; но нет



какая взаимосвязь?
Последний раз редактировалось Газзель! Вс фев 25, 2024 17:10:02, всего редактировалось 1 раз.
Ответить