اطلاعیه

Collapse
No announcement yet.

عدم وقوع وقفه سرریزی دو تایمر

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

    عدم وقوع وقفه سرریزی دو تایمر

    با سلام،
    من می خواستم از وقفه سرریزی تایمرهای 0 و 2 توی برنامم استفاده کنم. که تایمر2 به صورت آسنکرون و از طریق کریستال ساعت که متصل به TOSC1 و TOSC2هست کلاک می گیره. ولی مشکل اینجاس که فقط وقفه تایمر0 اجرا میشه! یعنی با اینکه تایمر2 وقفه اش اولویت داره به تایمر0 ولی بازم...
    قبل از اینکه بخوام از وقفه تایمر0 استفاده کنم، وقفه تایمر2 که برای ساعت هست به خوبی انجام میشد! :NO:

    در ضمن برنامه رو با ATMEL STUDIO (WinaAVR)i نوشتم برنامه رو!

    P.S: رجیستر ها رو هم چک کردن چندبار و درست ست شدن :agree:

    با تشکر

    «پشتکار» «پشتکار» «پشتکار»

    #2
    پاسخ : عدم وقوع وقفه سرریزی دو تایمر

    سلام دوست عزیز
    چون وقتی یک وقفه رخ میده و پروگرم کانتر به آدرس ساب روتین اون وقفه میره ، میزنه وقفه های دیگه رو غیر فعال میکنه ، من اولش فکر کردم که وقفه تایمر 0 زودتر رخ میده و وقتی پروگرم کانتر تو ساب روتین وقفه 0 هست ، وقفه تایمر 2 miss میشه ، اما دیدم که اینطور نیست و پرچم تایمر 2 یک میمونه تا پروگرم کانتر از ساب روتین تایمر صفر برگرده و با اولین کلاک به ساب روتین تایمر 2 میره ، چییی شد ، اگه برنامه ات رو بذاری میتونیم بیشتر کمکت کنیم

    دیدگاه


      #3
      پاسخ : عدم وقوع وقفه سرریزی دو تایمر

      دوست من مورد اول اینکه باید وقفه سرارسری فعال باشه ، که انشاا.. این کار رو کردید
      مورد دوم اولویت وقفه اینطوری تعیین میشه :

      کد:
      isr1()
      {
      }
      isr2()
      {
      }
      و ...
      اول اولویت با وقفه 1
      سپس وقفه 2
      الی آخر

      حدالامکان تو subrotine وقفه از تاخیر استفاده نکیند چون باعث میشه ما بقی وقفه ها اجرا نشه
      دلا خو کن به تنهایی که از تنها بلا خیزد

      دیدگاه


        #4
        پاسخ : عدم وقوع وقفه سرریزی دو تایمر

        نوشته اصلی توسط scienceaddict
        سلام دوست عزیز
        چون وقتی یک وقفه رخ میده و پروگرم کانتر به آدرس ساب روتین اون وقفه میره ، میزنه وقفه های دیگه رو غیر فعال میکنه ، من اولش فکر کردم که وقفه تایمر 0 زودتر رخ میده و وقتی پروگرم کانتر تو ساب روتین وقفه 0 هست ، وقفه تایمر 2 miss میشه ، اما دیدم که اینطور نیست و پرچم تایمر 2 یک میمونه تا پروگرم کانتر از ساب روتین تایمر صفر برگرده و با اولین کلاک به ساب روتین تایمر 2 میره ، چییی شد ، اگه برنامه ات رو بذاری میتونیم بیشتر کمکت کنیم
        والا منم نفهمیدم چی گفتین :biggrin: ولی خب این چیزایی که من از توش درآوردم رو که خب درست بود
        نوشته اصلی توسط Navid_Micro
        دوست من مورد اول اینکه باید وقفه سرارسری فعال باشه ، که انشاا.. این کار رو کردید
        مورد دوم اولویت وقفه اینطوری تعیین میشه :

        کد:
        isr1()
        {
        }
        isr2()
        {
        }
        و ...
        اول اولویت با وقفه 1
        سپس وقفه 2
        الی آخر

        حدالامکان تو subrotine وقفه از تاخیر استفاده نکیند چون باعث میشه ما بقی وقفه ها اجرا نشه
        از تأخیر کلاً تو برنامه هام استفاده نمی کنم زیاد چه برسه داخل وقفه!
        با این اولویت باز وقفه تایمری که اولویت 2 رو دادم اجرا نمیشه

        «پشتکار» «پشتکار» «پشتکار»

        دیدگاه


          #5
          پاسخ : عدم وقوع وقفه سرریزی دو تایمر

          برنامه رو بزار تا ببینیم چیکار کردی !!!
          دلا خو کن به تنهایی که از تنها بلا خیزد

          دیدگاه


            #6
            پاسخ : عدم وقوع وقفه سرریزی دو تایمر

            تازه جالب اینجاس از ISR1 و ISR2 استفاده می کنم بدترم میشه! یعنی فرقی نداره کدوم تایمر رو اولویت میدم، کلاً مالتی پلکسش هم بهم میریزه!!!
            روش های زیادی امتحان کردم ولی نشد که نشد!!!!

            این هم کدها:
            کد:
            #include <avr/io.h>
            #include <avr/interrupt.h>
            #include "avrlibdefs.h"
            #include <stdio.h>
            #include "a2d.c"
            
            unsigned int h=12,m=0,s=0,m1=0,m2=0,h1=0,h2=0,temp=0,t1=0,t2=0,t3=0,counter2=0,counter0=0,adc_counter=0,shift=0,adc=0,i=1;
            
            
            ISR(TIMER0_OVF_vect)
            {
            	
            	shift++;
            	if(shift==4)
            	shift=0;
            	
            }
            
            
            ISR(TIMER2_OVF_vect)
            {
            	adc_counter++;
            	counter2++;
            	if (counter2==4)
            	{
            		counter2=0;
            		s++;
            	}
            	if(s==60)
            	{s=0;
            	m++;}
            	if(m==60)
            	{m=0;
            	h++;}
            	if(h==13)
            	h=1;
            
            	if (PINC&0b10)
            	{
            		
            		if(!(PINC&0b1000))
            		{
            			if(h<13)
            			h++;
            			if(h==13)
            			h=1;
            		}
            
            		if(!(PINC&0b100))
            		{
            			if(m<60)
            			m++;
            			if(m==60)
            			m=0;
            		}
            	}
            	
            }
            
            
            int main(void)
            {
            	
            	PORTA=0x00;
            	DDRA=0x00;
            	PORTB=0x00;
            	DDRB=0x1F;
            	PORTC=0x00;
            	DDRC=0x70;
            	PORTD=0x00;
            	DDRD=0xFF;
            	
            	ASSR=0x08;
            	TCCR2=0x03;
            	
            	TCCR0=0x03;
            	
            	TIMSK=0x41;
            	
            	sei();
            	
            	a2dInit();
            	
            	
              while(1)
              {
                //TODO:: Please write your application code 
            		adc=a2dConvert10bit(ADC_CH_ADC0);
            		if(i==1)
            		{
            			i=0;
            			temp=adc;
            		}
            		if(adc_counter==40)
            		{
            			adc_counter=0;
            			temp=adc;
            		}
            
            		m1=m%10;
            		m2=m/10;
            		h1=h%10;
            		h2=h/10;
            
            		t1=temp%10;
            		t2=(temp%100)/10;
            		t3=(temp%1000)/100;
            		
            		
            		if(PINC&0b10)
            		{
            			sbi(PORTB,0);
            			if(shift==0)
            			{
            				switch(m1)
            				{
            					case 0:PORTD=0x3f;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,2);
            				cbi(PORTB,3);
            				cbi(PORTB,5);
            				sbi(PORTB,1);
            			}
            			else
            			
            			if(shift==1)
            			{
            				switch(m2)
            				{
            					case 0:PORTD=0x3f;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,1);
            				cbi(PORTB,3);
            				cbi(PORTB,5);
            				sbi(PORTB,2);
            			}
            			else
            			if(shift==2)
            			{
            				switch(h1)
            				{
            					case 0:PORTD=0x3f;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,2);
            				cbi(PORTB,1);
            				cbi(PORTB,5);
            				sbi(PORTB,3);
            			}
            			else
            			if(shift==3)
            			{
            				switch(h2)
            				{
            					case 0:PORTD=0x00;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,2);
            				cbi(PORTB,3);
            				cbi(PORTB,1);
            				sbi(PORTB,5);
            				
            			}
            			
            		}
            		else
            		if(!(PINC&0b10))
            		{
            			cbi(PORTB,0);
            			if(shift==0)
            			{
            				
            				switch(t1)
            				{
            					case 0:PORTD=0x3f;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,1);
            				cbi(PORTB,3);
            				cbi(PORTB,5);
            				sbi(PORTB,2);
            			}
            			else
            			if(shift==1)
            			{
            				switch(t2)
            				{
            					case 0:PORTD=0x3f;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,2);
            				cbi(PORTB,1);
            				cbi(PORTB,5);
            				sbi(PORTB,3);
            			}
            			else
            			if(shift==2)
            			{
            				switch(t3)
            				{
            					case 0:PORTD=0x00;
            					break;
            					case 1:PORTD=0x06;
            					break;
            					case 2:PORTD=0x5b;
            					break;
            					case 3:PORTD=0x4f;
            					break;
            					case 4:PORTD=0x66;
            					break;
            					case 5:PORTD=0x6d;
            					break;
            					case 6:PORTD=0x7d;
            					break;
            					case 7:PORTD=0x07;
            					break;
            					case 8:PORTD=0x7f;
            					break;
            					case 9:PORTD=0x6f;
            					break;
            					default:PORTD=0x40;
            				}
            				cbi(PORTB,2);
            				cbi(PORTB,3);
            				cbi(PORTB,1);
            				sbi(PORTB,5);
            			}
            		}
            		
              }
            }

            «پشتکار» «پشتکار» «پشتکار»

            دیدگاه


              #7
              پاسخ : عدم وقوع وقفه سرریزی دو تایمر

              مشکل حل شد...
              پایه های کریستال چرب شده بودن بهم ریخته بود!!!

              و در مورد اولویت وقفه ها و ISR1 و 2 حالا واسه من که کار نکرد و فکرم نکنم کلاً کار کنه! آخه وقتی توی دیتاشیت خودش اولیت بندی کرده مگه میشه تغییرش داد؟! :|

              باز هم تشکر از پاسخ دوستان

              «پشتکار» «پشتکار» «پشتکار»

              دیدگاه

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