View previous topic :: View next topic |
Author |
Message |
mickent
Joined: 18 Feb 2007 Posts: 22 Location: TN, USA
|
Measuring MIPS with Output instructions |
Posted: Wed Jun 08, 2011 11:48 pm |
|
|
I need to know the MIPS that my PIC33 is running at because my DAC is running at half speed so I made a tight loop in main:
while 1,
output high;
output low;
This runs at 3.7 Mhz
Would this be 3 instructions so the MIPS is 11.1 MIPS?
Thanks, Mick _________________ Mick |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Thu Jun 09, 2011 5:37 am |
|
|
MIPS usually refers to machine or assembly instructions, not lines of C code. Look at your program .lst file to see how many assembly instructions are there. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
mkent
Joined: 09 Sep 2003 Posts: 37 Location: TN, USA
|
|
Posted: Thu Jun 09, 2011 12:53 pm |
|
|
Thanks SherpaDoug,
This is the list file:
Code: | 154: // Main Code
155: while (1)
156: {
157: output_high(PIN_B13);
0330 A9A2C9 bclr.b 0x02c9,#5
0332 A8A2CD bset.b 0x02cd,#5
158: output_low(PIN_B13);
0334 A9A2C9 bclr.b 0x02c9,#5
0336 A9A2CD bclr.b 0x02cd,#5
159: /*
160: MotorCntlLeft= 0xfff0;
161: MotorCntlRight = 0xfff0;
162: AuxCntlWord = 0xfff0;
163:
164: if(!input(PIN_B5))
165: {
166: Rover_Control_Xmit();
167: }
168: */
169: }
0338 37FFFB bra 0x000330
033A 37FFFF bra 0x00033a |
I'm still not sure how to count instructions? Does the "while" loop take clock cycles? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Thu Jun 09, 2011 1:42 pm |
|
|
Just open up the databook for you PIC and go to the instruction set chapter. Every instruction will have the number of machine cycles it takes to executes. Bit clear, bit set are 1 cycle each, branches are 2 cycles.
So in your case 6 machine cycles. How long that takes depends on the crystal running the PIC and any divider you might have chosen... |
|
|
mkent
Joined: 09 Sep 2003 Posts: 37 Location: TN, USA
|
|
Posted: Thu Jun 09, 2011 3:06 pm |
|
|
Thanks for the replies.
PCM the stopwatch won't work above 20 Mhz.
My only question now is about clock cycles vs instruction cycles. The PIC33 has 2 clock cycles for each instruction cycle.
So 6 x 3.68 Mhz = 22.08 Mhz This is the MIPS (Fcy) that I expect. My clock is 44.2 Mhz.
So why does the DAC run at half speed?
Fvco = 176 Mhz,
Aux clock divider is 8 so Aclk = 22 Mhz / 256 = 86 Khz and I measure 43 Khz.
I made it work by reducing my sine array from 72 values to 36 but this bugs me.
Any ideas?
Mick |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Thu Jun 09, 2011 3:17 pm |
|
|
The stopwatch works at the frequency you put in as the PIC operating frequency. Defaults to 20MHz, but runs happily at 100M+...
Look at the data sheet. Oscillator section. Where does 'Fp' come from (peripheral clock used by stuff like the ADC)?. It is _not_Fosc....
Best Wishes |
|
|
mkent
Joined: 09 Sep 2003 Posts: 37 Location: TN, USA
|
|
Posted: Thu Jun 09, 2011 4:17 pm |
|
|
Ttelmah, I get this error when I try to use the stopwatch with a MIPS of 22 Mhz.
ADC-W0007: Cannot meet full accuracy with RC clock source and Frequency > 20Mhz
I am going to start a new thread to discuss my DAC problem for the sake of the search engine.
Mick |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Jun 10, 2011 4:29 am |
|
|
Look carefully at your fuse settings. Just ran MPLAB up with a PIC33 selected, and clock rate of 120MHz from the internal oscillator/PLL, and no such complaint.
Happily took 0.01667uSec for an instruction....
Best Wishes |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Fri Jun 10, 2011 10:27 am |
|
|
mkent wrote: | Thanks SherpaDoug,
This is the list file:
Code: | 154: // Main Code
155: while (1)
156: {
157: output_high(PIN_B13);
0330 A9A2C9 bclr.b 0x02c9,#5
0332 A8A2CD bset.b 0x02cd,#5
158: output_low(PIN_B13);
0334 A9A2C9 bclr.b 0x02c9,#5
0336 A9A2CD bclr.b 0x02cd,#5
159: /*
160: MotorCntlLeft= 0xfff0;
161: MotorCntlRight = 0xfff0;
162: AuxCntlWord = 0xfff0;
163:
164: if(!input(PIN_B5))
165: {
166: Rover_Control_Xmit();
167: }
168: */
169: }
0338 37FFFB bra 0x000330
033A 37FFFF bra 0x00033a |
I'm still not sure how to count instructions? Does the "while" loop take clock cycles? |
If you use #use fast_io, you can eliminate the direction register settings in your loop, BUT YOU NEED TO MAKE SURE to do it before the while loop starts.
And yes, the while loop is essentially the BRA 0x000330 command that you must have to keep the loop going.
The BRA following is essentially to keep the PIC in a known state (rather than run off into memory) in case you DIDN'T have something in main to keep control of the process.
-Ben _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
eoinoc
Joined: 30 Apr 2009 Posts: 16
|
|
Posted: Mon Jun 13, 2011 6:17 am |
|
|
To measure you instruction speed use the repeat instruction
Code: |
while(true)
{
#asm
repeat #0x3fff
btg .....
#endasm
}
|
This will give you a good burst of pin toggle at your instruction speed, of course there will be a small glitch at the end of the while true loop. |
|
|
|