Перейти к содержанию
    

Добрый День!

 

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

 

И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2.

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

 

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

Изменено пользователем Artёm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2.

Все верно

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

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

Вполне применимо, с некоторыми ограничениями - прерывания использовать не получится.

Очевидно размещать bootloader удобно в последних страницах флеш. Bootloader должен при записи первой страницы подменять команду по адресу 0 на rjmp BOOTLOADER_ENTRY (адрес своей точки входа), сохранять где-то (в одной из страниц флеш или например в eeprom) оригинальную команду расположенную по адресу 0, чтобы потом можно было передать управление основной программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще вопрос: где находится (в какой памяти) 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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает.

При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во flash.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переставить то все равно не работает.

Предлагаю взять пример из ДШ. Он там точно рабочий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает.

При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во 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 :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Нашел в исходниках:

while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Нашел в исходниках:

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).

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...