# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > سوال: استفاده از تایمر1 برای تولید صدا

## mostafa272

با سلام

کد زیر مربوط به برنامه تولید صدا هست که از تایمر1 مد مقایسه ایش استفاده می کنه ولی دقیقا نمی دونم چطوری؟ممکنه یه نفر توضیح بده؟(منظورم اینه که چه عاملی (متغیری) در تایمر باعث ایجاد صدا میشه با توجه به کد)

با تشکر
  /* This header file declares the internal
   register addresses for Atmega 8535 */
#include "io8535.h"

#define   OCIE1A  TIMSK_Bit4
#define   I       SREG_Bit7
#define   DDD5    DDRD_Bit5
#define   PD5     PORTD_Bit5

// Declare variables
unsigned char COUNT;
// Timer1 Compare Match Handler
#pragma vector = TIMER1_COMPA_vect
__interrupt void COMP_A(void)
{
    COUNT--;   // COUNT-1
}
// Main
void main(void)
{
    unsigned char i;
    DDD5 = 1;        // Set PD5 output
    PD5 = 1;         // speaker off
    // TCNT1H = TCNT1L = 0
    TCNT1H = 0;
    TCNT1L = 0;
    TCCR1A = 0x40;;    // Toggle OC1A on Compare match
    OCIE1A = 1;        // Enable Timer 1 Compare match A
    I = 1;             // Set global interrupt interrupt
    do{
        for (i=0; i < 20 ; i++){
            // 480[Hz]/2
            OCR1AH = 15360 >> 8;
            OCR1AL = 15360 & 0x00ff;
            TCCR1B = 0x09;
            COUNT = 24;        // 480[Hz]
            while(COUNT != 0); // Wait for interrupt
            // 320[Hz]/2
            OCR1AH = 23040 >> 8;
            OCR1AL = 23040 & 0x00ff;
            COUNT = 16;        // 320[Hz]
            while(COUNT != 0); // Wait for interrupt
        }
        // Wait 2 seconds
        OCR1AH = 0xff;
        OCR1AL = 0xff;
        TCCR1A = 0;
        COUNT = 113;
        while(COUNT != 0);  // Wait for interrupt
        TCCR1A = 0x40;      // Toggle OC1A on Compare match
    }while(1);
}

----------


## sharin

اينجا دارهه يه شكل موجي با فركانس هاي مختلف درست مي كنه .
هر سيگنالي كه به اسپيكر و ... مي دي ، با تغيير فركانس صداش تغيير مي كنه .
الان هم در حلقه ي اصلي برنامه ، با مقدار دهي به تايمر و ريجستر ها و  نتظيم count در هر قسمت ، در واقع دارهه فركانس هاي مختلف براي توليد صدا  هاي مختلف درست مي كنه و شكل موج حاصل از عملكرد تايمر به اسپيكر مي رسه  ...
در خود كد ها هم توضيحات هست و همه چيز واضح هست ديگه ...

موفق باشيد.

----------


## mostafa272

پس اگر بخوام صداهای مختلفی تولید کنم فقط باید فرکانس مورد نظرم رو بریزم تو متغیر count؟مثلا اگر بخواهم یه صدایی مثل آژیر تولید کنم اگر یه حلقه for دیگه در حلقه اصلی main قرار بدم و به count هم یه مقدار دلخواه دیگه بدهم همچین صدایی تولید می شود؟

----------


## sharin

فركانس مورد نظر رو در count نمي ريزيد !
مثلا به سبكي كه بالا كد زده ، مقدار 16 براي count فركانس 320Hz رو مي سازهه ...

به سبك خودش كد بزنيد و البته مقادير count رو خيلي ديمي نديد ، فركانسش رو حساب كنيد كه از حد توان شنوايي ما بيشتر نشه ...
و ...
كلا چند بار تست كنيد.

موفق باشيد.

----------

