From: Vaclav P. <vac...@se...> - 2008-11-20 12:11:48
|
Hello, I use following short code: #include <pic16f690.h> void main(void) { // config the application OSCCON = 0x70; //8MHz internal clock, sysclock defined in CONFIG ANSEL = 0x00; ANSELH = 0x00; // config SPI TRISB_bits.TRISB6 = 0; // SCK TRISB_bits.TRISB4 = 1; // SDI TRISC_bits.TRISC7 = 0; // SDO SSPSTAT = 0x80; // SMP=1, CKP=0 SSPCON = 0x31; // CKE=1, enable, SPI master, Fosc/16 while(1) ; } During comiplation I get erors: > sdcc -V -mpic14 -ppic16f690 main.c + d:\v\sw\sdcc\bin\sdcpp.exe -nostdinc -Wall -obj-ext=.o -DSDCC_MODEL_SMALL -DSDCC=284 -DSDCC_REVISION=5264 -DSDCC_pic14 -D__pic14 -DSDCC_PROCESSOR="pic16f690" -isystem "d:\v\sw\sdcc\include\pic14" -isystem "d:\V\sw\sdcc\bin\..\include\pic14" -isystem "d:\v\sw\sdcc\include" -isystem "d:\V\sw\sdcc\bin\..\include" -isystem "d:\v\sw\sdcc\include\pic" -isystem "d:\V\sw\sdcc\bin\..\include\pic" "main.c" main.c:23: error 26: '_TRISB_bits' not a structure/union member main.c:23: error 25: Structure/Union expected left of '.->' main.c:24: error 26: '_TRISB_bits' not a structure/union member main.c:24: error 25: Structure/Union expected left of '.->' main.c:25: error 26: '_TRISC_bits' not a structure/union member main.c:25: error 25: Structure/Union expected left of '.->' In .H file there is correct definition of "TRISB_bits". But it seems to me that SDCC wrongly interprets underscores. Is there some hack, how to enable unions ? My SDCC is of version 2.8.4 #5264 (Nov 11 2008) (MINGW32) Thank you in advance, Vaclav |
From: MiGaNuTs <mig...@fr...> - 2008-11-20 16:40:45
|
Hello, try to write "TRISB6 = 0;" in place of " TRISB_bits.TRISB6 = 0;" it should works better. if not, write "TRISB=0x08;" it do the same jo, and the asm code is shorter and faster. Sorry for my bad english. have fun. MiGaNuTs Le 20 nov. 08 à 13:11, Vaclav Peroutka a écrit : > Hello, I use following short code: > > #include <pic16f690.h> > > void main(void) > { > // config the application > OSCCON = 0x70; //8MHz internal clock, sysclock defined in CONFIG > ANSEL = 0x00; > ANSELH = 0x00; > > // config SPI > TRISB_bits.TRISB6 = 0; // SCK > TRISB_bits.TRISB4 = 1; // SDI > TRISC_bits.TRISC7 = 0; // SDO > > SSPSTAT = 0x80; // SMP=1, CKP=0 > SSPCON = 0x31; // CKE=1, enable, SPI master, Fosc/16 > > while(1) ; > > } > > During comiplation I get erors: >> sdcc -V -mpic14 -ppic16f690 main.c > + d:\v\sw\sdcc\bin\sdcpp.exe -nostdinc -Wall -obj-ext=.o - > DSDCC_MODEL_SMALL -DSDCC=284 -DSDCC_REVISION=5264 -DSDCC_pic14 - > D__pic14 -DSDCC_PROCESSOR="pic16f690" -isystem "d:\v\sw\sdcc\include > \pic14" -isystem "d:\V\sw\sdcc\bin\..\include\pic14" -isystem "d:\v > \sw\sdcc\include" -isystem "d:\V\sw\sdcc\bin\..\include" -isystem > "d:\v\sw\sdcc\include\pic" -isystem "d:\V\sw\sdcc\bin\..\include > \pic" "main.c" > main.c:23: error 26: '_TRISB_bits' not a structure/union member > main.c:23: error 25: Structure/Union expected left of '.->' > main.c:24: error 26: '_TRISB_bits' not a structure/union member > main.c:24: error 25: Structure/Union expected left of '.->' > main.c:25: error 26: '_TRISC_bits' not a structure/union member > main.c:25: error 25: Structure/Union expected left of '.->' > > In .H file there is correct definition of "TRISB_bits". But it > seems to me that SDCC wrongly interprets underscores. Is there some > hack, how to enable unions ? My SDCC is of version 2.8.4 #5264 (Nov > 11 2008) (MINGW32) > > Thank you in advance, > Vaclav > > ---------------------------------------------------------------------- > --- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge > Build the coolest Linux based applications with Moblin SDK & win > great prizes > Grand prize is a trip for two to an Open Source event anywhere in > the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > |
From: Vaclav P. <vac...@se...> - 2008-11-20 18:52:21
|
> ---------------------------------------- > > TRISB_bits.TRISB6 = 0; // SCK > Hello, I just found that direct TRISB6 = 0; works properly. Even if I would like TRISBbits.TRISB6 = 0; as it is done for PIC16 port. Is there any plans to synchronize it ? I have another question. In SDCC manual I did not find it but maybe somebody can help me. I currently initialize strings like that: main() { __data unsigned char buf[10]; buf[0] = 'H', buf[1] = 'e'; buf[2] = 'l', buf[3] = 'l', buf[4] = 'o'; buf[5] = 0x0d; buf[6] = 0x00; SendString( buf); } Is there any more clever way how to initialize buffer with "Hello\n" in data memory ? But I do not want to have string in program memory and use GPTRGET. Or the way I did it is the only possible way ? Thank you, Vaclav |
From: Richard G. <ri...@re...> - 2008-11-20 19:33:37
|
I don't really see how you can avoid the constant being in the program area, but personally I would simply do this, below, although admittedly this would pull in some string manipulation library routines. Whatever you do, the "Hello\n" string is going to have to be stored somewhere that is not volatile in the first instance. buf="Hello\n"; Another way might be to declare "Hello\n" as a constant, set up a pointer to that constant and then dereference the pointer into volatile memory using a loop, incrementing the pointer each time around, until the null string terminator is encountered, but you're probably not going to save much program space over the library routine that does the same job. You could use some inline assembly language of course... On Thursday 20 November 2008 13:44:32 Vaclav Peroutka wrote: > > ---------------------------------------- > > > > TRISB_bits.TRISB6 = 0; // SCK > > Hello, I just found that direct TRISB6 = 0; works properly. Even if I would > like TRISBbits.TRISB6 = 0; as it is done for PIC16 port. Is there any plans > to synchronize it ? > > I have another question. In SDCC manual I did not find it but maybe > somebody can help me. I currently initialize strings like that: main() { > __data unsigned char buf[10]; > > buf[0] = 'H', buf[1] = 'e'; buf[2] = 'l', buf[3] = 'l', buf[4] = 'o'; > buf[5] = 0x0d; buf[6] = 0x00; SendString( buf); > } > > Is there any more clever way how to initialize buffer with "Hello\n" in > data memory ? But I do not want to have string in program memory and use > GPTRGET. Or the way I did it is the only possible way ? > > Thank you, > Vaclav > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge Build the coolest Linux based applications with Moblin SDK & win > great prizes Grand prize is a trip for two to an Open Source event anywhere > in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user -- Richard. PGP Key-id: 0x5AB3D350 Giving up on assembly language was the apple in our Garden of Eden: Languages whose use squanders machine cycles are sinful. The LISP machine now permits LISP programmers to abandon bra and fig-leaf. -- Epigrams in Programming, ACM SIGPLAN Sept. 1982 |
From: Raphael N. <rn...@we...> - 2008-11-20 20:01:28
|
> Hello, I just found that direct TRISB6 = 0; works properly. Even if I > would like TRISBbits.TRISB6 = 0; as it is done for PIC16 port. Is there > any plans to synchronize it ? You can use #define NO_BIT_DEFINES 1 #include <pic14regs.h> to disable bit defines, see the header files. NO_BIT_DEFINES must be defined *before* including the device header! > I have another question. In SDCC manual I did not find it but maybe > somebody can help me. I currently initialize strings like that: > main() { > __data unsigned char buf[10]; > > buf[0] = 'H', buf[1] = 'e'; buf[2] = 'l', buf[3] = 'l', buf[4] = 'o'; > buf[5] = 0x0d; buf[6] = 0x00; > SendString( buf); > } > > Is there any more clever way how to initialize buffer with "Hello\n" in > data memory ? But I do not want to have string in program memory and use > GPTRGET. Or the way I did it is the only possible way ? Why not use void main (void) { __data unsigned char str[] = "Hello"; } This works well, and generates the same code as your manual assignments given a local variable 'str'. This fails utterly for globals, though (a bug that I need to fix some day)... Regards, Raphael |