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

Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы?
И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2.
Все верно
Цитата
В этом случае где разместить Boot Loader и как передать ему управление.
И понятие Boot sector пременимо к этому МК?
Вполне применимо, с некоторыми ограничениями - прерывания использовать не получится.
Очевидно размещать bootloader удобно в последних страницах флеш. Bootloader должен при записи первой страницы подменять команду по адресу 0 на rjmp BOOTLOADER_ENTRY (адрес своей точки входа), сохранять где-то (в одной из страниц флеш или например в eeprom) оригинальную команду расположенную по адресу 0, чтобы потом можно было передать управление основной программе.
Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Сергей Борщ
Nov 23 2007, 11:01
Цитата(Artёm @ Nov 23 2007, 12:39)

Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Он скрыт от вас. Писать вы в него можете командой SPM, а читается он только путем перезаписи во флеш.
Пробую записать страницу во 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
}
Цитата(Artёm @ Nov 23 2007, 11:27)

Пробую записать страницу во flash предварительно заполнив последовательностью чисел. Проверяю в симуляторе: записывает по адресу 0х0200 только одно слово 3F 3E т.е. последнее записываемое слово. Куда пропадают остальные байты
У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса.
Цитата(=GM= @ Nov 23 2007, 16:05)

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

Если переставить то все равно не работает.
Предлагаю взять пример из ДШ. Он там точно рабочий.
bodja74
Nov 23 2007, 19:13
Цитата(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
Цитата(bodja74 @ Nov 23 2007, 22:13)

...
1 Загружаем R0,R1
2 SPMCSR = 0x01
3 Ждем сброса SELFPRGEN
...
Что значит ждем сброса SELFPRGEN это же Fuse bit, разве он меняется в процессе выполнения программы может Вы имели ввиду какой-нибудь другой бит, если да то какой?
Спасибо всем ответившим.
Разобрался.
#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
Цитата(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.
Цитата(=GM= @ Nov 26 2007, 13:27)

SELFPRGEN - это фьюз, он не изменяется просто так, например, он программируется внешним последовательным программатором, с помощью команды Write Extended Fuse Bits.
Я и говорю зачем его ждать если он фьюз...
Нашел в исходниках:
while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed
Может bodja74 это имел ввиду?...
bodja74
Nov 26 2007, 11:30
Цитата(Artёm @ Nov 26 2007, 14:56)

Я и говорю зачем его ждать если он фьюз...
Нашел в исходниках:
while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed
Может bodja74 это имел ввиду?...
Да ,я примерно это имел ввиду.
Вы в своих исходниках привели регистр SPMCSR ,а не SPMCR,поэтому я подумал ,что адекватнее было бы говорить про бит SELFPRGEN ,бит SPMEN просто переименовали так
Можно и подождать, вреда не будет, а можно и не ждать, поскольку "The CPU is halted during the Page Erase and Write operations" (цитата со с.159-160).
То есть, проверяй бит, не проверяй бит, всё равно процессор стоит.
Цитата(=GM= @ Nov 26 2007, 15:40)

Можно и подождать, вреда не будет, а можно и не ждать, поскольку "The CPU is halted during the Page Erase and Write operations" (цитата со с.159-160).
То есть, проверяй бит, не проверяй бит, всё равно процессор стоит.
Да действительно, так, но для моего случая.
Пример брал для ATmega128, а для неё:
• Page Erase to the RWW section: The NRWW section can be read during the page
erase.
• Page Erase to the NRWW section: The CPU is halted during the operation.
Поэтому там и стоит ожидание.
Само собой для вашего случая. Не будем же мы обсуждать out pind,r16 для at90s8515, правильно(:-)?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.