Thông báo

Collapse
No announcement yet.

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

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [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

  • #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


    • #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


      • #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


        • #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


          • #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


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

              Comment


              • #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


                • #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


                  • #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


                    • #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


                      • #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


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

                          Comment


                          • #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


                            • #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...
                              X