با سلام من یک برنامه نوشتم که هر یک دقیقه یکبار 3 ثانیه ال ای دی رو روشن میکنه و 3 ثانیه خاموش ، برنامه یک دقیققشو با تایمر یک نوشتم و برنامه 3 ثانیشو با delay نرم افزاری حالا اگر بخوام برنامه 3 ثانیشو با تایمر صفر بنویسم چه تغییری باید در برنامه زیر ایجاد کنم ، البته همانطور که در برنامه زیر مشاهده میکیند تا حدی تایمر صفر رو فعال کردم اما از اینجا به بعدشو نمیدونم باید چه کار کنم ممنون میشم راهنمایی بفرمایید .
کد:
#include <mega16.h>
#include <delay.h>
// Declare your global variables here
// Timer 0 overflow interrupt service routine
unsigned int i;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
}
//void led(void)
//{
//PORTA.0=1;
//delay_ms(3000);
//PORTA.0=0;
//delay_ms(3000);
//}
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
i++;
if(i>=2)
{
i=0;
PORTA.0=1;
delay_ms(3000);
PORTA.0=0;
delay_ms(3000);
}
TCNT1H=0xF0;
TCNT1L=0xBC;
}
void main(void)
{
DDRA.0=1;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0.977 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 0.26214 s
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Timer Period: 4.1943 s
// Timer1 Overflow Interrupt: On
TCCR1A=0x00;
TCCR1B=0x04; // scale 256
TCNT1H=0xF0;
TCNT1L=0xBC;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
// Global enable interrupts
#asm("sei")
while (1);
}




ببینید ای ن مشابه همون کاریه که خودتون انجام دادین. شما گفتین که در طول ۱ دقیقه به مدت۳ ثانیه LED رو روشن میکنید و بعد خاموش. تو برنامه ای که شما نوشتین وقفه سرریز تایمر تو هر ۳۰ ثانیه اتفاق میفته و برای ایجاد زمان ۱ دقیقه یه متغیر i رو تا دو واحد افزایش دادین تا به زمان ۱ دقیقه برسین. حالا ما اینجا یه کاری میکنیم که وقفه سرریز تایمر هر ۱ ثانیه اتفاق بیفته. بنابراین باید برای داشتن بازه ۱ دقیقه ای متغیر t رو تا ۵۹ افزایش دادیم و بعد صفرش کردیم. حالا اگر tبین ۰ تا ۳ بود LED را روشن میکنیم و اگر t بزگتر از ۳ بود LED رو خاموش میکنیم. اینجوری هر ۱ دقیقه ۳ ثانیه LED روشن میشه و بعد از اون تا پایان ۱ دقیقه خاموش میمونه تا دوباره t صفر بشه و تکرار ماجرا...

دیدگاه