di2500.txt ;************************************************************************************************** ; LISTING 1 - ROUTINE FOR GENERATING ARBITRARY FREQUENCIES ; ; "Generate frequencies with arbitrary relationships," EDN, March 16, 2000, pg 152 ; ; http://www.ednmag.com/ednmag/reg/2000/031600/designideas.htm#06di6 ;*************************************************************************************************** C1 EQU 40 ; Count for 500Hz C2 EQU 28 ; Count for 700Hz C3 EQU 20 ; Count for 1000Hz C4 EQU 19 ; Count for 1050Hz C5 EQU 18 ; Count for 1100Hz C6 EQU 14 ; Count for 1500Hz C7 EQU 12 ; Count for 1700Hz C8 EQU 10 ; Count for 2000Hz F1 EQU 21 ; Internal RAM locations for storing the F2 EQU 22 ; above count values F3 EQU 23 F4 EQU 24 F5 EQU 25 F6 EQU 26 F7 EQU 27 F8 EQU 28 org 0 ajmp main; ;----------Timer T0 service routine -------------- org 00BH ; Timer 0 to service vector cpl p3.4 djnz F1,CF2 ; 24 osc. periods cpl p1.7 ; 12 osc. periods mov F1,#C1 ; 24 osc. periods; ; Total Osc.cycles = 60 * 8 + 12 = 492 ; with 24MHz crystal this amounts to ; 20.5 microseconds CF2: djnz F2,CF3 ; decrement counter for freq. f2 cpl p1.6 ; if it reduces to 0 then complement the mov F2,#C2 ; logic on the corresponding pin and reload ; the count value CF3: djnz F3,CF4 cpl p1.5 mov F3,#C3 CF4: djnz F4,CF5 cpl p1.4 mov F4,#C4 CF5: djnz F5,CF6 cpl p1.3 mov F5,#C5 CF6: djnz F6,CF7 cpl p1.2 mov F6,#C6 CF7: djnz F7,CF8 cpl p1.1 mov F7,#C7 CF8: djnz F8,exit cpl p1.0 mov F8,#C8 exit: reti ; End of timer interrupt routine main: call init; LOOP: JMP LOOP; ;------ Initialization Routine ----------- init: mov F1,#C1 ; Initialize count values mov F2,#C2 mov F3,#C3 mov F4,#C4 mov F5,#C5 mov F6,#C6 mov F7,#C7 mov F8,#C8 ; The following code sets timer T0 to 25 microseconds ; and enables the timer intterupt mov TMOD, #02H ; set timer mode to mode 2 mov tl0,#0ceh ; (8-bit auto-reload mode) mov th0,#0ceh ; set reload value setb ET0 ; enable timer interrupt setb EA ; master interrupt enable setb TR0 ; start timer ret end