اطلاعیه

Collapse
No announcement yet.

مشکل در شمارش 0 تا 60

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

    مشکل در شمارش 0 تا 60

    سلام بر همه مهندسین
    دوستان من یه برنامه ای نوشتم که کدشو براتون میزارم تو این برنامه می خواستم که سون سگمنت مالتی پلکس کاتد مشترک من از 0 تا 59 رو بشماره و و خروجی پورت B به ترتیب به سگمنت وصل شده باشه منتها وقتی من این میکرو رو به سگمنت تو پروتوئوس وصل میکنم عدد روی سگمنت روی صفر میمونه تقریبا یه هفته ای دارم فکر میکنم به جایی نرسیدم کسی میتونه منو راهنمایی کنه؟
    اصول کار هم اینه که تایمرم به ازای هر بار overflow در وقفه یکی به m اضافه میکنه و اگه مقدار m =4 بشه ( 4*256ms) حدود یک ثانیه یدونه به سگمنت اضافه میکنه و....
    کد:
    #include <mega8.h>
    #include <delay.h>  
    int m ;
    int n ;
    int R ;
    
    flash unsigned char S[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
    
    
    void main(void)
    {
    
    DDRB=0xFF;
    
    DDRD=(1<<DDD0 )| (1<<DDD1) ;
    TCCR0=0x05; 
    TCNT0=0x00;              
    TIMSK=1<<TOIE0;
    
    
    #asm("sei")
    
    while (1) {
    
       
       PORTD =0x02 ;
       PORTB=S[n] ; 
       delay_ms(12);     
        
    }
      
    }
    
     ////////////////////////
    interrupt [10] void timer0_ovf_isr(void)
    {
    
    m = m++ ;
     if ( m==4){
     n=n++;
       if(n==10){
       n=0;   
       }  
     R=R++;
       if(R==60){
       R=0 ;
       }
       
     }   
    }
    رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

    #2
    پاسخ : مشکل در شمارش 0 تا 60

    نوشته اصلی توسط pencil
    سلام بر همه مهندسین
    دوستان من یه برنامه ای نوشتم که کدشو براتون میزارم تو این برنامه می خواستم که سون سگمنت مالتی پلکس کاتد مشترک من از 0 تا 59 رو بشماره و و خروجی پورت B به ترتیب به سگمنت وصل شده باشه منتها وقتی من این میکرو رو به سگمنت تو پروتوئوس وصل میکنم عدد روی سگمنت روی صفر میمونه تقریبا یه هفته ای دارم فکر میکنم به جایی نرسیدم کسی میتونه منو راهنمایی کنه؟
    اصول کار هم اینه که تایمرم به ازای هر بار overflow در وقفه یکی به m اضافه میکنه و اگه مقدار m =4 بشه ( 4*256ms) حدود یک ثانیه یدونه به سگمنت اضافه میکنه و....
    کد:
    #include <mega8.h>
    #include <delay.h>  
    int m ;
    int n ;
    int R ;
    
    flash unsigned char S[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
    
    
    void main(void)
    {
    
    DDRB=0xFF;
    
    DDRD=(1<<DDD0 )| (1<<DDD1) ;
    TCCR0=0x05; 
    TCNT0=0x00;              
    TIMSK=1<<TOIE0;
    
    
    #asm("sei")
    
    while (1) {
    
       
       PORTD =0x02 ;
       PORTB=S[n] ; 
       delay_ms(12);     
        
    }
      
    }
    
     ////////////////////////
    interrupt [10] void timer0_ovf_isr(void)
    {
    
    m = m++ ;
     if ( m==4){
     n=n++;
       if(n==10){
       n=0;   
       }  
     R=R++;
       if(R==60){
       R=0 ;
       }
       
     }   
    }
    دوست عزیز من برنامتون رو گذرا نگاه کردم. چند تا چیز مبهمه:
    1- اولا فرکانس کاری میکرو چنده؟ احتمالا 1MHz؟ اگر اینطوریه خوب مشکلی نیست.
    2- جایی که چک میکنی m مساوی چهار شده یا نه، m رو بعدش صفر نکردی و به خاطر همین وقتی m چهار بشه دستورات اجرا میشه ولی دفعه بعدی که اینتراپت اجرا بشه، m میشه 5 و دستورات اجرا نمیشه و همینطور m بزرگ میشه.
    3- این یعنی چی؟ DDRD=(1<<DDD0 )| (1<<DDD1)
    4- شما مالتی پلکس رو کجا انجام میدی؟ یعنی بین دو تا سون سگمنت من ندیدم جایی مالتی پلکس انجام بدی.
    5- افزایش R باید در داخل شرط if(n==10) انجام بشه نه بیرون اون.

    اینا رو تصحیح کن اگه درست نشد بگو

    دیدگاه


      #3
      پاسخ : مشکل در شمارش 0 تا 60

      سلام دوست عزیز تشکر
      کارایی که گفتید ر انجام دادم یعنی مشکل این بود که m رو صفر نکردم و R باید داخل n قرار میدادم که با راهنمایی شما مشکل حل شد :wow:
      رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

      دیدگاه


        #4
        پاسخ : مشکل در شمارش 0 تا 60

        فقط یه سوالی درباره مالتی پلکس کردن
        من برای مالتی پلکس کردن پایه d0 رو یک کرده portb رو مقدار دهی میکنم بعد یه تاخیر میدم بعدش d0 رو غیر فعال و d1 رو فعال میکنم ودولاره portb رو مقدار دهی میکنم و بعد دوباره یه تاخیر
        به نظرتون این کاری که من میکنم اشتباه هست؟ یعنی شیوه مالتی پلکس کردن همینه؟
        رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

        دیدگاه


          #5
          پاسخ : مشکل در شمارش 0 تا 60

          نوشته اصلی توسط pencil
          فقط یه سوالی درباره مالتی پلکس کردن
          من برای مالتی پلکس کردن پایه d0 رو یک کرده portb رو مقدار دهی میکنم بعد یه تاخیر میدم بعدش d0 رو غیر فعال و d1 رو فعال میکنم ودولاره portb رو مقدار دهی میکنم و بعد دوباره یه تاخیر
          به نظرتون این کاری که من میکنم اشتباه هست؟ یعنی شیوه مالتی پلکس کردن همینه؟
          :nerd: شیوه ی مالتی پلکس کردم دقیقا همین جوریه دوست عزیز!
          آنچه كه باعث موفقيت انسان ها مي شود سخت كوشي است و نه نخبه بودن! Porsche 911 Turbo S 181.000 $ USD
          جناب سعدی فرموده بودند: "بر احوال ان مرد باید گریست _ که دخلش بود نوزده، خرجش بیست!"
          که اگه الان بود باید میگفت: "بود حال و احوال آن مرد زار _ که دخلش ریال است ، خرجش دلار :|"
          http://www.eca.ir/forum2/index.php?topic=80472.msg489565#msg489565
          http://www.eca.ir/forum2/index.php?topic=82242.msg501926#msg501926

          دیدگاه

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