MORE YOU READ AND MORE YOU LEARN

READ MY ARTICLE TO MAKE YOUR VIEW. YOU CAN KNOW SOME UNKNOWN.I TRY TO MAKE SOME UNCOOMMOONN......

Saturday, 1 May 2010

Perfect spiral, every time


A while back we saw a logic clock that used the alternating current frequency from the power grid to keep time. We asked for information on your projects that use this method and we got a lot of comments and tips. Today we’re sharing [Doug Jackson's] method which he used in his word clock.
The schematic above is from that project and we’ve outlined the important part in green. [Doug] pulls a signal from the 9V AC power before it hits the bridge rectifier, using a 100K resistor and a zener diode to protect the microcontroller pin. The code for that project comes as a hex file but he sent us the C code pertaining to this timing circuit. It’s written for PIC but you’ll have no trouble adapting it to other microcontroller families. Take a look after the break.

//  Set the frequency of the local mains - MUST BE SET OR THE CLOCK WILL BE USELESS

//#define MAINS_FREQ 50      // the local mains supply frequency for Australia
#define MAINS_FREQ 60    // the local mains supply frequency for the USA

T1CON   =   0b00000011;   // Timer 1 control
//    Prescale - 00 - 1:1,   Oscilator disabled,  External Clock,  Timer Enebled

void incrementtime(void){
// increment the time counters keeping care to rollover as required
 sec=0;
 if (++min >= 60) {
       min=0;
       if (++hour == 13) {
            hour=1;            }
     }
}
                                    void interrupt my_isr(void){
      // test to see if it was a Timer 1 interrupt - External mains source
      if ((TMR1IE) && (TMR1IF) && (mode==0)){
           sec++; // increment the seconds counter
          TMR1IF=0;
          TMR1H=0xff;
          TMR1L=MAINS_DLY;    // reset TMR1H and TMR1L to go off in the
                              // appropriate number of cycles based on the local
                              // supply frequency
          }

}

void main(void)
{
  init();  // initialise the hardware
  testleds(); // test the LED array
  version();  // Display the version number of the software

  displaytime(); // display the current time

  TMR1H=0xff;
  TMR1L=MAINS_DLY;    // reset TMR1H and TMR1L to go off in the number of
                      // mains cycles based on the local mains frequency
    ei();
  while (1) {
            //test to see if we need to increment the time counters
          if (sec==60)
          {
              incrementtime();
              displaytime();
          }

          ....... etc etc etc - do the display of the time as required.....
   }
}