From: Vipul M. <vi...@li...> - 2004-01-26 05:48:05
|
I am having problems compiling the attached code. This code is a sample that replicates my problem. The microcontroller P89c668 has 8K ram. How do I tell sdcc to use the 8K and not crib. :-( I have tried tweaking the segments but that does not help. Please rescue me! Here is the output I get from sdcc: $ sdcc -v SDCC : mcs51/gbz80/z80/avr/ds390/pic14/pic16/TININative/xa51/ds400/hc08 2.3.5 (Nov 19 2003) (UNIX) $ sdcc small-prob.c ?ASlink-Error-Insufficient space in data memory. 4998 bytes short. ?ASlink-Error-Stack overlaps area 'DATA' A quick reply will be highly appreciated as this is very urgent. -- Vipul |
From: Johannes K. <jck...@xs...> - 2004-01-28 07:16:53
|
Vipul Mathur wrote: > I am having problems compiling the attached code. This code is a > sample that replicates my problem. The microcontroller P89c668 has 8K > ram. How do I tell sdcc to use the 8K and not crib. :-( I have tried > tweaking the segments but that does not help. Please rescue me! > > Here is the output I get from sdcc: > > $ sdcc -v > SDCC : > mcs51/gbz80/z80/avr/ds390/pic14/pic16/TININative/xa51/ds400/hc08 2.3.5 > (Nov 19 2003) (UNIX) > > $ sdcc small-prob.c > ?ASlink-Error-Insufficient space in data memory. 4998 bytes short. > > ?ASlink-Error-Stack overlaps area 'DATA' > > A quick reply will be highly appreciated as this is very urgent. > place this function before the main function unsigned char _sdcc_external_startup(void) { AUXR &= 0xFC; /* sfr at 0x8E AUXR; */ return 0; } Johannes |
From: Jean-Paul <tch...@fr...> - 2004-01-28 07:52:31
|
Hello, It looks like you try and use _data_ RAM, while you have got 8K of _xdata= _=20 RAM. Can't be quicker. Cheers Jean-Paul On Sat, 24 Jan 2004 02:27:08 +0530, Vipul Mathur <vi...@li...>=20 wrote: > I am having problems compiling the attached code. This code is a sample= =20 > that replicates my problem. The microcontroller P89c668 has 8K ram. How= =20 > do I tell sdcc to use the 8K and not crib. :-( I have tried tweaking=20 > the segments but that does not help. Please rescue me! > > Here is the output I get from sdcc: > > $ sdcc -v > SDCC : mcs51/gbz80/z80/avr/ds390/pic14/pic16/TININative/xa51/ds400/hc08= =20 > 2.3.5 (Nov 19 2003) (UNIX) > > $ sdcc small-prob.c > ?ASlink-Error-Insufficient space in data memory. 4998 bytes short. =20 > ?ASlink-Error-Stack overlaps area 'DATA' > > A quick reply will be highly appreciated as this is very urgent. > --=20 NEVER jump into a LOOP! |
From: Jung-Hee P. <jhe...@ho...> - 2004-01-31 03:03:23
Attachments:
jhp_adc.jpg
jhp_adc_ext.c
|
Hi everybody, I am in trouble with ADC0808 connected to mC8031 through decoder HC138. For more convenience, please see the source code and hardware figuration enclosed. I am terribly sorry for this disturbance. As far as I have understood the principle to work with ADC : FIrst, raise START & ALE, then wait for INT end of conversion, at the end we reading samples by Raise OE. Finally read data in from configured port. In my source-code, I use Timer0 in MODE 1 - 16 bit to count 65,535. Each time the Timer 0 overflows, increase a count variable. This duaration is measured approximately 30''. External Interrupt 1 is set hardware start (TCON.3=1) As you can see, in the main function, in the infinite loop while I use command to stimulate - choose - ADC. Thus, ADC is chosen every 30''. It means that the leds tested at Port P1 must be blinked. Herein, I dont think that it turn off too fast to observe. Because, the main time of tested led is turned off. In addition, If I remove "P1=0x0F" inside EX1_ISR(), the leds will be always turned off. I am confused myself the using ambigously under decoder: xdata at 0x8000 unsigned char adcCh0; Then choose ADC by adcCh0=0; If so, for channel 1. Could I do with adcCh0=1;? And, the readdata command will be: a=adcCh0; Should I have reconfigure my schematic? Thanks so much for your comments, helps in advance. yours sincerely, J.H Park wrote from Republic of Korea. |
From: Jean-Paul <tch...@fr...> - 2004-01-31 11:58:42
|
Hi Glad to hear from you again. Should I conclude that the LCD address decoding is working OK? As to you new problem: You want to be sure that your programme runs through you routine and that= =20 the timing loop works. So, instead of lighting your LEDs such a short time, you could toggle the= m=20 with an EXOR instruction: P1 =3D P1 _EXOR_ 0Fh, that is P1 ^=3D Ox0F. Thus you would have a sufficient time to see what happens, if anything. Then, you will be able to see if your ADC is correctly addressed. Cheers Jean-Paul --=20 NEVER jump into a LOOP! |
From: Jung-Hee P. <jhe...@ho...> - 2004-01-31 16:39:12
|
On Saturday Jan. 31, 2004 Jean-Paul wrote: >Glad to hear from you again. >Should I conclude that the LCD address decoding is >working OK? I am very grateful for your kindness and enthusiam help. From your careful and clear instructions, I have passed dealing with LCD at ease. On Saturday Jan. 31, 2004 Jean-Paul wrote: >As to you new problem: >You want to be sure that your programme runs through >you routine and that >the timing loop works. >So, instead of lighting your LEDs such a short time, you >could toggle them >with an EXOR instruction: P1 = P1 _EXOR_ 0Fh, that is >P1 ^= Ox0F. >Thus you would have a sufficient time to see what >happens, if anything. >Then, you will be able to see if your ADC is correctly >addressed. I greatly appreciate your comments. I found that my ADC decoder is OK, but I have made mistake in dealing ADC command. INT1 is always triggered - or triggered with a very short duration (On ADC I use crytal HCO-050 500kH). However, I am still confused in dealing with ADC implicitly through decoder. Anyone has any more comments or suggestion? Thank you for your help, comments and suggestion in advance. yours sincerely, J.H Park wrote from Republic of Korea. |
From: Jean-Paul <tch...@fr...> - 2004-01-31 18:01:55
|
On Sun, 1 Feb 2004 01:47:31 +0900, Jung-Hee Park=20 <jhe...@ho...> wrote: > have made mistake in dealing ADC command. INT1 is always triggered - or > triggered with a very short duration (On ADC I use crytal HCO-050 500kH= ). > However, I am still confused in dealing with ADC implicitly through=20 > decoder. To answer one of your former questions: I would write: //ADC xdata at 0x8000 unsigned char adcCh0; xdata at 0x8001 unsigned char adcCh1; xdata at 0x8002 unsigned char adcCh2; xdata at 0x8003 unsigned char adcCh3; xdata at 0x8004 unsigned char adcCh4; xdata at 0x8005 unsigned char adcCh5; xdata at 0x8006 unsigned char adcCh6; xdata at 0x8007 unsigned char adcCh7; in order to address all 8 channels. When you write at one of these addresses, the internal latch of the ADC=20 (which plays exactly the same role as the 74HC573 (or 373) you put to=20 decode the low addresses of your EPROM) keeps the address of the selecte= d=20 channel (0 to 7). This is done on the low to high edge of the write pulse= . Simultaneously, your write operation starts the conversion. Once the conversion is finished, you have to read the result, at any one=20 of the eight addresses. For simplicity, you could write: //ADC ... xdata at 0x8000 unsigned char adcresult; To read the result, you could simply do: P1 =3D adcresult; You should then see the result (or its complement, according to your=20 wiring) on the LEDs. Question: when should I read the result? To take one problem at a time, I would not use interrupts yet. Instead, I would first enter your loop delay(500); then wait for End Of Conversion: while(T1=3D0) {}; // wait until signal from the ADC. P1 =3D adcresult; // read and display Once you are sure that you read the analog voltage of one channel (which=20 you could drive with a potentiometer), you can go further with your=20 program, that's using interrupts, converting the value you read to displa= y=20 it on the LCD or sending it over the serial line. To check the interrupts without the uncertainty about your handling of th= e=20 ADC, you may want to just wire a pull-up resistor and a push-button=20 connected to ground, write some lines of code to be sure that your=20 controller reacts to the level change. Just make a main loop that does nothing, and have the interrupt toggle an= =20 LED on the falling edge of the !INT1 line. By the way: you'll have notice= d=20 that the output of the ADC is positive. So you have to invert it (with a=20 74HC04, or 00 or any inverter that might be available) before applying it= =20 to the !INT1 imput. This supposes that you enable interrupts from !INT1 by setting ET1 in IE=20 (IE.3). You may want not to rely on the interrupt before you master everything=20 else. If so don't enable !INT1 interrupt (clear IE.3) and have your loop=20 poll the !INT1 pin instead. Then you can enable the interrupt once the=20 program reacts as you want. Jean-Paul > ------------------------------------------------------- > The SF.Net email is sponsored by EclipseCon 2004 > Premiere Conference on Open Tools Development and Integration > See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. > http://www.eclipsecon.org/osdn > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > --=20 NEVER jump into a LOOP! |
From: Gernot F. <ger...@ne...> - 2004-01-31 20:08:03
|
On Fri, 30 Jan 2004, you wrote: >=20 > Hi everybody, > I am in trouble with ADC0808 connected to mC8031 through decoder HC138.= For > more convenience, please see the source code and hardware figuration Once more 2 questions. data at 0x30 unsigned char nT0Count;=09 checked you that sdcc dont use this location ? to be sure use =20 volatile unsigned char data nT0Count; =46rom where get the adc his clock?=20 --=20 MFG Gernot =09 |
From: Gernot F. <ger...@ne...> - 2004-01-31 09:00:32
|
On Fri, 30 Jan 2004, you wrote: Are you sure the Timerinterrupt is working? =09TCON=3D0x18; // Timer 0 - soft start;// INT1 hardware start This line starts timer0 and enables timer1 Interrupt but disables ET0. This overwrites =09ET0=3D1; (5 lines before TCON) --=20 MFG Gernot |
From: Jung-Hee P. <jhe...@ho...> - 2004-01-31 14:07:01
|
On Friday Jan. 31, 2004 Gernot Fink wrote: Are you sure the Timerinterrupt is working? TCON=0x18; // Timer 0 - soft start;// INT1 hardware start This line starts timer0 and enables timer1 Interrupt but disables ET0. This overwrites ET0=1; (5 lines before TCON) Hi, I would like to thank for your comment. I am strongly sure that my Timer 0 routine works fine. I have checked visually by displaying notification on LCD. Maybe I misunderstand your points. Herein, the configuration command: TCON=0x18; means Interrupt Timer 0 is configured for software start - TURN ON (by setting bit TR0 - also named TCON.4 - of TCON) and External Interrupt 1 (INT1) is set by Hardware (by setting bit IE1 - also named TCON.3 of TCON). Thus I dont think the command will enable Timer 1 and disable ET0. Would you mind instructing me any mis-concept herein please? Thank you very much. yours sincerely, J.H Park wrote from Republic of Korea. |
From: Gernot F. <ger...@ne...> - 2004-01-31 20:08:03
|
On Sat, 31 Jan 2004, you wrote: > means Interrupt Timer 0 is configured for software start - TURN ON (by > setting bit TR0 - also named TCON.4 - of TCON) and > External Interrupt 1 (INT1) is set by Hardware (by setting bit IE1 - al= so > named TCON.3 of TCON). > Thus I dont think the command will enable Timer 1 and disable ET0. >=20 > Would you mind instructing me any mis-concept herein please? I was wrong. Missinterpreted IE0.=20 --=20 MFG Gernot |