HomeArticlesProjectsBlogContact
Articles
Stress Meter
Colin Mitchell
Colin Mitchell
January 15, 2006
Make sure to subscribe to our newsletter and be the first to know the news.

Table Of Contents

01
WHERE DO YOU START?
02
RISING SOUND
03
THE RANDOM NUMBER GENERATOR
04
THE TOUCH PAD
05
THE PROGRAM
06
THINGS YOU CANNOT DO
07
ASSEMBLY
08
GOING FURTHER
09
WRITING YOUR OWN PROGRAM
10
18 LED Display-1 PARTS LIST

This project uses the “18 LED Display-1”
[Order kit](mailto:sales@elechelp.com?Subject=Buying a Stress Meter Kit)
Page 2


This project comes with all parts, PC board and a pre-programmed chip for STRESS METER. But you are encouraged to add more sub-routines to the program and learn to program the chip yourself. You will need the “Chip Programmer Model F” and the software provided below.

Things you will need:
1: Stress Meter project (Uses 18 LED Display-1 PCB and parts and comes with PIC12F629 chip pre-programmed with “Stress”)
2: Chip Programmer - Model F project

The following are software programs and instructions:

  • Instruction Set for PIC12F629
  • Library of sub-routines A-E Library of sub-routines E-P Library of sub-routines P-Z More routines: ”Copy and Paste
  • PIC12F629 Data Sheet (.pdf 4,926KB)
  • blank12F629.asm
  • Chip Programmer - model F instructions
  • MPASM (to assemble your program)
  • IC Prog (to burn your chip - when connected to Chip Programmer - Model F)
  • Stress Meter files: .asm


STRESS METER CIRCUIT
(Stress Meter circuit is the same as 18 LED Display circuit)
(The LED numbers follow the LEDs on the PC board)

I visited a games shop recently and saw a simple game called “STRESS METER”. It consisted of 16 LEDs in a circle with two touch pads. By placing your fingers on the touch pads, the circuit started and ran the LEDs in a “chaser” pattern around the display, with a beep each time a LED was illuminated.
The circuit gradually slowed down to a random LED and the display showed “how stressed you were.”
“What a wonderful idea for the 18 LED Display-1” I thought.
And here it is.
The program for this game is complete and ready to run, but it can be improved and more features can be added. This is the purpose of this article. After you see how the sub-routines are put together, you are invited to add more ideas of your own.

When the project is turned on, the piezo beeps every few seconds with a “beep-beep” to let you know the game is switched on.
By putting your fingers on the touch pads, the LEDs illuminate in a circle. Each time a LED is illuminated, the piezo produces a beep. The pattern gradually slows down to a final LED.
The piezo emits a “Rising Sound” and the game starts again.
Obviously the circuit has nothing to do with your stress level. It is purely a random number generator.
All the sub-routines have already been presented in other projects so it’s just a matter of combining them to produce the game.

WHERE DO YOU START?

Whenever you have a task in front of you, where do you start?
In this case it is “accessing the LEDs.”
Each LED has a defined set of outputs that must be HIGH and LOW, with all other lines “input” (so they do not upset the brightness of the LED being driven).
The circuit diagram shows how each LED is accessed.
You can make a test-device by connecting two cells together and placing a 220 ohm resistor on the positive lead. By probing each pair of outputs on the chip (with the chip removed from the socket) you will see the corresponding LED illuminate.
This data is then placed in a sub-routine and represents the first sub-routine of your program.
The next sub-routine to add is a delay.
You can then create a Main routine that accesses each LED and illuminates it for a short period of time.
Each sub-routine is added to the program in alphabetical order so it can be found quickly when the program is very large.
Del_1 is a “do-nothing” routine called a “Nested Delay.” Two or more files are required to produce a delay.
The maximum value a file can hold is FF. This is a hex value equivalent to 255. If you create a loop and decrement the file to zero, the maximum “delay-time” you will create is very short as each instruction takes only 1 micro-second. Each loop will take 3 - 5 microseconds, so the total time will be less than 1 millisecond.
If we place another loop around this, we create an inner loop and an outer loop.
The micro executes the inner loop and then one loop of the outer loop. The result is 255 loops of 1 millisecond. This produces a total of about 0.25 seconds. If we pre-load a file with a value, we can adjust the time for the delay. If the files are not pre-loaded, the delay uses the unknown value in the file. If a file has been decremented to zero, (as with the inner loop) it will contain 00 and will immediately be decremented (or rolled over) to FF. That’s why it will produce 255 decrements.
In the following delay, file B has been pre-loaded with 20h:

Del_1   movlw   20h
        movwf   fileB
DelX    decfsz  fileA,1
        goto    DelX
        decfsz  fileB,1
        goto    DelX
        retlw   00

The next sub-routine is Beep. This produces the effect of the click of a Wheel Of Fortune,” as it rotates. All sounds are actually a square wave. When the HIGH time is equal to the LOW time, the square wave is called a “regular” square wave. The high time can be longer or shorter than the low time but this changes the sound a very small amount, when we are talking about a “tone” (a constant frequency).
To produce a tone (a beep) we need three files.

  1. HIGH time
  2. LOW time
  3. Duration of the tone.

The HIGH time file can be the same as the LOW time file, but each file must be loaded with a value before each part of the cycle as it comes out of the loop with “00.”
The following sub-routine is used to produce the Beep:

Beep    movlw   b'11111110'
        tris    05h             ;make GPO output
        movlw   020h
        movwf   beeplength
Beep1   bsf     GPIO,0          ;Piezo HIGH
        movlw   80h
        movwf   beephigh
Beep2   nop
        decfsz  beephigh,1
        goto    Beep2
        bcf     GPIO,0
        movlw   80h
        movwf   beeplow         ;Piezo LOW
Beep3   nop
        decfsz  beeplow,1
        goto    Beep3
        decfsz  beeplength,1
        goto    Beep1
        retlw   00

The next sub-routine to add to the program is:

RISING SOUND

This indicates the end of the game.
This program is more-complex than “Beep.”
To produce a sound from a speaker or piezo diaphragm, the output from the micro is made HIGH then LOW, at a regular interval. To increase the pitch of the note, the interval of time between the HIGH and LOW is decreased. This can be done by decrementing a file. The tone will then increase to a very high note. The program can detect when the file is zero to end the sound.
In the Rising Sound sub-routine, we load a file called “temp” and them immediately load the value it contains into another file called soundhigh for decrementing. “soundhigh” is then decremented to zero to produce the HIGH portion of the waveform. “temp” is then loaded into “soundlow” and decremented to produce the LOW portion of the waveform. This keeps “temp” available to be decremented once after each cycle, to produce the gradual rise in tone.

sound   movlw   b'11111110'
        tris    05h         ;make GPO output
        movlw   0F0h
        movwf   temp
sound1  bsf     GPIO,0      ;Piezo HIGH
        movf    temp,0
        movwf   soundhigh
sound2  nop
        nop
        nop
        nop
        nop
        decfsz  soundhigh,1
        goto    sound2
        bcf     GPIO,0
        movf    temp,0
        movwf   soundlow    ;Piezo LOW
sound3  nop
        nop
        nop
        nop
        nop
        decfsz  soundlow,1
        goto    sound3
        decfsz  temp,1
        goto    sound1
        retlw   00

The next sub-routine is:

THE RANDOM NUMBER GENERATOR

One of the most difficult sub-routines to create is the random number generator. This is because a computer is very precise in its execution of instructions and it cannot produce a list of random numbers.
You may have seen a random number generator program using the timer file (TMR0). This will produce a single random number, but we need a sequence of random numbers. It is very difficult to get a stream of random numbers.
The only solution is to produce a random number table and access it “half-way down” by using a starting value derived from the timer register.
The pointer for the table is incremented on each pass of the program and when it reaches the end of the table, it starts at the top. In this way, even the first number is unknown and the pattern will never be remembered by anyone playing the game.

THE TOUCH PAD

The Touch Pad is two tinned pads on the PC board. When you touch them with a finger, the resistance of your finger is reduced by a factor of about 100 - 400 by the gain of the emitter-follower transistor and this puts a HIGH on the input pin of the chip. The input impedance of the chip is fairly high (about 50k) but when you add a pull-down resistor (to prevent stray signals being detected by the chip), the impedance decreases. The answer is to add the emitter-follower transistor.

THE PROGRAM

The full program is shown on Page 2 of this article.
The file you will burn into a PIC12F629 chip is: .hex
The PIC12F629 chip in the kit comes with pre-programmed “Stress.”
It can be re-programmed up to 1,000 times but the best thing to do is purchase another chip and use it to burn your own programs.

THINGS YOU CANNOT DO

The LEDs in this project are connected to the outputs of the micro in a very special way to provide unique access that cannot be applied to other types of devices.
You cannot connect other devices to the chip in the same way as we have connected the LEDs due to the special characteristic of a LED.
A LED will not turn on if the applied voltage is below its characteristic turn-on voltage.
If a LED is replaced with a piezo, for example, the voltage across the piezo will be approx 5v, and this voltage will also appear across two or three of the other LEDs in the display and they will also be activated and produce a very small illumination.
That’s why the piezo has to be connected between one of the outputs and the 0v rail.

ASSEMBLY

Constructing the STRESS METER project and testing the circuit is covered in the ”18 LED Display-1 project.” The only two components you need to separately identify are the transistor and diode. They both look the same. The diode is marked “A6” and the transistor is “1K.”


All parts mount on the top-side of the board.
The 7 blue lines are jumpers made from enameled wire.


Parts identification

GOING FURTHER

This project offers a wide possibility for changes, improvements and additions.
You can add a different “click” sound to indicate the wheel advancing or another tune when the wheel stops. You can also add an “attract mode” at the beginning of the program, when the game is waiting to be played.
When you are adding anything to the program, only add a very small modification and test it.
If the addition does not work, try it as a completely separate sub-routine by starting a new project and testing it by itself.
This especially applies to sub-routines such as sounds, as they can be tested separately.
You can also start a completely different project using the layout of the LEDs and piezo.
To do this, we have started to help you. If you touch the touch pads before turning the circuit ON, the program will go to a “NEW” section and repeat the “Rising Sound” tune. This lets you know you have reached the “NEW” section.
In place of “NEW” you can add your own routines. You can also use any of the sub-routines from the STRESS METER game or adapt any of the sub-routines from our Library: A-E E-P P-Z.

WRITING YOUR OWN PROGRAM

The program for “Stress” has been written in a very simple “linear” way that uses a lot of repeated instructions. This has been done to help beginners understand how to create sub-routines.
Many programs are written by very clever programmers and they try to show their skills to newcomers. The result is a failure. Things must be explained in a very simple way so that they can “latch-on” to the concepts.
That’s why this project is ideal. It starts at the beginning.
You can produce a result on the display with as little as 10 instructions.
The PC board contains a touch switch, piezo and a number of LEDS.
Although the LEDs are not accessed in the normal way, you can use the sub-routines to access each LED (about 4 instructions) and write your own program to do something simple - like flash a LED or produce a tone.
It doesn’t matter where you start or how simple the program, the important part is to START.
You can use the chip that comes with the kit or buy another one and keep the original as a back-up.
Start with something simple - turn on a LED.
Then turn on another LED.
Then flash a LED
Then alternately turn on two LEDs.
Then produce a beep.
Then produce a beep-beep-beep.
Then produce a beep - beep while alternately flashing two LEDs.

This is the only way to build up your skills.
After all, this is the way the author created the Stress program.
The only way to create anything complex is to add a small bit at a time. This allows you to fault-find a mistake or carry out corrections or modifications, with the least amount of frustration.
If you create a lot of code at the one time and the program does not work, it is very difficult to fault-find the mistake.
You can use some of the “de-bugging” programs and “single-step” features provided by Microchip, but these will take you a long time to use.
They are very interesting to use as they show the content of each file before and after each instruction.
They will also show you how each instruction works and what result it produces. This is especially important with logic instructions (AND, XOR etc) and the setting or clearing of the bits in the STATUS file (such as Carry, Digit Carry or Zero).
But the fastest way to progress with a program is to use the sub-routines we have provided in our Library of Routines - ”Copy and Paste.”

The chip is like an empty exercise book.
You can write almost anything you want.
It’s now up to you,

18 LED Display-1 PARTS LIST

  • 5 - 47R

  • 2 - 10k

  • 1 - 100n surface mount capacitor

  • 1 - 100u electrolytic

  • 1 - BC 847 surface mount transistor “1K”

  • 18 - surface mount LEDs (20 supplied)

  • 1 - surface-mount diode “A6”

  • 1 - mini piezo diaphragm

  • 1 - mini slide switch

  • 4 - AA cells

  • 1 - 4-cell battery box

  • 1 - 8 pin IC socket

  • 30cm - fine enameled wire

  • 1m - fine solder

  • 1 - PIC12F628 “Stress” microcontroller IC

  • 1 - 18 LED Display-1 PCB

Order kit


Tags

#PIC12F629#PIC
Colin Mitchell

Colin Mitchell

Expertise

electronics
writing
PIC-Chips

Social Media

instagramtwitterwebsite

Related Posts

Happy Birthday
Happy Birthday
May 15, 2010
TODO
© 2021, All Rights Reserved.

Quick Links

Advertise with usAbout UsContact Us

Social Media