//2005.10.21-2008.7.31 tiny2313 “dŽqƒsƒAƒm koyama@cc.hirosaki-u.ac.jp #define Nkey 13 #define Nc 256 #define ts 0.00006375 #include #include #include // ³Œ·”g prog_uint8_t W[]={0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,17,18,20,21,23,25,27,29,31,33,35,37,40,42,44,47,49,52,54,57,59,62,65,67,70,73,76,79,82,85,88,90,93,97,100,103,106,109,112,115,118,121,124,127,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173,176,179,182,185,188,190,193,196,198,201,203,206,208,211,213,215,218,220,222,224,226,228,230,232,234,235,237,238,240,241,243,244,245,246,248,249,250,250,251,252,253,253,254,254,254,255,255,255,255,255,255,255,254,254,254,253,253,252,251,250,250,249,248,246,245,244,243,241,240,238,237,235,234,232,230,228,226,224,222,220,218,215,213,211,208,206,203,201,198,196,193,190,188,185,182,179,176,173,170,167,165,162,158,155,152,149,146,143,140,137,134,131,128,124,121,118,115,112,109,106,103,100,97,93,90,88,85,82,79,76,73,70,67,65,62,59,57,54,52,49,47,44,42,40,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0}; uint16_t Xsw[]={ ts*Nc*523.25*256, ts*Nc*554.37*256, ts*Nc*587.33*256, ts*Nc*622.25*256, ts*Nc*659.26*256, ts*Nc*698.46*256, ts*Nc*739.99*256, ts*Nc*783.99*256, ts*Nc*830.61*256, ts*Nc*880.00*256, ts*Nc*932.33*256, ts*Nc*987.77*256, ts*Nc*1046.5*256 }; uint16_t KEY=0xff, KEY0=0xff, KEYon=0, X[Nkey], v, x, E[Nkey]; uint8_t i, j, g=0, c=0, KEY1=255, KEY2=255, KEY3=255; SIGNAL(SIG_TIMER1_OVF){ // .125*510=63.75us(@8MHz) if(--c==0) g++; // 63.75us*256=16.32ms v=0; // U• if((i=KEY1)=Nc){ v+=pgm_read_byte(&W[(x=128+(X[i]+=Xsw[i]))>>8]); v+=pgm_read_byte(&W[(x+(Nc<<7)-E[i])>>8]); if(c==0) E[i]-=(E[i]>>4); }else v+=256; if((i=KEY2)=Nc){ v+=pgm_read_byte(&W[(x=128+(X[i]+=Xsw[i]))>>8]); v+=pgm_read_byte(&W[(x+(Nc<<7)-E[i])>>8]); if(c==0) E[i]-=(E[i]>>4); }else v+=256; if((i=KEY3)=Nc){ v+=pgm_read_byte(&W[(x=128+(X[i]+=Xsw[i]))>>8]); v+=pgm_read_byte(&W[(x+(Nc<<7)-E[i])>>8]); if(c==0) E[i]-=(E[i]>>4); }else v+=256; OCR1AL=OCR1BL=v>>3; } int main (void){ PORTB=0xf7; DDRB=0x18; // rrroorrr PORTD=0x7f; DDRD=0x00; // xrrrrrrr TCCR1A=0xb1; // OC1A=!OC1B=0/1 on COM TCCR1B=0x01; // Timer1: 8 bit PhaseCorr PWM,CK/1 TIMSK=(1<>2) | ((PIND&0x7f)<<6); KEYon=KEY0&(~KEY); // ON‚Ι‚Θ‚Α‚½ƒrƒbƒg‚ͺ1 for(j=0;j