PDA

View Full Version : سوال: استفاده از تایمر1 برای تولید صدا



mostafa272
جمعه 08 اردیبهشت 1391, 15:47 عصر
با سلام

کد زیر مربوط به برنامه تولید صدا هست که از تایمر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
جمعه 08 اردیبهشت 1391, 20:50 عصر
اينجا دارهه يه شكل موجي با فركانس هاي مختلف درست مي كنه .
هر سيگنالي كه به اسپيكر و ... مي دي ، با تغيير فركانس صداش تغيير مي كنه .
الان هم در حلقه ي اصلي برنامه ، با مقدار دهي به تايمر و ريجستر ها و نتظيم count در هر قسمت ، در واقع دارهه فركانس هاي مختلف براي توليد صدا هاي مختلف درست مي كنه و شكل موج حاصل از عملكرد تايمر به اسپيكر مي رسه ...
در خود كد ها هم توضيحات هست و همه چيز واضح هست ديگه ...

موفق باشيد.

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

sharin
یک شنبه 24 اردیبهشت 1391, 21:49 عصر
فركانس مورد نظر رو در count نمي ريزيد !
مثلا به سبكي كه بالا كد زده ، مقدار 16 براي count فركانس 320Hz رو مي سازهه ...

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

موفق باشيد.