[help] gặp rắc rối với timer1 của pic 16f887

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • loveboom3012
    Thành viên chính thức
    • Apr 2010
    • 55

    #1

    [help] gặp rắc rối với timer1 của pic 16f887

    Vào thẳng vấn đề luôn, em viết hàm ngắt tràn timer1 của 16f887 nhưng nó không chạy, mọi người giúp em với
    Code:
    #include <htc.h>
    #include "lcd.h"
    __CONFIG(XT & HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DEBUGDIS);
    
    #define _XTAL_FREQ 4000000
    bit display=1;
    void interrupt_t0(void)
    {
    	int count=0;
    	if(TMR1IE && TMR1IF)
    	{
    
    			TMR1H=0X3C;
    			TMR1L=0XB0;
    			TMR1IF=0;
    			TMR1IE=1;
    			display=~display;
    			RB0=~RB0;
    	}
    }
    void main()
    {
    	int i;
    	ANSEL=0;
    	ANSELH=0; //KHAI BAO TAT CA CAC PIN DEU LA DIGITAL
    	GIE=1; // CHO PHEP TAT CA CAC NGAT
    	PEIE=1;
    	TMR1CS=0;
    	T1CKPS1=0; //CHON DO CHIA TAN TI LE 1/4
    	T1CKPS0=1;
    	TMR1H=0X3C; // THIET LAP GIA TRI TIMER1 = 15536
    	TMR1L=0XB0;
    	TMR1IE=1; //CHO PHEP TIMER1 HOAT DONG
    	TMR1IF=0; //CO TRAN TIMER1 DUOC XOA
    	TRISB0=0;
    	RB0=0;
    	while(1)
    	{
    	};
    }
    Attached Files
  • thientanvt
    Thành viên tích cực
    • Mar 2010
    • 234

    #2
    Hi sữa lại thử coi:
    Code:
    void interrupt_t0 ISR(void)
    {
    	int count=0;
    	if(TMR1IE && TMR1IF)
    	{
    
    			TMR1H=0X3C;
    			TMR1L=0XB0;
    			TMR1IF=0;
    			TMR1IE=1;
    			display=~display;
    			RB0=~RB0;
    	}
    }

    Comment

    • mast090
      Thành viên tích cực
      • Oct 2010
      • 1018

      #3
      add
      TMR1ON = 1 ; /* Enable Timer1 Module */
      chưa cho phép timer chạy thì làm sao mà có ngắt để nhảy vào hàm ngắt đc
      cách viết tên hàm ngắt cũng sai
      void interrupt Ten_ham(void)
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment

      • loveboom3012
        Thành viên chính thức
        • Apr 2010
        • 55

        #4
        Nguyên văn bởi thientanvt Xem bài viết
        hi sữa lại thử coi:
        Code:
        void interrupt_t0 isr(void)
        {
        	int count=0;
        	if(tmr1ie && tmr1if)
        	{
        
        			tmr1h=0x3c;
        			tmr1l=0xb0;
        			tmr1if=0;
        			tmr1ie=1;
        			display=~display;
        			rb0=~rb0;
        	}
        }
        đã thử và vẫn không được bạn à

        Comment

        • queduong
          Moderator
          • Jul 2005
          • 6781

          #5
          thử cái đúng không thử đi thử cái sai thì làm sao nó chạy !

          --- làm như bài #3
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment

          • loveboom3012
            Thành viên chính thức
            • Apr 2010
            • 55

            #6
            Nguyên văn bởi mast090 Xem bài viết
            add
            TMR1ON = 1 ; /* Enable Timer1 Module */
            chưa cho phép timer chạy thì làm sao mà có ngắt để nhảy vào hàm ngắt đc
            cách viết tên hàm ngắt cũng sai
            void interrupt Ten_ham(void)
            đã sửa thêm TMR1ON=1 , nhưng vẫn không được, mô phỏng proteus cứ báo lỗi tràn stack
            Code:
            #include <htc.h>
            #include "lcd.h"
            __CONFIG(XT & HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DEBUGDIS);
            
            #define _XTAL_FREQ 4000000
            void interrupt_isr(void)
            {
            	if(TMR1IE && TMR1IF)
            	{
            			RB0=~RB0;
            			TMR1H=0XfC;
            			TMR1L=0X35;
            			TMR1IF=0;
            	}
            }
            
            void main()
            {
            	int i;
            	ANSEL=0;
            	ANSELH=0; //KHAI BAO TAT CA CAC PIN DEU LA DIGITAL
            	GIE=1; // CHO PHEP TAT CA CAC NGAT
            	PEIE=1;
            	TMR1ON=1;
            	TMR1CS=0;
            	T1CKPS1=0; //CHON DO CHIA TAN TI LE 1/4
            	T1CKPS0=1;
            	TMR1H=0xfc; // THIET LAP GIA TRI TIMER1 = 15536
            	TMR1L=0x35;
            	TMR1IE=1; //CHO PHEP TIMER1 HOAT DONG
            	TMR1IF=0; //CO TRAN TIMER1 DUOC XOA
            	TRISB0=0;
            	RB0=0;
            	while(1)
            	{
            	};
            }

            Comment

            • loveboom3012
              Thành viên chính thức
              • Apr 2010
              • 55

              #7
              hj đã giải quyết được chỗ hàm void interrupt không có gạch nối

              Comment

              • bqviet
                Linux zealot
                • Jun 2007
                • 6170

                #8
                Nguyên văn bởi loveboom3012 Xem bài viết
                hj đã giải quyết được chỗ hàm void interrupt không có gạch nối
                Đã giải quyết được thì cũng nên cảm ơn cái ông đã viết bài giúp chính xác chứ ?
                Phần mềm tự do hoặc không dùng máy tính nữa !.

                Comment

                • thientanvt
                  Thành viên tích cực
                  • Mar 2010
                  • 234

                  #9
                  Hi hồi nảy comment vội nên quên sữa cái interrupt_t0 thành interrupt. Thành ra vẫn sai.

                  Comment

                  • loveboom3012
                    Thành viên chính thức
                    • Apr 2010
                    • 55

                    #10
                    tiện thể cho em hỏi luôn vấn đề này với : khi bit temp = 1 thì hiển thị trên lcd temp=1 ; khi temp=0 thì hiển thị temp = 0, nhưng mà sao khi mô phỏng với proteus thì temp = 1 thì hiển thị ok còn khi temp=0 thì cứ giật giật như kiểu bị delay thế nhỉ
                    code của em đây:
                    Code:
                    #include <htc.h>
                    #include <pic16f887.h>
                    #include "lcd.h"
                    __CONFIG(XT & HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DEBUGDIS);
                    #define _XTAL_FREQ 4000000
                    int count=0;
                    bit temp;
                    void interrupt isr(void)
                    {
                    	if(TMR1IF==1)
                    	{
                    		if(count==5)
                    		{
                    			count=0;
                    			RB0=~RB0;
                    			temp=~temp;
                    		}
                    		TMR1H=0;
                    		TMR1L=0;
                    		TMR1IF=0;
                    		++count;
                    	}
                    }
                    void main()
                    {
                    	ANSEL=0;
                    	ANSELH=0; //KHAI BAO TAT CA CAC PIN DEU LA DIGITAL
                    	GIE=1; // CHO PHEP TAT CA CAC NGAT
                    	PEIE=1;
                    	TMR1ON = 1 ; /* Enable Timer1 Module */
                    	TMR1CS=0;
                    	T1CKPS1=1; //CHON DO CHIA TAN TI LE 1/4
                    	T1CKPS0=0;
                    	TMR1H=0; // THIET LAP GIA TRI TIMER1 = 15536
                    	TMR1L=0;
                    	TMR1IE=1; //CHO PHEP TIMER1 HOAT DONG
                    	TMR1IF=0; //CO TRAN TIMER1 DUOC XOA
                    	TRISB0=0;
                    	TRISD=0XFF;
                    	RB0=0;
                    	
                    	lcd_init();
                    	__delay_ms(10);
                    	while(1)
                    	{
                    		if(temp)
                    		{
                    			lcd_clear();
                    			lcd_gotoxy(0,0);
                    			lcd_puts("temp=1");
                    		}
                    		else
                    		{
                    			lcd_gotoxy(0,1);
                    			lcd_puts("temp=0");
                    		}
                    	};
                    }

                    Comment

                    • thientanvt
                      Thành viên tích cực
                      • Mar 2010
                      • 234

                      #11
                      Hi loveboom3012, với lcd bạn không nên cho hiển thị liên tục như vậy. hiển thị liên tục sẽ làm cho ảnh bị xóa rồi ghi liên tục ảnh sẽ không rỏ nét huống chi là mô phỏng. Nên hiển thị một lần rồi thôi.
                      Code:
                      bit display;
                      while(1)
                      	{      
                                      if(display != temp){display = temp;
                      		if(temp)
                      		{
                      			lcd_clear();
                      			lcd_gotoxy(0,0);
                      			lcd_puts("temp=1");
                      		}
                      		else
                      		{
                      			lcd_gotoxy(0,1);
                      			lcd_puts("temp=0");
                      		}
                                      }
                      	};

                      Comment

                      • loveboom3012
                        Thành viên chính thức
                        • Apr 2010
                        • 55

                        #12
                        Nguyên văn bởi thientanvt Xem bài viết
                        Hi loveboom3012, với lcd bạn không nên cho hiển thị liên tục như vậy. hiển thị liên tục sẽ làm cho ảnh bị xóa rồi ghi liên tục ảnh sẽ không rỏ nét huống chi là mô phỏng. Nên hiển thị một lần rồi thôi.
                        Code:
                        bit display;
                        while(1)
                        	{      
                                        if(display != temp){display = temp;
                        		if(temp)
                        		{
                        			lcd_clear();
                        			lcd_gotoxy(0,0);
                        			lcd_puts("temp=1");
                        		}
                        		else
                        		{
                        			lcd_gotoxy(0,1);
                        			lcd_puts("temp=0");
                        		}
                                        }
                        	};
                        hok được bạn ơi, nó vẫn bị giật giật như lúc đầu vậy

                        Comment

                        • thientanvt
                          Thành viên tích cực
                          • Mar 2010
                          • 234

                          #13
                          Nếu vậy bạn chụp hình lên xem thế nào.

                          Comment

                          • loveboom3012
                            Thành viên chính thức
                            • Apr 2010
                            • 55

                            #14
                            Nguyên văn bởi thientanvt Xem bài viết
                            Nếu vậy bạn chụp hình lên xem thế nào.
                            mình có gửi kèm file mô phỏng bên trang 1 đó , bạn xem là biết à

                            Comment

                            • xe đạp
                              Thành viên tích cực
                              • Nov 2010
                              • 121

                              #15
                              bỏ cái lcd_clear() đi là hết

                              Comment

                              Về tác giả

                              Collapse

                              loveboom3012 Tìm hiểu thêm về loveboom3012

                              Bài viết mới nhất

                              Collapse

                              Đang tải...