| 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
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  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.
 |  | 
	
		|  | 
	
		| 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
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  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.
 |  | 
	
		|  | 
	
		|  |