The result is a slightly FMed pulse train that averages 32,768 Hz over a one-second interval.
The test set shown here was used to verify the code:
The DUT was driven with 10 MHz and the output divided by 2e15.
The 1PPS line was used to trigger a delayed-sweep oscilloscope and an edge
of the 1 Hz line was observed to be stable on the delayed 50 uSec/cm sweep.
Adding 1 NOP instruction per second to the code caused the 1 Hz edge to drift
by the calculated 24 uSec per minute, thus testing the test-set.
The Microchip PIC code below fits easily into the 8-pin 12F629.
 
;**************************************************************** ; * ; Filename: 10M32K.asm * ; Date: 09/20/2008 * ; File Version: 0.01 * ; * ; Author: Peter Putnam * ; email: peter@ni6e.com * ; * ; Tip o' the Tam: /tvb * ; * ;**************************************************************** ; Generates 32768 Hz from 10.000 MHz ; Loop 9632 times with 39 counts per loop in Part 1 ; Loop (65536-9632)= 55904 times with 38 counts per loop in Part 2 ; Toggle the output pin at end of each minor loop. ; The first 9632 times through the loop are longer by 400 nS. ; Repeat to infinity and beyond ; ; ; 10 MHz input at CLKIN, pin 2 ; 32768 Hz out at GPIO2, pin 5 ; 100 nSec per clock cycle ; 400 nSec per instruction cycle ; ; /MCLR tied hi internally ;**************************************************************** ; 12F629 * ; +---------+ * ; 1 | | 8 * ; 5.0 V ----+ +---- GND * ; 2 | | 7 * ; 10.0 MHz In CLKIN ----+ +---- GP0 * ; 3 | | 6 * ; GP4 ----+ +---- GP1 * ; 4 | | 5 * ; GP3 ----+ +---- GP2 32768 Hz Out * ; | | * ; +---------+ * ; * ;**************************************************************** list p=12F629 #include p12F629.inc radix hex __config _EC_OSC & _MCLRE_OFF & _WDT_OFF ;======================================= ;Bit RP0 is bank select bit ; ; 0: Bank 0 ; 1: Bank 1 ; ;======================================= w equ 0 ; to w register f equ 1 ; to file register or memory address ;======================================= ;register definitions cblock 0x20 DST DST1 VAR VAR1 d1 x1 endc ;======================================= Reset: org 0x00 Init: ; Initialize Ports bcf STATUS,RP0 ; Bank 0 clrf GPIO ; Init GPIO movlw 0x07 ; Set GP<2:0> to digital IO movwf CMCON bsf STATUS,RP0 ; Bank 1 movlw b'00110000' ; Set GPIO<5:4> as inputs, (GPIO4 in only) movwf TRISIO ; and GPIO<3,2,1,0> as outputs bcf STATUS,RP0 ; Bank 0 movlw 0x5F ; Counter setup for first pass, Part 1 loop movwf DST movlw 0xDA movwf DST+1 ; movlw 0x9F ; Counter setup for Part 2 loop ; movwf VAR ; movlw 0x25 ; movwf VAR+1 ; ******************************** Part 1 Loop ******************************* part1: ; Part 1 counter set to repeat 9632 times ; Inner loop = 39 instruction cycles movlw 0x07 ; 22 cycles movwf d1 delay_22a decfsz d1, f goto delay_22a goto $+1 ; 2 cycles movlw 0x9F ; Counter setup for Part 2 movwf VAR ; repeated many times here in Part 1 movlw 0x25 ; keeping it inside a counted loop movwf VAR+1 movlw b'00000100' ; Toggle output pin xorwf GPIO, f ; Back to this point in Part 1 loop ; must be 39 instruction cycles ; Increment 16 bit counter, set Z when full ; count 9632 passes, then set Z flag incfsz (DST),W ; Add one to low byte decf (DST)+1,F ; No carry (negates next step) incf (DST)+1,F ; Add one to high byte movwf (DST) ; Store updated low byte back iorwf (DST)+1,W ; Set Z flag btfsc STATUS, 2 goto part2a goto part1 part2a: nop ; required because bit test is single cycle ; when program counter is not modified ; otherwise, it is 2 cycles ; ******************************** Part 2 Loop ************************** part2: ; Part 2 counter set to repeat 55904 times ; Inner loop = 38 instruction cycles movlw 0x07 ; 22 cycles movwf x1 delay_22b decfsz x1, f goto delay_22b nop ; 1 cycle movlw 0x5F ; Counter setup for Part 1 movwf DST ; repeated many times in Part 2 loop movlw 0xDA ; keeping it inside a counted loop movwf DST+1 movlw b'00000100' ; Toggle output pin xorwf GPIO, f ; Back to this point in Part 2 loop ; must be 38 instruction cycles ; Increment 16 bit counter, set Z when full ; count 55904 passes, then set Z flag incfsz (VAR),W ; Add one to low byte decf (VAR)+1,F ; No carry (negates next step) incf (VAR)+1,F ; Add one to high byte movwf (VAR) ; Store updated low byte back iorwf (VAR)+1,W ; Set Z flag btfsc STATUS, 2 goto part1 goto part2 end