|
SPM ATtiny84 |
|
|
|
Nov 22 2007, 06:29
|
Участник

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

|
Добрый День!
Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы?
И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2. В этом случае где разместить Boot Loader и как передать ему управление.
И понятие Boot sector пременимо к этому МК?
Сообщение отредактировал Artёm - Nov 22 2007, 06:31
|
|
|
|
|
Nov 22 2007, 10:58
|

кекс
     
Группа: Свой
Сообщений: 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, чтобы потом можно было передать управление основной программе.
|
|
|
|
|
Nov 23 2007, 10:39
|
Участник

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

|
Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
|
|
|
|
|
Nov 23 2007, 11:27
|
Участник

Группа: Новичок
Сообщений: 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 }
|
|
|
|
|
Nov 23 2007, 13:29
|
Участник

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

|
Цитата(=GM= @ Nov 23 2007, 16:05)  У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса. Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает. При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во flash.
|
|
|
|
|
Nov 23 2007, 19:13
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 26 2007, 05:41
|
Участник

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

|
Цитата(bodja74 @ Nov 23 2007, 22:13)  ... 1 Загружаем R0,R1 2 SPMCSR = 0x01 3 Ждем сброса SELFPRGEN ... Что значит ждем сброса SELFPRGEN это же Fuse bit, разве он меняется в процессе выполнения программы может Вы имели ввиду какой-нибудь другой бит, если да то какой?
|
|
|
|
|
Nov 26 2007, 07:41
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Nov 26 2007, 10:27
|

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.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 26 2007, 10:56
|
Участник

Группа: Новичок
Сообщений: 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 это имел ввиду?...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|