; main loop ; ; r28,r29,r30 is the phase accumulator ; r24,r25,r26 is the adder value determining frequency ; ; add value to accumulator ; load byte from current table in RAM ; output byte to port ; repeat ; clear accumulator clr r28 clr r29 clr r30 add r28,r24 LOOP1: adc r29,r25 ; 1 adc r30,r26 ; 1 ldi r31,1 ; 1 even step by default sbrc r29,7 ; 1 Skip if bit 7 in r29 cleared ldi r31,2 ; 1 odd step instead ld r0,z ; 2 out PORTD,r0 ; 1 add r28,r24 ; 1 adc r29,r25 ; 1 adc r30,r26 ; 1 ldi r31,1 ; 1 even step sbrc r29,7 ; 1 Skip if bit 7 in r29 cleared ldi r31,2 ; 1 odd step ld r0,z ; 2 add r28,r24 ; 1 timeing out PORTD,r0 ; 1 rjmp LOOP1 ; 2 => 20 / 2 = 10 cycles ;****************************************************************************** ; data tables ;****************************************************************************** ; force table to begin at 256 byte boundary .org 0x100 sine2x256x8: ; 512 step sinewave table ; to be copied to SRAM starting at 0x100 ; even .db 128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174 .db 176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216 .db 218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245 .db 246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255 .db 255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247 .db 246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220 .db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179 .db 176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131 .db 128,124,121,118,115,112,109,106,103,99,96,93,90,87,84,81 .db 79,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39 .db 37,35,33,31,29,27,25,23,21,19,18,16,15,13,12,10 .db 9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0 .db 0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8 .db 9,10,12,13,15,16,18,19,21,23,25,27,29,31,33,35 .db 37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76 .db 79,81,84,87,90,93,96,99,103,106,109,112,115,118,121,124 ; odd .db 129,132,135,138,141,144,147,150,154,157,160,163,166,169,172,175 .db 178,180,183,186,189,192,194,197,200,202,205,207,210,212,214,217 .db 219,221,223,225,227,229,231,233,235,236,238,239,241,242,244,245 .db 246,247,248,249,250,251,252,253,253,254,254,255,255,255,255,255 .db 255,255,255,255,255,254,254,253,253,252,251,251,250,249,248,247 .db 245,244,243,241,240,238,237,235,233,232,230,228,226,224,222,219 .db 217,215,213,210,208,205,203,200,198,195,192,190,187,184,181,178 .db 175,173,170,167,164,161,158,154,151,148,145,142,139,136,133,130 .db 126,123,120,117,114,111,108,105,101,98,95,92,89,86,83,80 .db 77,75,72,69,66,63,61,58,55,53,50,48,45,43,41,38 .db 36,34,32,30,28,26,24,22,20,19,17,16,14,13,11,10 .db 9,8,7,6,5,4,3,2,2,1,1,0,0,0,0,0 .db 0,0,0,0,0,1,1,2,2,3,4,4,5,6,7,8 .db 10,11,12,14,15,17,18,20,22,23,25,27,29,31,33,36 .db 38,40,42,45,47,50,52,55,57,60,63,65,68,71,74,77 .db 80,82,85,88,91,94,97,101,104,107,110,113,116,119,122,125 UpDateMode: cpi Mode,0 brne LoopMode Off: clr r0 st Z+,r0 cpi r31,1 brne Off cpi r31,255 brne Off rjmp ModeDone LoopMode: cpi Mode,2 brne ABC ldi ZH, high(sine2x256x8 *2) ; Initialize Z pointer ldi ZL, low(sine2x256x8 *2) ldi YH,1 clr YL sine512: lpm r0,z+ st y+,r0 cpi YH,3 brne sine512 cpi YL,255 brne sine512 ABC: ModeDone: ret