
unit tone
{
	public link unit SOUND {}
	public link unit SOUND1 {}
	
	link unit MCU {} = #.MEGA328;
	
	
	//[i] var_uint16 freq1;
	uint16 freq1;
	//[i] var_uint16 freq2;
	uint16 freq2;
	
	
	uint8 value1;
	uint8 value2;
	uint16 angle1;
	uint16 angle2;
	
	//---------------------------------------------------
	//[i] function_void OS_init;
	void OS_init()
	{
		angle1 = 0;
		value1 = 0;
		freq1 = 500;
		
		angle2 = 0;
		value2 = 0;
		freq2 = 500;
		
		SOUND.D0_DIR = 1;
		SOUND.D0_OUT = 0;
		SOUND1.D0_DIR = 1;
		SOUND1.D0_OUT = 0;
		timer_init();
	}
	//---------------------------------------------------
	//ʱʼ
	// 11.0592MHz, ƵΪ1, ƵΪ 11059200Hz
	//ֵΪ 256
	//жƵΪ 11059200Hz / 256 = 43200Hz
	void timer_init()
	{
		//ģʽ
		MCU.TCCR2A = 0B1010_0011;
		MCU.TCCR2B = 0B0000_0001;
		//ʼ
		MCU.OCR2A = 0;
		MCU.OCR2B = 0;
		//ж
		MCU.TIFR2 | 0b0000_0001;
		//ʹж
		MCU.TIMSK2 | 0b0000_0001;
	}
	//---------------------------------------------------
	//жϷ
	
	link uint8 OCR2A = MCU.OCR2A;
	link uint8 OCR2B = MCU.OCR2B;
	uint16 PWM;
	
	interrupt [MCU.WATCH.TIMER2_OVF]
	void TIMER2_OVF()
	{
		//˫ͨƵ(Чʹ޷)
//		angle1 + freq1;
//		angle1 8(uint8) = angle1 8(uint8) & 0B0111_1111;
//		PWM = value1 * WAVE (angle1 8(uint8));
//		angle2 + freq2;
//		angle2 8(uint8) = angle2 8(uint8) & 0B0111_1111;
//		PWM + value2 * WAVE (angle2 8(uint8));
//		PWM >> 1;
//		MCU OCR2 = PWM 8(uint8);
	
	
		//Ϊȼ۵ĻƵ,
		//С256˫ͨĲϳ
	
		
//	angle1 + freq1,
//	angle1 8(N8) = angle1 8(N8) & 0B0111_1111,
		#asm "LDS r26,&angle1"
		#asm "LDS r30,&freq1"
		#asm "ADD r26,r30"
		#asm "STS &angle1,r26"
		#asm "LDS r26,&angle1+1"
		#asm "LDS r30,&freq1+1"
		#asm "ADC r26,r30"
		#asm "ANDI r26,0x7F"
		#asm "STS &angle1+1,r26"
//	PWM = value1 * WAVE (angle1 8(N8)),
		//#asm "LDS r26,&angle1+1"
		#asm "LDI r27,0x00"
		#asm "LDI r30,&WAVE%256"
		#asm "LDI r31,&WAVE/256"
		#asm "ADD r30,r26"
		#asm "ADC r31,r27"
		#asm "LPM r22,Z"
		#asm "LDS r23,&value1"
		#asm "MULSU r22,r23"
		//#asm "STD y+&PWM,r0"
		//#asm "STD y+&PWM+1,r1"
		#asm "LDI r22,128"
		#asm "ADD r1,r22"
		#asm "STS &OCR2A,r1"
//	angle2 + freq2,
//	angle2 8(N8) = angle2 8(N8) & 0B0111_1111,
		#asm "LDS r26,&angle2"
		#asm "LDS r30,&freq2"
		#asm "ADD r26,r30"
		#asm "STS &angle2,r26"
		#asm "LDS r26,&angle2+1"
		#asm "LDS r30,&freq2+1"
		#asm "ADC r26,r30"
		#asm "ANDI r26,0x7F"
		#asm "STS &angle2+1,r26"
//	PWM + value2 * WAVE (angle2 8(N8)),
		//#asm "LDS r26,&angle2+1"
		#asm "LDI r27,0x00"
		#asm "LDI r30,&WAVE%256"
		#asm "LDI r31,&WAVE/256"
		#asm "ADD r30,r26"
		#asm "ADC r31,r27"
		#asm "LPM r22,Z"
		#asm "LDS r23,&value2"
		#asm "MULSU r22,r23"
		
		//#asm "LDD r30,y+&PWM"
		//#asm "LDD r31,y+&PWM+1"
		#asm "LDI r22,128"
		#asm "ADD r1,r22"
		#asm "STS &OCR2B,r1"
		
//	зΪ޷2
//	PWM >> 1;
//	MCU OCR2 = PWM 8(uint8);
		//#asm "LDI r22,128"
		//#asm "ADD r31,r22"
		//#asm "ADD r1,r22"
		//#asm "ADD r31,r1"
		//#asm "ROR r31"
		//#asm "STS &OCR2B,r31"
	}
	//---------------------------------------------------
	
	//β
	[#.code int8*128] WAVE =
	[
		-127,-123,-119,-115,-111,-107,-103,-99,-95,-91,-87,-83,-79,-75,-71,-67,
		-63,-59,-55,-51,-47,-43,-39,-35,-31,-27,-23,-19,-15,-11, -7, -3,
		  1,  5,  9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
		 65, 69, 73, 77, 81, 85, 89, 93, 97,101,105,109,113,117,121,125,
		127,123,119,115,111,107,103, 99, 95, 91, 87, 83, 79, 75, 71, 67,
		 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23, 19, 15, 11,  7,  3,
		 -1, -5, -9,-13,-17,-21,-25,-29,-33,-37,-41,-45,-49,-53,-57,-61,
		-65,-69,-73,-77,-81,-85,-89,-93,-97,-101,-105,-109,-113,-117,-121,-125,
	];
}





