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

 
 
> Количество стробов ALE, Работа с внешним ОЗУ
tonjo
сообщение Nov 25 2006, 19:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 22-11-04
Пользователь №: 1 190



Не понимаю, зачем при работе с внешним ОЗУ mega посылает три строба ALE за один период чтения или записи? Помогите пожалуйста разобраться!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Nov 27 2006, 16:56
Сообщение #2


Ambidexter
*****

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



Цитата(tonjo @ Nov 25 2006, 16:21) *
Не понимаю, зачем при работе с внешним ОЗУ mega посылает три строба ALE за один период чтения или записи? Помогите пожалуйста разобраться!

Вроде не должно быть так. Мега должна посылать один строб ALE за один цикл чтения/записи в/из внешней памяти (3+ тактов процессора). В цикле чтения/записи внешней памяти не должно быть обращения к внутренней ОЗУ.

Как вы определили, что именно за ОДИН период чтения посылается три строба ALE? Какие команды вы использовали для чтения и записи?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
tonjo
сообщение Nov 27 2006, 22:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 22-11-04
Пользователь №: 1 190



Цитата(=GM= @ Nov 27 2006, 16:56) *
Как вы определили, что именно за ОДИН период чтения посылается три строба ALE? Какие команды вы использовали для чтения и записи?

То что за один период чтения или записи - то это посмотрел осциллографом. Т.е. идет строб ALE, затем адрес, данные. Потом строб WR или RD заканчивается и появляются ещё два строба ALE, расстояние между которыми примерно 1мкс (контроллер работает на частоте 8МГц).
На С пишу недавно и не исключаю, что неправильно написал программу (контроллер mega128). Привожу код:

#define offset 0x1100
void WriteByte(unsigned char Addr, unsigned char Data)
{
unsigned char *pSRAM = (unsigned char *)(offset+Addr);
*pSRAM = Data;
}
unsigned char ReadByte(unsigned char Addr)
{
unsigned char *pSRAM = (unsigned char *)(offset+Addr);
return *pSRAM;
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 28 2006, 16:34
Сообщение #4


Ambidexter
*****

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



Цитата(tonjo @ Nov 27 2006, 19:04) *
Цитата(=GM= @ Nov 27 2006, 16:56) *

Как вы определили, что именно за ОДИН период чтения посылается три строба ALE? Какие команды вы использовали для чтения и записи?

То что за один период чтения или записи - то это посмотрел осциллографом. Т.е. идет строб ALE, затем адрес, данные. Потом строб WR или RD заканчивается и появляются ещё два строба ALE, расстояние между которыми примерно 1мкс (контроллер работает на частоте 8МГц).
На С пишу недавно и не исключаю, что неправильно написал программу (контроллер mega128). Привожу код:

#define offset 0x1100
void WriteByte(unsigned char Addr, unsigned char Data)
{
unsigned char *pSRAM = (unsigned char *)(offset+Addr);
*pSRAM = Data;
}
unsigned char ReadByte(unsigned char Addr)
{
unsigned char *pSRAM = (unsigned char *)(offset+Addr);
return *pSRAM;
}

Пропустил ваш код (см.ниже) через КоудВижнАВР-компайлер, ужас! В течение одного цикла оператора while насчитал СЕМЬ обращений к памяти, из них только одно - к внешней. Пометил их цифрами от 1 до 7. Теперь я удивляюсь как вам удалось ужаться до трёх! Вы зря, кстати, pSRAM объявили как char, компайлер все равно интерпретирует его как int.

Код
#define offset 0x1100
unsigned char *pSRAM;

unsigned char ReadByte(unsigned char Addr)
{
*pSRAM=offset+Addr;
return *pSRAM;
}

void main(void)
{
unsigned char address=0x1000;
unsigned char byte=0x13;
while(1)
{
  byte=ReadByte(address);
}
}

          .CSEG
         .ORG     0
__RESET:  LDI     R30,LOW(0x25F) ; STACK
          OUT     SPL,R30        ; POINTER
          LDI     R30,HIGH(0x25F); INITIALIZATION
          OUT     SPH,R30
          LDI     R28,LOW(0xE0)  ; DATA INITIALIZATION
          LDI     R29,HIGH(0xE0) ; STACK POINTER
          RJMP    _main

; #define offset  0x1100
          .DSEG
          .ORG    0xE0
_pSRAM:   .BYTE   0x2            ; unsigned char *pSRAM

          .CSEG
; unsigned char ReadByte(unsigned char Addr){
_ReadByte: LD     R30,Y          ;2 *pSRAM=offset+Addr;
           LDI    R26,LOW(4352)  ;
           LDI    R27,HIGH(4352) ;
           CLR    R31            ;
           ADD    R30,R26        ;
           ADC    R31,R27        ;
           LDS    R26,_pSRAM     ;3
           LDS    R27,_pSRAM+1   ;4
           ST     X,R30          ;5
           ADIW   R28,1          ;  return *pSRAM;}
           RET                   ;6-7

;     void main(void){
_main:     LDI    R16,0          ;  address -> R16
           LDI    R17,19         ;  byte -> R17
_0x3:      ST     -Y,R16         ;1 while(1){
           RCALL  _ReadByte      ; byte=ReadByte(address);
           MOV    R17,R30        ;
           RJMP   _0x3           ;  } end while loop
_0x6:      RJMP   _0x6           ;  } end main



--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
tonjo
сообщение Nov 28 2006, 18:02
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 22-11-04
Пользователь №: 1 190



Спасибо, =GM=, за помощь. Вот не ожидал такого. А как лучше сделать, чтобы не было такого ужаса?Можете примерчик привести? Пожалуйста!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:40
Рейтинг@Mail.ru


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