Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPM ATtiny84
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Artёm
Добрый День!

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

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

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

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

Вполне применимо, с некоторыми ограничениями - прерывания использовать не получится.
Очевидно размещать bootloader удобно в последних страницах флеш. Bootloader должен при записи первой страницы подменять команду по адресу 0 на rjmp BOOTLOADER_ENTRY (адрес своей точки входа), сохранять где-то (в одной из страниц флеш или например в eeprom) оригинальную команду расположенную по адресу 0, чтобы потом можно было передать управление основной программе.
Artёm
Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Сергей Борщ
Цитата(Artёm @ Nov 23 2007, 12:39) *
Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.
Он скрыт от вас. Писать вы в него можете командой SPM, а читается он только путем перезаписи во флеш.
Artёm
Пробую записать страницу во 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
}
=GM=
Цитата(Artёm @ Nov 23 2007, 11:27) *
Пробую записать страницу во flash предварительно заполнив последовательностью чисел. Проверяю в симуляторе: записывает по адресу 0х0200 только одно слово 3F 3E т.е. последнее записываемое слово. Куда пропадают остальные байты

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


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

Предлагаю взять пример из ДШ. Он там точно рабочий.
bodja74
Цитата(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
Artёm
Цитата(bodja74 @ Nov 23 2007, 22:13) *
...
1 Загружаем R0,R1
2 SPMCSR = 0x01
3 Ждем сброса SELFPRGEN
...


Что значит ждем сброса SELFPRGEN это же Fuse bit, разве он меняется в процессе выполнения программы может Вы имели ввиду какой-нибудь другой бит, если да то какой?
Artёm
Спасибо всем ответившим.
Разобрался.

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


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

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

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

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

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

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

Вы в своих исходниках привели регистр SPMCSR ,а не SPMCR,поэтому я подумал ,что адекватнее было бы говорить про бит SELFPRGEN ,бит SPMEN просто переименовали так smile.gif
=GM=
Можно и подождать, вреда не будет, а можно и не ждать, поскольку "The CPU is halted during the Page Erase and Write operations" (цитата со с.159-160).

То есть, проверяй бит, не проверяй бит, всё равно процессор стоит.
Artёm
Цитата(=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.

Поэтому там и стоит ожидание.
=GM=
Само собой для вашего случая. Не будем же мы обсуждать out pind,r16 для at90s8515, правильно(:-)?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.