(0014) // user defined beep (0015) // in: Frequency in 1-10 kHz and duration in ms (0016) void buzzer_beep (unsigned char freq, unsigned int duration) // (0017) { (0018) unsigned int ticks, i; // 0,0015ms/delay(x) (0019) (0020) //delay[ms] = (1000/f) / 2 (0021) //delay[ticks] = ((1000/f) / 2) * 667 ticks/ms (0022) (0023) ticks = ((int)((100/freq)/2)*6); // not exactly (+5% in freq...) max=300 03CD 2D2C MOV R18,R12 03CE 2733 CLR R19 03CF E604 LDI R16,0x64 03D0 E010 LDI R17,0 03D1 940E18F1 CALL div16s 03D3 E022 LDI R18,2 03D4 E030 LDI R19,0 03D5 940E18F1 CALL div16s 03D7 0198 MOVW R18,R16 03D8 E006 LDI R16,6 03D9 E010 LDI R17,0 03DA 940E19B0 CALL empy16s 03DC 0168 MOVW R12,R16 (0024) (0025) // duration: 667*ticks from delay(ticks) per ms // max 5s@10kHz, 50s@1kHz (0026) (0027) i = ((long)duration*334)/ticks; // 03DD 0115 MOVW R2,R10 03DE 2444 CLR R4 03DF 2455 CLR R5 03E0 E44E LDI R20,0x4E 03E1 E051 LDI R21,1 03E2 E060 LDI R22,0 03E3 E070 LDI R23,0 03E4 925A ST R5,-Y 03E5 924A ST R4,-Y 03E6 923A ST R3,-Y 03E7 922A ST R2,-Y 03E8 018A MOVW R16,R20 03E9 019B MOVW R18,R22 03EA 940E19C0 CALL empy32u 03EC 0116 MOVW R2,R12 03ED 2444 CLR R4 03EE 2455 CLR R5 03EF 925A ST R5,-Y 03F0 924A ST R4,-Y 03F1 923A ST R3,-Y 03F2 922A ST R2,-Y 03F3 940E192D CALL div32s 03F5 0158 MOVW R10,R16 03F6 C008 RJMP 0x03FF (0028) (0029) while (i--) // 1000*0,5ms = 0,5s (0030) { (0031) delay(ticks); // approx 0.25ms delay 03F7 0186 MOVW R16,R12 03F8 940E06AA CALL _delay (0032) buzzer_on(); 03FA 98C1 CBI 0x18,1 (0033) delay(ticks); 03FB 0186 MOVW R16,R12 03FC 940E06AA CALL _delay (0034) buzzer_off(); 03FE 9AC1 SBI 0x18,1 03FF 0115 MOVW R2,R10 0400 01C1 MOVW R24,R2 0401 9701 SBIW R24,1 0402 015C MOVW R10,R24 0403 2022 TST R2 0404 F791 BNE 0x03F7 0405 2033 TST R3 0406 F781 BNE 0x03F7 0407 940E19F6 CALL pop_gset4 0409 9508 RET (0035) } (0036) }