Arduino Mega with Atmega 1280 has four 16 bit timers, that could be used for various purposes, like time/frequency measurement, control with precise timing, PWM generation. Today I hope to explain how to use timer for clocks, timers (countdown) and other things, where You need µCPU to perform some tasks after precise period of time. I’ll give You two examples:
Pseudo 1 second timer
Real 1 second timer
How counter works? It is simple independent 16 bit accumulator, which value increases by 1 at clock cycle. 16 bit means that maximum counter’s value is 65536. When this value is reached counter starts counting from 0 again and gives hardware interrupt. Counter value could be changed any time. This is normal counter mode, Atmega 1280 offers total 14 operating modes.
Last time I showed You how to control 1 digit 7 segment LED display with Arduino. This time it’s not 1, but 4 digits. To connect 1 digit to Arduino we had to use 8 ports, so to connect 4 digits we need to have 4×8=32? Not necessary. Where is a way to use much less ports, it’s called multiplexing. Using multiplexing at one time only one digit is active(e.g. for 2ms). All digits is turned on is serial, but because human’s eye is inert we have illusion, that all digits are lighting at same time.
As You can see form schematic bellow with multiplexing implemented we required only 4 additional ports compared to 1 digit circuit, total – 12.
Because at the same time only one digit will be on All 4 digits segments inputs are connected together. By connecting digits common cathodes to ground we are controlling which digit shall be turned on. Atmega 1280 µCPU port can drain(receive) maximum 40 mA current. If all one digits segments are on, we are having 20×8= 160 mA that is to much, so we can’t to connect common cathodes directly to Arduino ports. Therefore I have used BC547 NPN transistors as switches. Transistor is opened, when positive voltage is applied at the base.
So this is first real electronics mini project/tutorial in this blog.
Everybody at the beginning usually shows how to turn on one LED, I do it a little more complex by controlling 7 segment LED display.
For this demonstration I use one Kingbright SC56-11EWA module with common cathode, it means that all 8 (7 segments + 1 dot) LED’s cathode are connected together:
The first step is to connect 7 segment display LED’s anodes to Arduino ports. You need 7 free ports, or 8 if You want use “dot”. Display datasheet comes very handy, when You need to found out which pin is which.
Do not forget to connect LED’s pins with resistors in serial. Typical red LED forward voltage is 2.0V @20mA current, but Arduino ports outputs 5V, so You must use resistor, in this situation (5-2)/0.02= 150 Ohm or higher should be ok.
Common cathode (3 and/or 8 pin) should be connected to GND and if You have display with common anode You should connect it to +5V.
So if everything is connected we should start to analyze program code.
To make life easier I have done same definitions, so after that I don’t need to remember which Arduino ports I selected to connect display’s segments:
#define G 22
#define F 23
#define A 24
#define B 25
#define E 26
#define D 27
#define C 28
#define DP 29
Arduino ports can be outputs (e.g. for controlling LED) or inputs (e.g. to detect pressed button, sense voltage). We need outputs to turn on LED’s so:
This is the very first and I hope not the last post of this blog. With this event I want to share with you LED calculator. It is also my first project with Visual C++ Expression 2008, this software development environment is free for students.
Calculator is capable of finding suitable standard E12 (10%) resistor value and power for one LED designs. There also some tips for user to find LED forward voltage: