Artem_ 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 (изменено) · Жалоба Добрый День! Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы? И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2. В этом случае где разместить Boot Loader и как передать ему управление. И понятие Boot sector пременимо к этому МК? Изменено 22 ноября, 2007 пользователем Artёm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Правильно ли я понял, что SPM инструкции в ATtiny84 можно выполнять из любого места программы? И у него нет битов BOOTRST, BOOTSZ1, BOOTSZ2. Все верно В этом случае где разместить Boot Loader и как передать ему управление. И понятие Boot sector пременимо к этому МК? Вполне применимо, с некоторыми ограничениями - прерывания использовать не получится. Очевидно размещать bootloader удобно в последних страницах флеш. Bootloader должен при записи первой страницы подменять команду по адресу 0 на rjmp BOOTLOADER_ENTRY (адрес своей точки входа), сохранять где-то (в одной из страниц флеш или например в eeprom) оригинальную команду расположенную по адресу 0, чтобы потом можно было передать управление основной программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Еще вопрос: где находится (в какой памяти) Temporary Page Buffer. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Еще вопрос: где находится (в какой памяти) Temporary Page Buffer.Он скрыт от вас. Писать вы в него можете командой SPM, а читается он только путем перезаписи во флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Пробую записать страницу во 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= 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Пробую записать страницу во flash предварительно заполнив последовательностью чисел. Проверяю в симуляторе: записывает по адресу 0х0200 только одно слово 3F 3E т.е. последнее записываемое слово. Куда пропадают остальные байты У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба У вас адреса разные при заполнении и при записи. Переставьте r30 и r31, чтобы были одинаковые адреса. Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает. При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во flash. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Если переставить то все равно не работает. Предлагаю взять пример из ДШ. Он там точно рабочий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Разные - это я пробывал переставлять, остался последний вариант. Если переставить то все равно не работает. При заполнении используется ведь адрес слова во временной странице, а при записи номер страницы во 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 :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба ... 1 Загружаем R0,R1 2 SPMCSR = 0x01 3 Ждем сброса SELFPRGEN ... Что значит ждем сброса SELFPRGEN это же Fuse bit, разве он меняется в процессе выполнения программы может Вы имели ввиду какой-нибудь другой бит, если да то какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба Спасибо всем ответившим. Разобрался. #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= 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба Процедура сложнее, чем Вы ее себе представляете. 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_ 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба SELFPRGEN - это фьюз, он не изменяется просто так, например, он программируется внешним последовательным программатором, с помощью команды Write Extended Fuse Bits. Я и говорю зачем его ждать если он фьюз... Нашел в исходниках: while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed Может bodja74 это имел ввиду?... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба Я и говорю зачем его ждать если он фьюз... Нашел в исходниках: while( SPMControllRegister & (1<<SPMEN) ); // Wait until Flash write completed Может bodja74 это имел ввиду?... Да ,я примерно это имел ввиду. Вы в своих исходниках привели регистр SPMCSR ,а не SPMCR,поэтому я подумал ,что адекватнее было бы говорить про бит SELFPRGEN ,бит SPMEN просто переименовали так :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба Можно и подождать, вреда не будет, а можно и не ждать, поскольку "The CPU is halted during the Page Erase and Write operations" (цитата со с.159-160). То есть, проверяй бит, не проверяй бит, всё равно процессор стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться