NTSC video synthesis and output
--NTSC video is an old standard, but is still used in North America
for closed circuit TV. It is fairly simple to generate a black/white NTSC signal. Also, the frame buffer for a 1-bit, 256x200 pixel image is only 1600 words (6400 bytes) of RAM.
Chapter 13 of Programming 32-bit Microcontrollers in C: Exploring the PIC32
by Lucio Di Jasio was very useful. I used Di Jasio's method of
generating sync pulses using one output-compare unit. Video is sent to
the SPI controller using DMA bursts from memory (also similar to Di
Jasio), but DMA timing-start control was implemented using another
output-compare unit rather than chaining two DMA channels. This allowed
easy control of video content timing.
Timer2 is ticking away with an match time equal to one video line
time. Ouput-compare 2 is slaved to timer2 to generate a series of pulses
at the line-rate. The duration of the OC2 pulses (for vertical sync) is
controlled by the Timer2 match ISR in which a simple state machine is
running, but the pulse durations are not dependent on ISR
execution time. Output-compare 3 is also slaved to timer2 and set up to
generate an interrupt at a time appropriate for the end of the NTSC back porch,
at which time the DMA burst to the SPI port starts. I got best video
stability when the core is running at 60 MHz and the peripheral bus
running at 30 MHz. The first example is just a bounding ball with some text. The example requires that the ascii character header file be in the project folder. The DAC which combines the SYNC and video signal and adjusts to levels to standard video is:
--The second example
is a particle system explosion.
Without doing any space optimization 1500 particles (along with screen
buffer) use up memory. All the positions can be updated in every frame.
Giving each particle a high initial velocity, and high drag makes a
nice cloud.
-- The third example
is a particle system fountain, which is a slight modification of the
explosion. I optimized the point-draw and one ISR for more efficient
execution. Frame update now takes 7.2 mSec. Video.
The overhead for NTSC TV signal generation is about 5 microSec per 63.5 microSec line, or about 8%. You should use this optimized version for an intensive animation.
A small variation makes the particle system fire to the side. Video.
--The fourth example
turns on the ADC to make an oscilloscope. The ADC is set up to trigger
from the timer3 compare match signal, but without turning on an ISR. A
DMA channel transfer is then triggered by the ADC done signal to dump
the ADC results to memory at up to 900 Ksamples/sec. This ADC hardware
process runs at the same time as the video update hardware process, so
video is not disturbed.
CPU load is small so there is time to draw the ADC waveform to the
screen. It would be straightforward to add a button state machine for
scope control and a FFT. The following image is captured from the NTSC
screen and shows the scope running at 900 Ksamples/sec and displaying a
frequency estimate. Video is running at 500 Ksamples/sec ADC rate.
-- The fifth example is a vector variation of the scope. Video is running at 900 Ksamples/sec. Still image below.
congratulations!
I”m looking for a cheap oscilloscope. To produce it and sell it!