Цитата(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