Back to Electronics Cookbook Back to Smart&Small  

 

Microcontroller based digital counter. Can be used as a basis for microcontroller based visitor counter or another events counter.

Schematic diagram. Click to enlarge.



Microcontroller based digital counter PCAD2006 Schematic file. Click to download.





Source code (IAR Embedded Workbench):

#include "iom8.h"
#include "inavr.h"

#define bit(n)			(1 << (n))
#define setbit(p,n)	(p|=bit(n))
#define clrbit(p,n)	(p&=~bit(n))
#define invbit(p,n)	(p=p^bit(n))
#define tstbit(p,n)	(p&bit(n))


// Port D
#define IN	5	// Input

void PortInit(void)	// Ports init
{
	PORTD = (1<<IN);	// Pull-up on

	DDRB = 0xFF;		// All outputs
	DDRC = 0x7F;		// All outputs

}// PortInit

unsigned int Counter;	// Clock counter

char Flag = 0;

char OldFlag = 0;
char PrevState = 0;

void DeviceStateInit (void)
{
	Counter = 0;
}

void TimerInit(void)						// Timer init
{
	TCCR0 = (1<<CS00)|(1<<CS01);		// 2 ms @ 8.0 MHz

	TIMSK |= 1<<TOIE0;					// Enable interrupt
	TCNT0 = 0x00;
}//TimerInit()


#pragma vector = TIMER0_OVF_vect		// Timer0 interrupt
__interrupt void TIMER0_OVF_Interrupt(void)
{
	if(tstbit(PIND, IN))	// IN

	{
		if(!tstbit(OldFlag, 0))
		{			
			clrbit(Flag, 0);	
			clrbit(PrevState, 0);
		}

		clrbit(OldFlag, 0);
	}
	else
	{
		if(tstbit(OldFlag, 0))
		{

			setbit(Flag, 0);
			if (!tstbit(PrevState, 0))
			{

				Counter++;
				PORTB = (unsigned char) Counter;	// Data output, low byte
				PORTC = (0x7F && ((unsigned char) Counter>>8));	// Data output, high byte

			}
			setbit(PrevState, 0);
		}
		setbit(OldFlag, 0);
	}
}//TIMER0_OVF_Interrupt


void main(void)
{
  	PortInit();
	TimerInit();
	DeviceStateInit();

	asm("sei");

   while (1)
   {
	}
}// main()
 

  Contact us: inbox@smasma.com © Smart&Small Webmaster: webmaster@smasma.com