CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

problem with version 4.140
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

problem with version 4.140
PostPosted: Mon Jun 24, 2013 11:32 am     Reply with quote

Hello,
I think it's a problem of structures that are not well defined, but I would ask an opinion.
Code:

#define   MAXTEL      8
#define   ARBSIZE   24   
char      argbuf[ARBSIZE];   


Code:
typedef struct      
{
  char         numtel[21];      
  unsigned int8      ass_in;         
  bit            ab_cal:1;      
  bit            ab_sms:1;      
  bit            ab_voc:1;      
} tel_struct;


Code:
tel_struct      tel_data[MAXTEL];


Code:

strcpy(tel_data[n_leggi_num].numtel, argbuf);

If I use the strcpy in the version 4.119 is ok tel_data[n_leggi_num].numtel contains regular data
if use for example version 4.128
the first byte of tel_data[n_leggi_num].numtel contain '\0' why?


Last edited by Max on Fri Jun 28, 2013 10:29 am; edited 2 times in total
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Jun 24, 2013 11:38 am     Reply with quote

It's important to post a small, compilable test program. Notice this thread
on today's board:
http://www.ccsinfo.com/forum/viewtopic.php?t=50712
The original poster does not provide a test program. So we have to guess
what his problem is, and try to make a test program. The whole thread
still does not have any resolution at this time. We're still guessing.

You should prevent this problem in your thread by posting a test program
that shows the problem. It must have the #include for the PIC, #fuses,
#use delay, main(), variables, constants, etc.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Tue Jun 25, 2013 7:06 am     Reply with quote

Code:
bit            ab_sms:1;
I wonder if this is legal C code.
Consider what you are saying: from the type bit, take 1 bit to put it here in the structure. I don't know how 'bit' is defined in the compiler and I don't have the compiler here to check it but even when it is working it is a strange way to code it like this. A bit is already of size 1 bit, so why specify that you want only to use 1 bit from it (it is even confusing when I write it down like this).

The correct way:
Code:
int            ab_sms:1;
and what might work, but is not compatible with other compilers:
Code:
int1            ab_sms;
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 12:13 am     Reply with quote

Quote:
I don't know how 'bit' is defined in the compiler

It's not defined in the compiler nor a standard C type.
It's the bad thing of posting incomplete code snippets, not worth to discuss it.
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 12:53 am     Reply with quote

Thanks for all reply,
I forgot to post the definition of bits
Code:

typedef   int1 bit;

ok so if it's better to write 'I will
Quote:
int1 ab_sms;


These are the fuse and .. more
Code:
#include    <18F458.h>
#device    adc=10
#use       delay(clock=11059200,RESTART_WDT)
#fuses       NOWDT,WDT128,HS, PROTECT, NOOSCSEN, NOBROWNOUT, BORV20
#fuses      NOPUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB
#fuses      NOCPB, NOWRTC, NOEBTR, NOEBTRB
#use       rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,RESTART_WDT,bits=8,ERRORS)
#use      FAST_IO(A)
#use      FAST_IO(B)
#use      FAST_IO(C)
#use      FAST_IO(D)
#use      FAST_IO(E)

Unfortunately, maybe there are some lines you do your standard "C", but what I do not understand is why with some versions of CCS works well and others do not.
thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19350

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 1:28 am     Reply with quote

It is _best_, to use the bitfield, not int1 at all here.
Code:

typedef struct     
{
  char         numtel[21];     
  unsigned int8      ass_in;         
  int            ab_cal:1;     
  int            ab_sms:1;     
  int            ab_voc:1;     
} tel_struct;

You are defining 'sub variables' one bit in size, inside an integer. This is standard C.

'int1', is a CCS expansion, allowing you in general to define 'one bit' integers, but does introduce the problem of how such variables are going to be aligned when stored in something like a structure, and to then try defining a one bit field 'inside' a one bit variable gets into 'black art' territory. The point about bitfields is that these are the 'standard' C way of defining bits.
The bitfield operator explicitly says in K&R, that the variable may _only_ be an integer. CCS won't handle (for example), bitfields into an int16 (for PIC16/18), but does not syntax check this.

Far better and safer to stick to standard C.

Best Wishes
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

**** EDIT ****
PostPosted: Wed Jun 26, 2013 6:47 am     Reply with quote

I replaced the lines of code in the way I have indicated, however, I think I miss anything again:
From debugging after breackpoint, I have in in_data [0]. Contact = 0

if I execute the line
Code:
mystruct.v_contact  = in_data[0].value

v_contact contains 1.Confused

v_contact and in_data is defined in this way:
Code:
struct
{
  int  v_contact:1;
}mystruct;

typedef struct      
{
  int            enable:1;      
  int            contact:1;      
  int            polar:1;      
  int            pin:1;         
  int            status:1;      
  int            allarme:1;      
  int            gia_chiamato:1;
  unsigned int8          delay_sample;   
  unsigned int16          delay;         
  unsigned int16        counter;      
} input_struct;

input_struct   in_data[4];



I do not understand why.
Code:
     (file lst)   mystruct.v_contact = in_data[t].contact;
0906:  BCF    xA2.2
0908:  MOVF   x99,W
090A:  MULLW  06
090C:  MOVF   FF3,W
090E:  CLRF   xA4
0910:  MOVWF  xA3
0912:  MOVLW  E6
0914:  ADDWF  xA3,W
0916:  MOVWF  FE9
0918:  MOVLW  01
091A:  ADDWFC xA4,W
091C:  MOVWF  FEA
091E:  BTFSS  FEF.0
0920:  BRA    0924
0922:  BSF    xA2.2
         mystruct.v_status = (mystruct.v_enable && (!mystruct.v_pin ^ mystruct.v_contact));
0924:  BTFSS  xA2.0
0926:  BRA    093A
0928:  MOVLW  00
092A:  BTFSS  xA2.1
092C:  MOVLW  01
092E:  MOVWF  xA4
...
...


Last edited by Max on Wed Jun 26, 2013 11:49 am; edited 1 time in total
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 9:43 am     Reply with quote

The data referenced in the diasassembly list doesn't match the above source. This brings up one more
the question of a complete, compilable test program demonstrating the problem.

Without it, I see no chance to find out anything meaningful.
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 10:04 am     Reply with quote

FvM wrote:
The data referenced in the diasassembly list doesn't match the above source. This brings up one more
the question of a complete, compilable test program demonstrating the problem.

Without it, I see no chance to find out anything meaningful.

Thanks,
the code is very long, it is impossible to post it.
I still say, however, that the 4119 version it's all right Crying or Very sad
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 12:26 pm     Reply with quote

Quote:
the code is very long, it is impossible to post it.

Noone asked for posting the full code.

There are essentially two options:
- the problem/bug/whatsoever can be reproduced with a small test programm. Then you should try to
setup a respective example and you have a good chance that other forum memeber can help you to
explain the problem, possibly find a workaround etc.

- problem can't be easily reproduced and occurs only in your application. Then it's about to meaningless to
discuss the details in the forum, except for saying: there's a problem, but I don't know why.

P.S.: I checked, that the assembly code is apparently correct (for the actual structure layout, not the
arrangement shown in the post) and identical for V4.112 and V4.127.
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

PostPosted: Thu Jun 27, 2013 12:13 am     Reply with quote

The first assembler code is generated from version 4.140, the second with version 4.119.
The C source code is NOT changed, while the assembler code you '.
It can be seen as the 'education BTFSS that when compiled with 4,140 controls bit 0, whereas the 4,119 controls the bit 1.

With 4.140
Code:
....................              mystruct.v_contact = in_data[t].contact;
082C:  BCF    xA3.2
082E:  MOVF   x99,W
0830:  MULLW  06
0832:  MOVF   FF3,W
0834:  CLRF   xA5
0836:  MOVWF  xA4
0838:  MOVLW  E6
083A:  ADDWF  xA4,W
083C:  MOVWF  FE9
083E:  MOVLW  01
0840:  ADDWFC xA5,W
0842:  MOVWF  FEA
0844:  BTFSS  FEF.0
0846:  BRA    084A
0848:  BSF    xA3.2


with 4.119

Code:
....................              mystruct.v_contact = in_data[t].contact;
082C:  BCF    xA3.2
082E:  MOVF   x99,W
0830:  MULLW  06
0832:  MOVF   FF3,W
0834:  CLRF   xA5
0836:  MOVWF  xA4
0838:  MOVLW  E6
083A:  ADDWF  xA4,W
083C:  MOVWF  FE9
083E:  MOVLW  01
0840:  ADDWFC xA5,W
0842:  MOVWF  FEA
0844:  BTFSS  FEF.1
0846:  BRA    084A
0848:  BSF    xA3.2


If I create a small project with only these instructions, NOT the problem occurs, exists only in the full program.
But what I do not understand is why with two different versions assembler generates two different codes
Ttelmah



Joined: 11 Mar 2010
Posts: 19350

View user's profile Send private message

PostPosted: Thu Jun 27, 2013 2:44 am     Reply with quote

I think the problem is far more 'basic'.

Suspicion, possibly the keyword 'enable' has a #defined expansion, somewhere in one of the later include files (driver or something), with the compilers after 4.119.

Hence the actual structure is not being setup as you think, so the code fails.

With the basic code (no driver includes), the code works fine, so the compiler doesn't have a problem at heart with handling anything here.
Unfortunately (always annoying), CCS doesn't allow you to 'see' the source file 'after macro expansion', making this one hard to detect.
Simply change the actual 'names' used in the variables. Just do a text search and replace on all your source files, for 'contact', 'enable' etc., and change them to something like 'my_cont', and 'my_ena', which are unlikely to exist in any CCS file. If the problem disappears, you know exactly what it going on.

Best Wishes
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Thu Jun 27, 2013 4:12 am     Reply with quote

Quote:
I think the problem is far more 'basic'.

Suspicion, possibly the keyword 'enable' has a #defined expansion, somewhere in one of the later include files (driver or something), with the compilers after 4.119.


Something like this might happen. My problem with the previously posted code was, that the structures
obviously contain additional fields that are not shown in the source, e.g. v_pin and v_enable. Posting
consistent code is the absolute minimal requisite to discuss a possible bug, I think.

If you see however bitfields shifted, reordered or whatsoever, it would be quite easy to find out what has
been assigned to the other bits by scanning symbol files and assembly listings, respectively check if all
fields can be still accessed. We can't see if the bit enable is used anywhere in the code.
Max



Joined: 15 Dec 2003
Posts: 51
Location: Italy

View user's profile Send private message

PostPosted: Thu Jun 27, 2013 6:53 am     Reply with quote

Ttelmah wrote:
I think the problem is far more 'basic'.

Suspicion, possibly the keyword 'enable' has a #defined expansion, somewhere in one of the later include files (driver or something), with the compilers after 4.119.

Nothing, Crying or Very sad I replaced all the names of both the structure and the its members, but always the same problem.
I think I'll leave the old version Crying or Very sad
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Thu Jun 27, 2013 11:06 am     Reply with quote

You showed that in the example in_data[t].contact is read as bit 0 in V4.140 although it's assigned to bit 1.
- Is it always accessed at this memory location, also in other instructions?
- How about in_data[].enable, which is expected at bit 0? Is it used in your application at all? If yes, where does the compiler access it?
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group