اطلاعیه

Collapse
No announcement yet.

سوال در باره یک برنامه خیلی ساده + فایل پروتئوس

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سوال در باره یک برنامه خیلی ساده + فایل پروتئوس

    سلام به همگی

    من یه برنامه ای نوشتم که در آن میخوام با یک میکروی ATmega32 چهار تا LED رو پورت B رو با وقفه های دو کلید ورودی روی پورت D کنترل کنم. LED ها بصورت متوالی روشن و خاموش میشن و با زدن وقفه اول روشن شدن LED ها یک واحد میره عقب و با زدن وقفه دوم هم روشن و خاموش شدن LED ها یک واحد میره جلو ولی نمیدونم چرا برنامه در محیط کدویژن 9 تا ارور میده!!!

    این لینک این پروژه است که 45 کیلوبایت بیشتر نیست:

    http://s2.picofile.com/file/7158254943/led_test_in

    منطق برنامه ام به این صورت هست که چهار تا LED بصورت رقص نور یکی یکی روشن و خاموش میشن و با زدن INT0 چک میکنیم که PORTD.2 که الان 1 شده در همین لحظه کدام پورت مربوط به LED هم از طرف دیگر میکرو 1 شده و بلافاصله یک delay میدهیم و از LED شماره ی قبلی پروسه روشن و خاموش شدن رو ادامه میدهیم و عینا همین کار رو برای INT1 اجرا میکنیم منتها اینبار از شماره بعدی بجای قبلی کار را ادامه میدهیم.

    امیدوارم تونسته باشم منظورم رو برسونم.

    درضمینه AVR خیلی مبتدی هستم. خواهشا این برنامه رو در کدویژن خودتون اجرا کنید و بفرمایید که عیبهای آن چی هستند.


    ممنونم

    #2
    پاسخ : سوال در باره یک برنامه خیلی ساده + فایل پروتئوس

    با سلام
    اشکالی که اول از همه من دیدم اینه که شما به نظرم درست نحوه استفاده از ساختار switch رو متوجه نشدید بعضی جا ها هم آکولاد نزاشتید اگه میشه از تکرار کد ها اجتناب کنید یک خورده برنامه رو ساده کنید کاری که میخواهید بکنید اونقدر پیچیده نیست که برنامتون شون میده
    یک توضیح در مورد switch میدم ببینید میتونید مشکلتون رو حل کنید :
    ساختار تصمیم switch
    فرم کلی این دستور :

    switch (عبارت) {
    case مقدار1 :
    مجموعه دستورات 1
    break;
    case مقدار2 :
    مجموعه دستورات 2;
    break;
    case مقدار3 :
    مجموعه دستورات3;
    break;
    .
    .
    .
    default:
    مجموعه دستورات حالت پیشفرض;
    };
    \\-----------------------------------------------

    در این ساختار همواره مقادیر 1 تا n با عبارت موجود در آرگومان switch مقایسه شده و هر قسمت که با آن مدارش برابر بود
    مجموعه دستوراتش اجرا شده و از ساختار switch خارج میشود ؛ اگر هم هیچکدام از مقادیر با عبارت برابر نباشند
    مجموعه دستورات قسمت default اجرا شده و سپس از ساختار خارج می شود که البته این قسمت اختیاری
    است و درصورت ننوشتن این قسمت مسلما حالت پیشفرضی برای ساختار پیش بینی نشده

    دیدگاه


      #3
      پاسخ : سوال در باره یک برنامه خیلی ساده + فایل پروتئوس

      ممنونم از اینکه وقت میذارید و به سوالات من پاسخ میدید.

      کلا switch ها انگار تو این برنامه مشکل دارند لذا برنامه رو با if راه اندازی کردم و تونستم تمامی ارور ها رو رفع کنم.
      اما نمیدونم چرا وقفه ها فقط یکبار اجرا میشن...!!! :sad:

      فایل های جدید رو مجددا پلود کردم:
      http://s2.picofile.com/file/7158477739/led_test_intrupt_2.rar.html

      اگر زحمتی نیست بزرگواری بفرمایید و یک نگاهی به این فایلها بیندازید. فایل پروتئوس رو هم امتحان کنید تا منظور من رو بهتر متوجه بشید.

      ممنونم

      دیدگاه


        #4
        پاسخ : سوال در باره یک برنامه خیلی ساده + فایل پروتئوس

        دوست عزیز ببخشید ، شما که رشتتون کامپیوتر باید از همه قابلیت های زبان برای برنامه نویسی استفاده کنید ولی اصلا رقبتی برای اینکار رو نشون نمیدید چرا ؟ نمیخواستم اینکارو بکنم اما واقعا خوندن برنامه تون همیچین حوصله میخواد با توجه به مطالبی که فرمودید من این برنامهتون رو با اجازتون اصلاح کردم ببینید چطوره :

        کد:
        #include <mega32.h>
        #include <delay.h>
        
        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        // Place your code here
        if(PORTB>1)PORTB>>=1;
        }
        
        // External Interrupt 1 service routine
        interrupt [EXT_INT1] void ext_int1_isr(void)
        {
        // Place your code here
        if(PORTB<5)PORTB<<=1;
        }
        
        // Declare your global variables here
        
        void main(void)
        {
        
        // Port B initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTB=0x01;
        DDRB=0x0f;
        
        // Port C initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTC=0x00;
        DDRC=0x00;
        
        // Port D initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=P State2=P State1=T State0=T
        PORTD=0x0C;
        DDRD=0x00;
        
        
        
        // External Interrupt(s) initialization
        // INT0: On
        // INT0 Mode: Falling Edge
        // INT1: On
        // INT1 Mode: Falling Edge
        // INT2: Off
        GICR|=0xC0;
        MCUCR=0x0A;
        MCUCSR=0x00;
        GIFR=0xC0;
        
        
        
        
        // Global enable interrupts
        #asm("sei")
        
        while (1)
           {
           // Place your code here
        if(PORTB<5)PORTB<<=1;
        else PORTB=0X01;
        delay_ms(1000);
           }
        }

        دیدگاه

        لطفا صبر کنید...
        X