اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی C

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

    مشکل در برنامه نویسی C

    سلام دوستان . من مدتیه که خودم شخصا در حال یادگیری برنامه نویسیه AVR در محیط codevision هستم . ولی متاسفانه با مشکلاتی روبرو میشم که برام قابل فهم نیستن . برای نمونه برنامه ای نوشتم که یک جور تایمره و بوسیله اینتراپت سه حالت زمانی 2،4 و 5 ساعته یک خروجی رو فعال که و این درصورتیه که یک تریگر به ورودی اعمال بشه.
    ممنون میشم که به برنامه من نگاهی بندازین و ایرادهامو بگین.
    در ضمن چطور میشه با برنامه ورودیه حساس به لبه نوشت بدون استفاده از اینتراپت.
    ممنون
    کد:
    #include  <mega16.h>
    #include  <delay.h>
    char Hour[3]={2,4,5};
    unsigned char i;
    unsigned char hours;
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    	if(i==3)
    	{
    		i=0;
        hours=Hour[0];
      }
      else
      {
        i++;
    		hours=Hour[i];	
      }
    }
    
    
    
    void main(void)
    {
     unsigned char s;
     unsigned char m;
     unsigned char h;
    
     GICR|=0x40;
     MCUCR=0x00;
     MCUCSR=0x00;
     GIFR=0x40;
     DDRA=0x00;
     PORTA=0xFF;
     DDRB=0xff;
     PORTB=0x00;
    
    
    
     while(1);
      {  if(!PINA.0)
          {
            PORTB.0=1;
            goto  Zaman;
            
          }  
         else
          {
            PORTB.0=0;
          }
             
           
        Zaman:
         
         for(h=0,h<hours,++h)
          {
            for(m=0,m<59,++m)
              {
                for(s=0,s<59,++s)
                  {
                    delay_ms(1000);
                  }
              }   
              
            PORTB.0=0;
          }
      }   
    }
    اگر نداني به کجا ميخواهي بروي، چگونه انتظار داري به آنجا برسي؟!!

    #2
    پاسخ : مشکل در برنامه نویسی C


    نوشته اصلی توسط micro_chip2007
    چطور میشه با برنامه ورودیه حساس به لبه نوشت بدون استفاده از اینتراپت.
    با خوندن مقدار یه پین یا ADC

    دیدگاه


      #3
      پاسخ : مشکل در برنامه نویسی C

      میشه توضیح بدین
      اگر نداني به کجا ميخواهي بروي، چگونه انتظار داري به آنجا برسي؟!!

      دیدگاه


        #4
        پاسخ : مشکل در برنامه نویسی C

        نمی خوام بپرم وسط حرفتون ولی برای یه همچین کاری نیازی نیست cpu اینقد درگیر بشه.
        حساسیت به لبه به چه معنیه ؟

        یعنی وقتی ولتاژ اعمال شده به میکرو با زدن کلید از حالت high به low تغییر وضعیت پیدا کرد میکروی عزیز شما به همون لحظه اول تغییر سطح حساس باش.
        خب این خیلی ساده با گذاشتن شرط if به این صورت که اگر پین مورد نظر به حالت دلخواه تغییر وضعیت داد و همچنین یه متغیر حالت صفر بود کارهای مورد نظر رو انجام بده و سپس متغیر حالت رو به مقدار اول جهت تشخیص های بعدی برگردون.

        موفق باشید
        چرا ناراحتی پاتریک!
        + امروز ی بچه دیدم سرچهارراه گل میفروخت
        - از دیدنش ناراحت شدی؟
        + نه
        پس چی ناراحتت کرده
        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
        ------------------------------------------------------------------------------------------------------
        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
        ------------------------------------------------------------------------------------------------------
        محصولات

        دیدگاه


          #5
          پاسخ : مشکل در برنامه نویسی C

          روشهای بهتری برای برنامه نوشتن هست...بگو میخوای چکار کنی تا بهتر کمک کنیم

          دیدگاه


            #6
            پاسخ : مشکل در برنامه نویسی C

            کد:
            while(1);
            چرا حلقه بینهایت رو بستی ؟

            کد:
            for(h=0,h<hours,++h)
            for(m=0,m<59,++m)
            for(s=0,s<59,++s)
            چرا از و استفاده کردی سمی کولن بزار
            گذشت خصلت مردان است

            دیدگاه


              #7
              پاسخ : مشکل در برنامه نویسی C

              کد:
              #include <io.h>
              #include <delay.h>
              
              const unsigned char Hour[3] = {2,4,5};
              unsigned char i = 0;
              
              interrupt[EXT_INT0] void ext_int0_isr(void) {
               if (++i > 2) {
                i = 0;
               }
              }
              
              void main(void) {
               unsigned char s;
               unsigned char m;
               unsigned char h;
               
               PORTA = ~0;
               DDRA = 0;
               PORTB = 0;
               DDRB = ~0;
               
               GICR |= 0x40;
               MCUCR = 0;
               MCUCSR = 0;
               GIFR = 0x40;
               
               while (1) {
                PORTB.0 = ~PINA.0;
                
                for (h = 0; h < Hour[i]; ++h) {
                 for (m = 0; m < 59; ++m) {
                  for (s = 0; s < 59; ++s) {
                   delay_ms(1000);
                  }
                 }
                 PORTB.0 = 0;
                }
               }
              }
              بهتره از اسلیپ و تایمر استفاده کنی
              گذشت خصلت مردان است

              دیدگاه


                #8
                پاسخ : مشکل در برنامه نویسی C

                جمع بزرگان جمع.
                بله همینطور که دوستان فرمودند نیاز به خواندن adc و .... برای تشخیص لبه نیست.
                همانطور که مستحضرید میکرو کنترلر های سری مگا avr مجهز به پول اپ داخلی می باشند.
                الا ایحال برای شما ابتدا با مقدار دهی رجیستر های ddr پین ها را به صورت ورودی تعیین میکنید.سپس پول اپ داخلی را با مقدار دهی به رجیستر های port فعال میکنید.
                حال به برنامه زیر توجه کنید.
                کد:
                if((PINB.0==1)&(a<1)){
                ************///dastoorati ki mikhahid anjam dahid
                a=1;
                }
                if(PINB.0==0)    //zamani ke kelid be halate addi bargasht
                a=0;
                Someone who can change the world
                ELECTRONIC ENGINEER

                دیدگاه

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