آی پی امداد
abtahi

مدارهای ساده با اتمل استادیو

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
برای به دست آوردن زمان یک ثانیه با تایمر صفر با کریستال 8 مگا هرتز
کریستال 8 مگا هرتز یعنی در هر ثانیه 8000000 بار نوسان میکنه
8000000 بر بزرگترین عددی که در جدول بالا بخش پذیره 256 هست پس تقسیم کلاک را بر روی 256 می گذاریم
TCCR0==0x04;
یا TCCR0 |= (1<<CS02);
که فرکانس حاصل میشه 31250
چون تایمر ما 8 بیتی هست پس هر 256 بار یک وقفه رخ میده
3250 بر 256 بخش پذیر نیست ولی بر 250 بخش پذیر هست پس ما میتونیم در ابتدای شمارش مقدار تایمر را روی عدد 6 قرار دهیم و بعد از شمارش 250 شماره مقدار تایمر 256 میشه و یک وقفه رخ میده 31250/250=125
پس با 125 وقفه ما زمان یک ثانیه را داریم
sei(); فعال کردن وقفه سراسری
TIMSK |= (1<<TOIE0); فعال کردن وقفه تایمر صفر
int i=0;
int sec=0; متغیر برای نگه داری ثانیه
TCCR0 |= (1<<CS02); کلاک/256
TCNT0=0x06; قرار دادن عدد 6 در مقدار تایمر
ISR(TIMER0_OVF_vect){} دستورات وقفه تایمر صفر
ISR(TIMER0_OVF_vect){
i++; اضافه کردن i
if (i==125){sec++; اگر i مساوی 125 شد یک واحد به ثانیه اضافه کن i را برابر صفر قرار بده
i=0;}

TCNT0 = 0x6;مقدار 6 را در تایمر قرار بده
}
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
مدار ساعت با seven segment و تایمر صفر میکرو اتمگا 8
/*
* 7segment.c
*
* Created: 03/29/2025 03:00:15 ب.ظ
* Author : brv
*/



#include <avr/io.h>
#include <util/delay.h> // کتابخانه تاخیر زمانی
#include <avr/interrupt.h>
#define F_CPU 8000000UL // تنظیم کریستال

#define SegOne 0xFE//پین شماره 1 صفر شود
#define SegTwo 0xFD//پین شماره 2 صفر شود
#define SegThree 0xFB//پین شماره 3 صفر شود
#define SegFour 0xF7//پین شماره 4 صفر شود
#define seg_Dir DDRD
#define seg_Port PORTD
#define pi_Dir DDRB
#define pi_Port PORTB
#define pi_PIN PINB
#define set 4 //پین 4 به عنوان دکمه set
#define up 5 //pin5 ==up

#define don 6 //pin6 =don
#define setEvent (pi_PIN & (1<<set)) // setevent= یک بودن پین set
#define upEvent (pi_PIN & (1<<up)) // up event== یک بودن pin up
#define donEvent (pi_PIN & (1<<don)) //don event== یک بودن pin don
uint8_t min,hr,sec,st,cdf,mm;
char seg_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//کد نمایش عددها در نمایشگر 7 قطعه
// تابع منو

void menu(){
uint8_t t=1;
while (!setEvent){_delay_ms (10);}// تا وقتی setevent یک نبود 10 میلی ثانیه بر کن
while (t>0){// تا زمانی که t بزرگتر از صفر است

if (!setEvent){ // هرگاه دکمه ست فشرده شد
while (!setEvent){_delay_ms (10);}
if (t==2){t=0;}
if (t==1){t=2;}




}
if (!donEvent){ // کاهش دقیقه و ساعت
if (t==1){hr++;
if (hr>=24){hr=0;}}
if (t==2){min++;
if (min>=60){min=0;}}

while (!donEvent){_delay_ms (10);}

}
if (!upEvent){ // افزایش دقیقه و ساعت
if (t==1 && hr>0){hr--;
}
if (t==2 && min>0){min--;
}

while (!upEvent){_delay_ms (10);}

}
if((sec%2)==0){cdf=2;}
if (t==1){



display(hr,100);
cdf=1;


}
if (t==2){

display(100,min);
cdf=1;
}


}


}
// تابع نمایشگر سون سکمنت
void display( uint8_t tr ,uint8_t td){
pi_Port = SegOne;

seg_Port = seg_code[tr/10];
_delay_ms(10);// تاخیر یک میلی ثانیه

pi_Port = SegTwo;
seg_Port = seg_code[tr%10];
if (cdf==2){seg_Port |= (1<<7);}
_delay_ms(10);// تاخیر یک میلی ثانیه



pi_Port = SegThree;
seg_Port = seg_code[td/10];
_delay_ms(10);// تاخیر یک میلی ثانیه


pi_Port = SegFour;
seg_Port = seg_code[td%10];
_delay_ms(10);// تاخیر یک میلی ثانیه






}








int main() {
sei();
//int num,i,num1;
TIMSK |= (1<<TOIE0);

TCCR0 |= (1<<CS02);
TCNT0=0x06;
/* تنظیم پورت خروجی */
pi_Dir = 0x0F; // پین 0تا 3
seg_Dir = 0xff; // کنترل 7 قطعه ای
pi_Port=0xFF;
while (1)
{if((sec%2)==0){cdf=2;} display(hr,min);
cdf=1;
while(!setEvent){_delay_ms(10);
menu();}
}


}
// دستورات وقفه صفر
ISR(TIMER0_OVF_vect){
st++;
if(st==125){sec++;
st=0;
TCNT0 = 0x6;
if (sec==60){
min++;
sec=0;
if (min>=60){hr++;
min=0;}
if (hr>=24){
hr=0;

}
}




}





}
 

پیوست‌ها

بالا