|
Самопрограммирование AVR, Помогите определить причину ошибки |
|
|
|
May 22 2008, 11:20
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Len_OK @ May 22 2008, 13:29)  Помогите разобраться почему не пишутся данные во флеш(пытаюсь записать 2 байта )
DoSpm **************SKIPPED***************
LDI R20,low(flash_data) LDI R21,high(flash_data) MOVW R1:R0,R21:R20 Тут какая-то неправда  Получается, что Вы все время грузите r0:r1 одной и той же константой, т.е. адресом переменной. Вам ведь надо загрузить указатель на extern flash_data и оттуда что-то взять ? тогда это может выглядеть так: Код ldi r26,low(flash_data) ldi r27,high(flash_data) ld r0,X+ ld r1,X+
|
|
|
|
|
May 22 2008, 11:23
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Заполнить надо весь temp буфер. После этого писать. Если хотите записать только 2 байта - то надо прочитать содержимое всей страницы, изменить 2 байта, и записать модифицированную страницу в temp буфер, потом стереть страницу, и инициировать запись страницы. Цитата почему не пишутся данные во флеш У вас функция зацикливается здесь: Код Wait_spm: ... SBRC R19, 0 RJMP Wait_spm
OUT SPMCR,R16 SPM SEI <--- к тому же запись в SPMCR происходит при разрешенных прерываниях!!!! ... while_EEPROM:// not write to EEPROM SBIC 0x1C, 0x01 RJMP while_EEPROM
call Wait_spm //enable write to prog. memory Каждая функция (вызываемая CALL'ом) должна заканчиваться RET'ом.
|
|
|
|
|
May 22 2008, 13:22
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Len_OK @ May 22 2008, 11:37)  Как заполнить всю страницу данными, например при вызове ассемблерной функции передать в нее данные из буфера на 32 элемента Если из одной области памяти в другую, то можно так, например Код ;Move data from the RAM area into another one ramram: ld temp1,z+ st y+,temp1 dec cntbyt brne ramram ret Перед вызовом надо само собой настроить указатели Y и Z, ну и счётчик байт, как же без него. Отправил пост и потом заметил, что это 800-й. Ну и ну, неужто я столько накатал(:-)?!
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 22 2008, 14:13
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986

|
DoSpm //*************fill temp bufer*************
PUSH R31 PUSH R30
ldi r18,96// load data from mem ldi r19,0 st Z,R18 std Z+1,R19
ldi R26, low(flash_data) ldi R27, high(flash_data) ldi R23,0x32 fill_temp: LD R0,X+ LD R1,X+ ST Z, R0 STD Z+1,R1 wait_spm: IN R18,0x37 MOV R19,R18 SBRC R19, 0 RJMP wait_spm
LDI R18, 1 LDI R30, flash_data LD R20, Z LDD R21,Z+1 mov R30, R17 LDI R31,0 MOVW R1:R0,R21:R20 OUT 0x37,R18 SPM
LDI R16,1 OUT SPMCR,R16 SPM
dec R23 dec R23 cpi R23,0 brne fill_temp
//***************************************** //******* save data to programm memory***** LDI R16,low(flash_adr)//load address in prog.mem. LDI R17,high(flash_adr) MOVW R31:R30,R17:R16
LDI R16,5 OUT SPMCR,R16 SPM POP R30 POP R31
//***************************************** RET END DoSpm Вот накалякала вот такую штуку.В результате записывается один байт, во второй просто нули и всё
Сообщение отредактировал Len_OK - May 22 2008, 14:28
|
|
|
|
|
May 22 2008, 20:57
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата Len_OK  У меня к вам вопрос (точнее два вопроса). 1. Если вы не собираетесь писать программу на "C" тогда зачем пользоваться убогим иаровским ассемблером? avrasm2 в AVR-Studio гораздо более удобен и правилен "как асм". 2. Напротив, если собираетесь писать на "C", то неужели одной DoSpm( addr, data, code) недостаточно? имея одну функцию "заправки" требуемых регистров и вызова SPM, все остальное можно оформить на C примерно в таком виде: Код DoSpm( page_addr, 0x0, CODE_ERASE); // <--- стререть страницу DoSpm( page_addr, 0x0, CODE_REENABLE_RWW); // <--- разлочить RWW секцию если работаем из boot секции for( i = 0; i < PAGE_SIZE; i++) { // fill temp buffer DoSpm( page_addr + i, <слово данных>, CODE_FILL_TEMP_BUF); // <-- заполнить temp буфер } DoSpm( page_addr, 0x0, CODE_DO_PROGRAM ); // <--- зашить темп буфер DoSpm( page_addr, 0x0, CODE_REENABLE_RWW); // разлочить RWW если работаем из boot секции
|
|
|
|
|
May 23 2008, 07:32
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986

|
Цитата(defunct @ May 22 2008, 23:57)   У меня к вам вопрос (точнее два вопроса). 1. Если вы не собираетесь писать программу на "C" тогда зачем пользоваться убогим иаровским ассемблером? avrasm2 в AVR-Studio гораздо более удобен и правилен "как асм". 2. Напротив, если собираетесь писать на "C", то неужели одной DoSpm( addr, data, code) недостаточно? Я конечно собираюсь все писать на си. Просто я решила написать полностью функцию на ассемблере, чтобы из си передавать только буфер с данными. И функцию заполнения страницы представляла себе намного сложнее. Ваш вариант оказался проще, спасибо за терпение
Сообщение отредактировал Len_OK - May 23 2008, 07:35
|
|
|
|
|
May 23 2008, 11:46
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986

|
[quote name='defunct' date='May 23 2008, 13:02' post='415863'] У меня всё ещё возникают проблемы с записью. Если я заполняю страницу какой-то интовой константой, размер страницы указываю 32(а должно быть 16 слов), то все нормально записывается. Если же я пытаюсь заполнить страницу какими-то данными из моего буфера, то ничего не получаеся
|
|
|
|
|
May 23 2008, 15:09
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата размер страницы указываю 32(а должно быть 16 слов), Запоняется буфер словами, выходить за границы буфера при его заполнении нежелательно (может приводить к непредсказуемым последствиям). (PAGE_SIZE >> 1) - будет количество слов. ;> И при загрузке данных, надо увеличивать адрес на 2. page_addr + (i << 1). Если не заработает - приведите код, вечером смогу попробовать на тиньке.
|
|
|
|
|
May 26 2008, 06:21
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986

|
Цитата(defunct @ May 23 2008, 18:09)  Если не заработает - приведите код, вечером смогу попробовать на тиньке. Прилагаю свой проект, потому как всё ещё не могу разобраться в чём проблема. Программка почему-то вообще не хочет работать с буфером.
Сообщение отредактировал Len_OK - May 26 2008, 06:25
|
|
|
|
|
Jun 1 2008, 22:27
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Асм функция используемая вами - рабочая. Полагаю что-то не так было с загрузкой данных и возможно адресами. Загружать temp буфер надо словами, а не байтами. Цитата Программка почему-то вообще не хочет работать с буфером. Убедитесь что фуз SELFPRGEN запрограммирован (установлен в 0)! см атач. проверил в железе (на t2313). Писал в последнюю страницу флеш - работает (стирает / пишет).
|
|
|
|
|
Jun 2 2008, 06:08
|
Участник

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986

|
Цитата(defunct @ Jun 2 2008, 01:27)  см атач. проверил в железе (на t2313). Писал в последнюю страницу флеш - работает (стирает / пишет). Спасибо, я все проверила, всё работает...просто не хватало оперативки контроллера!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|