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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> SPM ATtiny84
Artёm
сообщение Nov 22 2007, 06:29
Сообщение #1


Участник
*

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



Добрый День!

Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы?

И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2.
В этом случае где разместить Boot Loader и как передать ему управление.

И понятие Boot sector пременимо к этому МК?

Сообщение отредактировал Artёm - Nov 22 2007, 06:31
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 22 2007, 10:58
Сообщение #2


кекс
******

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



Цитата(Artёm @ Nov 22 2007, 09:29) *
Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы?
И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2.

Все верно
Цитата
В этом случае где разместить Boot Loader и как передать ему управление.
И понятие Boot sector пременимо к этому МК?

Вполне применимо, с некоторыми ограничениями - прерывания использовать не получится.
Очевидно размещать bootloader удобно в последних страницах флеш. Bootloader должен при записи первой страницы подменять команду по адресу 0 на rjmp BOOTLOADER_ENTRY (адрес своей точки входа), сохранять где-то (в одной из страниц флеш или например в eeprom) оригинальную команду расположенную по адресу 0, чтобы потом можно было передать управление основной программе.
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 23 2007, 10:39
Сообщение #3


Участник
*

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



Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2007, 11:01
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Artёm @ Nov 23 2007, 12:39) *
Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Он скрыт от вас. Писать вы в него можете командой SPM, а читается он только путем перезаписи во флеш.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 23 2007, 11:27
Сообщение #5


Участник
*

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



Пробую записать страницу во flash предварительно заполнив последовательностью чисел.
Проверяю в симуляторе: записывает по адресу 0х0200 только одно слово 3F 3E т.е. последнее записываемое слово. Куда пропадают остальные байты


ErasePageFlash(0x0200);
for (i=0;i<32;i++)
{
a = i;
a = a<<1;
FillBuf((i*2), (i*2)+1, a);
}

WritePageToFlash(0x0200);


void FillBuf(unsigned char low, unsigned char hi, unsigned int c)
{
#asm
ldd r1,y+3
ldd r0,y+2
ldd R30,y+1
ldd R31,y+0
#endasm
SPMCSR = 0x01;
#asm
spm
#endasm
}

void WritePageToFlash(unsigned int c)
{
#asm
ldd R31,y+1
ldd R30,y+0
#endasm
SPMCSR = 0x05;
#asm
spm
#endasm
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 23 2007, 13:05
Сообщение #6


Ambidexter
*****

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



Цитата(Artёm @ Nov 23 2007, 11:27) *
Пробую записать страницу во flash предварительно заполнив последовательностью чисел. Проверяю в симуляторе: записывает по адресу 0х0200 только одно слово 3F 3E т.е. последнее записываемое слово. Куда пропадают остальные байты

У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 23 2007, 13:29
Сообщение #7


Участник
*

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



Цитата(=GM= @ Nov 23 2007, 16:05) *
У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса.


Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает.
При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во flash.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 23 2007, 14:37
Сообщение #8


кекс
******

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



Цитата(Artёm @ Nov 23 2007, 16:29) *
Если переставить то все равно не работает.

Предлагаю взять пример из ДШ. Он там точно рабочий.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 23 2007, 19:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(Artёm @ Nov 23 2007, 16:29) *
Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает.
При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во flash.


Процедура сложнее, чем Вы ее себе представляете.

1 Загружаем R0,R1
2 SPMCSR = 0x01
3 Ждем сброса SELFPRGEN
4 Делаем п 1,2,3 пока не заполним страницу
5 SPMCSR = 0x03
6 Ждем сброса SELFPRGEN
7 SPMCSR = 0x05
8 Ждем сброса SELFPRGEN

Если хотим потом прочитать ,что записали
9 SPMCSR = 0x11
10 Ждем сброса SELFPRGEN

Если опять ничего не записали ,смотрим ,может у нас есть фуз SELFPRG smile.gif
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 26 2007, 05:41
Сообщение #10


Участник
*

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



Цитата(bodja74 @ Nov 23 2007, 22:13) *
...
1 Загружаем R0,R1
2 SPMCSR = 0x01
3 Ждем сброса SELFPRGEN
...


Что значит ждем сброса SELFPRGEN это же Fuse bit, разве он меняется в процессе выполнения программы может Вы имели ввиду какой-нибудь другой бит, если да то какой?
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 26 2007, 07:41
Сообщение #11


Участник
*

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



Спасибо всем ответившим.
Разобрался.

#asm
ldd r1,y+3
ldd r0,y+2
ldd R30,y+1
ldd R31,y+0
#endasm //в этом месте сбрасывалась переменная i по-этому писалось все в первую ячейку
SPMCSR = 0x01; //буфера
#asm
spm
#endasm

пришлось переделать так:
#asm
push r16
ldd r1,y+3
ldd r0,y+2
ldd R31,y+1
ldd R30,y+0

push r29
push r28

clr r29 ; Очистить старший байт y
ldi r28,0x57
ldi r16,0x01
st y,r16 ;SPMCSR = 0x01;

spm
pop r28
pop r29
pop r16
#endasm
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 26 2007, 10:27
Сообщение #12


Ambidexter
*****

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



Цитата(bodja74 @ Nov 23 2007, 19:13) *
Процедура сложнее, чем Вы ее себе представляете.

1 Загружаем R0,R1
2 SPMCSR = 0x01
3 Ждем сброса SELFPRGEN
4 Делаем п 1,2,3 пока не заполним страницу
5 SPMCSR = 0x03
6 Ждем сброса SELFPRGEN
7 SPMCSR = 0x05
8 Ждем сброса SELFPRGEN

Если хотим потом прочитать, что записали
9 SPMCSR = 0x11
10 Ждем сброса SELFPRGEN


SELFPRGEN - это фьюз, он не изменяется просто так, например, он программируется внешним последовательным программатором, с помощью команды Write Extended Fuse Bits.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Artёm
сообщение Nov 26 2007, 10:56
Сообщение #13


Участник
*

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



Цитата(=GM= @ Nov 26 2007, 13:27) *
SELFPRGEN - это фьюз, он не изменяется просто так, например, он программируется внешним последовательным программатором, с помощью команды Write Extended Fuse Bits.


Я и говорю зачем его ждать если он фьюз...

Нашел в исходниках:
while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed

Может bodja74 это имел ввиду?...
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 26 2007, 11:30
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(Artёm @ Nov 26 2007, 14:56) *
Я и говорю зачем его ждать если он фьюз...

Нашел в исходниках:
while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed

Может bodja74 это имел ввиду?...

Да ,я примерно это имел ввиду.

Вы в своих исходниках привели регистр SPMCSR ,а не SPMCR,поэтому я подумал ,что адекватнее было бы говорить про бит SELFPRGEN ,бит SPMEN просто переименовали так smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 26 2007, 12:40
Сообщение #15


Ambidexter
*****

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



Можно и подождать, вреда не будет, а можно и не ждать, поскольку "The CPU is halted during the Page Erase and Write operations" (цитата со с.159-160).

То есть, проверяй бит, не проверяй бит, всё равно процессор стоит.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

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

 


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


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