| |
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))
#define IN 5 // Input
void PortInit(void){
PORTD = (1<<IN); DDRB = 0xFF; DDRC = 0x7F;}
unsigned int Counter;
char Flag = 0;
char OldFlag = 0;
char PrevState = 0;
void DeviceStateInit (void)
{
Counter = 0;
}
void TimerInit(void){
TCCR0 = (1<<CS00)|(1<<CS01); TIMSK |= 1<<TOIE0; TCNT0 = 0x00;
}
#pragma vector = TIMER0_OVF_vect // Timer0 interrupt
__interrupt void TIMER0_OVF_Interrupt(void)
{
if(tstbit(PIND, 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; PORTC = (0x7F && ((unsigned char) Counter>>8)); }
setbit(PrevState, 0);
}
setbit(OldFlag, 0);
}
}
void main(void)
{
PortInit();
TimerInit();
DeviceStateInit();
asm("sei");
while (1)
{
}
}
|
|