Thông báo

Collapse
No announcement yet.

tutorial cho HTPIC

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

  • #61
    Thankyou for your contribution. We never forget! Keep good work!!!
    “If you create your own electricity, heating and water systems, you create your own politics. Maybe that’s what they’re afraid of.” –– Michael Reynolds

    Comment


    • #62
      Chào các bạn.

      Mình thấy quyển manual complier của bọn HTsoft cũng khá hay và đầy đủ chú ý. Do đó, thấy cái gì hay hay mình viết rùi các bạn góp ý kiến nhá. Có lẽ mình cũng nên lập thư viện cho HTPIC chứ nhỉ?? Thấy anh em dùng CCS hoạt động kinh quá .

      Đầu tiên là cách khai báo một biến đặt tại một địa chỉ nhất định trong RAM.

      Ví dụ, muốn Portvar là biến đặt tại địa chỉ 0x06 thì trong ASM ta dùng lệnh sau:
      Code:
      _Portvar EQU 06h
      Khi đó mỗi khi thao tác với biến Portvar tức là thao tác với ô nhớ 06h.

      Trong HTPIC các bạn khai báo như sau:
      Code:
      volatile unsigned char Portvar @ 0x06;
      Chú ý từ khóa @.

      Chúc các bạn thành công.
      Technical sale at WT Microelectronics S'pore
      Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
      Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

      Comment


      • #63
        Thư viện LCD 16x2 8bit mode.

        Mình xin upload thư viện viết cho LCD, ở đây mình dùng 8 bit mode cho LCD 2 line x 16 colum.

        Code:
        // LCD.h
        #ifndef	 LCD_H
        #define	LCD_H
        
        # include <pic.h>
        
        //============== Using LCD - 2 line, 16 colum
        #define	LCD_MODE_2x16		(TRUE)					// HDM16216H-2, HDM16216H-4, HDM16216H-5, HDM16216H-B, HDM16216H-D, HDM16216L-2, HDM16216L-5, HDM16216L-7, HDM16216L-D, HDM16216L-B, HDM16216H-I
        
        #define	LCD_CURSOR_BLINK					(FALSE)					// Blink/Noblink cursor mode
        #define	LCD_CURSOR_ON					(TRUE)						// Cursor visible
        #define	LCD_CURSOR_INCREMENT			(TRUE)						// Set left-to-right cursor movement
        #define	LCD_CURSOR_SHIFT					(FALSE)					// Shift display on entry
        
        #define	LCD_DISPLAY_ON					(TRUE)					// Turn display on/off
        
        #define	LCD_ALLOW_USER_CHARS			(TRUE)					// Controls whether display uses ASCII for control chars or uses user-defined chars in lcd_putc()
        #define	LCD_ENABLE_GETC					(TRUE)					// Save code space by setting to FALSE
        #define	LCD_ENABLE_GOTOXY				(TRUE)					//   any functions which you will not
        #define	LCD_ENABLE_PRINTF				(TRUE)					//   need in your application.
        #define	LCD_ENABLE_UNSCROLL			(TRUE)
        #define	LCD_ENABLE_SCROLL				(TRUE)
        #define	LCD_ENABLE_CLEAR					(TRUE)
        
        #define LCD_MAXROWS						((unsigned char)(2))
        #define	LCD_MAXCOLS						((unsigned char)(16))
        # define LCD_MULTI_LINE					(TRUE)
        
        #define LCD_8_BIT_MODE						(TRUE)
        
        //======================= Define LCD_PORT
        #define	LCD_DATA_PORT		PORTD					// Port on which LCD data lines are connected
        #define	LCD_TRIS_PORT		TRISD					// Need to specify the corresponding TRIS
        
        # define LCD_RS			RA1
        # define LCD_RW			RA2
        # define LCD_E				RA3
        
        # define LCD_TRIS_E		TRISA1
        # define LCD_TRIS_RW		TRISA3
        # define	LCD_TRIS_RS		TRISA2
        
        // =======================  Define command code
        #define	LCD_COMMAND_CLEAR				((unsigned char)(0x01))	//1.53 ms	// Clear screen, home cursor, unshift display
        #define	LCD_COMMAND_HOME				((unsigned char)(0x02))	//1.53 ms	// Home cursor, unshift display
        #define	LCD_COMMAND_BACKSPACE		((unsigned char)(0x10))				// Move cursor left one (destructive based on LCD_DESTRUCTIVE_BS)
        #define	LCD_COMMAND_FWDSPACE		((unsigned char)(0x14))				// Move cursor right one
        #define	LCD_COMMAND_PANLEFT			((unsigned char)(0x18))				// Move screen left one
        #define	LCD_COMMAND_PANRIGHT			((unsigned char)(0x1C))			// Move screen right one
        
        
        // ==================== Declare some functions
        void delay_us (unsigned char us);
        void delay_ms(unsigned char  ms);
        unsigned char LCD_getByte (void);
        void LCD_PrByte (unsigned char  c);
        void LCD_Command(unsigned char c);
        void LCD_PrChar (unsigned char  c);
        void LCD_gotoXY(unsigned char row, unsigned char col);
        unsigned char  LCD_getChar (void);						// Read character at cursor
        void LCD_Init(void);
        void LCD_PrString (const char* message); 
        
        #endif
        Các bạn sẽ thấy là khi muốn dùng LCD thì đầu tiên các bạn khai báo thông số cho LCD như các chân RS, RW, E, LCD_PORT ở Define LCD_PORT. Mặc định mình khai báo là: LCD_PORT là PortD, RS là RA1, RW là RA2, E là RA3.

        Các bước thực hiện:

        - Khởi tạo LCD dùng lệnh: LCD_Init();
        - Thao tác ghi đọc bình thường, chú ý nhất là các hàm: LCD_gotoXY, LCD_PrString, LCD_PrChar, LCD_Command.

        Tiếp theo là file LCD.c là file thực hiện:

        Code:
        //LCD.c
        # include "lcd.h"
        
        // ==== Some constants for LCD 16x2
        const unsigned char  const LCD_ROW_ADDRESS[] =					// Row/Column information for LCD_gotoxy()
        	{
        	0x00,		// Line 1
        	0x40		// Line 2
        	};
        
        const unsigned char  const LCD_INIT_STRING [] =					// LCD Init String on powerup
        	{
        	0b00000001,							//	Clear display
        	0b00000010,							//	Home cursor
        };
        
        //==========================================================================================
        void delay_us (unsigned char us){
        	while(us--){
        		asm("nop");
        		asm("nop");
        	};
        }
        
        //==========================================================================================
        void delay_ms(unsigned char  ms){
        	unsigned char	i, j;
        	while(ms--){
        		for (i = 0; i < 20; i++)
        			for (j = 0; j < 100; j++)
        				asm("nop");
        		};
        }
        // ============================================================================================
        unsigned char LCD_getByte (void){
        	unsigned char retval; 									// Return value
        	LCD_TRIS_PORT = 0xFF;								// Set port to all input
        	LCD_RW = 1;											// Tell LCD we want to read
        	delay_us(2);
        	LCD_E = 1;												// Do the read
        	delay_us(2);
        	retval = LCD_DATA_PORT;
        	LCD_E = 0;
        	LCD_TRIS_PORT = 0x00;								// Set port back to outputs
        	return (retval);
        }
        //====================================================================================================
        void LCD_PrByte (unsigned char  c){						// Write byte to port in current RS mode
        	unsigned char RS_Status;
        	RS_Status = LCD_RS;									// Get old pin state
        	LCD_RS = 0;											// Force into command mode to read state
        	while (LCD_getByte () & 0x80);							// Wait for read state
        	if (RS_Status)
        		LCD_RS = 1;										// Restore RS to old state
        	delay_us (1);
        	LCD_RW = 0;											// Set to write mode
        	delay_us (1);
        	LCD_DATA_PORT = c;									// Send the character out
        	LCD_E = 1;
        	delay_us(1);
        	LCD_E = 0;	
        }
        //================================================================================================
        /*Ham yeu cau goi lenh dieu khien LCD*/
        void LCD_Command(unsigned char c){						// Send command to LCD port
        	LCD_RS = 0;
        	LCD_PrByte(c);	
        }
        //================================================================================================
        /*Ham yeu cau goi du lieu hien thi len LCD*/
        void LCD_PrChar (unsigned char  c){						// Write character to LCD
        	LCD_RS = 1 ;
        	LCD_PrByte(c);
        }
        //=================================================================================================
        void LCD_gotoXY(unsigned char row, unsigned char col){
        	if (row > LCD_MAXROWS)						// Range limit
        		row = LCD_MAXROWS;
        	if (col > LCD_MAXCOLS)
        		col = LCD_MAXCOLS;
        	
        	row = LCD_ROW_ADDRESS[row-1];					// Get address of first byte on desired row
        	row += col - 1;
        	LCD_Command (0x80 | row);							// Write new cursor address
        }
        //  ===================================================================================== 
        unsigned char  LCD_getChar (void)							// Read character at cursor
        	{
        	unsigned char 	retval;										// Return value
        	LCD_RS = 1;
        	retval = LCD_getByte ();
        	LCD_RS = 0;
        	return (retval);
        	}
        
        //=======================================================================================
        void LCD_Init(void){
        	unsigned char i;	
        
        	 LCD_TRIS_PORT 	=	0x00;
        	 LCD_TRIS_E 	= 	0;
        	 LCD_TRIS_RW 	=	0;
        	 LCD_TRIS_RS 	=	0;
        
        	LCD_E = 0 ;
        	LCD_RS = 0;
        	LCD_RW = 0; 
        	 
        	 //delay_ms(100); 							  //   Tao tre 100ms cho LCD khoi dong
        	
        	LCD_PrByte (0b00111000); 		//Function set  ; DL = 1(8 bits) , N = 1 (2 lines), F = 0 (5x8 dots)
        	LCD_PrByte (0b00001100);		// Display on/off control 
        	LCD_PrByte (0b00000110);		// Entry mode set
        
        	LCD_PrByte(LCD_COMMAND_CLEAR);
        	LCD_PrByte(LCD_COMMAND_HOME);
        }
        
        // ===================================================================================================  
        
        void LCD_PrString (const char* message){					// Write message to LCD (C string type)
        
        	while (*message)						//	Look for end of string
        		LCD_PrChar (*message++);					//	Show and bump
        }
        Các bạn thêm 2 file này vào trong Project của mình và nhớ include file LCD.h vào chỗ đầu file chứa hàm Main nhé.

        Các bạn có thể mô phỏng bằng Proteus chạy rất ok. Lúc nào gửi tiếp mấy cái đã test.

        Chúc các bạn thành công.
        Technical sale at WT Microelectronics S'pore
        Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
        Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

        Comment


        • #64
          Thư viện I2C Master.100 Khz

          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 I2C_Init(void);          // khởi tạo I2C ở chế độ Master, Baud = 100 Khz
          void I2C_waitForIdle(void); // Chờ khi nào đường bus ở chế độ Idle (rảnh rỗi)
          void I2C_Start(void);        // Khởi động I2C - Master chiếm đường bus
          void I2C_repStart(void);   // Chế độ Restart
          void I2C_stop(void);         // Stop I2C - Master nhường đường bus cho thiết bị khác
          unsigned char I2C_write( unsigned char I2CWriteData ); // ghi một byte lên đường SDA
          unsigned char I2C_read( 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 I2C_NACK(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.
          Technical sale at WT Microelectronics S'pore
          Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
          Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

          Comment


          • #65
            sao không thấy cao thủ nào post bài hướng dẫn nữa vậy
            Mỗi người nên là ánh sáng cho chính bản thân mình!

            Comment


            • #66
              có bạn nào có phần mềm HTPIC xịn không cho mình với vì mình mới làm quen với PIC, nếu có thể bạn hướng dẫn cho mình trình nạp nữa thì tốt. cảm ơn các bạn nhiều.

              Comment


              • #67
                mình rất cần vì mình đang tiếp cận với PIC CSS thì mình làm rồi nhưng thấy không hay lắm.

                Comment


                • #68
                  cho em hoi
                  bit TMRO la bit gi` va anh cho TMRO=6 la co y nghia nhu the nao
                  em tim` trong dât shet ko thay noi den cai bit nay ma cung ko co thanh ghi nao nhu nay ca
                  |

                  Comment


                  • #69
                    Nguyên văn bởi phucvinh_el Xem bài viết
                    cho em hoi
                    bit TMRO la bit gi` va anh cho TMRO=6 la co y nghia nhu the nao
                    em tim` trong dât shet ko thay noi den cai bit nay ma cung ko co thanh ghi nao nhu nay ca
                    TMR0 là thanh ghi chứa giá trị đếm của Timer 0, đây là thanh ghi 8 bit, nó chỉ có một thanh ghi đó thôi, không giống như Timer 16 bit, ví dụ Timer 1 bạn sẽ tìm được TMR1H, TMR1L.

                    Tác giả nạp trước cho bộ đếm giá trị là 6, Timer 0 sẽ đếm từ giá trị này đến 255 thì tràn. Chắc ý tác giả muốn nạp trước giá trị 6 (trừ 1 lệnh hiệu chỉnh) để đựoc 250 x prescaler chu kỳ cho một lần tràn.

                    Ý tưởng thì có lẽ là vậy, nhưng thực tế nó sẽ chạy không hoàn toàn chính xác như vậy.

                    Comment


                    • #70
                      Nguyên văn bởi ngohaibac Xem bài viết
                      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 I2C_Init(void);          // khởi tạo I2C ở chế độ Master, Baud = 100 Khz
                      void I2C_waitForIdle(void); // Chờ khi nào đường bus ở chế độ Idle (rảnh rỗi)
                      void I2C_Start(void);        // Khởi động I2C - Master chiếm đường bus
                      void I2C_repStart(void);   // Chế độ Restart
                      void I2C_stop(void);         // Stop I2C - Master nhường đường bus cho thiết bị khác
                      unsigned char I2C_write( unsigned char I2CWriteData ); // ghi một byte lên đường SDA
                      unsigned char I2C_read( 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 I2C_NACK(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.
                      mình muốn phát xung 400us qua cổng RS 232 để truyền qua con MAX 232 để phát sóng FM bạn có thể chỉ giùm không ?

                      Comment


                      • #71
                        ban bắc gửi cho anh em phần mềm HTPIC đi.mình cũng đang cần

                        Comment


                        • #72
                          Anh Ngô Hài Bắc oi8 cho em hỏi một chút. Em lấy code sau dùng cho con PIC 16F877A trong mạch báo nhiệt độ nhưng khi em làm thử thì 2con led 7 đoạn nó không sáng gì cả.Em nghĩ chắc là code thiếu cái gì đó. Mong anh chỉ giáo cho em.Em có gửi kèm schematic của mach và code cua nó.
                          Attached Files

                          Comment


                          • #73
                            cho em hỏi về lập trình C cho Pic

                            Chào các bạn,

                            ah, mình định dùng camera để đưa dữ liệu vào máy tính, và nhờ VDK xử lý dữ liệu và tương tác với người sử dụng, ví dụ tren giao diẹn windown, học sinh có thể chọn 1 giá trị khoảng cách giữa hai khe hẹp đến màn, thí trên giao diện sẽ xuất hiện giá trị khoảng vân tương ứng,
                            mình chọn lập trình C vì minh đọc trên mạng thấy nếu cần cho việc thiết kế giao diện nhiều hơn thì nên chọn cách lập trình C cho VDK, và PIC 18F4550 thì dễ dùng cho lập trình C vì thế mình chọn và đã mua xong hết các thiết bị cần thiết rồi.
                            Nhưng đến lúc bắt tay vào việc lập trình cho PIC thì mình k có tài liệu về lập trình C cho VDK, và với PIC 18F4550 thì mình cần đọc những lài liệu nào để có thể lạp trình C cho nó?

                            Bạn nào có kinh nghiệm thì giúp mình với.

                            Comment


                            • #74
                              Nguyên văn bởi camthach Xem bài viết
                              Chào các bạn,

                              ah, mình định dùng camera để đưa dữ liệu vào máy tính, và nhờ VDK xử lý dữ liệu và tương tác với người sử dụng, ví dụ tren giao diẹn windown, học sinh có thể chọn 1 giá trị khoảng cách giữa hai khe hẹp đến màn, thí trên giao diện sẽ xuất hiện giá trị khoảng vân tương ứng,
                              mình chọn lập trình C vì minh đọc trên mạng thấy nếu cần cho việc thiết kế giao diện nhiều hơn thì nên chọn cách lập trình C cho VDK, và PIC 18F4550 thì dễ dùng cho lập trình C vì thế mình chọn và đã mua xong hết các thiết bị cần thiết rồi.
                              Nhưng đến lúc bắt tay vào việc lập trình cho PIC thì mình k có tài liệu về lập trình C cho VDK, và với PIC 18F4550 thì mình cần đọc những lài liệu nào để có thể lạp trình C cho nó?

                              Bạn nào có kinh nghiệm thì giúp mình với.
                              ko bit a dùng camera làm j trong trường hợp này ? vì rõ ràng học sinh nhấp chuột vào màn hình (giá trị khoảng vân sẽ xuất hiện ) thì mọi thao tác đều nằm trong sự kiểm soát PC --> PIC và camera ko dùng .
                              Còn nếu í a là học sinh chỉ vào bảng ( máy chiếu sẽ chiếu lên bảng) , camera nhận hình ảnh vị trí tay học sinh đang chỉ --> đưa về PC sử lí --> wa khủng với 1 ng chưa bit lập trình C cho PIC như thế nào.

                              A hình như đang hiểu sai về công dụng của PIC và camera trong trường hợp này . Cách đơn giản và hiệu quả nhất là :
                              - Mua 1 bộ thu phát IR hoặc RF
                              - Mạch thu gắn thêm con PLS2030 ( tên con này ko nhớ rõ , chỉ nhớ là tạo cổng COM ảo) . Còn nếu dùng PIC 4550 thì khỏi cần vì bản thân PIC này đã có module giao tiếp USB
                              - Viết chương trình nhận tín hiệu từ bộ Tx , đưa vào PIC sử lí , oy truyền tín hiệu điều khiển lên PC
                              - Tại PC , a viết chương trình nhận tín hiệu từ cổng USB ( do PIC gửi lên) bằng VB hoặc Delphi. Đây là công đoạn giao tiếp PC chứ ko có chi hết.
                              Giao tiếp PC thì a bit oy . Vd : trên mạch phát TX , nhấn nút 1 thì ra lệnh cho chuột click đúp vào my Computer.

                              Comment


                              • #75
                                Nguyên văn bởi Zz_Bi_zZ Xem bài viết
                                ko bit a dùng camera làm j trong trường hợp này ? vì rõ ràng học sinh nhấp chuột vào màn hình (giá trị khoảng vân sẽ xuất hiện ) thì mọi thao tác đều nằm trong sự kiểm soát PC --> PIC và camera ko dùng .
                                Còn nếu í a là học sinh chỉ vào bảng ( máy chiếu sẽ chiếu lên bảng) , camera nhận hình ảnh vị trí tay học sinh đang chỉ --> đưa về PC sử lí --> wa khủng với 1 ng chưa bit lập trình C cho PIC như thế nào.

                                A hình như đang hiểu sai về công dụng của PIC và camera trong trường hợp này . Cách đơn giản và hiệu quả nhất là :
                                - Mua 1 bộ thu phát IR hoặc RF
                                - Mạch thu gắn thêm con PLS2030 ( tên con này ko nhớ rõ , chỉ nhớ là tạo cổng COM ảo) . Còn nếu dùng PIC 4550 thì khỏi cần vì bản thân PIC này đã có module giao tiếp USB
                                - Viết chương trình nhận tín hiệu từ bộ Tx , đưa vào PIC sử lí , oy truyền tín hiệu điều khiển lên PC
                                - Tại PC , a viết chương trình nhận tín hiệu từ cổng USB ( do PIC gửi lên) bằng VB hoặc Delphi. Đây là công đoạn giao tiếp PC chứ ko có chi hết.
                                Giao tiếp PC thì a bit oy . Vd : trên mạch phát TX , nhấn nút 1 thì ra lệnh cho chuột click đúp vào my Computer.
                                Cam on ban Zz-bi-Zz,

                                Nhưng mình muốn nói rõ hơn là hiện tại mình có sẵn bộ thí nghiệm giao thoa với ánh sáng laze đỏ. và đã tạo ra một hệ thống vân giao thoa rồi (cho HS quan sát thực tế).
                                Và bạn biết là khi mình di chuyển vị trí nguồn sáng laze thì hệ vân giao đó sẽ thay đổi theo. (khoảng vân i sẽ tăng hoặc giảm phụ thuộc vào vị trí nguồn laze D).
                                Vấn đề của mình là muốn chứng minh điều này bằng thí nghiệm giao thoa đó ghép nối qua máy tính. Trên giao diện Windown, HS sẽ chọn 1 vị trí D (D =40cm), máy tính sẽ điều khiển vị trí của nguồn laze đến đúng vị trí D đã chọn đấy thông qua PIC, và camera sẽ nhận tín hiệu lúc này đưa về PIC xử lý và đưa kết quả khoảng vân i (i = 0.0005cm) lên giao diện Windown.
                                Vì mình là giáo viên cấp 3, thí nghiệm ở trường thì hơi lạc hậu.., mình muốn HS có cái tool để học hiện đại hơn mà chờ nhà nước cấp cho thì chắc....HS của mình đã ra trường rồi . Nên mình tự bỏ tiền túi và mày mò để làm thui. Hi vọng nhờ các anh giúp đỡ.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X