Let's revive this thread a bit.
I have K2010 that has sick or 'sick' 1M-100M ranges (I've looked in reversed schematics of K2000 and partial of K2010 and it doesn't seem the problem is in TF-245 or switches or anything else, at least not for now).
Instead of 1M is shows smth like 1.00434... on 1M and 10M ranges, which is more than 4300ppm off.
That may seem to be 'fine/enough' for Australia (but unacceptable for me) on 10M range that has 400 ppm/year spec and meter wasn't calibrated for 9 years.
But not for 1M range - 70 ppm/year let's say.
So, I decided to try adjusting it to something. And similar to topicstarter I bumped in this silly and artificial obstacle - the need to go through all steps. That is even worse in my case since 1M is the highest adjustable range and that is STEP10.
Nowadays it seems to be popular discovering hidden commands in DMMs, I decided to give it a try.
(What's next is for quite educational purposes, don't try things since you can loose your precious calibration - if you screw up it's your responsibility)After some digging I found the following unknown to me commands:
:CALibration:PROTected:RCOunt
:DIAGnostic:KEIThley:CALibration:AC:CONSTant
:DIAGnostic:KEIThley:CALibration:DC:CONSTant
:DIAGnostic:KEIThley:CALibration:UNLOCK
:DIAGnostic:KEIThley:EHRaccess
:DIAGnostic:KEIThley:ISN
:DIAGnostic:KEIThley:WARMBOOT
It's time to try some of them, but first - let's insure we won't loose our precious calibration. :'(
Capacitor makes it a bit harder, but clip accurately sits on the right side of the chip where data lines are, only need to connect programmator to ground in some other place.
Calibration flash data is saved, now we are prepared and safe.
By different reasons, first thing I tried to execute was
:CALibration:PROTected:RCOunt.
This command doesn't seem to take any arguments and just does one unpleasant thing - immediately clears calibration count and dates
, of course persistently saving them in a flash - precaution measure was very right decision, this meter is very unkindly to unknown command seekers.
After some digging, I found that some other commands are doing:
- :DIAGnostic:KEIThley:ISN is "Instrument Serial Number", they need somehow to program it, right ?
Execution format is :DIAGnostic:KEIThley:ISN '1234567' - these quotes were quite unexpected thing, I only tried them because of how current measurement function is set, like :SENS:FUNC 'RESistance'. Maximum length is 7 symbols, but you can specify less. If someone specified symbols are not printable they will be shown as ' ' in *IDN? command. Action is also immediate, persistent and irrevertable.
- :DIAGnostic:KEIThley:WARMBOOT is just some kind of reboot, still quite handy thing during experiments because things like calibration constants are not applied to the meter until reboot (or maybe some other action but I don't know exactly).
- :DIAGnostic:KEIThley:EHRaccess sounds like "External Hardware Access", but I have no idea what it really does inside, maybe just freezes CPU via special instruction, anyway it will unlikely help me with my task.
- :DIAGnostic:KEIThley:CALibration:UNLOCK does not take any arguments, it just does something (will see later).
Finally, the most tasty things
:DIAGnostic:KEIThley:CALibration:AC|DC:CONSTant.
Unfortunately doesn't start constantly playing AC/DC on the meter
, but for success execution should take a number - number in various formats that meter usually accepts.
And as usual, nothing really happens, I've tried to execute them several times w/o any evident result.
Than just applying logic of how calibration happens, I decided to SAVE calibration - in order to to that you have to specify current and next calibration dates (which I already wiped).
So we executing:
:CALibration:PROTected:DATE 2000,01,01
:CALibration:PROTected:NDUE 2001,01,01
:CALibration:PROTected:SAVE
Rebooting the meter ... and immediately seeing something like
+440: "Gain-aperture correction error"
Let's call it a success.
Then we invoke command
:CALibration:PROTected:DATA? and after some staring at the screen with old and new output we realize that some calibration constants changed to all that nonsense that I've tried before.
After some experimenting and digging I found that:
:DIAGnostic:KEIThley:CALibration:UNLOCK - allows to change calibration constants. Each time it invoked it resets in-memory constants we will change to the ones the meter has for now. Also allows to invoke calibration code change command.
:DIAGnostic:KEIThley:CALibration:AC|DC:CONSTant - these commands just take all calibration parameters from corresponding section one after another, very similar how calibration steps go.
In my case
:CALibration:PROTected:DATA? shows
91 value:
26 AC constants (not sure about first 4 numbers) and
66 DC constants. In order to change one of them you have to invoke appropriate command, passing previous constants as they are (that's not really true, a bit later about it), then put a changed value(s), save calibration and reboot the meter - adjustment is ready.
This all enables possibility to play with calibration constants in repeatable and almost revertable way. Why almost?
Remember how meter outputs constants - it will show number like '+2.78018988E-01'. Fine, right ? Not really.
If we look now it's stored in flash (which btw has a few sections which meter reads and updates as single huge blocks, also with a hash in the end of most of them) then we find that all constants (except 4 numbers in the beginning of DATA? output) are represented as 8-bytes double numbers.
Number we try to find is (python is helping here):
>>> hex(struct.unpack('>Q', struct.pack('>d', +2.78018988E-01))[0])
'0x3fd1cb102748210a'
And we only see something like:
>>> struct.unpack('>d', struct.pack('>Q', 0x3fd1cb1027a256fa))[0]
0.2780189883281846
So here is the little trap for putting original constants back - we need 15 digits after decimal point in order to put back what is supposed to be here, but meter is only printing 8. For most of constants which are small, 10^-4 or 10^-6, but that's a bit unpleasant, +1 for why dumping flash directly from chip is very good option for those who can open the instrument.
Having all that, it's possible to adjust something in a meter like with a screw driver
like in the old days, but don't screw it up completely.
Since my meter has much more constants than K2000 I cannot say which does what, finding that is the other huge task.
I can only say that setting constants one by one (via small script of course), I found gain constant for 1M range (which applies to 1M-100M ranges) and additional constant that applies to 10M and 100M ranges on the top of previous one (since as far as I understood 10M divider that is used for high voltages is used to measure 10M and 100M resistance in parallel to it). I still haven't found the way how to skip calibration steps, but this is at least something that helps me to solve my issue.