реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Самопрограммирование AVR, Помогите определить причину ошибки
_Pasha
сообщение May 22 2008, 11:20
Сообщение #31


;
******

Группа: Участник
Сообщений: 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


Тут какая-то неправда smile.gif
Получается, что Вы все время грузите r0:r1 одной и той же константой, т.е. адресом переменной.
Вам ведь надо загрузить указатель на extern flash_data и оттуда что-то взять ?
тогда это может выглядеть так:
Код
ldi r26,low(flash_data)
ldi r27,high(flash_data)
ld r0,X+
ld r1,X+
Go to the top of the page
 
+Quote Post
defunct
сообщение May 22 2008, 11:23
Сообщение #32


кекс
******

Группа: Свой
Сообщений: 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'ом.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 22 2008, 12:37
Сообщение #33


Участник
*

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



Как заполнить всю страницу данными, например при вызове ассемблерной функции передать в нее данные из буфера на 32 элемента
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 22 2008, 13:22
Сообщение #34


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-й. Ну и ну, неужто я столько накатал(:-)?!


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 22 2008, 14:13
Сообщение #35


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение May 22 2008, 20:57
Сообщение #36


кекс
******

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



Цитата
Len_OK

bb-offtopic.gif У меня к вам вопрос (точнее два вопроса).
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 секции
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 23 2008, 07:32
Сообщение #37


Участник
*

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



Цитата(defunct @ May 22 2008, 23:57) *
bb-offtopic.gif У меня к вам вопрос (точнее два вопроса).
1. Если вы не собираетесь писать программу на "C" тогда зачем пользоваться убогим иаровским ассемблером? avrasm2 в AVR-Studio гораздо более удобен и правилен "как асм".
2. Напротив, если собираетесь писать на "C", то неужели одной DoSpm( addr, data, code) недостаточно?


Я конечно собираюсь все писать на си. Просто я решила написать полностью функцию на ассемблере, чтобы из си передавать только буфер с данными. И функцию заполнения страницы представляла себе намного сложнее.
Ваш вариант оказался проще, спасибо за терпение smile.gif

Сообщение отредактировал Len_OK - May 23 2008, 07:35
Go to the top of the page
 
+Quote Post
defunct
сообщение May 23 2008, 10:02
Сообщение #38


кекс
******

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



Цитата(Len_OK @ May 23 2008, 10:32) *
Я конечно собираюсь все писать на си.

Тогда хорошо бы "причесать" функцию - добавить в нее проверку на готовность SPM перед загрузкой SPMCR регистра. (не знаю насколько это актуально для tiny, но это нужно для мег, где есть RWW секция).
Код
WAIT_SPM_READY:
SBIC  SPMCR,  0
RJMP WAIT_SPM_READY
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 23 2008, 11:46
Сообщение #39


Участник
*

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



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


кекс
******

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



Цитата
размер страницы указываю 32(а должно быть 16 слов),

Запоняется буфер словами, выходить за границы буфера при его заполнении нежелательно (может приводить к непредсказуемым последствиям).
(PAGE_SIZE >> 1) - будет количество слов. ;>
И при загрузке данных, надо увеличивать адрес на 2.
page_addr + (i << 1).
Если не заработает - приведите код, вечером смогу попробовать на тиньке.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 26 2008, 06:21
Сообщение #41


Участник
*

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



Цитата(defunct @ May 23 2008, 18:09) *
Если не заработает - приведите код, вечером смогу попробовать на тиньке.


Прилагаю свой проект, потому как всё ещё не могу разобраться в чём проблема. Программка почему-то вообще не хочет работать с буфером.

Сообщение отредактировал Len_OK - May 26 2008, 06:25
Прикрепленные файлы
Прикрепленный файл  SpmTest.rar ( 19.22 килобайт ) Кол-во скачиваний: 29
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 1 2008, 22:27
Сообщение #42


кекс
******

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



Асм функция используемая вами - рабочая. Полагаю что-то не так было с загрузкой данных и возможно адресами.
Загружать temp буфер надо словами, а не байтами.

Цитата
Программка почему-то вообще не хочет работать с буфером.

Убедитесь что фуз SELFPRGEN запрограммирован (установлен в 0)!

см атач.
проверил в железе (на t2313).
Писал в последнюю страницу флеш - работает (стирает / пишет).
Прикрепленные файлы
Прикрепленный файл  my_spm_t2313_.zip ( 20.19 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
Len_OK
сообщение Jun 2 2008, 06:08
Сообщение #43


Участник
*

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



Цитата(defunct @ Jun 2 2008, 01:27) *
см атач.
проверил в железе (на t2313).
Писал в последнюю страницу флеш - работает (стирает / пишет).


Спасибо, я все проверила, всё работает...просто не хватало оперативки контроллера!
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016