I make data loggers using the 18F4620 running on internal clock (INTIO2) and a Dallas DS1629 with a 32768 Xtal as RTC and temperature sensor. I do a clock accuracy check by instructing the DS1629 to output a clock at one quarter rate and count transitions. See attached code.

In over 100 loggers the PIC18F4620 clock accuracy has always been better than 0.1% (1000 ppm) and much smaller than the minimum increment obtainable by changing the OSCTUNE register so I have never had to apply a speed correction.

I get excellent data with DEBUG at 19,200 bps BUT I ALWAYS use CharPacing 100 to give some extra stop bit time. This functions flawlesly for me.

HTH
Brian

Code:
TuneOscillator:
     high pgc : pause 2 : debug 13,10,"Comparing IntOsc with RTC ", 13, 10
     i2cwrite SDA, SCl, %10011110, $AC, [ %10000101]  
         'OscOut = OscIn/4, temperature on demand
     pause 20
 'StartConversion:
     i2cwrite SDA, SCl,%10011110, [ %11101110]       ' send $EE   
      'activate DS1629 OscOut to divide by 4.  
      'make a copy of the OSCTUNE register before any changes
      '32768 Hz/4 = 8192 Hz.  A 2 second window should see 16384 counts.
      'NOTE.  Either leave this function active in live logger OR allow
      'conversion time for the DS1629 to fetch tenperature.
      
      count clkpin, 2000, clkcal  'returns number of low to high transitions
      debug 13, 10, "ClkCal = ", #clkcal  'in a 2 second window
      if clkcal > 16384 then 'Clock is SLOW
         debug ", SLOW by ", #(clkcal - 16384)
      else
         debug ", FAST by ", #(16384 - clkcal)
      endif
      debug , " ticks in 16384. " 
      clkerror = abs((1000000*(clkcal - 16384))/16384)
      debug  "Clock error = ", dec clkerror, " ppm", 13, 10
      i2cwrite SDA, SCl, %10011110, $AC, [ %00000101]  'Turn OscOut OFF