View previous topic :: View next topic |
Author |
Message |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
Timer 1 is not going at right clk speed? |
Posted: Thu Jul 21, 2022 4:39 pm |
|
|
I'm making a silly program to test the time that the library takes to write 64 bytes and I'm getting weird values from Timer 1. I don't understand why.
Code: |
WriteTime=0;
sprintf(xLineBuffer,"FBAEF1A425B6A7B345208C9D4CA8AC8E48A4ZZ48B1834DBEBE9D4EA8AD8E46A4");
set_timer1(0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
write_program_memory(0x3000,xLineBuffer,64);
WriteTime=get_timer1();//51640?
set_timer1(0);
read_program_memory(0x3000,xOutBuffer,64);
ReadTime=get_Timer1();//59
set_timer1(0);
write_program_memory(0x3040,xLineBuffer,64);
WriteTime2=get_timer1();//1439
|
I'm getting values above 50K and the PIC16F67J50 is running at 48MHz from the internal clock.
The timer 1 should have a clock of 1.5MHz, so that means the block erase and posterior 64 byte write takes 34.3mS
Why?
According the datasheet 39775c the block erase count as ONE write, so around 2.8mS for the block erase plus the 64 bytes that at address 0x3040, that doesn't erase the block, takes around 1mS.
What's happening here?, one is taking too much time and the normal write without the block erase at 0x3040 is taking less time than the 2.8mS expected. _________________ Electric Blue |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Fri Jul 22, 2022 6:46 am |
|
|
First thing, move the set_timer1 to after the timer setup. Otherwise the
timer can be running at an undetermined clock rate before this. Invalidates
the value....
Then, how are you reading the results?.
If you are in a debugger, these give unexpected results for the timings
of things like flash memory writes. I met this years ago, and ended up
list pulsing a pin and measuring with an oscilloscope instead. Gave the
right value then. |
|
![](templates/subSilver/images/spacer.gif) |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Fri Jul 22, 2022 8:00 am |
|
|
Quote: | First thing, move the set_timer1 to after the timer setup. Otherwise the
timer can be running at an undetermined clock rate before this. Invalidates
the value.... |
I did it but I get mostly the same result.
Quote: | Then, how are you reading the results?. |
I put a breakpoint a couple of lines after all the test ends and then I read the values using the ICD3. _________________ Electric Blue |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Fri Jul 22, 2022 11:38 am |
|
|
Do it by programming without ICD and pulsing a pin. It is a very real
limitation of the ICD systems that the debug executive interferes
with the timing of things like flash memory writes. |
|
![](templates/subSilver/images/spacer.gif) |
|