I am interested to draw lines, square, rectangle, circle etc on my TV screen. At first I was confused where to start. While thinking about it, a pencil and an eraser came to my mind. If we have a good pencil, eraser and a paper, then we can draw on it according to our own logic. If we use the pencil with compass and scale, we can draw circle, line, box etc on the paper. This is the basic idea I implemented in this small hobby project.
I divided my tv screen into 128 x 64 pixels. I am using atmega32 microcontroller. It got 2kb RAM. So, if each pixel takes 1 bit, then 128 x 64 pixels takes (128*64/8) = 1024bits of RAM(screen buffer). Still I can increase the resolution but any way at present I am satisfied with this because it is my first attempt and I can improve it later.
Here a horizontal line in TV(two lines) takes 16byte, ie horizontal resolution now is 16*8 = 128 pixel. Similar 64 bytes are stacked up and thus the vertical resolution now is 64 lines. I am using fake interlacing so total vertical lines are 312 and here again I combine 2 lines to a single line which takes 1 16byte row of the screen buffer.
I told about a pencil at the starting of the post, that is nothing but a function which could set a pixel. The eraser is a function which clear a pixel. Now the paper is the a digital display of 128×64 pixels, the smallest dot is 1 pixel.
PENCIL = setpixel(x,y);
ERASER = clrpixel(x,y);
PAPER = 128×64 screen
building block = one pixel
Now my first aim is to create the pencil and eraser so that I can draw any thing on my TV screen using simple mathematics….
I am setting a character array disp_buffer ie 1024 bits (128×64) which stores each pixel information and we will be playing on this buffer to draw pictures.
A brief explanation about the working of TV is provided at my previous post.. Ok, now before going to the pencil, we need to set the paper. Here we need to set the display buffer to show it on TV. May be this will be one of the most important part of the code. A raster scanning of a TV takes 64uS. So we need to generate timer interrupts on each 64us and we need to use more precise and peak value clock, the external crystal of 16MHz
. But unfortunately, I don’t have a 16MHz
but have a 16.450MHz
. So I stick with it and all of my code will be related to that. I will update it soon when I get a 16MHz
. We can easily calculate the timer compare value to be loaded into OCCR1A using below equation. For more Detail: Drawing geometric figures on a PAL TV using ATmega32 (128×64 resolution)