|
|
View previous topic :: View next topic |
Author |
Message |
schmobol Guest
|
Problem with bit_set() function on CCS 3.185 |
Posted: Wed Feb 18, 2004 6:50 am |
|
|
Updating CCS compiler from 3.184 to 3.185, one of my software didn’t work anymore. I finally tracked down the problem to the “bit_set()” function that seemed to basically erased the whole int8 variable instead of setting the bit.
I changed the line :
bit_set(trame[j],i+3);
and replaced it with :
trame[j]|=0x01<<(i+3);
and now everything’s all right butI didn’t have that problem with 3.184.
Anybody else had similar experience ? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Feb 18, 2004 2:55 pm |
|
|
Quote: | Updating CCS compiler from 3.184 to 3.185, one of my software didn’t work anymore. I finally tracked down the problem to the “bit_set()” function that seemed to basically erased the whole int8 variable instead of setting the bit. |
I think there is a problem. I analyzed the code produced by PCM 3.185
with an 16F877, and it looks like the compiler is leaving off two lines
of ASM code at the end. It calculates the correct bitmask, and combines
it with the value read from the array, but it does not put the result back
into the array.
Since you found the bug, do you want to email CCS tech support
about this ?
Code: |
main()
{
char trame[10];
char j;
char i;
j = 0;
i = 4;
SYMBOLS
main.trame 00000021
main.j 0000002B
main.i 0000002C
0000 .................... bit_set(trame[j], i+3);
000E 3021 MOVLW 21 // Get address of trame array
000F 072B ADDWF 2B,W // Add j to it
0010 0084 MOVWF 04 // Put the result in the FSR
0011 0800 MOVF 00,W // Read the value at trame[0]
0012 00AD MOVWF 2D // Save it in 2D
0013 3003 MOVLW 03
0014 072C ADDWF 2C,W // Get bit number (i+3) in W
0015 00AE MOVWF 2E // Save it in 2E
0016 3001 MOVLW 01 // Init the bitmask to 0x01
0017 00F7 MOVWF 77 // Save it in 77
0018 082E MOVF 2E,W // Get the bit number (i+3)
0019 00F8 MOVWF 78 // Put it in a counter variable
001A 1903 BTFSC 03.2 // Is the bit number = 0 ?
001B 2820 GOTO 020 // Jump if so -- bitmask is already done.
001C 1003 BCF 03.0 // Clear the carry flag
001D 0DF7 RLF 77,F // Rotate the bitmask left by 1 bit
001E 0BF8 DECFSZ 78,F // Continue until bitmask is done
001F 281C GOTO 01C
0020 0877 MOVF 77,W // Put bitmask into W
0021 04AD IORWF 2D,F // OR the bitmask with value read at trame[0]
// That's the end of the routine. But there's a bug.
// It doesn't move the temp value in 2D back into
// the actual trame[0] ram location.
// I think it needs two more lines.
#asm
movf 0x2D,w // Put the finished byte into W
movwf 0 // Put W into trame[0] (by using FSR)
#endasm |
|
|
|
schmobol Guest
|
Problem with bit_set() function on CCS 3.185 |
Posted: Thu Feb 19, 2004 3:55 am |
|
|
Yes , that's done. I sent a message to CCS to mention that problem. We can expect to have it solved for the next release!
Thank you for your support |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 22, 2004 8:44 am |
|
|
Hi folks,
Usually I dont download the last version to use it until it´s well mature, stable and bug free.
My suggestion:
for those who download and use the last version and found a bug not present in previous releases,
CCS would find a way to compensate for this, may be extending the expiration date to update or equivalent.
At least they do what CCS must had made it before, with extra money. A two-way favour.
Humberto |
|
|
|
|
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
|