سلام.
من یه سنسور شتاب (ADXL202) دارم که می خوام خروجی های X و Y اون رو که به صورت PWM است،(خروجی ها موج های هم دوره ای دارند) بوسیله ی ATMEGA32 دیوتی سایکلشون رو اندازه بگیرم.
وقتی که میخوام دیوتی سایکل یکی از خروجی ها رو به تنهایی اندازه بگیرم، مشکلی ندارم (فعال کردن اینتراپت صفر و حساس کردن اون به لبه بالا رونده و پائین رونده) .
ولی وقتی که میخوام دیوتی سایکل دو محور رو به صورت همزمان اندازه بگیرم (بوسیله ی اینتراپت صفر برای محور X و اینتراپت یک برای محور Y)، برنامه ای که مینویسم، جواب درستی نمیده (نمیدونم مشکل از نحوه فعال کردن اینتراپت یک در داخل ISR اینتراپت صفره یا چیز دیگه). چون در این میکرو یه تایمر 16 بیتی بیشتر نداریم، مجبور شدم که در هر زمان یکی از اینتراپت ها رو فعال و دیگری رو غیر فعال کنم.
من برنامه ای که نوشتم رو اینجا میذارم، ممنون میشم اگه دوستان برای تصحیحش بهم کمک کنن.
اینم فایل برنامه اگه اینجا نتونستین بخونینش.
http://www.mediafire.com/?o4x1956luzaelog
خدا یک در دنیا و صد در آخرت بهتون عطا کنه!
من یه سنسور شتاب (ADXL202) دارم که می خوام خروجی های X و Y اون رو که به صورت PWM است،(خروجی ها موج های هم دوره ای دارند) بوسیله ی ATMEGA32 دیوتی سایکلشون رو اندازه بگیرم.
وقتی که میخوام دیوتی سایکل یکی از خروجی ها رو به تنهایی اندازه بگیرم، مشکلی ندارم (فعال کردن اینتراپت صفر و حساس کردن اون به لبه بالا رونده و پائین رونده) .
ولی وقتی که میخوام دیوتی سایکل دو محور رو به صورت همزمان اندازه بگیرم (بوسیله ی اینتراپت صفر برای محور X و اینتراپت یک برای محور Y)، برنامه ای که مینویسم، جواب درستی نمیده (نمیدونم مشکل از نحوه فعال کردن اینتراپت یک در داخل ISR اینتراپت صفره یا چیز دیگه). چون در این میکرو یه تایمر 16 بیتی بیشتر نداریم، مجبور شدم که در هر زمان یکی از اینتراپت ها رو فعال و دیگری رو غیر فعال کنم.
من برنامه ای که نوشتم رو اینجا میذارم، ممنون میشم اگه دوستان برای تصحیحش بهم کمک کنن.
اینم فایل برنامه اگه اینجا نتونستین بخونینش.
http://www.mediafire.com/?o4x1956luzaelog
خدا یک در دنیا و صد در آخرت بهتون عطا کنه!
کد:
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#include <lcd.h>
unsigned int T1x,T2xs,T2ys,T1y;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (MCUCR==0x02)
{
T1x=TCNT1;
TCNT1=0;
MCUCR=0x03;
}else
{
T2xs=TCNT1;
TCNT1=0;
GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;
}
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(MCUCR==0x08)
{
T1y=TCNT1;
TCNT1=0;
MCUCR=0x0c;
}else
{
T2ys=TCNT1;
TCCR1B=0;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
}
}
void main(void)
{
TCCR1B=0x01;
GICR|=0xc0;
MCUCR=0x0A;
GIFR=0xc0;
lcd_init(16);
#asm
.equ __lcd_port=0x18;
#endasm
#asm("sei")
while (1)
{
unsigned int c,d;
char str[16],str2[16],str3[16],str4[16];
delay_ms(200);
lcd_clear();
sprintf(str,"Tx=%u",T1x);
lcd_puts(str);
delay_ms(100);
lcd_gotoxy(0,1);
c=T1x+T2xs;
sprintf(str2,"Zx=%u",c);
lcd_puts(str2);
delay_ms(100);
lcd_gotoxy(8,0);
sprintf(str3,"Ty=%u",T1y);
lcd_puts(str3);
delay_ms(100);
lcd_gotoxy(8,1);
d=T1y+T2ys;
sprintf(str4,"Zy=%u",d);
lcd_puts(str4);
}
}


دیدگاه