|
|
View previous topic :: View next topic |
Author |
Message |
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
if (x == c) problem |
Posted: Sat Jul 10, 2010 10:16 pm |
|
|
Hi,
I have noticed few times that ccs is doing a funny thing:
I use PCH, when I do this
Code: | if ((a == 1) && (c ==1)) {
|
then it does not work, but if I do this
Code: | if ((a != 0) && (c !=0)) {
|
then it works!
Any similar experience and solution?
This is my code:
Code: |
for (ac=0;ac<16;ac++) { // find it in the buffer and if there then do not buffer again
if ((tx_c_h == sent_buffered_cmd_h[ac]) && (tx_c_l == sent_buffered_cmd_l[ac]) && (tx_d1_h == sent_buffered_data1H[ac]) && (tx_d1_l == sent_buffered_data1L[ac]) && (tx_d2_h == sent_buffered_data2H[ac]) && (tx_d2_l == sent_buffered_data2L[ac]) && (tx_d3_h == sent_buffered_data3H[ac]) && (tx_d3_L == sent_buffered_data3L[ac]) && (tx_d4_h == sent_buffered_data4H[ac]) && (tx_d4_l == sent_buffered_data4L[ac])) {
inbuffer = 1;
} //if
else {
inbuffer = 0;
} //else
|
and it does not work...
But this works
Code: |
for (a=0;a<16;a++) {
if ((strn_decrypted[6] == sent_buffered_cmd_h[a]) && (strn_decrypted[7] == sent_buffered_cmd_l[a]) && (strn_decrypted[8] == sent_buffered_data1H[a]) && (strn_decrypted[9] == sent_buffered_data1L[a]) && (strn_decrypted[10] == sent_buffered_data2H[a]) && (strn_decrypted[11] == sent_buffered_data2L[a]) && (strn_decrypted[12] == sent_buffered_data3H[a]) && (strn_decrypted[13] == sent_buffered_data3L[a]) && (strn_decrypted[14] == sent_buffered_data4H[a]) && (strn_decrypted[15] == sent_buffered_data4L[a])) {
//message receiving confirmed
flag_expect_response[a] = 0 ;
}
}
|
thnx _________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jul 11, 2010 12:52 am |
|
|
It's impossible to see, if your complains are justified without knowing the exact type definition of all involved variables - and the PCH version.
I guess, that you actually never verified the claimed issue with the first example? I know, that it's generally working correctly (e.g. with int8 type).
Code: | if ((a == 1) && (c ==1)) { |
There may be possibly issues with decoding of complex expressions, although I'm not aware of it with PCH (they are still quite common with recent PCH versions). If so, everything is changed when replacing a single subexpression. Thus it's necessary to know the exact conditions to reproduce the problem.
A usual explanation would be a common user programming error as e.g. comparing signed and unsigned data types. |
|
|
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
|
Posted: Sun Jul 11, 2010 1:09 am |
|
|
Variables:
Code: |
BYTE tx_msg,tx_c_h,tx_c_l,tx_d1_h,tx_d1_l,tx_d2_h,tx_d2_l,tx_d3_h,tx_d3_l,tx_d4_h,tx_d4_l;
BYTE sent_buffered_msg_type[16];
BYTE sent_buffered_cmd_h[16];
BYTE sent_buffered_cmd_l[16];
BYTE sent_buffered_data1H[16];
BYTE sent_buffered_data1L[16];
BYTE sent_buffered_data2H[16];
BYTE sent_buffered_data2L[16];
BYTE sent_buffered_data3H[16];
BYTE sent_buffered_data3L[16];
BYTE sent_buffered_data4H[16];
BYTE sent_buffered_data4L[16];
Code:
void buffer_in_TX(short sent,short confirmation, int txbuffer) {
int a;
short inbuffer;
inbuffer = 0;
for (a=0;a<16;a++) { // find it in the buffer and if there then do not buffer again
if ((sent_buffered_cmd_h[a] == tx_c_h) && (sent_buffered_cmd_l[a] == tx_c_l) && (sent_buffered_data1H[a] == tx_d1_h) && (sent_buffered_data1L[a] == tx_d1_l) && (sent_buffered_data2H[a] == tx_d2_h) && (sent_buffered_data2L[a] == tx_d2_l) && (sent_buffered_data3H[a] == tx_d3_h) && (sent_buffered_data3L[a] == tx_d3_L) && (sent_buffered_data4H[a] == tx_d4_h) && (sent_buffered_data4L[a] == tx_d4_l)) {
inbuffer = 1;
} //if
else {
inbuffer = 0;
} //else
if ((sent == 1) && (confirmation == 0)) {
flag_sent[a] = 1; // send when bus is free and remove from the buffer
//beep_short();
} //if
} //for
if ( ((inbuffer == 0) && (sent == 0)) || ((inbuffer == 0) && (confirmation == 1)) ) {
//beep_long();
if (confirmation == 1) {
flag_expect_response[txbuffer] = 1;
} //if
if (confirmation == 0) {
flag_expect_response[txbuffer] = 0;
} //if
sent_confirmation[txbuffer] = confirmation;
sent_buffered_msg_type[txbuffer] = tx_msg;
sent_buffered_cmd_h[txbuffer] = tx_c_h;
sent_buffered_cmd_l[txbuffer] = tx_c_l;
sent_buffered_data1H[txbuffer] = tx_d1_h;
sent_buffered_data1L[txbuffer] = tx_d1_l;
sent_buffered_data2H[txbuffer] = tx_d2_h;
sent_buffered_data2L[txbuffer] = tx_d2_l;
sent_buffered_data3H[txbuffer] = tx_d3_h;
sent_buffered_data3L[txbuffer] = tx_d3_l;
sent_buffered_data4H[txbuffer] = tx_d4_h;
sent_buffered_data4L[txbuffer] = tx_d4_l;
} //if
}
void printout(int confirmation,int msg_type_to_send,int cmd_h_to_send,int cmd_l_to_send,int data1H_to_send,int data1L_to_send,int data2H_to_send,int data2L_to_send,int data3H_to_send,int data3L_to_send,int data4H_to_send,int data4L_to_send) {
short sent;
crcRX();
disable_interrupts(int_rda);
sent = 0;
tx_msg = msg_type_to_send;
tx_c_h = cmd_h_to_send;
tx_c_l = cmd_l_to_send;
tx_d1_h = data1H_to_send;
tx_d1_l = data1L_to_send;
tx_d2_h = data2H_to_send;
tx_d2_l = data2L_to_send;
tx_d3_h = data3H_to_send;
tx_d3_l = data3L_to_send;
tx_d4_h = data4H_to_send;
tx_d4_l = data4L_to_send;
txbuffer++;
if (txbuffer > 15) {
txbuffer = 0;
} //if
if ( (!kbhit()) && (stop_TX != 1) ) {
comms_TX_high();
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",0xFF,dest_h,dest_l,address_h,address_l,msg_type_to_send,cmd_h_to_send,cmd_l_to_send,data1H_to_send,data1L_to_send,data2H_to_send,data2L_to_send,data3H_to_send,data3L_to_send,data4H_to_send,data4L_to_send,crc_h_calculated,crc_l_calculated,0xD);
comms_TX_low();
sent = 1;
reprint_delay = 0;
} //if
else {
sent = 0;
} //else
buffer_in_TX(sent,confirmation,txbuffer); //buffer it if not in buffer
enable_interrupts(int_rda);
} //void
When I send a message I expect it to be loaded into my buffer if not there, however it does not execute this part:
if ((sent_buffered_cmd_h[a] == tx_c_h) && (sent_buffered_cmd_l[a] == tx_c_l) && (sent_buffered_data1H[a] == tx_d1_h) && (sent_buffered_data1L[a] == tx_d1_l) && (sent_buffered_data2H[a] == tx_d2_h) && (sent_buffered_data2L[a] == tx_d2_l) && (sent_buffered_data3H[a] == tx_d3_h) && (sent_buffered_data3L[a] == tx_d3_L) && (sent_buffered_data4H[a] == tx_d4_h) && (sent_buffered_data4L[a] == tx_d4_l)) { |
and always marks inbuffer as 0 _________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
|
Posted: Sun Jul 11, 2010 1:11 am |
|
|
PCH 4.107 _________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
|
Posted: Sun Jul 11, 2010 1:14 am |
|
|
Code: |
34: if ((sent_buffered_cmd_h[a] == tx_c_h) && (sent_buffered_cmd_l[a] == tx_c_l) && (sent_buffered_data1H[a] == tx_d1_h) && (sent_buffered_data1L[a] == tx_d1_l) && (sent_buffered_data2H[a] == tx_d2_h) && (sent_buffered_data2L[a] == tx_d2_l) && (sent_buffered_data3H[a] == tx_d3_h) && (sent_buffered_data3L[a] == tx_d3_L) && (sent_buffered_data4H[a] == tx_d4_h) && (sent_buffered_data4L[a] == tx_d4_l)) {
0512 6A03 CLRF 0x3, ACCESS
0514 51A6 MOVF 0xa6, W, BANKED
0516 0FCB ADDLW 0xcb
0518 6EE9 MOVWF 0xfe9, ACCESS
051A 0E00 MOVLW 0
051C 2003 ADDWFC 0x3, W, ACCESS
051E 6EEA MOVWF 0xfea, ACCESS
0520 5062 MOVF 0x62, W, ACCESS
0522 5CEF SUBWF 0xfef, W, ACCESS
0524 E15C BNZ 0x5de
0526 6A03 CLRF 0x3, ACCESS
0528 51A6 MOVF 0xa6, W, BANKED
052A 0FDB ADDLW 0xdb
052C 6EE9 MOVWF 0xfe9, ACCESS
052E 0E00 MOVLW 0
0530 2003 ADDWFC 0x3, W, ACCESS
0532 6EEA MOVWF 0xfea, ACCESS
0534 5063 MOVF 0x63, W, ACCESS
0536 5CEF SUBWF 0xfef, W, ACCESS
0538 E152 BNZ 0x5de
053A 6A03 CLRF 0x3, ACCESS
053C 51A6 MOVF 0xa6, W, BANKED
053E 0FEB ADDLW 0xeb
0540 6EE9 MOVWF 0xfe9, ACCESS
0542 0E00 MOVLW 0
0544 2003 ADDWFC 0x3, W, ACCESS
0546 6EEA MOVWF 0xfea, ACCESS
0548 5064 MOVF 0x64, W, ACCESS
054A 5CEF SUBWF 0xfef, W, ACCESS
054C E148 BNZ 0x5de
054E 6A03 CLRF 0x3, ACCESS
0550 51A6 MOVF 0xa6, W, BANKED
0552 0FFB ADDLW 0xfb
0554 6EE9 MOVWF 0xfe9, ACCESS
0556 0E00 MOVLW 0
0558 2003 ADDWFC 0x3, W, ACCESS
055A 6EEA MOVWF 0xfea, ACCESS
055C 5065 MOVF 0x65, W, ACCESS
055E 5CEF SUBWF 0xfef, W, ACCESS
0560 E13E BNZ 0x5de
0562 6A03 CLRF 0x3, ACCESS
0564 51A6 MOVF 0xa6, W, BANKED
0566 0F0B ADDLW 0xb
0568 6EE9 MOVWF 0xfe9, ACCESS
056A 0E01 MOVLW 0x1
056C 2003 ADDWFC 0x3, W, ACCESS
056E 6EEA MOVWF 0xfea, ACCESS
0570 5066 MOVF 0x66, W, ACCESS
0572 5CEF SUBWF 0xfef, W, ACCESS
0574 E134 BNZ 0x5de
0576 6A03 CLRF 0x3, ACCESS
0578 51A6 MOVF 0xa6, W, BANKED
057A 0F1B ADDLW 0x1b
057C 6EE9 MOVWF 0xfe9, ACCESS
057E 0E01 MOVLW 0x1
0580 2003 ADDWFC 0x3, W, ACCESS
0582 6EEA MOVWF 0xfea, ACCESS
0584 5067 MOVF 0x67, W, ACCESS
0586 5CEF SUBWF 0xfef, W, ACCESS
0588 E12A BNZ 0x5de
058A 6A03 CLRF 0x3, ACCESS
058C 51A6 MOVF 0xa6, W, BANKED
058E 0F2B ADDLW 0x2b
0590 6EE9 MOVWF 0xfe9, ACCESS
0592 0E01 MOVLW 0x1
0594 2003 ADDWFC 0x3, W, ACCESS
0596 6EEA MOVWF 0xfea, ACCESS
0598 5068 MOVF 0x68, W, ACCESS
059A 5CEF SUBWF 0xfef, W, ACCESS
059C E120 BNZ 0x5de
059E 6A03 CLRF 0x3, ACCESS
05A0 51A6 MOVF 0xa6, W, BANKED
05A2 0F3B ADDLW 0x3b
05A4 6EE9 MOVWF 0xfe9, ACCESS
05A6 0E01 MOVLW 0x1
05A8 2003 ADDWFC 0x3, W, ACCESS
05AA 6EEA MOVWF 0xfea, ACCESS
05AC 5069 MOVF 0x69, W, ACCESS
05AE 5CEF SUBWF 0xfef, W, ACCESS
05B0 E116 BNZ 0x5de
05B2 6A03 CLRF 0x3, ACCESS
05B4 51A6 MOVF 0xa6, W, BANKED
05B6 0F4B ADDLW 0x4b
05B8 6EE9 MOVWF 0xfe9, ACCESS
05BA 0E01 MOVLW 0x1
05BC 2003 ADDWFC 0x3, W, ACCESS
05BE 6EEA MOVWF 0xfea, ACCESS
05C0 506A MOVF 0x6a, W, ACCESS
05C2 5CEF SUBWF 0xfef, W, ACCESS
05C4 E10C BNZ 0x5de
05C6 6A03 CLRF 0x3, ACCESS
05C8 51A6 MOVF 0xa6, W, BANKED
05CA 0F5B ADDLW 0x5b
05CC 6EE9 MOVWF 0xfe9, ACCESS
05CE 0E01 MOVLW 0x1
05D0 2003 ADDWFC 0x3, W, ACCESS
05D2 6EEA MOVWF 0xfea, ACCESS
05D4 506B MOVF 0x6b, W, ACCESS
05D6 5CEF SUBWF 0xfef, W, ACCESS
05D8 E102 BNZ 0x5de
35: inbuffer = 1;
05DA 81A7 BSF 0xa7, 0, BANKED
36: } //if
37: else {
05DC D001 BRA 0x5e0
38: inbuffer = 0;
05DE 91A7 BCF 0xa7, 0, BANKED
39: } //else
40: |
_________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
|
Posted: Sun Jul 11, 2010 2:01 am |
|
|
It was my mistake,
this is wrong:
Code: |
void buffer_in_TX(short sent,short confirmation, int txbuffer) {
int a;
short inbuffer;
inbuffer = 0;
for (a=0;a<16;a++) { // find it in the buffer and if there then do not buffer again
if ((sent_buffered_cmd_h[a] == tx_c_h) && (sent_buffered_cmd_l[a] == tx_c_l) && (sent_buffered_data1H[a] == tx_d1_h) && (sent_buffered_data1L[a] == tx_d1_l) && (sent_buffered_data2H[a] == tx_d2_h) && (sent_buffered_data2L[a] == tx_d2_l) && (sent_buffered_data3H[a] == tx_d3_h) && (sent_buffered_data3L[a] == tx_d3_L) && (sent_buffered_data4H[a] == tx_d4_h) && (sent_buffered_data4L[a] == tx_d4_l)) {
inbuffer = 1;
} //if
else {
inbuffer = 0;
} //else
|
I am overriding my flag with this:
Code: |
else {
inbuffer = 0;
} //else
|
So correct is:
Code: |
void buffer_in_TX(short sent,short confirmation, int txbuffer) {
int a;
short inbuffer;
inbuffer = 0;
for (a=0;a<16;a++) { // find it in the buffer and if there then do not buffer again
if ((sent_buffered_cmd_h[a] == tx_c_h) && (sent_buffered_cmd_l[a] == tx_c_l) && (sent_buffered_data1H[a] == tx_d1_h) && (sent_buffered_data1L[a] == tx_d1_l) && (sent_buffered_data2H[a] == tx_d2_h) && (sent_buffered_data2L[a] == tx_d2_l) && (sent_buffered_data3H[a] == tx_d3_h) && (sent_buffered_data3L[a] == tx_d3_L) && (sent_buffered_data4H[a] == tx_d4_h) && (sent_buffered_data4L[a] == tx_d4_l)) {
inbuffer = 1;
} //if
|
and then if msg is in the buffer then inbuffer will kick on and be 1, if not there will stay 0 as in initial:
Code: |
short inbuffer;
inbuffer = 0;
|
Thnx.
PS. the if (x == c) problem is there I am sure but this one was false alarm. I have notice this strange behavior few times in the past. If I get it again I will post it. _________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jul 11, 2010 2:22 am |
|
|
I can't see from your code, if the compare will ever match. I could verify with MPLAB SIM however, that it achieves a match
exactly for one position, if the buffer arrays have been set before respectively. So it seems to me, that the claimed problem
doesn't exist.
In any case, you should post a complete code example, that reproduces the problem. |
|
|
Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
|
Posted: Sun Jul 11, 2010 2:25 am |
|
|
13K is too much, many thnx anyway, since my "else" is removed all works like a beauty.
_________________ Help "d" others and then you shell receive some help from "d" others. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jul 11, 2010 3:45 am |
|
|
I didn't mean posting your complete application code but a complete example, that can be compiled as is. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jul 11, 2010 2:39 pm |
|
|
If you do post an example program, do it in the style you used below,
with simple, short little variables, and a very short (but complete)
program. Make it easy for us to read. You will get a lot more help that way.
Quote: |
if ((a == 1) && (c ==1)) { |
|
|
|
|
|
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
|