|
|
  |
Самопрограммирование AVR, Помогите определить причину ошибки |
|
|
|
May 15 2008, 13:41
|

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

|
Цитата(Len_OK @ May 15 2008, 16:27)  а вставку ассемблерную сделать в ИАРе для меня проблематично Да я Вас понимаю, и еще отмечу, что правильную ассемблерную вставку сделать гораздо сложнее чем писать всю программу на ассемблере. Цитата ну хоть под Tiny2313? Вечером посмотрю как в IAR'е можно выйти из положения (сейчас под рукой нет ни IAR'a, ни Tiny).
|
|
|
|
|
May 15 2008, 18:07
|

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

|
Я так понял, Вы пользуютесь апнотом от AVR. Те, которые попадались мне, были заточены под Меги. Попробуйте, пользуясь этим апнотом, написать бутлоадер, например, для Меги-8. Когда получиться, тогда приобретенный опыт можно будет применить и к Тинькам. Помоему, с бутлоадером для Меги здесь Вам помогут больше, чем с бутлоадером для Тини. Я в том числе. Здесь многие "грызли" и победили этот вопрос.
|
|
|
|
|
May 15 2008, 21:32
|

кекс
     
Группа: Свой
Сообщений: 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 до вызова функции), на результат не смотрите. Ну а дальше уже по даташиту делайте то, что вам нужно.
|
|
|
|
|
May 16 2008, 07:57
|
Участник

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

|
Цитата(Igor26 @ May 15 2008, 21:07)  Попробуйте, пользуясь этим апнотом, написать бутлоадер, например, для Меги-8.  Для меги у меня уже давно работает!А для тини(думала получиться аналогичным образом) не получается.Теперь вся сложность состоит в использовании ассемблера... Цитата(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 )
|
|
|
|
|
May 16 2008, 09:48
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 16 2008, 09:55
|

кекс
     
Группа: Свой
Сообщений: 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? Компилирующийся проект смотрите в атаче.
|
|
|
|
|
May 16 2008, 10:17
|
Участник

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

|
Цитата(defunct @ May 16 2008, 12:55)  Какая у вас версия IAR'a? IAR4.11
|
|
|
|
|
May 16 2008, 10:23
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 16 2008, 10:24
|

кекс
     
Группа: Свой
Сообщений: 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"? т.к. может пересекается с ключевым словом компилятора.
|
|
|
|
|
May 16 2008, 10:39
|
Участник

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

|
есть ли разница между расширениями х.s90 и х.s? Я изначально создавала х.s файл Создала проект заново, кажется всё откомпилилось!  Спасибо
|
|
|
|
|
May 20 2008, 09:26
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 22 2008, 10:29
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|