From: Jim P. <jim...@mi...> - 2005-05-10 20:26:24
|
Hi I've got a problem I hope someone might help me with. I'm building an application using a 87C52 microcontroller. In the design I have tied the EA pin low so that all code memory is external. I've done this mostly because I don't have a programmer for the 87C52 but I do have a eprom programmer for a 27C256 device. The problem I'm having is that the following simple program just does not run. I'm wondering if there is some additional software initialization need that I've overlooked. Of course I'm using the sdcc compiler and have been successful in writing code which I have downloaded to a develpoment board running the Paulmon2 software. The code is simply intended to flash a LED which I have connected to an output pin of a 8255 io chip. Symptoms include the address lines are not functioning per the code, the RD pin appears inactive,and PSEN appears ok. I have both a eprom emulator and a eprom programmer tried both with similar results CODE J1.c #include <8051.h> #include <paulmon2.h> xdata at 0xa003 unsigned char abc_cnfg; /* configure 8255*/ xdata at 0xa000 unsigned char port_a; /* ouput*/ xdata at 0xa001 unsigned char port_b; /* input*/ xdata at 0xa002 unsigned char port_c; /*output*/ xdata at 0x8000 unsigned int n1; void delay_ms(unsigned char ms) { ms; _asm mov r0, dpl 00001$: mov r1, #250 00002$: nop nop djnz r1, 00002$ djnz r0, 00001$ ret _endasm; } void main(void) { delay_ms(100); abc_cnfg=130; port_c=0; while(1) { port_c=128; /*turn light on*/ for(n1=0;n1<=500;n1++) delay_ms(1); /* copyed paulmon2 delay function*/ port_c=0; /*turn led off*/ for(n1=0;n1<=500;n1++) delay_ms(1); } } ************************************************************************************* The command line for the sdcc compiler is: sdcc --code-loc 0x0000 --stack-after-data --xram-loc 0x8000 -I c:\sdcc\share\sdcc\include j1.c ************************************************************************************** Can any one tell me if I've overlooked something regarding the initialization of the chip. I have looked at the J1.lst and J1.map files and it appears as though the compiler has automatically called _sdcc-external-startup. If anyones interested I will be glad to send a schematic of how I connected the devices Thanks Jim Peterson |
From: Martin L. <le...@di...> - 2005-05-11 14:38:38
|
On tir, 2005-05-10 at 16:26 -0400, Jim Peterson wrote: > The code is simply intended to flash a LED which I have connected to > an output pin of a 8255 io chip. Symptoms include the address lines > are not functioning per the code, the RD pin appears inactive,and PSEN > appears ok. I have both a eprom emulator and a eprom programmer tried > both with similar results One option might be to run it in the simulator (s51) and see if it does what you expect it to? -- Regards Martin Leopold. Dept. of Computer Science, University of Copenhagen |
From: Felix B. <fb...@lt...> - 2005-05-11 15:25:41
|
Jim, What do you mean by 'the address lines are not functioning' and 'RD pin appears inactive'? Some questions about hardware: - did you check ADx and RD with a logic analyzer? - do you have external RAM? - does your address decoder do what it is supposed to do? - what about #CS, #WR and #RD signal on 8255? - did your hardware work with some software not compiled with SDCC? Perhaps I can help if you send me some PDF schematic. Concerning your 'delay_ms', I think you should remove the 'ret' instruction. For non naked functions SDCC creates the necessary stack frame (including the return instruction). If SDCC would have inserted some more instructions (in this case I believe it didn't) before the final 'ret' your code would bypass them (it would also bypass 'pop' instructions which would fill up your stack within no time). Just take a look at the .asm and .lst file created by SDCC. The call to 'sdcc-external-startup' is explained in SDCC's User Guide; have a look at chapter 'Startup Code'. Hope this helps ... ------------------------- Felix Jim Peterson wrote: > > Hi > > I've got a problem I hope someone might help me with. I'm > building an application using a 87C52 microcontroller. > > In the design I have tied the EA pin low so that all code memory > is external. I've done this mostly because I don't have a programmer > for the 87C52 but I do have a eprom programmer for a 27C256 device. > > The problem I'm having is that the following simple program just > does not run. I'm wondering if there is some additional software > initialization need that I've overlooked. Of course I'm using the > sdcc compiler and have been successful in writing code which I have > downloaded to a develpoment board running the Paulmon2 software. > > The code is simply intended to flash a LED which I have connected > to an output pin of a 8255 io chip. Symptoms include the address > lines are not functioning per the code, the RD pin appears > inactive,and PSEN appears ok. I have both a eprom emulator and a > eprom programmer tried both with similar results > > CODE J1.c > #include <8051.h> > #include <paulmon2.h> > xdata at 0xa003 unsigned char abc_cnfg; /* configure 8255*/ > xdata at 0xa000 unsigned char port_a; /* ouput*/ > xdata at 0xa001 unsigned char port_b; /* input*/ > xdata at 0xa002 unsigned char port_c; /*output*/ > xdata at 0x8000 unsigned int n1; > > > void delay_ms(unsigned char ms) > { > ms; > _asm > mov r0, dpl > 00001$: mov r1, #250 > 00002$: nop > nop > djnz r1, 00002$ > djnz r0, 00001$ > ret > _endasm; > } > > void main(void) > { > delay_ms(100); > abc_cnfg=130; > port_c=0; > > while(1) > { > port_c=128; /*turn light on*/ > for(n1=0;n1<=500;n1++) > delay_ms(1); /* copyed paulmon2 delay function*/ > > port_c=0; nb sp; /*turn led off*/ > for(n1=0;n1<=500;n1++) > delay_ms(1); > } > } > ************************************************************************************* > The command line for the sdcc compiler is: > sdcc --code-loc 0x0000 --stack-after-data --xram-loc 0x8000 -I c:\sdcc\share\sdcc\include j1.c > ************************************************************************************** > Can any one tell me if I've overlooked something regarding the > initialization of the chip. I have looked at the J1.lst and J1.map > files and it appears as though the compiler has automatically called > _sdcc-external-startup. > If anyones interested I will be glad to send a schematic of how I connected the devices > Thanks > Jim Peterson > > > |
From: Jean-Paul <tch...@fr...> - 2005-05-12 07:54:09
|
Hello, before you go any further, try and answer the first question: did your hardware ever work? Are you using a commercial that works with the maker's firmware, or a homebrew board? In that last case, why not send a schematic (in some readable form, ps or= =20 pdf) for review? Regards Jean-Paul On Tue, 10 May 2005 16:26:18 -0400, Jim Peterson =20 <jim...@mi...> wrote: > > Hi > > I've got a problem I hope someone might help me with. I'm building an =20 > application using a 87C52 microcontroller. > > In the design I have tied the EA pin low so that all code memory is =20 > external. I've done this mostly because I don't have a programmer for =20 > the 87C52 but I do have a eprom programmer for a 27C256 device. > > The problem I'm having is that the following simple program just does =20 > not run. I'm wondering if there is some additional software =20 > initialization need that I've overlooked. Of course I'm using the sdcc = =20 > compiler and have been successful in writing code which I have =20 > downloaded to a develpoment board running the Paulmon2 software. > > The code is simply intended to flash a LED which I have connected to an= =20 > output pin of a 8255 io chip. Symptoms include the address lines are no= t =20 > functioning per the code, the RD pin appears inactive,and PSEN appears = =20 > ok. I have both a eprom emulator and a eprom programmer tried both with= =20 > similar results > > CODE J1.c > #include <8051.h> > #include <paulmon2.h> > xdata at 0xa003 unsigned char abc_cnfg; /* configure 8255*/ > xdata at 0xa000 unsigned char port_a; /* ouput*/ > xdata at 0xa001 unsigned char port_b; /* input*/ > xdata at 0xa002 unsigned char port_c; /*output*/ > xdata at 0x8000 unsigned int n1; > void delay_ms(unsigned char ms) > { > ms; > _asm > mov r0, dpl > 00001$: mov r1, #250 > 00002$: nop > nop > djnz r1, 00002$ > djnz r0, 00001$ > ret > _endasm; > } > void main(void) > { > delay_ms(100); > abc_cnfg=3D130; > port_c=3D0; > while(1) > { > port_c=3D128; /*turn light on*/ > for(n1=3D0;n1<=3D500;n1++) > delay_ms(1); /* copyed paulmon2 delay =20 > function*/ > port_c=3D0; /*turn led off*/ > for(n1=3D0;n1<=3D500;n1++) > delay_ms(1); > } > } > ***********************************************************************= ************** > The command line for the sdcc compiler is: > sdcc --code-loc 0x0000 --stack-after-data --xram-loc 0x8000 -I =20 > c:\sdcc\share\sdcc\include j1.c > ***********************************************************************= *************** > Can any one tell me if I've overlooked something regarding the =20 > initialization of the chip. I have looked at the J1.lst and J1.map file= s =20 > and it appears as though the compiler has automatically called =20 > _sdcc-external-startup. > If anyones interested I will be glad to send a schematic of how I =20 > connected the devices > Thanks > Jim Peterson --=20 NEVER jump into a LOOP! |