Программирование Flash arduino

vladsf
Offline
Зарегистрирован: 30.03.2021

Добрый день!

Прошу у Гуфов помощи.

Пробую сделать программу, которая пишет во Flash стандартной подпрограммой. В ячейки $290, $291 записываю начальный адрес страницы Flash. Записываю страницу. Почему то во Flash первые 32 байта данные пишутся, как положено, начиная с начального адреса, А остальные 96 байт улетают в адреса, которые меньше начального адреса страницы (по логике должны увеличиваться в сравнении с начальным адресом). Подпрограмма вроде бы стандартная. В чем может быть причина.

.CSEG
.org $3fa0;2c0;c3b;db7;
flash_write:

lds r30, $290
lds r31, $291
cli

; Page Erase; Ñòèðàíèå ñòðàíèö
ldi r20, (1<<PGERS) | (1<<SPMEN)
call Do_spm

; re-enable the RWW section ïîâòîðíî âêëþ÷èòå ðàçäåë RWW
ldi r20, (1<<RWWSRE) | (1<<SPMEN)
call Do_spm
; transfer data from RAM to Flash page buffer ïåðåäà÷à äàííûõ èç îïåðàòèâíîé ïàìÿòè â áóôåð ôëýø-ñòðàíèö

ldi r24, low(PAGESIZEB) ;init loop variable
ldi r25, high(PAGESIZEB) ;not required for PAGESIZEB<=256
Wrloop:
ld r0, Y+
ld r1, Y+
ldi r20, (1<<SPMEN)
call Do_spm
adiw ZH:ZL, 2
sbiw r25: r24, 2 ;use subi for PAGESIZEB<=256
brne Wrloop
; execute Page Write âûïîëíèòü Çàïèñü ñòðàíèöû
subi ZL, low(PAGESIZEB) ;restore pointer
sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256
ldi r20, (1<<PGWRT) | (1<<SPMEN)
call Do_spm
; re-enable the RWW section ïîâòîðíî âêëþ÷èòå ðàçäåë RWW
;lds r30, $290
;lds r31, $291
ldi r20, (1<<RWWSRE) | (1<<SPMEN)
call Do_spm

; return to RWW section
; verify that RWW section is safe to read
Return:
in r16, SPMCSR
sbrs r16, RWWSB ; If RWWSB is set, the RWW section is not ready yet
ret
; re-enable the RWW section
ldi r20, (1<<RWWSRE) | (1<<SPMEN)
call Do_spm
rjmp Return
;sei
;ret
Do_spm:
; check for previous SPM complete
Wait_spm:
in r16, SPMCSR
sbrc r16, SPMEN
rjmp Wait_spm
; input: spmcrval determines SPM action
; disable interrupts if enabled, store status
in r17, SREG
; check that no EEPROM write access is present
Wait_ee:
sbic EECR, EEPE
rjmp Wait_ee
; SPM timed sequence
out SPMCSR, r20
spm
; restore SREG (to enable interrupts if originally enabled)
out SREG, r17
;sei
ret

 

Logik
Offline
Зарегистрирован: 05.08.2014

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А чего на си стандартной программой влом? Или скорости немерянные?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

2ТС:

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

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

Так что ищи форум единомышленников. Возможно такие есть. 

=================

Да, Я согласен, что мы ВААЩЕ не можем читать код на асме и не понимаем величия кодера, познавшего тайны оного! ;)))))))))))))) Жалкие, ничтожные люди... ;))

vde69
Offline
Зарегистрирован: 10.01.2016

wdrakula пишет:

Да, Я согласен, что мы ВААЩЕ не можем читать код на асме и не понимаем величия кодера, познавшего тайны оного! ;)))))))))))))) Жалкие, ничтожные люди... ;))

я 25 лет назад писал кое чего для 86 процов, но смотрю а тут почти все команды "другие"  :) ну нифига не понятно :))) но тогда были еще прямые вставки машинного кода, так, что даже тогда когда на Ассемблере еще были знающие люди встречались те кто своими вставками просто убивал читаемость кода....

Наверно так-же будет лет через 50, когда кто-то на форуме напишет код на с++ и его так-же закидают шапками (и будут правы в этом)

 

vladsf
Offline
Зарегистрирован: 30.03.2021

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

vladsf пишет:

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

То-есть Дракула был прав, выпендрился!!!
 

vladsf
Offline
Зарегистрирован: 30.03.2021

Чего здесь на форуме все злые. Я действительно два дня бился над проблемой. Обратился сюда за помощью, как крайний вариант. Знал какой ворох бурчаний услышу. И дело оказалось совсем не не в коде не важно будь он написан на СИ или Ассемблере. Если кому интересно скажу, память нужно разбивать на секции кратные размеру страницы. Для ардуино страница равна 128 байт. Я в регистру Zh, Zl записал не кратный адрес. Из-за этого вся чихарда.

Green
Offline
Зарегистрирован: 01.10.2015

Чихарда очевидно от слова чихать.)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

А вот про невыровненный адрес страницы - как раз было очевидно. И не весь ДШ нужно было перекрывать, а только внимательно прочитать про страничную организацию. Но писать это на асме - все равно идиотский мазохизм.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

vladsf пишет:

 Если кому интересно скажу, память нужно разбивать на секции кратные размеру страницы. Для ардуино страница равна 128 байт. Я в регистру Zh, Zl записал не кратный адрес. Из-за этого вся чихарда.

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

 

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:
А вот про невыровненный адрес страницы - как раз было очевидно. И не весь ДШ нужно было перекрывать, а только внимательно прочитать про страничную организацию. Но писать это на асме - все равно идиотский мазохизм.

Мне поздно перестраиваться ни СИ. Пишу на том языке, который мне нравится. Для меня проще писать на ассемблере. А в память Flash я писал раньше просто не много позабыл про кратность. Еще хочу уточнить про ардуино. Вы я смотрю товарищ начитанный. Почему на выводах порта d напряжение логической единицы 2,9В, а на выводах порта C 4,9В. Порты настроены на вывод. Из за более низкого напряжения не стабильно работает ЖК индикатор WP1602

rkit
Offline
Зарегистрирован: 23.11.2016

Либо ты их спалил, либо перегрузил.

Green
Offline
Зарегистрирован: 01.10.2015

Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)

vladsf
Offline
Зарегистрирован: 30.03.2021

rkit пишет:

Либо ты их спалил, либо перегрузил.

Все выводы разом и на двух ардино подряд?

Green
Offline
Зарегистрирован: 01.10.2015

vladsf пишет:

Мне поздно перестраиваться ни СИ. 


"Об этом думать никому не рано и никогда не поздно".

vladsf
Offline
Зарегистрирован: 30.03.2021

Green пишет:

Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)

]

Я пишу не так часто и уже использую готовые библиотеки, которые сам писал, поэтому мне проще.

Green
Offline
Зарегистрирован: 01.10.2015

Вот, вот. То о чём я и говорю. Всё сам и сам.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)

я писал когда-то драйвер, чтобы читать и писать гибкие дискеты любой плотности (не терять ёмкость), Альберто Паскуале своим тогда еще не разродился, а тут смысл в чём?

Green
Offline
Зарегистрирован: 01.10.2015

"Были и мы когда то рысаками." Асм хорош тем, что низкий порог входа и всё под твоим контролем. Вот только нафига...) Обычно с него начинают железячники.)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

rkit пишет:

Либо ты их спалил, либо перегрузил.

Все выводы разом и на двух ардино подряд?

поскольку такого не может быть, то, вероятно да - спалил. Или что-то подключил, или "тыкаешь" в D0 и D1. ;))

vladsf
Offline
Зарегистрирован: 30.03.2021

Green пишет:

"Были и мы когда то рысаками." Асм хорош тем, что всё под твоим контролем. Вот только нафига...)

Вот это мне и нравится. Мне раньше часто требовалось построить процесс так (например, когда проектировал 6 фазный тиристор выпрямитель), чтобы промежуточные вычисления производились когда в промежутке между прерываниями. Это хорошо когда видишь код целиком и наблюдаешь его работу.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

rkit пишет:

Либо ты их спалил, либо перегрузил.

Все выводы разом и на двух ардино подряд?

поскольку такого не может быть, то, вероятно да - спалил. Или что-то подключил, или "тыкаешь" в D0 и D1. ;))

Что значит тыкаешь в D0 и D1/

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

Мне поздно перестраиваться ни СИ. Пишу на том языке, который мне нравится.

Я уже писал тебе, когда ты USB "мучал", что твоё хобби никто не критикует и касается оно только тебя. НО(!!!) до тех пор, пока ты не просишь копаться в ассемблерном коде других. Вот про это я тебе и пишу снова.

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

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

Что значит тыкаешь в D0 и D1/

D0 D1 это Rx Tx и выведены на USB-UART на платах Ардуино на 328ом контроллере. Что-то измерять на них не стоит. ;) Хотя бы потому, что к ним светодиоды подключены ;)).

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

Что значит тыкаешь в D0 и D1/

D0 D1 это Rx Tx и выведены на USB-UART на платах Ардуино на 328ом контроллере. Что-то измерять на них не стоит. ;) Хотя бы потому, что к ним светодиоды подключены ;)).

У меня ардуино микро и rx tx это pd2 pd3 висят в воздухе. Я думаю нет ли в ардуинке каких либо ограничителей напряжения. Ток ардуино потребляет 26ма. Так что перегруза нет.

vde69
Offline
Зарегистрирован: 10.01.2016

посмотри какое опорное напряжение и сравни с даташитом. 

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

vladsf
Offline
Зарегистрирован: 30.03.2021

У меня кстати, что то похожее было правда на atmega16.