به عنوان مقدمه ای برای بحث تولید موسیقی با AVR، سورس بسیار ساده تولید یک آژیر خطر روی یکی از پین های خروجی mega8515 با کامپایلر IAR نوشته شده است. فرض بر این است که کلاک داخلی 1 مگاهرتز فعال باشد. توضیح برنامه به این صورت است که هر دو TIMER در مد CTC کار می کنند و TIMER0 وظیفه toggle کردن پین خروجی تولید صدا را بر عهده دارد و TIMER1 فرکانس تولید شده توسط TIMER0 را تغییر می دهد. با تغییر مقادیر ابتدا و انتهای دو تایمر می توان به صداهای مختلفی دست پیدا کرد و با کمی تغییر نرم افزار و اضافه کردن چند شرط می توان آژیر چند صدا (مانند آژیر دزدگیر ماشین) را ایجاد کرد. برای وصل یک بلندگو به خروجی میکروکنترلر باید از یک طبقه بافر ترانزیستوری استفاده شود تا صدای بلند و رسایی برای آژیر خطر ایجاد شود.
این نرم افزار برای هر شماره دیگری از خانواده AVR که بیش از یک تایمر داشته باشد با تغییرات جزئی قابل استفاده است و برای سایر کامپایلرها هم میتوان از همین منطق برنامه استفاده کرد .
این نرم افزار برای هر شماره دیگری از خانواده AVR که بیش از یک تایمر داشته باشد با تغییرات جزئی قابل استفاده است و برای سایر کامپایلرها هم میتوان از همین منطق برنامه استفاده کرد .
#include<ioavr.h>
/* written for ATMEGA8515
CLOCK = 1MHz
OUTPUT PIN = PA0 */
void main( void )
{
DDRA =0X01; // set PA0 to output
OCR0=90;
TCCR0=0X0A;
OCR1A=10000;
TCCR1B=0X09;
TIMSK=0X41;
asm("sei"
;
while(1);
}
#pragma vector=TIMER0_COMP_vect
__interrupt void TIMER0_compare()
{
if (PORTA==0X01) PORTA=0X00;
else PORTA=0X01;
}
#pragma vector=TIMER1_COMPA_vect
__interrupt void TIMER1_compareA()
{
if (OCR0==124) OCR0=90;
else OCR0+=1;
}
/* written for ATMEGA8515
CLOCK = 1MHz
OUTPUT PIN = PA0 */
void main( void )
{
DDRA =0X01; // set PA0 to output
OCR0=90;
TCCR0=0X0A;
OCR1A=10000;
TCCR1B=0X09;
TIMSK=0X41;
asm("sei"

while(1);
}
#pragma vector=TIMER0_COMP_vect
__interrupt void TIMER0_compare()
{
if (PORTA==0X01) PORTA=0X00;
else PORTA=0X01;
}
#pragma vector=TIMER1_COMPA_vect
__interrupt void TIMER1_compareA()
{
if (OCR0==124) OCR0=90;
else OCR0+=1;
}
دیدگاه