реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Самопрограммирование AVR, Помогите определить причину ошибки
Len_OK
сообщение May 14 2008, 12:42
Сообщение #1


Участник
*

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



Помогите, please! Программирую в IARe!
Возникла такая ошибка

Fatal Error[e38]: Option -H must not be defined more than once: -H1895
Никак не могу её исправить!
Если кто-нибудь сталкивался, подскажите что бы это могло быть?
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 14 2008, 13:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Ничего не понял. Поподробней пожалуйста.

P.S. Вы "рихтуете" XCL-файл?
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 14 2008, 13:05
Сообщение #3


Участник
*

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



Цитата(Igor26 @ May 14 2008, 16:01) *
P.S. Вы "рихтуете" XCL-файл?

Я его даже не трогала, просто подключила. И вот вылезла вот такая ошибка.
Такое впечатление , что подключено два XCL-файла, уже перепроверила все настройки....
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 14 2008, 13:09
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Вектора прерываний на область загрузчика переключаете?
У меня когда-то, помоему, выскакивала такая ошибка. Было связано с XCL-файлом, если не ошибаюсь. Дома попробую получить её и вечером отпишусь. А как Вы подключаете XCL-файл?
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 14 2008, 13:19
Сообщение #5


Участник
*

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



Цитата(Igor26 @ May 14 2008, 16:09) *
Вектора прерываний на область загрузчика переключаете?
У меня когда-то, помоему, выскакивала такая ошибка. Было связано с XCL-файлом, если не ошибаюсь. Дома попробую получить её и вечером отпишусь. А как Вы подключаете XCL-файл?

Я подключаю в линкере!Области бутлоадера как таковой у меня нет, потому что это Tiny13! Поэтому адресов я не меняла.И программка сама весит мало, потому как это пока только тест записи во флеш
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 14 2008, 14:17
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Len_OK @ May 14 2008, 16:19) *
Я подключаю в линкере!
Скорее всего вы не сняли галочку "Configure using dialogs (not .xcl file)" (или что-то подобное, поищите в Project->Options->General), поэтому ключ -H один раз подставляет оболочка в командную строку линкера, а второй раз он встречается в вашем .xcl


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 14 2008, 14:23
Сообщение #7


Участник
*

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



Цитата(Сергей Борщ @ May 14 2008, 17:17) *
Скорее всего вы не сняли галочку "Configure using dialogs (not .xcl file)" (или что-то подобное, поищите в Project->Options->General), поэтому ключ -H один раз подставляет оболочка в командную строку линкера, а второй раз он встречается в вашем .xcl

спасибо огромное!
Этот трабл решился!
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 15 2008, 06:42
Сообщение #8


Участник
*

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



Вот ещё ошибочка
Error[e46]: Undefined external "__AddrToZWordToR1R0ByteToSPMCR_SPM" referred in main (E:\Len_OK\iar\ work_flash\spm_Tiny13\Debug\Obj\main.r90 )
Error[e46]: Undefined external "__AddrToZByteToSPMCR_SPM" referred in main ( E:\Len_OK\iar\work_flash\ spm_Tiny13\Debug\Obj\main.r90 )
Error[e46]: Undefined external "__DataToR0ByteToSPMCR_SPM" referred in main ( E:\Len_OK\iar\work_flash\ spm_Tiny13\Debug\Obj\main.r90 )
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 15 2008, 06:49
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



А подключен к проекту хидер inavr.h или intrinsics.h?
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 15 2008, 06:50
Сообщение #10


Участник
*

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



Цитата(Igor26 @ May 15 2008, 09:49) *
А подключен к проекту хидер inavr.h или intrinsics.h?

да
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 15 2008, 07:41
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Что удалось найти. Функция __AddrToZByteToSPMCR_SPM в хидере intrinsics.h выглядит так:
__AddrToZByteToSPMCR_SPM, pseudo code.
MOVW R31:R30,addr
OUT SPMCR,byte
SPM
Обратите внимание на регистр SPMCR. В Tiny2313 он называется SPMCSR. Отсюда и ругань компилятора. Как побороть - не знаю. Не работал с Тиньками.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 15 2008, 07:47
Сообщение #12


Участник
*

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



Обратите внимание на регистр SPMCR. В Tiny2313 он называется SPMCSR. Отсюда и ругань компилятора. Как побороть - не знаю. Не работал с Тиньками.
[/quote]

Я поняла что разница в нвзваниях регистров, а как это исправить не знаю. Перечитала много инфы, но...
буду искать
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 15 2008, 13:12
Сообщение #13


Участник
*

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



sad.gif никто никогда не использовал spm для Tiny?
Go to the top of the page
 
+Quote Post
defunct
сообщение May 15 2008, 13:19
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 15 2008, 16:12) *
sad.gif никто никогда не использовал spm для Tiny?

Цитата
потому что это Tiny13!

Да вопрос то у вас не по SPM, а по IAR компилятору C.
На C для такой мелкой Tiny (1k флеш, 64 байта RAM) врятли кто-то что-то писал.
Cмысл писать под этот чип на C? Оперативки можно считать сразу не 64байта, а ~10, памяти программ под полезную часть программы тоже кот наплакал.

Пользуйте ассемблер.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 15 2008, 13:27
Сообщение #15


Участник
*

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



ну хоть под Tiny2313?

Цитата(defunct @ May 15 2008, 16:19) *
Пользуйте ассемблер.


Ассемблером почти не пользовалась, а вставку ассемблерную сделать в ИАРе для меня проблематично
Go to the top of the page
 
+Quote Post
defunct
сообщение May 15 2008, 13:41
Сообщение #16


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 15 2008, 16:27) *
а вставку ассемблерную сделать в ИАРе для меня проблематично

Да я Вас понимаю, и еще отмечу, что правильную ассемблерную вставку сделать гораздо сложнее чем писать всю программу на ассемблере.

Цитата
ну хоть под Tiny2313?

Вечером посмотрю как в IAR'е можно выйти из положения (сейчас под рукой нет ни IAR'a, ни Tiny).
Go to the top of the page
 
+Quote Post
muravei
сообщение May 15 2008, 14:22
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(Len_OK @ May 15 2008, 17:27) *
Ассемблером почти не пользовалась

Попробуйте АБ
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 15 2008, 18:07
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Я так понял, Вы пользуютесь апнотом от AVR. Те, которые попадались мне, были заточены под Меги. Попробуйте, пользуясь этим апнотом, написать бутлоадер, например, для Меги-8. Когда получиться, тогда приобретенный опыт можно будет применить и к Тинькам. Помоему, с бутлоадером для Меги здесь Вам помогут больше, чем с бутлоадером для Тини. Я в том числе. Здесь многие "грызли" и победили этот вопрос.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 15 2008, 21:32
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Использовать intrinsics для tiny у меня не получилось...
Но можно пойти таким путём.
Создаем и подключием к проекту asm модуль my_spm.s90 сл. содержания (это конечно не оптимальный вариант, но работать можно):
Код
#define SPMCR   0x37
#define SREG    0x3F

        PUBLIC  DoSpm
        
        RSEG    CODE:CODE:NOROOT(1)
        
DoSpm  
        PUSH    R31
        PUSH    R30
        MOVW    R31:R30, R17:R16
        MOVW    R17:R16, R1:R0  // R17:16 pair used as temp space
        MOVW    R1:R0, R19:R18
        CLI
        OUT     SPMCR, R20
        SPM
        SEI
        MOVW    R1:R0, R17:R16  // restore R1:R0 pair
        POP     R30
        POP     R31
        RET

        END     DoSpm


В основной программе объявляем функцию DoSpm:

Код
extern int DoSpm( int addr, int data, char spmcsr_code);


addr - помещается в Z
data - в R1-R0
spmcr_code - в SPMCSR (0x37 I/O space для t13)
и выполняется команда SPM
функция будет возвращать "мусор" (содержимое R1:R0 до вызова функции), на результат не смотрите.


Ну а дальше уже по даташиту делайте то, что вам нужно.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 16 2008, 07:57
Сообщение #20


Участник
*

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



Цитата(Igor26 @ May 15 2008, 21:07) *
Попробуйте, пользуясь этим апнотом, написать бутлоадер, например, для Меги-8.

smile.gif Для меги у меня уже давно работает!А для тини(думала получиться аналогичным образом) не получается.Теперь вся сложность состоит в использовании ассемблера...

Цитата(defunct @ May 16 2008, 00:32) *
Использовать intrinsics для tiny у меня не получилось...
Но можно пойти таким путём.
Создаем и подключием к проекту asm модуль my_spm.s90 сл. содержания (это конечно не оптимальный вариант, но работать можно):
Код
#define SPMCR   0x37
#define SREG    0x3F

        PUBLIC  DoSpm
        
        RSEG    CODE:CODE:NOROOT(1)
        
DoSpm  
        PUSH    R31
        PUSH    R30
        MOVW    R31:R30, R17:R16
        MOVW    R17:R16, R1:R0  // R17:16 pair used as temp space
        MOVW    R1:R0, R19:R18
        CLI
        OUT     SPMCR, R20
        SPM
        SEI
        MOVW    R1:R0, R17:R16  // restore R1:R0 pair
        POP     R30
        POP     R31
        RET

        END     DoSpm


В основной программе объявляем функцию DoSpm:

Код
extern int DoSpm( int addr, int data, char spmcsr_code);


addr - помещается в Z
data - в R1-R0
spmcr_code - в SPMCSR (0x37 I/O space для t13)
и выполняется команда SPM
функция будет возвращать "мусор" (содержимое R1:R0 до вызова функции), на результат не смотрите.
Ну а дальше уже по даташиту делайте то, что вам нужно.

Вроде всё так сделала, но появляется ошибка
Error[e46]: Undefined external "DoSpm" referred in main ( E:\Len_OK\iar\work_flash\test3\Debug\Obj\main.r90 )
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 09:38
Сообщение #21


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 16 2008, 10:57) *
Вроде всё так сделала, но появляется ошибка
Error[e46]: Undefined external "DoSpm" referred in main ( E:\Len_OK\iar\work_flash\test3\Debug\Obj\main.r90 )

А вы подключили файл к проекту?
workspace->правой кнопкой мыши на названии проекта->Add->add files... ->my_spm.s90

или через меню Project->Add files->assembler files->my_spm.s90
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 16 2008, 09:48
Сообщение #22


Участник
*

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



Цитата(defunct @ May 16 2008, 12:38) *
А вы подключили файл к проекту?
workspace->правой кнопкой мыши на названии проекта->Add->add files... ->my_spm.s90

или через меню Project->Add files->assembler files->my_spm.s90

Да,всё поправила, но теперь теперь ругань на
Error[Pe020]: identifier "PUBLIC" is undefined E:\Len_OK\iar\work_flash\test3\asm.s90 4
Error[Pe065]: expected a ";" E:\Len_OK\iar\work_flash\test3\asm.s90 6
Warning[Pe012]: parsing restarts here after previous syntax error E:\Len_OK\iar\work_flash\test3\main.c 9


Цитата(Len_OK @ May 16 2008, 12:43) *
Да,всё поправила, но теперь теперь ругань на
Error[Pe020]: identifier "PUBLIC" is undefined E:\Len_OK\iar\work_flash\test3\asm.s90 4
Error[Pe065]: expected a ";" E:\Len_OK\iar\work_flash\test3\asm.s90 6
Warning[Pe012]: parsing restarts here after previous syntax error E:\Len_OK\iar\work_flash\test3\main.c 9


а если немного меняю define и у меня выходит такая вот картина

#ifdef __IAR_SYSTEMS_ASM__
#define SPMCR 0x37
#define SREG 0x3F
NAME DoSpm
public DoSpm

COMMON INTVEC
ORG INT0_vect
rjmp SIG_INTERRUPT0
RSEG CODE:CODE:NOROOT(1)


#endif /* __IAR_SYSTEMS_ASM__ */


DoSpm:
PUSH R31
PUSH R30
MOVW R31:R30, R17:R16
MOVW R17:R16, R1:R0 // R17:16 pair used as temp space
MOVW R1:R0, R19:R18
CLI
OUT SPMCR, R20
SPM
SEI
MOVW R1:R0, R17:R16 // restore R1:R0 pair
POP R30
POP R31
RET

END DoSpm
то ошибки уже такие
Error[Pe077]: this declaration has no storage class or type specifier E:\Len_OK\iar\work_flash\test3\asm.s90 15
Error[Pe065]: expected a ";" E:\Len_OK\iar\work_flash\test3\asm.s90 15
Warning[Pe012]: parsing restarts here after previous syntax error E:\Len_OK\iar\work_flash\test3\main.c 9
Error[Pe109]: expression must have (pointer-to-) function type E:\Len_OK\iar\work_flash\test3\main.c 45
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 09:55
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 16 2008, 12:48) *
а если немного меняю define и у меня выходит такая вот картина

#ifdef __IAR_SYSTEMS_ASM__
#define SPMCR 0x37
#define SREG 0x3F
NAME DoSpm // <-- не нужно
public DoSpm

COMMON INTVEC // Не нужно
ORG INT0_vect // <--- не нужно!
rjmp SIG_INTERRUPT0 // <--- НЕ НУЖНО
RSEG CODE:CODE:NOROOT(1) // <--- должно быть перед меткой всегда
#endif /* __IAR_SYSTEMS_ASM__ */
DoSpm: // <-- ":" лишнее

Погодите, вставьте в asm файл все как есть из комента выше!
После метки "DoSpm" двоеточие ":" не нужно !
Какая у вас версия IAR'a?

Компилирующийся проект смотрите в атаче.
Прикрепленные файлы
Прикрепленный файл  SpmTest.zip ( 12.74 килобайт ) Кол-во скачиваний: 36
 
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 16 2008, 10:17
Сообщение #24


Участник
*

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



Цитата(defunct @ May 16 2008, 12:55) *
Какая у вас версия IAR'a?

IAR4.11
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 10:21
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 16 2008, 13:17) *
IAR4.11

Это хорошо, значит пример из атача предыдущего комента должен собираться без проблем (проверил на 4.11A).
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 16 2008, 10:23
Сообщение #26


Участник
*

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



[quote name='Len_OK' post='412200' date='May 16 2008, 13:17']
IAR4.11
[/quote]


Ваш проект компилится на "ура"!
не могу понять в чем причина, я точно такой же проект создала с нуля, в нем вот такие ошибки
Error[Pe020]: identifier "PUBLIC" is undefined E:\Len_OK\iar\work_flash\test3\asm.s90 4
Error[Pe065]: expected a ";" E:\Len_OK\iar\work_flash\test3\asm.s90 6

Может в настройках что-то ещё устанавливать нужно
[/quote]

Сообщение отредактировал Len_OK - May 16 2008, 10:24
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 10:24
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 16 2008, 13:23) *
Может в настройках что-то ещё устанавливать нужно

Сравните по настройкам с моим. Я создавал так:
Project -> Create New -> C -> main.
потом создал файл my_spm.s90
подключил его к проекту
скопировал содержимое из форума.
Выбрал тип процессора в настройках проекта - tiny13.
ну и собсно все..

Цитата
is undefined E:\Len_OK\iar\work_flash\test3\asm.s90

Совсем дикая идея - может нельзя файл называть именем "asm"? т.к. может пересекается с ключевым словом компилятора.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 16 2008, 10:39
Сообщение #28


Участник
*

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



есть ли разница между расширениями х.s90 и х.s?
Я изначально создавала х.s файл
Создала проект заново, кажется всё откомпилилось! smile.gif Спасибо
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 20 2008, 09:26
Сообщение #29


Участник
*

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



Решилась проблемка с записью во флешку ! Теперь можно использовать стандартные макросы для самопрограммирования и для МК Tiny с помощью IAR EW v5.10.


Только теперь не могу разобраться с таким трабло, когда данные записываются неверно!
При попытке записать страницу нулей, в одной из ячеек появляется значение 0хЕF
Может заполнение буфера производится некорректно!


do
{ fl_data=*(temp_buf+Buf_Adres+1);
fl_data<<=8;
fl_data|=*(temp_buf+Buf_Adres);
_FILL_TEMP_WORD(Buf_Adres,fl_data);
Buf_Adres+=2;
} while (Buf_Adres<32);

Сообщение отредактировал Len_OK - May 20 2008, 09:27
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 22 2008, 10:29
Сообщение #30


Участник
*

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



Помогите разобраться почему не пишутся данные во флеш(пытаюсь записать 2 байта )

#include <ioavr.h>

#define SPMCR 0x37
#define SREG 0x3F

PUBLIC DoSpm
EXTERN flash_data
EXTERN fl_data
EXTERN flash_adr
EXTERN hash
EXTERN st_hash
RSEG CODE:CODE:NOROOT(1)

DoSpm
//*************fill temp bufer*************
PUSH R31
PUSH R30
LDI R16,low(flash_adr)
LDI R17,high(flash_adr)
MOVW R31:R30,R17:R16

LDI R20,low(flash_data)
LDI R21,high(flash_data)
MOVW R1:R0,R21:R20
LDI R16,1
CLI
Wait_spm:
IN R18, 0x37
MOV R19, R18
SBRC R19, 0
RJMP Wait_spm


OUT SPMCR,R16
SPM
SEI

//*****************************************
//******* save data to programm memory*****

MOVW R31:R30,R17:R16

while_EEPROM:// not write to EEPROM
SBIC 0x1C, 0x01
RJMP while_EEPROM

call Wait_spm //enable write to prog. memory
LDI R16,5
CLI
OUT SPMCR,R16
SPM
SEI
POP R30
POP R31


//*****************************************
RET
END DoSpm
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 22 2008, 11:20
Сообщение #31


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Len_OK @ May 22 2008, 13:29) *
Помогите разобраться почему не пишутся данные во флеш(пытаюсь записать 2 байта )

DoSpm
**************SKIPPED***************

LDI R20,low(flash_data)
LDI R21,high(flash_data)
MOVW R1:R0,R21:R20


Тут какая-то неправда smile.gif
Получается, что Вы все время грузите r0:r1 одной и той же константой, т.е. адресом переменной.
Вам ведь надо загрузить указатель на extern flash_data и оттуда что-то взять ?
тогда это может выглядеть так:
Код
ldi r26,low(flash_data)
ldi r27,high(flash_data)
ld r0,X+
ld r1,X+
Go to the top of the page
 
+Quote Post
defunct
сообщение May 22 2008, 11:23
Сообщение #32


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Заполнить надо весь temp буфер.
После этого писать.
Если хотите записать только 2 байта - то надо прочитать содержимое всей страницы, изменить 2 байта, и записать модифицированную страницу в temp буфер, потом стереть страницу, и инициировать запись страницы.


Цитата
почему не пишутся данные во флеш

У вас функция зацикливается здесь:
Код
Wait_spm:
...
SBRC R19, 0
RJMP Wait_spm

OUT SPMCR,R16
SPM
SEI     <--- к тому же запись в SPMCR происходит при разрешенных прерываниях!!!!
...
while_EEPROM:// not write to EEPROM
SBIC 0x1C, 0x01
RJMP while_EEPROM

call Wait_spm //enable write to prog. memory


Каждая функция (вызываемая CALL'ом) должна заканчиваться RET'ом.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 22 2008, 12:37
Сообщение #33


Участник
*

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



Как заполнить всю страницу данными, например при вызове ассемблерной функции передать в нее данные из буфера на 32 элемента
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 22 2008, 13:22
Сообщение #34


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Len_OK @ May 22 2008, 11:37) *
Как заполнить всю страницу данными, например при вызове ассемблерной функции передать в нее данные из буфера на 32 элемента

Если из одной области памяти в другую, то можно так, например
Код
;Move data from the RAM area into another one
ramram:  ld   temp1,z+
         st   y+,temp1
         dec  cntbyt
         brne ramram
         ret

Перед вызовом надо само собой настроить указатели Y и Z, ну и счётчик байт, как же без него.
Отправил пост и потом заметил, что это 800-й. Ну и ну, неужто я столько накатал(:-)?!


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 22 2008, 14:13
Сообщение #35


Участник
*

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



DoSpm
//*************fill temp bufer*************

PUSH R31
PUSH R30


ldi r18,96// load data from mem
ldi r19,0
st Z,R18
std Z+1,R19

ldi R26, low(flash_data)
ldi R27, high(flash_data)
ldi R23,0x32
fill_temp:
LD R0,X+
LD R1,X+
ST Z, R0
STD Z+1,R1
wait_spm:
IN R18,0x37
MOV R19,R18
SBRC R19, 0
RJMP wait_spm


LDI R18, 1
LDI R30, flash_data
LD R20, Z
LDD R21,Z+1
mov R30, R17
LDI R31,0
MOVW R1:R0,R21:R20
OUT 0x37,R18
SPM

LDI R16,1
OUT SPMCR,R16
SPM

dec R23
dec R23
cpi R23,0
brne fill_temp



//*****************************************
//******* save data to programm memory*****
LDI R16,low(flash_adr)//load address in prog.mem.
LDI R17,high(flash_adr)
MOVW R31:R30,R17:R16

LDI R16,5
OUT SPMCR,R16
SPM
POP R30
POP R31


//*****************************************
RET
END DoSpm
Вот накалякала вот такую штуку.В результате записывается один байт, во второй просто нули и всё

Сообщение отредактировал Len_OK - May 22 2008, 14:28
Go to the top of the page
 
+Quote Post
defunct
сообщение May 22 2008, 20:57
Сообщение #36


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Len_OK

bb-offtopic.gif У меня к вам вопрос (точнее два вопроса).
1. Если вы не собираетесь писать программу на "C" тогда зачем пользоваться убогим иаровским ассемблером? avrasm2 в AVR-Studio гораздо более удобен и правилен "как асм".
2. Напротив, если собираетесь писать на "C", то неужели одной DoSpm( addr, data, code) недостаточно?

имея одну функцию "заправки" требуемых регистров и вызова SPM, все остальное можно оформить на C примерно в таком виде:
Код
DoSpm( page_addr, 0x0, CODE_ERASE); // <--- стререть страницу
DoSpm( page_addr, 0x0, CODE_REENABLE_RWW); // <--- разлочить RWW секцию если работаем из boot секции
for( i = 0; i < PAGE_SIZE; i++)
{
    // fill temp buffer
    DoSpm( page_addr + i,  <слово данных>, CODE_FILL_TEMP_BUF); // <-- заполнить temp буфер
}
DoSpm( page_addr, 0x0,  CODE_DO_PROGRAM ); // <--- зашить темп буфер
DoSpm( page_addr, 0x0, CODE_REENABLE_RWW); // разлочить RWW если работаем из boot секции
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 23 2008, 07:32
Сообщение #37


Участник
*

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



Цитата(defunct @ May 22 2008, 23:57) *
bb-offtopic.gif У меня к вам вопрос (точнее два вопроса).
1. Если вы не собираетесь писать программу на "C" тогда зачем пользоваться убогим иаровским ассемблером? avrasm2 в AVR-Studio гораздо более удобен и правилен "как асм".
2. Напротив, если собираетесь писать на "C", то неужели одной DoSpm( addr, data, code) недостаточно?


Я конечно собираюсь все писать на си. Просто я решила написать полностью функцию на ассемблере, чтобы из си передавать только буфер с данными. И функцию заполнения страницы представляла себе намного сложнее.
Ваш вариант оказался проще, спасибо за терпение smile.gif

Сообщение отредактировал Len_OK - May 23 2008, 07:35
Go to the top of the page
 
+Quote Post
defunct
сообщение May 23 2008, 10:02
Сообщение #38


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Len_OK @ May 23 2008, 10:32) *
Я конечно собираюсь все писать на си.

Тогда хорошо бы "причесать" функцию - добавить в нее проверку на готовность SPM перед загрузкой SPMCR регистра. (не знаю насколько это актуально для tiny, но это нужно для мег, где есть RWW секция).
Код
WAIT_SPM_READY:
SBIC  SPMCR,  0
RJMP WAIT_SPM_READY
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 23 2008, 11:46
Сообщение #39


Участник
*

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



[quote name='defunct' date='May 23 2008, 13:02' post='415863']
У меня всё ещё возникают проблемы с записью.
Если я заполняю страницу какой-то интовой константой, размер страницы указываю 32(а должно быть 16 слов), то все нормально записывается.
Если же я пытаюсь заполнить страницу какими-то данными из моего буфера, то ничего не получаеся
Go to the top of the page
 
+Quote Post
defunct
сообщение May 23 2008, 15:09
Сообщение #40


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
размер страницы указываю 32(а должно быть 16 слов),

Запоняется буфер словами, выходить за границы буфера при его заполнении нежелательно (может приводить к непредсказуемым последствиям).
(PAGE_SIZE >> 1) - будет количество слов. ;>
И при загрузке данных, надо увеличивать адрес на 2.
page_addr + (i << 1).
Если не заработает - приведите код, вечером смогу попробовать на тиньке.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение May 26 2008, 06:21
Сообщение #41


Участник
*

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



Цитата(defunct @ May 23 2008, 18:09) *
Если не заработает - приведите код, вечером смогу попробовать на тиньке.


Прилагаю свой проект, потому как всё ещё не могу разобраться в чём проблема. Программка почему-то вообще не хочет работать с буфером.

Сообщение отредактировал Len_OK - May 26 2008, 06:25
Прикрепленные файлы
Прикрепленный файл  SpmTest.rar ( 19.22 килобайт ) Кол-во скачиваний: 29
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 1 2008, 22:27
Сообщение #42


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Асм функция используемая вами - рабочая. Полагаю что-то не так было с загрузкой данных и возможно адресами.
Загружать temp буфер надо словами, а не байтами.

Цитата
Программка почему-то вообще не хочет работать с буфером.

Убедитесь что фуз SELFPRGEN запрограммирован (установлен в 0)!

см атач.
проверил в железе (на t2313).
Писал в последнюю страницу флеш - работает (стирает / пишет).
Прикрепленные файлы
Прикрепленный файл  my_spm_t2313_.zip ( 20.19 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
Len_OK
сообщение Jun 2 2008, 06:08
Сообщение #43


Участник
*

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



Цитата(defunct @ Jun 2 2008, 01:27) *
см атач.
проверил в железе (на t2313).
Писал в последнюю страницу флеш - работает (стирает / пишет).


Спасибо, я все проверила, всё работает...просто не хватало оперативки контроллера!
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01738 секунд с 7
ELECTRONIX ©2004-2016