|
Количество стробов ALE, Работа с внешним ОЗУ |
|
|
|
 |
Ответов
|
Nov 27 2006, 22:04
|

Местный
  
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Nov 28 2006, 16:34
|

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