اطلاعیه

Collapse
No announcement yet.

اشتباه بودن فرکانس میکرو

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

    اشتباه بودن فرکانس میکرو

    سلام

    من یک اتمگا 16 دارم ، روی هر فرکانسی که میزارمش اون مقدار اصلی خودش نیست!!!!!!!!!!!

    مثلا برنامه زیر را نوشتم

    کد:
    [left]/*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.4a Advanced
    Automatic Program Generator
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 2010/12/23
    Author : NeVaDa
    Company : Eletronic
    Comments: 
    
    
    Chip type        : ATmega16
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega16.h>
    #include <delay.h>
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A 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 
    PORTA=0x00;
    DDRA=0x00;
    
    // 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=0x00;
    DDRB=0x00;
    
    // 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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    while (1)
       {
       // Place your code here  
       delay_ms(1000);
       PORTD=0xFF;
       delay_ms(1000);
       PORTD=0x00;
    
       };
    }
    [/left]
    به جای یک ثانیه سه چهار ثانیه توقف میکنه oo:

    فیوز بیت هاش رو هم درست تنظیم کردم!

    دوستان میدونند مشکل از کجاست؟

    ممنون از همه :nerd:

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

    سلام دادا.
    معلومه. تابع delay تابع دقیقی نیست (یه نگاه به ساختارش بکنی مشخصه که چرا!). مخصوصاً اگه از کریستال ساعت استفاده نکنی.
    برای تایم دقیق از تایمر استفاده کن. (تازه اونم اینقدرا دقیق نیست!!!)
    موفق باشی.

    تشکر لازم نیست!

    دیدگاه


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

      سلام ایمان جان

      راستش میخوام یک سری اطلاعات رو با فرکانس 96000 بفرستم بیرون میکرو... نمیدونم چرا به مشکل بر خوردم!!!

      تایمر که راه میافته برای شمارش همه چیز میریزه به هم!!!

      ببین این نمونه برنامه من هست ، به محض اینکه تایمر روشن میشه ال ای دی چرت و پرت چشمک میزنه!!!

      کد:
      #include <mega16.h>
      
      
      #include <delay.h>
      
      #define OUT PORTB.0
      
      
      int cunt; 
      // Timer 0 overflow interrupt service routine
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Reinitialize Timer 0 value
      TCNT0=192;
      // Place your code here
      
       if(cunt <=15)
        OUT=0; 
        
      /////// RED  
        
      else if(cunt==16)
        OUT=0;
      else if(cunt==17)
        OUT=0;
      else if(cunt==18)
        OUT=0;
      else if(cunt==19)
        OUT=0; 
            
      ////// Green
        
      else if(cunt==20)
        OUT=0;
      else if(cunt==21)
        OUT=0;
      else if(cunt==22)
        OUT=0;
      else if(cunt==23)
        OUT=0; 
            
      /////// Blue
        
      else if(cunt==24)
        OUT=0;
      else if(cunt==25)
        OUT=0;
      else if(cunt==26)
        OUT=0;
      else if(cunt==27)
        OUT=0; 
        
        
      else if(cunt >= 28)
        OUT=0;  
      
      
      cunt++;
      if (cunt==44)
      {
      
        cunt=0;
      }
            
        
      
      }
      
      // Declare your global variables here
      
      void main(void)
      {
      
      
      PORTB=0x00;
      DDRB=0xFF;
      
      DDRD=0xFF;
      
      
      TCCR0=0x01;
      TCNT0=192;
      TIMSK=0x01;
      
      ACSR=0x80;
      SFIOR=0x00;
      
      // Global enable interrupts
      #asm("sei") 
      
      while (1)
         {
         // Place your code here 
         
         PORTD.7=1;
         delay_ms(1000);  
         PORTD.7=0;
         delay_ms(1000);
         };
      }

      ممنون از کمکت ایمان جان :nerd:

      دیدگاه


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

        سلام دادا.
        اگه ممکنه کل برنامه رو بذار. اگه این باشه که ناقصه!

        در ضمن برای تایمر اینو تست کن:
        کد:
        #include <mega32.h>
        void delay();
        void main(void)
        {
        PORTD=0x00;
        DDRD=0xFF;
        
        TCCR0=0x00;
        TCNT0=0x00;
        OCR0=0x00; 
        
        while (1)
           {
            PORTD.0=~PORTD.0;
            delay();
           }    
        }   
        
        void delay()
         {
         TCCR0=0x02;
         while(!(TIFR &0x02));
         TIFR|=0x02;
         }
        این برنامه یه فرکانس 500 کیلو با کریستال 4 میسازه.
        تشکر لازم نیست!

        دیدگاه


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

          میشه بپرسم کجای برنامه ی من ناقصه دادا؟! :-/

          دیدگاه


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

            تنظیمات تایمر دادا.
            تشکر لازم نیست!

            دیدگاه

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