Jump to content
    

CodeVisionAVR :rolleyes:

тогда асмовые вставки выглядят примерно так:

    #asm
       ld   r30,y+
       ld   r31,y+
       adiw r30,0
    #endasm

Напишите то что нужно Вам и будет счастье...

 

Вы с asm для AVR знакомы?

 

http://www.atmel.com/dyn/resources/prod_do...nts/doc0856.pdf

http://www.atmel.com/dyn/resources/prod_do...nts/doc1022.pdf

http://www.avr-asm-download.de/beginner_en.pdf

 

Share this post


Link to post
Share on other sites

возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ?

Может для начала посмотреть как на асме выглядят эти процедуры после кодевижона.

И тогда подумать можно ли их ускорить.

и еше вопрос, почему перед чтением в этих функциях глобально запрешаются прерывания ?

Я тоже не понимаю зачем прерывания запрещать.

Возможно для того чтобы эти фукции были атомарны и также как LDS,STS не прерывались.

Share this post


Link to post
Share on other sites

Напишите то что нужно Вам и будет счастье...

хочу читать байт по заданному адресу с SDRAM.

Вы с asm для AVR знакомы?

К сожалению с ASM не дружу.

как на асме выглядят эти процедуры после кодевижона

Вот это

         sx1=SREG;
         #asm("cli")
         rx1=RAMPX;
         RAMPX=((unsigned char *) &addr_a1)[2];
         vdac_a1=*((unsigned char*) addr_a1);
         RAMPX=rx1;
         SREG=sx1;
         addr_a1++;

компиль превратил в это:

 

;         sx1=SREG;
_0x84:
    IN   R3,63
;         #asm("cli")
    cli
;         rx1=RAMPX;
    IN   R2,57
;         RAMPX=((unsigned char *) &addr_a1)[2];
    __GETB1MN _addr_a1,2
    OUT  0x39,R30
;         vdac_a1=*((unsigned char*) addr_a1);
    LDS  R26,_addr_a1
    LDS  R27,_addr_a1+1
    LD   R13,X
;         RAMPX=rx1;
    OUT  0x39,R2
;         SREG=sx1;
    OUT  0x3F,R3
;         addr_a1++;
    LDI  R26,LOW(_addr_a1)
    LDI  R27,HIGH(_addr_a1)
    CALL __GETD1P_INC
    __SUBD1N -1
    CALL __PUTDP1_DEC

Edited by bekor

Share this post


Link to post
Share on other sites

Вот это

.

компиль превратил в это:

.

Мдаааа...

Лишний раз убедился что если нужно быстродействие нужно на асме писать.

Помочь это ускорить не смогу т.к. не знаком с кодевижоном и никогда не писал на СИ для мк.

 

З.Ы. А вот это макросы чтоли?

__GETB1MN _addr_a1,2

__SUBD1N -1

 

 

Share this post


Link to post
Share on other sites

Сейчас вожусь с тем же самым. По моему твёрдому убеждению после прокуренной доки на эксмегу, и закупленных непонятно зачем на радиорынке SDRAM планок с 8ми и 16 битными микросхемами, нашел тайминги в доке на эксмегу. там четко показано последовательное вычитывание двух тетрад по одному адресу. А значит, при подключении 8ми битной микросхемы, траблов не будет, но и работать не будет тоже. т.к. вместо двух тетрад, расположенных по одному адресу будут вычитываться два последовательных адреса. За сим возня с 8ми и 16 битными кристаллами была отложена. Закупил за бугром 100 штук MT48LC32M4A2-7EG. Это именно то, что нужно, все 128 кбит при 4х разрядах данных. Щас как раз собираю макет. Кстаит, не только я применил эту память, вот эти ребятки тоже :

http://alvidi.de/avr_xmodul_V2_0_en.html

но у них пол памяти только, потому что 16 микросхема.

Кстати они весьма любезно выложили и схему :

http://alvidi.de/data_sheets/avr_xschematic_V2_0.pdf

Успехов, коллеги.

 

ЗЫ памятью могу поделиться. 5$/шт, остправлю в любой город куда ходят поезда из Запорожья. Без проблем скажем по 10 штучек, кому нужно. Мне пока столько не выработать. Пишите, звоните, если что +380-6666666-82 Михаил.

Share this post


Link to post
Share on other sites

Добрый день. У меня дополнительный вопрос по работе со SDRAM.

 

Стоит связка ATxmega128A1+MT48LC16M4A2P-75:G. Тесты прошли нормально, память с контроллером работает. Однако, когда контроллер при отладке попадает в breakpoint, и находится в стопе какое-то время, содержимое SDRAM разрушается. Компилятор и отладчик от ИАРа. Знает ли кто-нибудь, есть ли возможность как-то настроить отладчик, чтобы даже в стопе от EBI шли команды refresh на SDRAM? А то задолбался, чес-слово! К тому же думаю, что на ARM'ах, которые предназначены для работы со SDRAM, эта проблема ну уж точно должна была быть решена

 

Спасибо.

Share this post


Link to post
Share on other sites

Сильно сомневаюсь, чтобы можно было бы тормознуть процессор с сохранением работоспособности памяти если это не заложено автоматически. Когда к памяти не производится обращение, то на нее можно ( нужно ) подавать команду SelfRefresh, то есть самостоятельной регенерации. В этом режиме ей даже тактовых импульсов подавать не надо. Но вот как действует EBI-контроллер - я не знаю совершенно.

 

Есть подозрение, что можно вручную контроллеру памяти указывать перейти в режим SelfRefresh - тогда даже если проц тормознется, то содержимое оперативки должно сохраняться. Хотя пока наши люди такой возможности не нашли. Да и отладчиком пока xMeg-у не мучили. Может и мы с таким столкнемся. Может быть Вам тоже не тормозить процессор - использовать другие методы отладки?

 

P.S. При работе с SDRAM без использования EBI таких проблем, мне кажется, не будет. Команду можно подать и вручную. Разве что тормознется в процессе обращения к памяти, ДО команды SelfRefresh.

Share this post


Link to post
Share on other sites

Судя по справке AVR Studio 5 в JTAGICE mkII и 3 кое-что предусмотрено для регенерации SDRAM во время останова:

 

XMEGA OCD

OCD and clocking

 

When the MCU enters stopped mode, the OCD clock is used as MCU clock. The OCD clock is either the JTAG TCK if the JTAG interface is being used, or the PDI_CLK if the PDI interface is being used.

 

The JTAGICE mkII does not offer a variable clock rate for XMEGA targets.

 

SDRAM refresh in stopped mode

 

When the OCD is in stopped mode, the MCU is clocked by the PDI or JTAG clock, as described in the paragraph above. Since nothing is known of this frequency by the debugger or OCD, a low refresh period (0x10) is automatically used. This value can't be changed by the user.

Share this post


Link to post
Share on other sites

В AppNote 1312 нашел штуку, которая напрямую, конечно, не подойдет, но, быть может, окажется полезной.

 

2.5 SDRAM Refresh Considerations

 

...

 

When in sleep mode and the clock to the EBI module is stopped, it is possible to enter Self-refresh mode for the SDRAM module. To enable Self-refresh, set the SDRAM Self-refresh Enable bit (SDSREN) in Control Register B (CTRLB) for Chip Select block 3. Note that it is not possible to access the SDRAM when in Self-refresh mode.

Получится, конечно, полный изврат, но можно перед потенциальной точкой останова записать этот бит. Вопрос только в том, сколько времени требуется EBI, чтобы выполнить эту операцию.

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...