Chroma 4:4:4 subsampling
To test whether the color is 10-bit or 8-bit. Download this:
Spears_Munsil_Quantazation_Test_2160p
Requires MPC or VLC or anything that can play .ts video files.
Chroma 4:4:4 subsampling
To test whether the color is 10-bit or 8-bit. Download this:
Spears_Munsil_Quantazation_Test_2160p
Requires MPC or VLC or anything that can play .ts video files.
I have a batch of TDS 620A which everything looks shiny new, but the display will stretch vertically and eventually gone unstable after turning it on continuously for a long time.
Turns out there’s a specific batch of flyback transformer (120-1841-00) on the monochrome CRT driver board (640-0071-06) that has quite a bit of infant mortality. The newer the unit looks (of the CRT tube looks shiny new without burn-in), the more likely it’s a victim of the bad batch.
The transformer is almost impossible to source (other than getting another CRT driver board), but I was able to find a Chinese supplier who makes it. It was usable, but it’s a nightmare to get it on because it’s really done with the stereotypical Chinese (PRC) manufacturing caliber. When I received the unit, it’s a WTF moment! Leave me a comment if you want me to write about it.
The replacement transformer is only pin and functionality compatible, but it’s not a drop in replacement (not even geometrically). The characteristics are different and I had to adjust the trimmers all over the place.
I was able to get the screen width I want by adjusting the variable inductor (L105, HOR SIZE) by nearly pulling ferrite rod out, but the horizontal linearity was way off (the left side is very squeezed):
I looked into the TDS520B Component Service Manual (Same CRT board circuit diagram) and found this:
But L100 looks like this, which doesn’t seems trimmable:
The right hand side is the same L100 choke I extracted from a CRT driver board (same model) that I’ve disposed of. I saw two suspicious pieces of metal-like objects strapped on the choke on the left (installed) which I haven’t seen in other identical boards.
Thinking that by changing the magnetic property of the core, I can adjust the inductance of an otherwise non-adjustable inductor. I took a few bits of magnets sitting on my bench and swing it around the L100 choke, the horizontal display widens/narrows depending on which pole of the magnet is facing the L100 choke.
After a few trial and error, I picked the right amount of magnet discs to correct the horizontal linearity so the squares have roughly the same width:
I guess I cracked the code! Here’s the result of correction by magnet:
HP Infiniium Series Atlas III Motherboard (Oldest generation Infinium oscilloscopes still branded as HP):
Tektronix TDS Series (500, 600, 700, 800)
The NVRAM in TDS series only contains the options data. Since I can reprogram the options, I can start with a blank NVRAM without reprogramming it).
Will keep updating this page when I came across more test equipment.
Here’s a concise paper describing common C programming pitfalls by Andrew Koening (www.literateprogramming.com/ctraps.pdf) corresponding to be book with the same title.
As a reminder to myself, I’ll spend this page summarizing common mistakes and my history with it.
Here are the mistakes that I don’t make because of certain programming habits:
*(p++)
instead of *p++
unless it’s idiomatic.for()
or if()
statements executing only first line: I always surround the block with {}
even if it’s just one line. Too often we need to inject an extra line and without {} it becomes a trap.y[i++]=x[i]
char* p, q
: very tempting since C++ style emphasize on pointer as a type over whether the variable is a pointer. I almost never declare multiple variables in one line.()
. Use typedef
.Did these once before, adjusted my programming habits to avoid it:
for()
loop with unsigned running variable: I stick with signed running variables in general. If I’m forced to use unsigned, I’ll remind myself that I can only stop AFTER hitting 1, but not 0 (i.e. i=0 never got executed).Haven’t got a chance to run into these, but I’ll program defensively:
a<b
instead of (a-b)<0
. Calculate mean by adding halfway length to the smaller number (i.e. (a+b)/2 == a + (b-a)/2
given a<b
). Shows up in binary search.What I learned from the paper:
stdio
buffer on stack (registered with setbuf()
) freed before I/O flushed: use static buffer (or just make sure the buffer lives outside the function call).char
type might be signed (128 to 255 are -128 to -1) so it sign extends during upcast. Use unsigned char
go guarantee zero extend for upcasting.toupper()/tolower()
might be implemented as a simple macro (no checks, incorrect /w side effects)"abcdefg"[3]
gives 'd'
Mistakes that I usually make when I switch back from full-time MATLAB programming:
~
operator instead of ! operator.Common mistakes I rarely make because of certain understanding:
break
at every case
in switch
block. It’s hard to forget once you’re aware of the Duff’s device.sizeof(a[])/sizeof(a[0])
after passing into a function does not give array length: hard to get it wrong once you understand that array (declared on stack) has meta-info that cannot be accessed beyond the stack level it’s initialized.