From: JIA P. <jp...@gm...> - 2013-06-08 09:15:45
|
Hi, all: I'm sorry to bug you again. The following code is able to be built both with *Keil C51* and with *sdcc*. However, *only* the .bin file built from *Keil C51* is working properly on my board; the .bin file built from *sdcc* *doesn't work* on my board at all. *A) code for Keil C51* #include <REG52.H> #include <INTRINS.H> sbit Beep = P1^5 ; unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; while(n!=0) Beep=~Beep,delay(m); TR0=0; } } *B) code for SDCC* #include <reg51.h> //#include <INTRINS.H> //sbit Beep = P1^5 ; unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; //while(n!=0) Beep=~Beep,delay(m); while(n!=0) P1_5=~P1_5,delay(m); * // am I right here?* TR0=0; } } So, can anybody help to explain why it is so? I can hear the music played by the .bin file built from code A) for Keil C51. However, I'm not able to hear the music played by the .bin file built from code B) for SDCC. Thank you. -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |
From: roelof 't H. <ro...@it...> - 2013-06-08 09:49:13
|
On Sat, 2013-06-08 at 17:15 +0800, JIA Pei wrote: > #include <reg51.h> Did you read the replies on your previous post ? You did not respond to them (yet). Hint : sdcc must be giving you a warning about NOT using reg51.h > void int0() interrupt 1 > { TH0=0xd8; > TL0=0xef; > n--; > } The proper setup of the interrupt routine with a current sdcc version is like the following : void Timer0_ISR(void) __interrupt tf0_vector { ....; } tf0_vector can be replaced with a number if you like as it already is a number set with #define in the processor type header file. > void delay (unsigned char m) > { > unsigned i=3*m; This variable is unsigned type what ? I am assuming integer due to the three times multiplication of a char (max value 255 * 3). > void delayms(unsigned char a) > { > while(--a); > } If you want strict timing, like a millisecond delay, use a hardware timer. > play: > while(1) > { > a: p=music_tab[i]; > if(p==0x00) { i=0, delayms(1000); goto play;} A "goto", seriously ? Still no mention of the sdcc version....... And no specific errors noted that sdcc gave. roelof ps: advise : please clean up your code writing skills. It looks like s**t. |
From: JIA P. <jp...@gm...> - 2013-06-08 10:04:30
|
Hi, roelof Thank you very much for your prompt reply. Seriously thank you. The code is actually copied from somebody else. I just did some copy/paste, and then test. I responded to my previous Email, probably into the wrong Email address (the sdcc development, instead of sdcc user) . Sorry. I'm trying your solution now... Thank you * * * * *JIA Pei <jp...@gm...>* *9:54 AM (8 hours ago)* ** ** ** *to Development* ** *Thank you for all who have answered my questions !! seriously thank you. * *The solutions has been found:* * * * * * * *#include <8052.h>* * * *#define RELAY P1_4* *#define K1 P2_7* * * *main()* *{* *while(1)* *{* * if (!K1) RELAY = 0;* * else RELAY = 1;* *}* *}* * * * * *Thank you everybody !!!* On Sat, Jun 8, 2013 at 5:48 PM, roelof 't Hooft <ro...@it...>wrote: > On Sat, 2013-06-08 at 17:15 +0800, JIA Pei wrote: > > > #include <reg51.h> > > Did you read the replies on your previous post ? > You did not respond to them (yet). > Hint : sdcc must be giving you a warning about > NOT using reg51.h > > > > void int0() interrupt 1 > > { TH0=0xd8; > > TL0=0xef; > > n--; > > } > > The proper setup of the interrupt routine with a current > sdcc version is like the following : > > void Timer0_ISR(void) __interrupt tf0_vector > { > ....; > } > > tf0_vector can be replaced with a number if you like as it > already is a number set with #define in the processor type > header file. > > > > void delay (unsigned char m) > > { > > unsigned i=3*m; > > This variable is unsigned type what ? > I am assuming integer due to the three times multiplication > of a char (max value 255 * 3). > > > > void delayms(unsigned char a) > > { > > while(--a); > > } > > If you want strict timing, like a millisecond delay, use > a hardware timer. > > > > play: > > while(1) > > { > > a: p=music_tab[i]; > > if(p==0x00) { i=0, delayms(1000); goto play;} > > A "goto", seriously ? > > Still no mention of the sdcc version....... > And no specific errors noted that sdcc gave. > > roelof > > ps: advise : please clean up your code writing skills. It > looks like s**t. > > > > > ------------------------------------------------------------------------------ > How ServiceNow helps IT people transform IT departments: > 1. A cloud service to automate IT design, transition and operations > 2. Dashboards that offer high-level views of enterprise services > 3. A single system of record for all IT processes > http://p.sf.net/sfu/servicenow-d2d-j > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |
From: JIA P. <jp...@gm...> - 2013-06-08 12:09:25
|
Hi, Dear roelof 't Hooft : Sorry to bug you again. I think why the code doesn't work has much to do with the 2 red bold lines: #include <reg51.h> *sbit Beep = P1^5 ; * unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; while(n!=0) *Beep = ~Beep*,delay(m); TR0=0; } } The above code is working, but in order to be able to be compiled with sdcc,what I've done is : 1) remove the first red line, 2) change the 2nd red line from *Beep=~Beep* to *P1_5=~P1_5* ; which seems to be incorrect. I myself of course supports ANSI C, instead of Keil C. However, I've already met so much such situations in Keil C code. How can I solve such problems in a uniform way in sdcc? Thank you very much... Cheers On Sat, Jun 8, 2013 at 6:04 PM, JIA Pei <jp...@gm...> wrote: > > Hi, roelof > > Thank you very much for your prompt reply. Seriously thank you. > The code is actually copied from somebody else. I just did some > copy/paste, and then test. > > I responded to my previous Email, probably into the wrong Email address > (the sdcc development, > instead of sdcc user) . Sorry. I'm trying your solution now... > > Thank you > * > * > * > * > *JIA Pei <jp...@gm...>* > *9:54 AM (8 hours ago)* > ** > ** > ** > *to Development* > ** > *Thank you for all who have answered my questions !! seriously thank > you. * > *The solutions has been found:* > * > * > * > * > * > * > *#include <8052.h>* > * > * > *#define RELAY P1_4* > *#define K1 P2_7* > * > * > *main()* > *{* > *while(1)* > *{* > * if (!K1) RELAY = 0;* > * else RELAY = 1;* > *}* > *}* > * > * > * > * > *Thank you everybody !!!* > > > > > > On Sat, Jun 8, 2013 at 5:48 PM, roelof 't Hooft <ro...@it...>wrote: > >> On Sat, 2013-06-08 at 17:15 +0800, JIA Pei wrote: >> >> > #include <reg51.h> >> >> Did you read the replies on your previous post ? >> You did not respond to them (yet). >> Hint : sdcc must be giving you a warning about >> NOT using reg51.h >> >> >> > void int0() interrupt 1 >> > { TH0=0xd8; >> > TL0=0xef; >> > n--; >> > } >> >> The proper setup of the interrupt routine with a current >> sdcc version is like the following : >> >> void Timer0_ISR(void) __interrupt tf0_vector >> { >> ....; >> } >> >> tf0_vector can be replaced with a number if you like as it >> already is a number set with #define in the processor type >> header file. >> >> >> > void delay (unsigned char m) >> > { >> > unsigned i=3*m; >> >> This variable is unsigned type what ? >> I am assuming integer due to the three times multiplication >> of a char (max value 255 * 3). >> >> >> > void delayms(unsigned char a) >> > { >> > while(--a); >> > } >> >> If you want strict timing, like a millisecond delay, use >> a hardware timer. >> >> >> > play: >> > while(1) >> > { >> > a: p=music_tab[i]; >> > if(p==0x00) { i=0, delayms(1000); goto play;} >> >> A "goto", seriously ? >> >> Still no mention of the sdcc version....... >> And no specific errors noted that sdcc gave. >> >> roelof >> >> ps: advise : please clean up your code writing skills. It >> looks like s**t. >> >> >> >> >> ------------------------------------------------------------------------------ >> How ServiceNow helps IT people transform IT departments: >> 1. A cloud service to automate IT design, transition and operations >> 2. Dashboards that offer high-level views of enterprise services >> 3. A single system of record for all IT processes >> http://p.sf.net/sfu/servicenow-d2d-j >> _______________________________________________ >> Sdcc-user mailing list >> Sdc...@li... >> https://lists.sourceforge.net/lists/listinfo/sdcc-user >> > > > > -- > > Pei JIA > > Email: jp...@gm... > cell: +1 604-362-5816 > > Welcome to Vision Open > http://www.visionopen.com > -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |
From: Ma X. <dam...@gm...> - 2013-06-08 12:36:49
|
RTFM The following line is invalid in SDCC. SDCC uses different syntax. sbit Beep = P1^5 ; |
From: JIA P. <jp...@gm...> - 2013-06-08 15:45:02
|
Hi, Thank you Ma XiaoJun. I tried 1) #include <reg51.h> *sbit Beep = P1_5 ; * which is wrong 2) #include <reg51.h> *sbit Beep;* .... *Beep=~Beep;* which is wrong 3) #include <reg51.h> *//* *sbit Beep = P1_5 ; * ... *P1_5=~P1_5;* which is still wrong I should say "thank you" to you, but your answer didn't give out a clear solution. Isn't there a way out to solve such problems in sdcc??? Cheers On Sat, Jun 8, 2013 at 8:36 PM, Ma Xiaojun <dam...@gm...> wrote: > RTFM > > The following line is invalid in SDCC. SDCC uses different syntax. > sbit Beep = P1^5 ; > > > ------------------------------------------------------------------------------ > How ServiceNow helps IT people transform IT departments: > 1. A cloud service to automate IT design, transition and operations > 2. Dashboards that offer high-level views of enterprise services > 3. A single system of record for all IT processes > http://p.sf.net/sfu/servicenow-d2d-j > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |
From: Ma X. <dam...@gm...> - 2013-06-08 15:58:53
|
Please read http://en.wikipedia.org/wiki/RTFM if you haven't. To give you some hints, please read 3.4.1.7 of SDCC user manual. http://sdcc.sourceforge.net/doc/sdccman.pdf |
From: Ondrej P. <Ond...@ri...> - 2013-06-08 16:20:36
|
Use Beep=!Beep; instead of ~. Otherwise C converts bit Beep to integer, makes bit complement and converts the result back to bit, what produces wrong result. Ondrej From: JIA Pei [mailto:jp...@gm...] Sent: Saturday, June 08, 2013 5:45 PM To: sdc...@li... Subject: Re: [Sdcc-user] buzzer code is working properly on my board built from Keil C51, but doesn't work at all if built from sdcc ... Hi, Thank you Ma XiaoJun. I tried 1) #include <reg51.h> sbit Beep = P1_5 ; which is wrong 2) #include <reg51.h> sbit Beep; .... Beep=~Beep; which is wrong 3) #include <reg51.h> // sbit Beep = P1_5 ; ... P1_5=~P1_5; which is still wrong I should say "thank you" to you, but your answer didn't give out a clear solution. Isn't there a way out to solve such problems in sdcc??? Cheers On Sat, Jun 8, 2013 at 8:36 PM, Ma Xiaojun <dam...@gm...<mailto:dam...@gm...>> wrote: RTFM The following line is invalid in SDCC. SDCC uses different syntax. sbit Beep = P1^5 ; ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. A cloud service to automate IT design, transition and operations 2. Dashboards that offer high-level views of enterprise services 3. A single system of record for all IT processes http://p.sf.net/sfu/servicenow-d2d-j _______________________________________________ Sdcc-user mailing list Sdc...@li...<mailto:Sdc...@li...> https://lists.sourceforge.net/lists/listinfo/sdcc-user -- Pei JIA Email: jp...@gm...<mailto:jp...@gm...> cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |
From: roelof 't H. <ro...@it...> - 2013-06-08 16:12:20
|
Hi, Ma XiaoJun told you to RTFM. Please do so. > I tried > 1) > #include <reg51.h> > > sbit Beep = P1_5 ; > > > which is wrong Of course it is wrong. > 2) > #include <reg51.h> > sbit Beep; > .... > Beep=~Beep; Somewhere Beep needs to be defined. Preferably in an included header file or at the top of your C file in which it is used. > 3) > #include <reg51.h> Why are you still including a header file of which sdcc tells you not to ? Again I am assuming you are using a recent sdcc version because you still did not show us what version you are using. > // sbit Beep = P1_5 ; > > ... > P1_5=~P1_5; > > > which is still wrong P1_5 is in the reg51.h file and also in the 8051.h file. You might want to try "p1_5 = !p1_5;". But the reg51.h is old and should not be used anymore as sdcc tells you with a warning. roelof |
From: JIA P. <jp...@gm...> - 2013-06-08 16:19:00
|
Hi, Thanks roelofh: It works !!! *P1_5 = ! P1_5* is working fine ! Thank you so much... On Sun, Jun 9, 2013 at 12:12 AM, roelof 't Hooft <ro...@it...>wrote: > Hi, > > Ma XiaoJun told you to RTFM. > Please do so. > > > > I tried > > 1) > > #include <reg51.h> > > > > sbit Beep = P1_5 ; > > > > > > which is wrong > > Of course it is wrong. > > > > 2) > > #include <reg51.h> > > sbit Beep; > > .... > > Beep=~Beep; > > Somewhere Beep needs to be defined. > Preferably in an included header file or at the top of > your C file in which it is used. > > > > 3) > > #include <reg51.h> > > Why are you still including a header file of which sdcc > tells you not to ? > Again I am assuming you are using a recent sdcc version > because you still did not show us what version you are > using. > > > > // sbit Beep = P1_5 ; > > > > ... > > P1_5=~P1_5; > > > > > > which is still wrong > > P1_5 is in the reg51.h file and also in the 8051.h file. > You might want to try "p1_5 = !p1_5;". > But the reg51.h is old and should not be used anymore as > sdcc tells you with a warning. > > roelof > > > > > ------------------------------------------------------------------------------ > How ServiceNow helps IT people transform IT departments: > 1. A cloud service to automate IT design, transition and operations > 2. Dashboards that offer high-level views of enterprise services > 3. A single system of record for all IT processes > http://p.sf.net/sfu/servicenow-d2d-j > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |