|
|
View previous topic :: View next topic |
Author |
Message |
Will Reeve
Joined: 30 Oct 2003 Posts: 209 Location: Norfolk, England
|
PIC12F509 int16 and int8 counter code |
Posted: Mon May 17, 2010 9:33 am |
|
|
Hi,
with tick defined as a int16 the compiler produces the following code:
Code: | .................... if (get_timer0()==0) tick++;
0095: MOVF 01,W
0096: BTFSS 03.2
0097: GOTO 09B
0098: INCF 0F,F
0099: BTFSC 03.2
009A: INCF 10,F
.................... if (tick > 270) {
009B: MOVLW 00
009C: MOVWF 07
009D: MOVF 10,W
009E: SUBWF 07,W
009F: BTFSC 03.0
00A0: GOTO 0B1
00A1: XORLW FF
00A2: BTFSS 03.2
00A3: GOTO 0AA
00A4: MOVLW 0E
00A5: MOVWF 07
00A6: MOVF 0F,W
00A7: SUBWF 07,W
00A8: BTFSC 03.0
00A9: GOTO 0B1
.................... output_toggle(LED);
00AA: BCF 0C.0
00AB: MOVF 0C,W
00AC: TRIS 6
00AD: MOVLW 01
00AE: XORWF 06,F |
Looks OK. But doesn't work. With tick an int8 and the check as tick > 245 code works fine:
Code: | .................... if (get_timer0()==0) tick++;
0093: MOVF 01,W
0094: BTFSC 03.2
0095: INCF 0D,F
.................... if (tick > 245) {
0096: MOVLW F5
0097: MOVWF 07
0098: MOVF 0D,W
0099: SUBWF 07,W
009A: BTFSC 03.0
009B: GOTO 0A2
.................... output_toggle(LED);
009C: BCF 0A.0
009D: MOVF 0A,W
009E: TRIS 6
009F: MOVLW 01
00A0: XORWF 06,F
|
What have a overlooked? (please!). WDT is disabled so processor is not resetting. |
|
|
Will Reeve
Joined: 30 Oct 2003 Posts: 209 Location: Norfolk, England
|
|
Posted: Mon May 17, 2010 9:37 am |
|
|
I've just narrowed it down. With tick set to an int16 code works as expected with if (tick > 254) but change it to if (tick > 255) which should work with an int16, code breaks! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 17, 2010 12:13 pm |
|
|
What's your compiler version ? I only have vs. 4.073, which is the
version of the free PCB compiler that's bundled with MPLAB v8.46.
I made the following test program and stepped through the code in MPLAB
simulator and it does work. 'result' goes to 0x01 in the Watch Window.
Code: |
#include <12F509.H>
#fuses INTRC,NOWDT
#use delay(clock=4000000)
//=========================
void main()
{
int8 result;
int16 tick;
result = FALSE;
tick = 300;
if(tick > 255)
result = TRUE;
else
result = FALSE;
while(1);
}
|
Here's the .LST file for it. With the comparison to > 255, the compiler
can optimize the test so that it only checks to see if the MSB of 'tick' is
non-zero. If that's the case, then the test is true. You can see them do
that in the code below.
Code: |
.................... void main()
.................... {
0002: CLRF 04
.................... int8 result;
.................... int16 tick;
....................
....................
.................... result = FALSE;
0003: CLRF 0D
.................... tick = 300;
0004: MOVLW 01
0005: MOVWF 0F
0006: MOVLW 2C
0007: MOVWF 0E
....................
.................... if(tick > 255)
0008: MOVLW 00
0009: MOVWF 07 // Set scratch register to 0x00
000A: MOVF 0F,W // Get MSB of 'tick' into W
000B: SUBWF 07,W // Compare MSB of 'tick' to 0x00
000C: BTFSC 03.0 // Jump if a borrow occurred (ie., if MSB != 0)
000D: GOTO 011
.................... result = TRUE;
000E: MOVLW 01 // If MSB is != 0, then set 'result' = 01 (True)
000F: MOVWF 0D
.................... else
0010: GOTO 012
.................... result = FALSE;
0011: CLRF 0D
....................
.................... while(1);
0012: GOTO 012
.................... }
|
|
|
|
Will Reeve
Joined: 30 Oct 2003 Posts: 209 Location: Norfolk, England
|
|
Posted: Mon May 17, 2010 12:52 pm |
|
|
Mine is version 4.107. Thanks. I've got your code to work (I am using real hardware and an LED as I don't use Mplab, your result variable I changed to a PIN!). I've gone back to the original code and mysteriously the code now works! I don't know why but I am happy! Finger trouble I used to say! I did think I was going insane!
Thanks for you help.
I hadn't realised MPLAB has a simulator....this has turned out to be a good question and answer as I haven't used MPLAB for maybe 10 years! Time to have another look I think as I usually ICD most code development but on these little parts you can't. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon May 17, 2010 3:51 pm |
|
|
The Simulator in MPLAB is great! Too bad you didn't know about this feature as it could have saved you a lot of time.
I often used the included stopwatch for timing measurements, much easier than pulsing an output pin connected to a scope. |
|
|
|
|
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
|