Processing Forum
// By Kyle McDonald// From the instructables project at:
#define resolution 8#define mains 50 // 60: north america, japan; 50: most other places
#define refresh 2 * 1000000 / mains
void setup () {Serial . begin ( 115200 );
// unused pins are fairly insignificant,// but pulled low to reduce unknown variablesfor ( int i = 2 ; i < 14 ; i ++ ) {pinMode ( i , OUTPUT );digitalWrite ( i , LOW );}
for ( int i = 8 ; i < 11 ; i ++ )pinMode ( i , INPUT );
startTimer ();}
void loop () {Serial . print ( time ( 8 , B00000001 ), DEC );Serial . print ( " " );Serial . print ( time ( 9 , B00000010 ), DEC );Serial . print ( " " );Serial . println ( time ( 10 , B00000100 ), DEC );
}
long time ( int pin , byte mask ) {unsigned long count = 0 , total = 0 ;while ( checkTimer () < refresh ) {// pinMode is about 6 times slower than assigning// DDRB directly, but that pause is importantpinMode ( pin , OUTPUT );PORTB = 0 ;pinMode ( pin , INPUT );while (( PINB & mask ) == 0 )count ++ ;total ++ ;}startTimer ();return ( count << resolution ) / total ;}
extern volatile unsigned long timer0_overflow_count ;
void startTimer () {timer0_overflow_count = 0 ;TCNT0 = 0 ;}
unsigned long checkTimer () {return (( timer0_overflow_count << 8 ) + TCNT0 ) << 2 ;}