RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Dùng ngắt ngoài

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hoangsonk49
    Đệ tử 1 túi
    • Oct 2008
    • 14

    #1

    Dùng ngắt ngoài

    Mọi người ơi cho em hỏi là em muốn dùng ngắt ngoài (INT) để khi có xung vào chân INT đó thì biến i tong chương trình của em tăng thêm một thì làm thế nào. EM chỉ thấy mọi người nói về timer mà ko mấy ai nhắc đến ngắt ngoài, mọi ngừoi có thể chỉ cho em dc không. Em cảm ơn nhiều.
  • popeye_ts22
    Đệ tử 2 túi
    • Jul 2008
    • 42

    #2
    Chỉ có 2 công đoạn thui mà:
    Trong chương trình chính bạn khởi tạo ngắt là ngắt ngoài,cho phép ngắt.
    vd:
    enable_interrupts(INT_EXT);
    enable_interrupts(GLOBAL);
    Trong chương trình ngắt bạn cho biến đếm tăng thêm 1.
    vd:
    #int_EXT
    void EXT_isr(void)
    {
    cnt++;
    }
    Best Regard.

    Comment

    • hoangsonk49
      Đệ tử 1 túi
      • Oct 2008
      • 14

      #3
      Mình thử nhưng nó toàn báo lỗi:
      Error[000] : undefined identifier: INT_EXT
      Error[000] : undefined identifier: GLOBAL

      Comment

      • 0903579509
        Đệ tử 4 túi
        • Mar 2007
        • 69

        #4
        Có lẻ bạn chưa khai báo :
        #include <*.h>
        Bạn xem lại xem sao!

        Comment

        • vitechpham
          Đệ tử 1 túi
          • Oct 2007
          • 15

          #5
          cac pac cho hoi cach chong nhiêu cho chan ngat ngoai cua pic
          code cua tui
          Code:
          #include <16f877a.h>
          #FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,NOLVP
          #use delay(clock=12000000)
          #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7)
          #byte d=0x08
          #locate i=0xa0
          #locate g=0xa1
          #locate l=0xa2
          #locate p=0xa3
          #locate c=0xa4
          #locate m=0xa5
          #locate n=0xa6
          #locate v=0xa7
          #locate h=0xa8
          #locate f=0xa9
          #bit cl=0x18.0
          int8 a[21],x,q;
          int8 b[21],s;
          int32 w;
          char r[10]={'0','1','2','3','4','5','6','7','8','9'};
          void clock()
          {
             output_high(pin_c5);
             delay_us(4);
             output_low(pin_c5);
             delay_us(4);
          }
          void lenh (int8 e)
          {
             d=e;
             output_low(pin_c3);
             output_low(pin_c4);
             clock();
             delay_ms(1);
          }
          void dulieu (int8 e)
          {
             d=e;
             output_high(pin_c3);
             output_low(pin_c4);
             clock();
             delay_ms(1);
          }
          void lcdinit()
          {
             d=0;
             output_low(pin_c4);
             delay_ms(500);
             output_low(pin_c3);
             d=0x38;
             clock();
             lenh(0x01);
             lenh(0x0c); 
          }   
          int8 kiemtra(int8 a[],int8 t,int8 f)
          {
             int8 k;
             t=0;
             if (bit_test(w,f)==1)
                t=1;
             for (k=0;k<=7;k++)  
                if(bit_test(a,k)==1)
                   t=t+1;   
             return t;
          }
          void demphat()
          {
             lenh(0x80);
             switch(g)
             {
                case 1:
                   lenh(0x01);
                   g=0;
                   p=0;
                   w=0;
                   dulieu("   DA KET NOI");
                   putc('s');
                break;
                case 7:
                   x=0;
                   if(n>0&& p==2&&v>l)
                   {
                      lenh(0xce);
                      dulieu(r[s/10]);
                      dulieu(r[s%10]);
                      putc(r[s/10]);
                      delay_ms(1);
                      putc(r[s%10]);
                      delay_ms(1);
                      if(v >=abs(a[n]-a[n-1]))
                      {
                         p=3;
                         v=0;   
                         delay_ms(3000);
                      }
                      l=v;
                   } 
                   if(n==h && p==3)
                   {
                      output_high(pin_b2);
                      output_high(pin_b3);
                      a[0]=0;
                      n=0;
                      g=0;
                      p=0;
                      l=0;
                      lenh(0x80);
                      dulieu("   HOAN THANH");
                      putc('h');
                    }   
                 break;  
                 case 6:
                   if(n==0)
                   {  
                      a[0]=f;
                      g=7;
                      dulieu(" DA NHAN LENH");
                      lenh(0xc0);
                      dulieu("VI TRI");
                      putc('d');
                   }
                break;
                case 5:
                   if(c<=m)
                   {
                      putc(b[c]);
                      delay_ms(1);
                      c=c+1;
                   }
                   if(c==m+1)
                   { 
                      g=0;
                      putc('k');
                   } 
                break;
                case 4:
                   if (b[0]==0 && x==0)
                      g=0;
                   if(b[0]>0&&x==0) 
                      g=5;   
                   putc('e');
                break;
                case 3:
                   g=0;   
                   putc('o');
                break;
                case 2:
                   g=0;
                   putc('z');
                break;   
                default:break;
             }
             delay_ms(1);
             if(g<5 )
                output_high(pin_b6);
          }
          void demthu()
          {  
             q=0;
             if(g==0)
             {
                if(cl==1)
                   bit_set(w,i);
                else
                   bit_clear(w,i);
                q = getc();      
                if (i==0)   
                   a[0]=q;   
                if (i<=h&&i>=1)
                {
                   a[i]=q;
                   i=i+1;
                   output_high(pin_b6);
                }
             }  
             if (c==m+1 && l>=1)
             {
                if(cl==1)
                   bit_set(w,b[l-1]);
                else
                   bit_clear(w,b[l-1]);   
                a[b[l-1]]=getc();
                l=l-1;
                if(l==0)
                {
                   p=1;
                   l=0;
                }
                output_high(pin_b6);
             }  
          }
          #priority int_rda,int_ext,int_tbe
          #int_global
          #int_tbe
          void phat()
          {  if (input(pin_b5)==1)
                demphat();
             disable_interrupts(int_tbe);
          }
          #int_rda
          void thu()
          {  
             output_low(pin_b6);
             demthu();
             if (i==h+1)
                output_low(pin_b6);
          }
          #int_ext
          void dongco()
          {
             if (g==7)
             {  
                x=2;
                v=v+1;
                output_high(pin_b2);
                output_high(pin_b3);
                output_low(pin_b7);
                if (abs(a[n]-a[n-1])<=50 )
                {
                   if (a[n]>a[n-1])
                      s=a[n-1]+v;
                   else
                      s=a[n-1]-v;
                }
                else
                {
                   if (a[n]>a[n-1])
                      if (a[n-1]< v )
                         s=100+a[n-1]-v;
                       else
                         s=a[n-1]-v;
                   else
                      if (a[n-1]+v>99)
                         s=a[n-1]+v-100;
                      else   
                         s=a[n-1]+v;
                }
             }  
          }
          void main()
          {
             int8 j;
             i=0;
             p=0;
             l=0;
             n=0;
             v=0;
             h=0;
             a[0]=0;
             b[0]=0;
             f=0;
             x=0;
             set_tris_d(0x00);
             set_tris_b(0x21);
             d=0;
             output_low(pin_b6);
             output_low(pin_b7);
             output_high(pin_b2);
             output_high(pin_b3);
             g=2;
             lcdinit();
             ext_int_edge(l_TO_H);
             enable_interrupts(global);
             enable_interrupts(int_tbe);
             enable_interrupts(int_rda);
             enable_interrupts(int_ext);
             while (true)
             {  
                if (a[0]=='p'||a[0]=='y'||a[0]=='t'||a[0]=='l')
                   x=1; 
                if(i==0&&p==0&&a[0]>0)
                {  
                   c=kiemtra(a[0],c,0);
                   if(c%2>0)
                      g=4;
                   else 
                   {
                      if(a[0]=='s')
                         g=1;
                      if (x==1)
                         g=3;
                      if ((a[0]>'s'||a[0]<'s')&&x==0)
                      {
                         g=3;
                         i=1;
                         h=a[0];
                         f=a[h];
                         p=3;
                      }   
                   }
                   a[0]=0;
                }    
                if(g==3&&x==1)
                {  
                   switch (q)
                   {
                      case 'p':
                         disable_interrupts(int_ext);
                         lenh(0xc0);
                         dulieu("QUAY PHAI");
                         output_low(pin_b2);
                         delay_ms(1000);
                         output_high(pin_b3);
                      break;
                      case 't':
                         disable_interrupts(int_ext);
                         lenh(0xc0);
                         dulieu("QUAY TRAI");
                         output_low(pin_b3);
                         delay_ms(1000);
                         output_high(pin_b2);
                      break;
                      case 'y':
                         lenh(0xc0);
                         dulieu("TIEP TUC ");
                         output_high(pin_b3);
                         output_high(pin_b2);
                         x=0;
                         enable_interrupts(int_ext);
                      break;
                      case 'l':
                         disable_interrupts(int_ext);
                         lenh(0xc0);
                         dulieu("DUNG     ");
                         output_high(pin_b3);
                         output_high(pin_b2);
                      break;
                   }   
                } 
                if(i==h+1)
                {
                   l=0;
                   for(j=1;j<=h;j++)
                   {
                      kiemtra(a[j],c,j);
                      if(c%2!=0)
                      {
                         b[l]=j;
                         l=l+1;
                      }
                   }
                   if(l==0)
                   {
                      g=6;
                      b[0]=0;
                   }
                   else
                   {
                      m=l-1;
                      g=4;
                   }   
                   i=0;
                   c=0;
                }   
                if (p==1)
                {
                   for (j=0;j<=m;j++)
                   {
                      kiemtra(a[b[j]],c,j);
                      if (c%2!=0)
                      {
                         b[l]=j;
                         l=l+1;
                      }
                   }
                   if(l==0)
                   {
                      g=6;
                      b[0]=0;
                   }   
                   else
                   {
                      m=l-1;
                      g=4;
                   }   
                   p=3;
                   c=0;
                }
                if (g==7&&n<=h)
                {  
                   if(p==3&& n<h)
                   {  
                      n=n+1;
                      p=2;
                   }   
                   if(abs(a[n]-a[n-1])>0&& x==0)
                   {
                      if(abs(a[n]-a[n-1])<=50)
                      {
                         if(a[n]>a[n-1])
                            output_low(pin_b2);
                         else
                            output_low(pin_b3);   
                      }      
                      else 
                      {  
                         if(a[n]>a[n-1])
                            output_low(pin_b3);
                         else
                            output_low(pin_b2);
                      }  
                      output_high(pin_b7); 
                   }
                }
               enable_interrupts(int_tbe);
             }
          }
          Last edited by namqn; 12-12-2008, 12:05 AM.

          Comment

          • hoangsonk49
            Đệ tử 1 túi
            • Oct 2008
            • 14

            #6
            Đây là toàn bộ bài của em: Mà không hiểu sao nó cứ báo lỗi
            Error[000] : undefined identifier: INT_EXT
            Error[000] : undefined identifier: GLOBAL
            và cả lỗi ở cái cấu hình đầu tiên. Mọi người xem giúp em với

            Code:
            /*========================================================
            ; Ten chuong trinh	: giao tiep USART voi PC, Doc viet EEprom
            ; Loai PIC	: Dung PIC16F877A - thach anh 20MHz
            ;========================================================*/
            #include<pic1687x.h>
            # include <stdio.h>
            #include<conio.h>
            
            __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
            int cnt;
            
            void INT_EXT_isr(void)
            {
            cnt++;
            // Ngat ngoai
            
            }
            
            
            // Ham doc Eeprom
            unsigned int doc_eprom(unsigned int add)
            {   EEADR=add;	// Thanh ghi dia chi
            	EEPGD=0x00; // 
            	RD=1; // Ready
            	return EEDATA ;	
            }
            
            // Ham viet Eeprom
            void viet_eprom(unsigned int add, unsigned char data)
            {	EEADR=add; // Thanh ghi dia chi
            	EEDATA=data; // Thanh ghi Du lieu
            	EEPGD=0x00; //
            	WREN=1; // Write enable
            	INTE=0; // Int enable
            	WR=1; // Write
            	INTE=1; // Int enable
            	WREN=0; // Write enable
            }
            // Ham init - khoi tao 
            void init(void){
            // Khoi tao cho USART
            	TRISC = TRISC | 0b00000000;			// Bit 7,6 la RX va TX
            	
            	SPEN = 1 ;		// Enable Serial Port communication.
            	SYNC =	 0;		// che do khong dong bo Asynchronous
            	// cho che do truyen
            	TXEN = 1;		//enable truyen
            	TX9 = 0 ;		// chon che do 8 truyen  bit du lieu
            	BRGH = 1; 		// High - speed
            	SPBRG = 129;	//Baud = 9600;	voi HS, Baud Rate = Fosc/(16(X+1))  
            	TXIE = 0;		// khong dung ngat Truyen
            	// Che do nhan du lieu
            	RCIE  =  1;		// dung ngat nhan
            	PEIE = 1;		// cho phep ngat ngoai vi
            	GIE  = 1;		// cho phep ngat toan cuc
            	RX9 = 0;		// nhan 8 bit
            	CREN = 1;		// lien tuc nhan du lieu; = 0 k lien tuc nhan du lieu
            	
            	}
            
            
            
            // Ham chinh
            void main(void){
            //viet_eprom(0x00, 0x01);
            int y;
            enable_interrupts(INT_EXT);
            enable_interrupts(GLOBAL);
            	while(1)
            	{   EEDATA=0b101010;
            		//viet_eprom(0x00,0b101010);
            		y=doc_eprom(0x00);
            		TXREG=y ;
            		
            		init();
            	
            	};
            }
            Last edited by namqn; 12-12-2008, 05:26 PM.

            Comment

            • hoangsonk49
              Đệ tử 1 túi
              • Oct 2008
              • 14

              #7
              Em dùng MPLAB.

              Comment

              • namqn
                Trưởng lão PIC bang
                • Feb 2006
                • 3020

                #8
                Nguyên văn bởi hoangsonk49 View Post
                Em dùng MPLAB.
                Bạn đang viết code bằng C cho PIC16F877A. Do đó, tôi tin rằng MPLAB chỉ là một IDE, còn trình biên dịch phải là một sản phẩm của hãng khác (vì Microchip không có trình biên dịch C cho dòng PIC mid-range). Thông báo lỗi mà bạn nhận được đến từ trình biên dịch C, mà bạn chưa cho biết ở đây (nhưng tôi đoán là CCS C). Bạn nên xem lại tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng.

                Thân,
                Biển học mênh mông, sức người có hạn.

                Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                http://www.picvietnam.com/forum/showthread.php?t=1263

                Comment

                • hoangsonk49
                  Đệ tử 1 túi
                  • Oct 2008
                  • 14

                  #9
                  MPLAB nhưng có HTPIC nhúng vào mà

                  Comment

                  • namqn
                    Trưởng lão PIC bang
                    • Feb 2006
                    • 3020

                    #10
                    Nguyên văn bởi hoangsonk49 View Post
                    MPLAB nhưng có HTPIC nhúng vào mà
                    Như tôi đã viết ở trên, thông báo lỗi đến từ trình biên dịch C (là HTPIC như bạn vừa cho biết). Do đó, bạn cần xem lại tài liệu hướng dẫn của HTPIC, để xem làm sao xử lý với các lỗi trên (lỗi "danh biểu chưa được định nghĩa"). Tôi cũng không dùng HTPIC, nên không hướng dẫn chi tiết cho bạn được.

                    Thân,
                    Biển học mênh mông, sức người có hạn.

                    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                    http://www.picvietnam.com/forum/showthread.php?t=1263

                    Comment

                    • thongdtk3
                      Nhập môn đệ tử
                      • Oct 2008
                      • 7

                      #11
                      Muốn ngắt ở RC0

                      các bác cho em hỏi, em muốn ngắt ngoài dùng 1 trong các chân của cổng C thì làm thế nào nhi?em muốn dùng 1 nút ấn , và mỗi lần ấn thì nó sẽ chuyển chương trinh từ program1 lên program2 ....dùng lệnh switch(mode) { case...... cổng b có chân RBO/INT thì em dùng mất rồi... giúp em với.. đây là đoạn chương trình ngắt ở RBO:.. còn ngắt ở RC0 thì em chịu



                      Code:
                      Int8 MODE,i,j;
                      BYTE TEMP;
                      
                      #int_ext
                      ext_isr()
                         {
                         mode++;
                         if (mode==4)
                         mode =0;
                         }
                      void program1();
                      void program2();
                      void program3();
                      
                      void main()
                         {
                         trisb=0xff;
                         enable_interrupts(int_ext);
                         ext_int_edge(H_TO_L);
                         enable_interrupts(GLOBAL);
                         mode=0;
                         while(1) {
                               switch(mode){
                                                 case 1:program1();break;
                                                 case 2:program2();break;
                                                 case 3:program3();break;
                      
                                          }
                         }
                         }
                      Last edited by namqn; 15-12-2008, 02:54 AM.

                      Comment

                      • namqn
                        Trưởng lão PIC bang
                        • Feb 2006
                        • 3020

                        #12
                        Nguyên văn bởi thongdtk3 View Post
                        các bác cho em hỏi, em muốn ngắt ngoài dùng 1 trong các chân của cổng C thì làm thế nào nhi?em muốn dùng 1 nút ấn , và mỗi lần ấn thì nó sẽ chuyển chương trinh từ program1 lên program2 ....dùng lệnh switch(mode) { case...... cổng b có chân RBO/INT thì em dùng mất rồi... giúp em với.. đây là đoạn chương trình ngắt ở RBO:.. còn ngắt ở RC0 thì em chịu
                        ...
                        Người ta thiết kế phần cứng rồi mới viết chương trình. Khi thiết kế phần cứng thì người ta phải chú ý đến những tài nguyên được cung cấp trên chip, chứ không gán chức năng cho các chân một cách vô tội vạ rồi sau đó dùng một chân không có tài nguyên để hiện thực một chức năng nào đó, dẫn đến ngõ cụt. Trừ một số chip có tính năng remappable pin (dsPIC/PIC24), các vi điều khiển PIC khác có rất ít khả năng chuyển một chức năng được gán cho một chân sang một chân khác.

                        Nếu bạn dùng PIC 8-bit, bạn chắc chắn phải thiết kế lại mạch nguyên lý.

                        Thân,
                        Biển học mênh mông, sức người có hạn.

                        Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                        http://www.picvietnam.com/forum/showthread.php?t=1263

                        Comment

                        • hoangsonk49
                          Đệ tử 1 túi
                          • Oct 2008
                          • 14

                          #13
                          Em dùng CSS để viết thì chương trình chạy ngon rồi, nhưng ko hiểu sao ra không đúng, mà hình như là nó ko chạy cái ngắt ngoài, các bác xem hộ em có sai chỗ nào không ạ:

                          #include <16F877A.h>
                          #include <DEFS_16F877A.h>
                          #device adc=8

                          #FUSES NOWDT //No Watch Dog Timer
                          #FUSES HS //High power osc > 5Mhz
                          #FUSES NOPUT //No Power Up Timer
                          #FUSES NOPROTECT //Code not protected from reading
                          #FUSES NODEBUG //No Debug mode for ICD
                          #FUSES NOBROWNOUT //No brownout reset
                          #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
                          #FUSES NOCPD //No EE protection
                          #FUSES WRT_50% //Lower half of Program Memory is Write Protected

                          #use delay(clock=20000000)

                          //Thiet lap USART rate 9600,xuat chan C6, nhan chan C7, 8 bits
                          #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)

                          int i,j;

                          // Ngat ngoai
                          #INT_EXT
                          void EXT_isr(void)
                          { i=i+1; // Bien i tang 1 khi co xung vao
                          if(i==100)
                          {i=0;
                          j=j+1;
                          write_eeprom(0x00,j);
                          }
                          TXREG=i;
                          }


                          // Ham chinh
                          void main()
                          {

                          setup_adc_ports(NO_ANALOGS);
                          setup_adc(ADC_OFF);
                          setup_psp(PSP_DISABLED);
                          setup_spi(SPI_SS_DISABLED);
                          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
                          setup_timer_1(T1_DISABLED);
                          setup_timer_2(T2_DISABLED,0,1);
                          setup_comparator(NC_NC_NC_NC);
                          setup_vref(FALSE);
                          enable_interrupts(INT_EXT); //Cho ngat
                          enable_interrupts(GLOBAL);
                          ext_int_edge(L_TO_H); //Suon len

                          // TODO: USER CODE!!
                          TRISC=0b10111111; // Chan C6 la output
                          TRISB=0b11111110; // Chan B0 la input
                          if (read_eeprom(0x00)==0xff)
                          {write_eeprom(0x00,0);};


                          while(1)
                          {
                          // Dua du lieu vao thanh ghi USART


                          }
                          }

                          Comment

                          • bien_van_khat
                            ...Damned...
                            • Apr 2006
                            • 503

                            #14
                            Code:
                            TRISB=0b11111110; // Chan B0 la input
                            TRISB0 = 0 => chân B0 là output.

                            Bạn chú ý, để code trong thẻ [ code ] [ / code ]
                            - Xin đọc trước khi post bài

                            Xin đặt code trong thẻ [ code ] [ /code ]

                            Comment

                            • hoangsonk49
                              Đệ tử 1 túi
                              • Oct 2008
                              • 14

                              #15
                              à, em làm dc rồi. Vui quá

                              Comment

                              Working...