This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Can't access addresses 0x00 - 0xFF of memory using XBYTE

I am using the XBYTE macro to access a memory mapped device. The chip select is being handled via another port (P1) to allow the full 64K of addresses to be axcessed. When I read data from the memory device I read 0x00 from addresses 0x00 - 0xFF. Above 0xFF the data reads correctly. I have verified that the memory device contains valid data in 0x00 - 0xFF address range. I also have scoped the RD line and it does appear that it is activated to read the data. Please let me know any thoughts. Thanks.

  • which chip?
    I know of chips with internal external memory (EDATA), but not of one with 256 bytes of EDATA, but that could be the reason.

    Erik

  • I am testing on an Intel 87C51. It's data sheet indicates that it is capable of addressing up to 64k of external data memory.

  • the memory device
    Is that "the memory mapped device" or "the memory"

    I think you should show your code, there is no obvious answer from the info you have provided.

    Erik

  • Here is the code requested. I left out the include files and ISRs. The serial port and timers are functioning as desired. I have tried both incrementing the address variable directly(code below) and using a #define statment to define it and adding an offset to it(shown in one of the app. notes). Both methods have the same result. The memory I refer to is the external memory mapped devices which is a UVPROM.

    unsigned int counter = 0;
    unsigned int address = 0x00; // 16 Bit Address where data is stored in the
    unsigned int temp_data = 0x00; // Data Byte Read
    unsigned char i = 0x00;


    P1 = 0x70; // Chip Select the UVPROM, High 8 Bits of 24 Bit Address

    for(i = 0; i<=8; i++)
    {
    printf("\n\rUVPROM Block 0x%bx",i);
    for(address = (i*0x0400); address <= (0x03FF+(i*0x0400)); address++)
    {
    temp_data = (XBYTE[address]); // Read data byte in from external UVPROM
    printf("\n\rAddress:0x%x, Data: 0x%bx",address,temp_data);
    }
    }
    P1 = 0x00; // Clear Port 1 after all the data is read

    while(1)
    {
    P1_0 = ~P1_0; // Toggle port pin
    }
    }

  • Are you sure that this meets the timing requirements of your memory-mapped thingy?

  • "unsigned int temp_data = 0x00;"

    Change that to unsigned char and it'll probably start working as you expect.