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

HTPIC - các chương trình cho PIC6F877A

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • tranvanthuong
    Đệ tử 2 túi
    • Mar 2007
    • 45

    #31
    em cai custom roi nhung cung ko duoc anh a!
    ko hiểu nỗi hôm trước em cài và dùng được nhưng từ khi gở ra cài lại thì ko thảnh công không biết tại sao nữa

    @ngohaibac: Lần sau em viết bài thì phải viết dài, hỏi thì hỏi vào một bài là được. Em vào luồng về MPASM để thảo luận và xem các anh chị đã làm nhé.
    Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...


    Chúc em thành công.
    Last edited by ngohaibac; 08-04-2007, 09:02 AM.
    Cổng trường Đại học cao vời vợi
    Đồng ruộng mênh mong đón em về!

    Comment

    • ngohaibac
      Đệ tử 9 túi
      • Oct 2005
      • 231

      #32
      Thư viện I2C Master.

      Tiếp theo là về module I2C, một chuẩn giao tiếp quan trọng khi giao tiếp với ngoại vi như EEPROM, RTS(DS1307),...

      Do đó, mình xin cung cấp cho các bạn các hàm và thực thi của các hàm này trên HTPIC. Mình có tham khảo cả ở bọn htsoft nhưng nó viết sai một số hàm không chạy được, mình đã viết lại toàn bộ.

      Đầu tiên là hàm I2C.h:

      Code:
      //I2C.h
      //Declare some functions
      void [B]I2C_Init[/B](void);          // khởi tạo I2C ở chế độ Master, Baud = 100 Khz
      void [B]I2C_waitForIdle[/B](void); // Chờ khi nào đường bus ở chế độ Idle (rảnh rỗi)
      void [B]I2C_Start[/B](void);        // Khởi động I2C - Master chiếm đường bus
      void [B]I2C_repStart[/B](void);   // Chế độ Restart
      void [B]I2C_stop[/B](void);         // Stop I2C - Master nhường đường bus cho thiết bị khác
      unsigned char [B]I2C_write[/B]( unsigned char I2CWriteData ); // ghi một byte lên đường SDA
      unsigned char [B]I2C_read[/B]( unsigned char ack ); // Đọc một byte với mã ACK (ACK = 0 nếu ack = 1, và ACK = 1 nếu ack = 0) -> dùng xác nhận từ master đối với slave.
      void [B]I2C_NACK[/B](void);  // tạo bít Not Ack
      Và sau đây là thực thi của các hàm này:

      Code:
      // I2C.c
      # include "pic.h"
      # include "I2C.h"
      //======================================================================================================
      void I2C_Init(void){
      /*	// Configure for Master Mode
      	SSPM3 = 1;
      	SSPM2 = 0;
      	SSPM1 = 0;
      	SSPM0 = 0;				ss	// I2C Master Mode, clock = Fosc/(4*(SSPADD + 1));
      	
      	WCOL = 0;					//No conllision
      	
      	SSPEN = 1;					// Enables the serial port and 
      */	
      	SSPCON = 0b00101000;		// set IIC port to Master mode with BRG	
      	SSPSTAT = 0b00000000;		// Standard speed mode - 100Hz
      	SSPCON2 = 0;
      	
      	//TRIS_SCL = 0;
      	//TRIS_SDA = 0;				// configure SDA and SCL as Output
      	
      	SSPADD = 9;			   	 // BAUD = 100KHz
      	SSPIF = 0;      				// clear SSPIF interrupt flag
       	BCLIF = 0;      				// clear bus collision flag
      	STAT_CKE  = 0;     			// use I2C levels      worked also with '0'
       	STAT_SMP = 1;     			// disable slew rate control  worked also with '0'
      }
      //=============================================================================
      void I2C_waitForIdle(void)
      {
       	while (( SSPCON2 & 0x1F ) | STAT_RW) ; //CLRWDT(); // wait for idle and not writing
      }
      
      //=============================================================================
      void I2C_Start(void){
      	//SSPIF = 0;
      	SEN = 1;
      	//while(!SSPIF);
      	while(SEN);
      }
      //==============================================================================
      void I2C_repStart(void)
      {
      	 I2C_waitForIdle();
      	 RSEN = 1;
      }
      //=============================================================================
      void I2C_stop(void)	
      {
      	 I2C_waitForIdle();
      	 PEN = 1; 
      }
      //==============================================================================
      unsigned char I2C_write( unsigned char I2CWriteData ){
      	 I2C_waitForIdle();
      	 SSPBUF = I2CWriteData;
      	 I2C_waitForIdle();
      	  return (!ACKSTAT); // function returns '1' if transmission is acknowledged	
      	// 1: Success
      	// 0: Fail to send 
      }
      //============================================================================
      unsigned char I2C_read( unsigned char ack ){
      	unsigned char I2C_ReadData;
      	 I2C_waitForIdle();
      	 RCEN = 1;
      	 I2C_waitForIdle();
      	 I2C_ReadData = SSPBUF;
      	 I2C_waitForIdle();
      	 if ( ack )  	ACKDT=0;
          	 else             ACKDT = 1;
       	 ACKEN = 1;               // send acknowledge sequence
      	 I2C_waitForIdle();
      	 return( I2C_ReadData );
      }
      /******************************************************************************************/
      
      void I2C_NACK(void)
      {
      	I2C_waitForIdle();
      	if (ACKSTAT){
      		PEN=1;						//Stop
         		I2C_waitForIdle();			//Wait until action is finished
      		while(PEN);
         	};
      }
      Còn việc dùng nó quá đơn giản, ví dụ với Ds1307 thì đầu tiên bạn phải:

      - Khởi tạo I2C bằng I2C_Start();
      - Start bằng I2C_Start();
      - Chọn slave giao tiếp bằng cách ghi địa chỉ và bit RW tương ứng với chế độ đọc hay ghi.
      - Ghi dữ liệu lựa chọn byte nào cần ghi hay cần đọc trong bảng RAM của DS1307.
      - Ghi dữ liệu hay là đọc dữ liệu.

      Chú ý: khi ghi xong, muốn đọc thì phải làm lại tức là phải restart nhé.

      Chúc các bạn thành công.
      www.ngohaibac.net
      www.ngohaibac.com

      Comment

      • tranvanthuong
        Đệ tử 2 túi
        • Mar 2007
        • 45

        #33
        cám ơn anh ngohaibac để em cài cái máy tính của em rồi em làm lại những gì anh hướng dẫn thữ xem sao! em sẽ không bao giờ bỏ cuộc cả hôm nay em sẽ cài máy lại rồi cài MPLAP rồi cài HT-pic và CCS C luôn

        @nohb: những cái này em có thể chát Yahoo với anh. Anh đề nghị không spam bài ở đây. Để cài HTPIC, CCS em xem hướng dẫn là cài được.

        Em xem xong anh sẽ del bài này đó.
        Last edited by ngohaibac; 09-04-2007, 10:49 AM.
        Cổng trường Đại học cao vời vợi
        Đồng ruộng mênh mong đón em về!

        Comment

        • ngohaibac
          Đệ tử 9 túi
          • Oct 2005
          • 231

          #34
          Chào các bạn.

          Mình thấy các thư viện của mình vẫn chưa tối ưu. Thư viện sẽ phải có thêm các lựa chọn là các constant để thiết lập cho các hàm Init.

          Các trình dịch tự sinh mã đều có các yếu tố này nhưng mà thấy C18, C30 có cách đặt tên các lựa chọn này khá hay.

          Nên bạn nào có thời gian thì nên viết lại và thêm các constant này vào thì chương trình sẽ có tính sử dụng lại cao. Mình có thời gian sẽ viết lại thêm.

          Chúc các bạn thành công.
          www.ngohaibac.net
          www.ngohaibac.com

          Comment

          • toanck86
            Đệ tử 1 túi
            • Apr 2007
            • 20

            #35
            các bác cho em hỏi HTPIC với HTPIC 18 có khác nhau không vậy

            Comment

            • quangdk
              Nhập môn đệ tử
              • Nov 2007
              • 6

              #36
              Em cam on Bac nhieu lam.Bac that rong luong.thanh vien moi

              Comment

              • minhham
                Nhập môn đệ tử
                • Jan 2008
                • 1

                #37
                HT-PIC cho động cơ bước

                chào các bác, em đang làm bài tập điều khiển động cơ bước loại 4 pha,2cuộn dây, 1 nguồn 5V chung cho 2 cuộn dây. Góc bước 7.5 độ. Làm và mô phỏng trên mạch thật mà mãi ko được. phát nản cả người. với đoạn code dưới thì động cơ quay bốn bước thì dừng, ko quay nữa, bấm nút thì động cơ lại quay tiếp.
                Hình trên proteous mang tính chất minh họa, vì ko mô phỏng trên proteous
                thuật toán là cứ sau mỗi lần cấp xung tới các cuộn dây của động cơ thì lại check nút bấm và cấp xung tiếp theo đúng chiều để động cơ quay cho phù hợp với yêu cầu nút bấm.
                nếu bác nào có code về bài tập này thì up lên cho anh em xem với!
                code:
                // DIEU KHIEN DONG CO BUOC: loai 4 pha, goc buoc 7.5do, dien ap 5V
                // Nut bam RB0 : Quay trai; nut RB1 : dung; RB2 : Quay phai
                // yeu cau: dong co dang quay trai neu bam nut quay phai (mot lan, ko can bam nhieu lan) thi doi chieu va quay phai.
                // dong co dang quay phai neu bam nut quay trai (mot lan) thi doi chieu va quay trai
                // dong co dang quay bam nut dung thi dung lai, nhung PORTD van duoc xuat ra 1 gia tri bang gia tri cuoi cung ngay truoc khi dung

                #include<pic.h>
                __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS);
                // ============= KHAI BAO CAC CHUONG TRINH CON ===========
                // ============= CHU Y: phai xap xep theo dung thu tu chuong trinh con o duoi. Mot loi ngo ngan HAHAHA =========
                char phimbam(void);
                void DL(unsigned int i);

                // ============= CHUONG TRINH CHINH ===========
                void main ()
                { // ============= KHOI TAO ============
                static char a; // bien a dieu khien trang thai hoat dong cua cua dong co
                OPTION = 0b00000000; // dung prescaler cho timer0 voi ti le 1:2 Va dung tro keo len PORTB
                TRISB = 0b00000111; // chan RB0, RB1, RB2 la input
                TRISD = 0b00000000; // PORTD la cong ra
                PORTD = 0b01010000; // PORTD gia su dang o vi tri dau ung voi gia tri 0b01010000, cac vi tri vai tro nhu nhau.
                while (1)
                { a = phimbam();
                if (PORTD == 0b01010000)
                { switch(a)
                { case 1 : { DL (5000); //trai
                PORTD = 0b10010000; };
                break;
                case 2 : { DL (5000);
                PORTD = 0b01010000; };
                break;
                case 3 : { DL (5000);
                PORTD = 0b01100000; }; //phai
                break;
                };
                };

                if (PORTD == 0b10010000)
                { switch(a)
                { case 1 : { DL (5000); //trai
                PORTD = 0b10100000; };
                break;
                case 2 : { DL (5000);
                PORTD = 0b10010000; };
                break;
                case 3 : { DL (5000);
                PORTD = 0b01010000; }; //phai
                break;
                };
                };

                if (PORTD == 0b10100000)
                { switch(a)
                { case 1 : { DL (5000); //trai
                PORTD = 0b01100000; };
                break;
                case 2 : { DL (5000);
                PORTD = 0b10100000; };
                break;
                case 3 : { DL (5000);
                PORTD = 0b10010000; }; //phai
                break;
                };
                };

                if (PORTD == 0b01100000)
                { switch(a)
                { case 1 : { DL (5000); //trai
                PORTD = 0b01010000; };
                break;
                case 2 : { DL (5000);
                PORTD = 0b01100000; };
                break;
                case 3 : { DL (5000);
                PORTD = 0b10100000; }; //phai
                break;
                };
                };
                }
                }


                // =========== CAC CHUONG TRINH CON ============
                //==============================================
                // chuong trinh "phimbam" phai lam sao de an 1 lan la duoc? chu ko can an nhieu lan hoac la phai giu nut an 1 luc ???????

                static char phimbam(void)
                { if ((RB0==0)&&(RB1==1)&&(RB2==1)) return (1); // dong co quay trai

                if ((RB1==0)&&(RB0==1)&&(RB2==1)) return (2); // dong co dung

                if ((RB2==0)&&(RB1==1)&&(RB0==1)) return (3); // dong co quay phai
                }
                //================ HAM DELAY DUNG TIMER0 =============
                void DL(unsigned int i)
                { while (i--)
                {
                TMR0 = 6;
                T0IF = 0;
                while (!T0IF);
                };
                }

                -> động cơ quay bốn bước dừng chắc do biến ''a'' ko giữ được giá trị ở vòng while tiếp theo.

                Comment

                • tran_binh
                  Nhập môn đệ tử
                  • Oct 2009
                  • 4

                  #38
                  hiên nay minh đang làm đồ án đồng hồ số hiện thị trên led 7 đoạn (dùng led đơn kết nối như led 7 đoạn). với kích thước 43*130 cm. nhưng phần cứng thì minh đã làm nhưng chưa chạy được vì port quét led chưa hoạt động còn port quét dữ liệu data thì hoạt động. mong các anh em tư vấn giùm minh. minh sử dụng ic 89c51 lập trình và chương trình đã thành công nhưng phần cứng thì chưa {minh xuất dữ liệu ra mưc 0} http://www.megaupload.com/?d=KH8OLX77
                  nho tu van goi qua mail: tranthanhbinh8888@gmail.com

                  Comment

                  • Locangel
                    Nhập môn đệ tử
                    • Jun 2009
                    • 1

                    #39
                    Bac ơi cho mình hỏi bạn viết bằng chuong trình biên dịch nào thế CCS-C hay là HTPICC

                    Comment

                    • nhulinh
                      Nhập môn đệ tử
                      • Jun 2006
                      • 10

                      #40
                      Anh Bắc ơi, có bài nghiên cứu nào của anh về điều khiển LED ma trận post cho mọi người tham khảo với...
                      Thanks

                      Comment

                      • ALU
                        Nhập môn đệ tử
                        • Jan 2010
                        • 6

                        #41
                        Nguyên văn bởi ngohaibac View Post
                        Lỗi này là do khi em cài MPLAB không đủ đó, nó thiếu MPASM toolsuite và ASM30 (asm cho PIC30F) nên nó không khởi động dc. Có lẽ là do em cài kiểu gì đó nên k cài cái MPASM toolsuite là complier ASM.

                        Em cài lại chú ý chọn Custom Option khi nó cho lựa chọn khi cài nhé, rùi chọn hết mà cài cho chắc chắn. Cái này giống cài nhiều phần mềm mà em.

                        Chúc em thành công.
                        Theo tôi đây là lỗi khá nhiều người gặp nhưng vẫn chưa có một trả lời nào xác đáng! Ngay cả trên forum của microchip cũng chưa trả lời rõ ràng.

                        Tôi cũng gặp tình cảnh tương tự!
                        Win của tôi là XP SP2 có bản quyền, phần mềm chống virus cũng là BKAV bản quyền.

                        Cài xong thì không thể khởi động nên không thể chỉ đường dẫn nhúng các trình biên dịch vào mplab IDE như hỉ dẫn trên microchip được.

                        Ai thực sự đã giải quyết triệt để lỗi trên thì chỉ dẫn cho anh em!
                        -------------------------------
                        Tôi đã xử lý được theo cách sau:
                        Last edited by ALU; 27-01-2010, 04:11 PM. Lý do: đã xử lý

                        Comment

                        • congtam1189
                          Nhập môn đệ tử
                          • Mar 2010
                          • 2

                          #42
                          sao khobg cho dơn de

                          Comment

                          • congtam1189
                            Nhập môn đệ tử
                            • Mar 2010
                            • 2

                            #43
                            sao ko cho dơn ve

                            Comment

                            • dienbk36
                              Nhập môn đệ tử
                              • Jan 2010
                              • 6

                              #44
                              Cám ơn anh Bắc!

                              Comment

                              • eros_89_a
                                Nhập môn đệ tử
                                • May 2010
                                • 4

                                #45
                                anh Bắc cho em hỏi tí ở chỗ bài nháy led dùng pp delay .theo em thấy mỗi vòng lặp while (time--) chi co 250us phải kô anh ?anh giải thik dùm em với.em mới học pic .cám ơn anh!

                                Comment

                                Working...