Программирование Flash arduino
- Войдите на сайт для отправки комментариев
Втр, 20/04/2021 - 12:24
Добрый день!
Прошу у Гуфов помощи.
Пробую сделать программу, которая пишет во 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
стандартная подпрограмма, она как обычный стиральный порошок, отстирывает хуже.
А чего на си стандартной программой влом? Или скорости немерянные?
2ТС:
Я вроде тебе писал уже, или не тебе, но такому же. Программисты используют ассемблер не для прикола, а как средство ручной оптимизации в критических по скорости местах кода (и чем лучше становятся оптимизаторы в GCC, тем меньше это вообще оправдано).
Никто не станет разбираться в ассемблерном коде, просто потому, что вдруг появился энтузиаст "бега в мешках". ;)) Пойми меня правильно. Человек, который пишет банальные и не критичные по времени выполнения части "через жопу", а на асме - это именно так и называется, воспринимается, как человек, который просто рисуется, да еще и перед незнакомыми людьми, что вдвойне странно.
Так что ищи форум единомышленников. Возможно такие есть.
=================
Да, Я согласен, что мы ВААЩЕ не можем читать код на асме и не понимаем величия кодера, познавшего тайны оного! ;)))))))))))))) Жалкие, ничтожные люди... ;))
Да, Я согласен, что мы ВААЩЕ не можем читать код на асме и не понимаем величия кодера, познавшего тайны оного! ;)))))))))))))) Жалкие, ничтожные люди... ;))
я 25 лет назад писал кое чего для 86 процов, но смотрю а тут почти все команды "другие" :) ну нифига не понятно :))) но тогда были еще прямые вставки машинного кода, так, что даже тогда когда на Ассемблере еще были знающие люди встречались те кто своими вставками просто убивал читаемость кода....
Наверно так-же будет лет через 50, когда кто-то на форуме напишет код на с++ и его так-же закидают шапками (и будут правы в этом)
Спасибо всем откликнувшимся. Проблема решена. Пришлось весь даташеет перерыть.
Спасибо всем откликнувшимся. Проблема решена. Пришлось весь даташеет перерыть.
То-есть Дракула был прав, выпендрился!!!
Чего здесь на форуме все злые. Я действительно два дня бился над проблемой. Обратился сюда за помощью, как крайний вариант. Знал какой ворох бурчаний услышу. И дело оказалось совсем не не в коде не важно будь он написан на СИ или Ассемблере. Если кому интересно скажу, память нужно разбивать на секции кратные размеру страницы. Для ардуино страница равна 128 байт. Я в регистру Zh, Zl записал не кратный адрес. Из-за этого вся чихарда.
Чихарда очевидно от слова чихать.)
А вот про невыровненный адрес страницы - как раз было очевидно. И не весь ДШ нужно было перекрывать, а только внимательно прочитать про страничную организацию. Но писать это на асме - все равно идиотский мазохизм.
Если кому интересно скажу, память нужно разбивать на секции кратные размеру страницы. Для ардуино страница равна 128 байт. Я в регистру Zh, Zl записал не кратный адрес. Из-за этого вся чихарда.
если поборол хорошим тоном будет выложить код с комментариями, в противном случае это позёрство однако
Мне поздно перестраиваться ни СИ. Пишу на том языке, который мне нравится. Для меня проще писать на ассемблере. А в память Flash я писал раньше просто не много позабыл про кратность. Еще хочу уточнить про ардуино. Вы я смотрю товарищ начитанный. Почему на выводах порта d напряжение логической единицы 2,9В, а на выводах порта C 4,9В. Порты настроены на вывод. Из за более низкого напряжения не стабильно работает ЖК индикатор WP1602
Либо ты их спалил, либо перегрузил.
Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)
Либо ты их спалил, либо перегрузил.
Все выводы разом и на двух ардино подряд?
Мне поздно перестраиваться ни СИ.
"Об этом думать никому не рано и никогда не поздно".
Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)
Я пишу не так часто и уже использую готовые библиотеки, которые сам писал, поэтому мне проще.
Вот, вот. То о чём я и говорю. Всё сам и сам.
Ну почему же. На асме тоже можно довольно таки быстро и красиво писать. Если придерживаться каких то правил и соглашений. Ещё макросредства здорово помогают. Другое дело, что то большое писать тяжело, потому что писать придётся всё самому. А так да, муторно и прошлый век.)
я писал когда-то драйвер, чтобы читать и писать гибкие дискеты любой плотности (не терять ёмкость), Альберто Паскуале своим тогда еще не разродился, а тут смысл в чём?
"Были и мы когда то рысаками." Асм хорош тем, что низкий порог входа и всё под твоим контролем. Вот только нафига...) Обычно с него начинают железячники.)
Либо ты их спалил, либо перегрузил.
Все выводы разом и на двух ардино подряд?
поскольку такого не может быть, то, вероятно да - спалил. Или что-то подключил, или "тыкаешь" в D0 и D1. ;))
"Были и мы когда то рысаками." Асм хорош тем, что всё под твоим контролем. Вот только нафига...)
Вот это мне и нравится. Мне раньше часто требовалось построить процесс так (например, когда проектировал 6 фазный тиристор выпрямитель), чтобы промежуточные вычисления производились когда в промежутке между прерываниями. Это хорошо когда видишь код целиком и наблюдаешь его работу.
Либо ты их спалил, либо перегрузил.
Все выводы разом и на двух ардино подряд?
поскольку такого не может быть, то, вероятно да - спалил. Или что-то подключил, или "тыкаешь" в D0 и D1. ;))
Что значит тыкаешь в D0 и D1/
Мне поздно перестраиваться ни СИ. Пишу на том языке, который мне нравится.
Я уже писал тебе, когда ты USB "мучал", что твоё хобби никто не критикует и касается оно только тебя. НО(!!!) до тех пор, пока ты не просишь копаться в ассемблерном коде других. Вот про это я тебе и пишу снова.
На мой взгляд - это немного неправильно. Ассемблерный код, даже хорошо комментированный, практически не читаем, не говоря про незаконченный и сделанный "для себя". Ты, вероятно, его читаешь, но просить посмотреть других - я бы не стал.
Что значит тыкаешь в D0 и D1/
D0 D1 это Rx Tx и выведены на USB-UART на платах Ардуино на 328ом контроллере. Что-то измерять на них не стоит. ;) Хотя бы потому, что к ним светодиоды подключены ;)).
Что значит тыкаешь в D0 и D1/
D0 D1 это Rx Tx и выведены на USB-UART на платах Ардуино на 328ом контроллере. Что-то измерять на них не стоит. ;) Хотя бы потому, что к ним светодиоды подключены ;)).
посмотри какое опорное напряжение и сравни с даташитом.
Встречал когда опорное ниже нормы всего на чуть чуть начинаются чудеса на ногах...
У меня кстати, что то похожее было правда на atmega16.