Cấu hình dao động cho Pic18F4550

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • TANDEM
    Đệ tử 2 túi
    • Aug 2008
    • 40

    #1

    Cấu hình dao động cho Pic18F4550

    Chào các bác! Nhờ các bác xem giúp em chương trình sau. Khi em sử dụng delay_ms() và ngắt timer3 thì thời gian hoạt động là không chính xác: delay_ms(1000) mà phải tới gần 1 phút sau thì mới có hiệu lực, cả ngắt timer3 cũng vậy. Nhưng nếu em thay #use delay(clock=1000000) thì lệnh delay_ms(1000) hoạt động chính xác còn ngắt timer3 vẫn không chính xác. Rất mong các bác giúp đỡ!
    Code:
    #include <18F4550.H>
    #include <DEF_18F4550.H>
    
    #FUSES NOWDT                 			//No Watch Dog Timer
    #FUSES HSPLL, PLL5, CPUDIV1
    #fuses ECPLL					//Su dung PLL va RA6 lam pin ra
    #FUSES NOPROTECT             			//Code not protected from reading
    #FUSES NOBROWNOUT            			//No brownout reset
    #FUSES NOPUT                 			//No power Up Timer
    #FUSES NODEBUG               			//No Debug mode for ICD
    #FUSES NOLVP                 			//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOWRT                 			//Program memory not write protected
    #FUSES MCLR					//Master clear reset
    #FUSES CCP2C1  					//Su dung rc1 lam cong OUT PWM
    #use delay(clock=48000000)			//Thach anh gan tren board la 20MHz
    
    #define dctrai		rc6			
    #define dcphai		rc7			
    
    //Ham ngat TIMER3(dung cho xu ly Encoder)***********************************************
    #int_TIMER3
    void  TIMER3_ProcesEncoder(void) 
    {
    	set_timer3(50536);
    	n++;
    	if(n==100)				//100*0.01(s)=1(s). Sau 1(s) thi tien hanh lay mau 1 lan
    	{					
    		porta=0b00000000;
    		n=0;											
    	
    	}	
    	clear_interrupt(int_TIMER3);
    }	
    
    void main(void)
    {
    	
    	
    	setup_adc_ports(NO_ANALOGS);		//tat ca porta la digital                        
    	set_tris_c(0b00110001);
    	set_tris_a(0b00010000);			
    	enable_interrupts(int_TIMER3);
    	enable_interrupts(Global);	
    	setup_timer_3(T3_INTERNAL|T3_DIV_BY_8);	//thiet lap timer3 o che do xung noi va sau 8 lan tran thi duoc MCU coi la 1 su kien -> xay ra ngat timer3 	
       	set_timer3(50536);			//100(Hz) = 48.000.000/[4*(65536-n)*8]
       						//n = 65536-[480.000/(4*8)] = 50536
       						//T = 1/f = 1/100 = 0.01(s) -> Sau 0.01(s) thì xay ra ngat timer3	
    	portc=0b00000000;
    	porta=0b00001111;
    	while(true)
    	{
    		dcphai=1;
    		dctrai=0;
    	   	delay_ms(1000);			
    	   	dctrai=1;
    	   	dcphai=0;
    	   	delay_ms(1000);
    	}
    }
    và đây là sơ đồ mạch.
    Attached Files
    Last edited by TANDEM; 22-06-2011, 09:15 PM.
  • shakespeare_a18
    Đệ tử 1 túi
    • Aug 2010
    • 22

    #2
    cấu hình trên của bác dùng với thạch anh 20Mhz. Nếu dùng thạch anh khác thì cần điều chỉnh lại.

    Comment

    • TANDEM
      Đệ tử 2 túi
      • Aug 2008
      • 40

      #3
      Cám ơn shakespeare_a18! Trong mạch mình dùng thạch anh 20MHz, hiện tượng thì như mình đã mô tả... Có khi nào mà thạch anh bị hư trong quá trình hàn không? Hay tụ 22pF không chính xác? Nhờ các bác giải thích giúp!

      Comment

      • TANDEM
        Đệ tử 2 túi
        • Aug 2008
        • 40

        #4
        Trước hết xin cám ơn mọi người đã quan tâm! Sau khi lần mò đủ kiểu, em quyết định ngắt điện và kiểm tra lại mạch (mạch in), mấu chốt ở đây là thạch anh không tiếp xúc (vì mạch xuyên kim nên không ngờ tới tình huống này). Thiện tai...thiện tai... Bây giờ em đã giải quyết xong phần thắc mắc ở trên. Tuy nhiên, chỉ đúng khi bỏ dòng #fuses ECPLL. Tại sao lại thế? Em không hiểu được. Một lần nữa, nhờ các bác chỉ giúp. Nhờ anh Namqn ra tay giúp em với!

        Comment

        • binhfile
          Nhập môn đệ tử
          • Aug 2009
          • 2

          #5
          EC là chế độ dùng nguồn xung ngoài nhỉ, HS , XT mới là dùng thạch anh ??

          Comment

          Working...