ايران ويج

نسخه‌ی کامل: پروگرامر usb كه كار كرد ولي حالا ...
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
(۱۷-تير-۱۳۹۱, ۱۰:۲۴:۰۱)sharin نوشته است: [ -> ]شما سوال قبلي تون كلا يه چيز بود و اين سوالتون يه چيز ديگه ... !
در كل Switch case و if و ... يه جورهه ، بستگي به خودت دارهه كه با كدوميشون حال كني ...
چيزي رو كه گفتيد هم عملي هست.همين رو با IF هم مي شه نوشت ...
در كل يك روش واحد وجود ندارهه ...
بله . من قبلا" ويژوال بيسيك كار كردم و اين چيزا رو مي‌دونم .در كل براي اين كه بتونم يه دكمه براي pb0 بذارم و وقتي اون را فشار دادم در همان لحظه حالت چشمك زدن عوض بشه بايد چكار كنم؟
تو ويژوال بيسيك چيزي داشتيم به نام {رويداد} مثلا" mouse_click و وقتي با ماوس كليك مي‌كردي كاري را كه مي‌خواستي انجام مي‌داد حالا مي‌خوام بدونم چطور ميشه به ميكرو فهموند كه وقتي pb0 يك شد در همان لحظه مقدار n (كه روش چشمك زدن رو تغيير مي‌ده) رو تغيير بده.ديگه نمي‌دونم چطور بگم.Amaze
باید از اینتراپت ها استفاده کنید.
تعداد محدودی از پورت های سری MEGA اینتراپت یا وقفه خارجی دارند. مثل INT0 و INT1 و INT2.
در CodeWizardAVR در سربرگ External IRQ میتونید سخت افزارش رو تنظیم کنید.
با فعال کردن هر یک از INTX یک تابع به برنامه تان اضافه میشه. در صورت فعال شدن هر یک از وقفه ها، خط اجرای برنامه به زیر برنامه INT مورد نظر پرش میکند.
(۱۷-تير-۱۳۹۱, ۱۳:۱۳:۴۸)Pardazesh-Gar نوشته است: [ -> ]باید از اینتراپت ها استفاده کنید.
تعداد محدودی از پورت های سری MEGA اینتراپت یا وقفه خارجی دارند. مثل INT0 و INT1 و INT2.
در CodeWizardAVR در سربرگ External IRQ میتونید سخت افزارش رو تنظیم کنید.
با فعال کردن هر یک از INTX یک تابع به برنامه تان اضافه میشه. در صورت فعال شدن هر یک از وقفه ها، خط اجرای برنامه به زیر برنامه INT مورد نظر پرش میکند.
خدا خيرت بده . آفرين .SmileClap
حالا كه زبانه‌ي external irq را باز كردم و tab0 را فعال كردم يه mode داره .بايد كدومش را بزنم ؟
در ضمن كدام پايه ي ميكروي مگا 32 به همين tab0 مربوط مي‌شه؟
خوب دوست من همون اول همين رو مي گفتي ... !!

اون مودي كه نوشته حساسيتش رو تعيين مي كنه ...
مثلا با اومدن لبه ي پايين رونده برهه به وقفه ...
شمارهه پايه هم بايستي از روي pinout در datasheet ميكرو چك كنيد. با نام INT0/1 و ...
شما بهترهه با كتاب بريد جلو ...
تمام اين چيزا در كتاب ها گفته شدن ...

موفق باشيد.
(۱۷-تير-۱۳۹۱, ۱۴:۰۸:۱۳)sharin نوشته است: [ -> ]خوب دوست من همون اول همين رو مي گفتي ... !!

اون مودي كه نوشته حساسيتش رو تعيين مي كنه ...
مثلا با اومدن لبه ي پايين رونده برهه به وقفه ...
شمارهه پايه هم بايستي از روي pinout در datasheet ميكرو چك كنيد. با نام INT0/1 و ...
شما بهترهه با كتاب بريد جلو ...
تمام اين چيزا در كتاب ها گفته شدن ...

موفق باشيد.

خيلي ممنونم . حالا كه ديدم اگر PD2 كه int0 هست را انتخاب كنم و led ها رو به پورت C وصل كنم به هدفم مي‌رسم.خيلي ممنونم.
به توصيه ‌ي شما كتاب هم خوندم.ولي يه چيزايي درباره لبه پايين رونده و بالارونده و... نوشته بود.آخرش من نفهميدم براي اينكه با فشار كليدي كه به INT0 وصله ، وقفه اجرا بشه بايد كدوم MODE رو انتخاب كنم؟همچنين آن سر كليد بايد به كجا وصل بشه؟(مثبت يا منفي)
در ضمن مي‌خوام وقتي روتين وقفه اجرا شد مقدار n افزايش پيدا كنه .اون كد هايي كه براي افزايش n بهم معرفي كردم رو بايد كجا بنويسم(آخهcodewizard وقتي كد توليد مي‌كنه دو قسمت داره با عنوان (PLACE YOUR CODE HERE) كه يكيش قبل كد اينتراپته و اون يكيش توي حلقه‌ي وايل (1) است).
ببخشيد زياد توضيح دادم.
به چند روش مي شه كليد رو طراحي كرد. بسته به نوع كليدي كه مي بندي حساسيت به لبه رو مشخص مي كني ، و يا بلعكس.
اضافه شدن n رو هم در روال وقفه بايستي بنويسيد نه در while
كلا همه چيز واضح هست ، فقط اگر خودتون هم كمي آزمون خطا كنيد ، هم تجربه اتون بيشتر مي شه و هم زودتر به جواب مي رسيد.

موفق باشيد.
بله فرمايش شما متينه . ولي پدرم در اومد از بس آزمون و خطا كردم لطفا" كمكم كنيد .اين كد برنامه ي منه توي Switch Case حالت هاي تايمر رو گذاشتم.يه دكمه شستي به پايه PD2 وصل كردم .(اون سر دكمه به كجا بايد وصل بشه).اين برنامه رو توي پروتئوس شبيه سازي كردم ولي n همون 1 مي‌مونه و فقط حالت اول چشمك زدن اجرا مي‌شه.اين كد كجاش اشكال داره؟(LED ها به پورت C وصلند)
کد:
Chip type : ATmega32
Program type : Application
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
*********************************************/

#include <mega32.h>
#include <delay.h>
// External Interrupt 0 service routine
int i,n=1;

interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (n<6)
{
n=n+1;
}
if (n=6)
{
n=1;
}
}

// Declare your global variables here

void main(void)
{
DDRC=0xFF;
GICR|=0x40;
MCUCR=0x01;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
switch(n)
{
case 1:
for(i = 1; i <= 64; i = i*4)
{
PORTC = i;
delay_ms(500);
}
for(i = 128; i >= 2; i = i/4)
{
PORTC = i;
delay_ms(500);
}
break;
/******************************/
case 2:
PORTC=0b10101010;
delay_ms(500);
PORTC=0b01010101;
delay_ms(500);
PORTC=0b11110000;
delay_ms(500);
PORTC=0b00001111;
delay_ms(500);
break;
/*****************************/
case 3:
for(i = 1; i <= 128; i = i*2)
{
PORTC = i;
delay_ms(500);
}




for(i = 128; i >= 1; i = i/2)
{
PORTC = i;
delay_ms(500);
}
break;
/****************************/
case 4:
for(i=1;i<=255;i=(i*2)+1)
{
PORTC=i;
delay_ms(500);
}
for(i=255;i>=1;i=(i-1)/2)
{
PORTC=i;
delay_ms(500);
}
PORTC=0b0;
delay_ms(500);
break;
/***************************/
case 5:
for(i=1;i<=255;i=(i*2)+1)
{
PORTC=i;
delay_ms(500);
}
PORTC=0b11111110;
delay_ms(500);
PORTC=0b11111100;
delay_ms(500);
PORTC=0b11111000;
delay_ms(500);
PORTC=0b11110000;
delay_ms(500);
PORTC=0b11100000;
delay_ms(500);
PORTC=0b11000000;
delay_ms(500);
PORTC=0b10000000;
delay_ms(500);
PORTC=0b0;
delay_ms(500);
break;
/*******************/
case 6:
PORTC=0b11000011;
delay_ms(500);
PORTC=0b00111100;
delay_ms(500);
PORTC=0b00011000;
delay_ms(500);
PORTC=0b11100111;
delay_ms(500);
break;
}
};
}
نقل قول: ولي پدرم در اومد از بس آزمون و خطا كردم لطفا" كمكم كنيد
اين كه فقط يك كليدهه ...
هنوز مونده تا ...
... و چه آزمون خطا هايي پيش روست !

کد:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (n<6)
{
n=n+1;
}
if (n=6)
{
n=1;
}
}

اين درسته ، اما كار اضافه انجام دادي ، به سبك پايين مي توني بهينه اش كني.

کد php:
interrupt [EXT_INT0void ext_int0_isr(void)
{
n++;
}
if (
n>5)
{
n=1;
}

شرط هاي حلقه ي For رو هم شايد بهتر باشه به سبك زير بنويسي ...
مثلا :
کد:
for(i = 1; i <= 64; i = i*4)
رو به صورت زير بنويس :
کد php:
for(165i*4

در كل مشكل خاصي به چشم نخورد ...

شما وقتي كليد رو هنوز طراحي نكرديد ، پس نبايد انتظار داشته باشيد مقدار n هم زياد بشه ...
اين كه كليد رو چطوري طراحي كنيد ، راحت ترين كار اينه كه يك نمونه ببينيد. ( توي net يه سرچي بزنيد يا از كتاب هايي كه پروژه انجام شده دارن ، سخت افزار كليد رو نگاه كنيد. )
بعد اون رو تحليل كنيد و لبه ي پايين و يا بالا رونده ساز بودن اش رو درك كنيد.
منظورم از آزمون خطا اين نيست كه همينجوري الكي وصل كني ! ، بلكه اينه كه يه ايده ي پايه داشته باشي و از همه ي لحاظ تستش كني و اشكالاتش رو پيدا كني و بتوني به طراحي درست برسي.
ايده ي پايه : پايه ي ميكرو رو پول آپ ( PULLUP ) مي كني ، يك سر كليد رو به همون پايه مي زني و سر ديگه اش رو به زمين.
اينطوري در حالت عادي ولتاژ پايه 5V هست ، وقتي كليد رو بزني ، پايه به زمين وصل مي شه و ولتاژ پايه صفر خواهد شد.
پس ، تغيير وضعيت از 5V به 0V يعني چي ؟ يعني لبه ي پايين رونده.
از نظر تئوري اين مدار كليد كاملا درست هست. مي ري جلوتر مي بيني كه يه سري مشكلاتي در عمل دارهه !
( وقتي به صورت مكانيكي ارتباطي رو برقرار مي كني ،‌ در سيگنال يه لرزشي به وجود مي ياد )
حالا بايد براي حل اين ايده بدي . به صورت نرم افزاري مي شه حل اش كرد ، به صورت سخت افزاري هم با استفاده از يك خازن ( در نقش فيلتر پايين گذر ) ( يا سازنده ي تاخير به قولي ! ) مي شه مشكل رو برطرف كرد و ...

منظورم از آزمون خطا اينه ...
كمي سرچ كنيد + آزمون خطا به سبك بالا ...
صفحه‌ها: 1 2