Hi All, I'm having a real hard time coming up with a reason why using a local var as an index into a struct fails but that same line with an immediate value specified works properly. Here's what I mean..
void main(void) { unsigned char cTemp, cValue; // Do whats required to get under way. //---------------------------------------------------------------------------- MAIN_System_Init(); // Endless While loop that the micro runs forever (hopefully). //---------------------------------------------------------------------------- while(gcTRUE) { cValue = 0x0C; cTemp = *port[0x0C].lsr; cTemp = *port[0x0C].txrx; cTemp = *port[cValue].lsr; cTemp = *port[cValue].txrx; } }
The first thing I would do is look at the generated code. I think it's much easier than looking at external bus accesses and gives much more information. And another thing. Once I had this weird problem when display in my target worked in debugger mode (running off external RAM) and refused to work when running from internal flash. The reason was that the microcontroller does not release chip select between two accesses to external bus if it runs off internal flash. It's perfectly correct and documented. I had two insert dummy accesses two XRAM to release the chip select. Maybe that's the reason why you can't see enough transitions on chip select? Regards, - Mike
I just compiled the following:
unsigned char lsr = 12; unsigned char txrx = 34; struct ct_st { unsigned char *lsr; unsigned char *txrx; }; volatile struct ct_st port [] = { { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, { &lsr, &txrx }, }; void main(void) { unsigned char cTemp, cValue; // Do whats required to get under way. //---------------------------------------------------------------------------- // MAIN_System_Init(); // Endless While loop that the micro runs forever (hopefully). //---------------------------------------------------------------------------- while(1) { cValue = 0x0C; cTemp = *port[0x0C].lsr; cTemp = *port[0x0C].txrx; cTemp = *port[cValue].lsr; cTemp = *port[cValue].txrx; } }
; FUNCTION main (BEGIN RMASK = @0x4022) ; SOURCE LINE # 33 ; SOURCE LINE # 34 ; SOURCE LINE # 44 0000 ?C0003: ; SOURCE LINE # 46 ; SOURCE LINE # 48 0000 F2F13000 R MOV R1,port+030H 0004 A9A1 MOVB RL5,[R1] ;---- Variable 'cTemp' assigned to Register 'RL5' ---- ; SOURCE LINE # 49 0006 F2F13200 R MOV R1,port+032H 000A A9A1 MOVB RL5,[R1] ; SOURCE LINE # 51 000C F2F13000 R MOV R1,port+030H 0010 A9A1 MOVB RL5,[R1] ; SOURCE LINE # 52 0012 F2F13200 R MOV R1,port+032H 0016 A9A1 MOVB RL5,[R1] ; SOURCE LINE # 54 0018 0DF3 JMPR cc_UC,?C0003 ; FUNCTION main (END RMASK = @0x4022)