23
TCP/IP Stack Microchip Author by Chandufo HUT 3/2010 Processor: dsPic33FJ128GP708 Debug: MpLab - C30 Library: TCP/IP Stack v5.20 Ethernet Card: ENC28J60 (with HTC245) Cấu hình để chạy TCP/IP: Phần cứng: Cấu hình giao tiếp SPI2 (hoặc SPI1) với ENC28J60 Cấu hình chân CS, RS, CLK để chọn devices là ENC28J60 Cấu hình các chân LED, LCD Phần mềm: Cấu hình TCP/IP chọn các giao thức đã có sẵn.

Bao Cao Ethernet Chandufo

Embed Size (px)

Citation preview

Page 1: Bao Cao Ethernet Chandufo

TCP/IP Stack MicrochipAuthor by ChandufoHUT3/2010Processor: dsPic33FJ128GP708Debug: MpLab - C30Library: TCP/IP Stack v5.20Ethernet Card: ENC28J60 (with HTC245)

Cấu hình để chạy TCP/IP:Phần cứng:

Cấu hình giao tiếp SPI2 (hoặc SPI1) với ENC28J60Cấu hình chân CS, RS, CLK để chọn devices là ENC28J60Cấu hình các chân LED, LCD

Phần mềm:Cấu hình TCP/IP chọn các giao thức đã có sẵn.

Page 2: Bao Cao Ethernet Chandufo

I. Cấu hình phần cứng:Cấu hình phần cứng chỉ trong file HardwareProfile.h. Trong file này ta định

nghĩa các thành phần như sau:Chọn Explorer_16 ứng với dòng dsPicChọn Fcy=80Mhz (mặc định là Fcy=80Mhz, vì vậy ta cần cấu hình lại bộ

chia để đạt được 80Mhz ứng với thạch anh của mình)Cấu hình chân LED là cổng ACấu hình chân nút nhấn là cổng C Cấu hình Chân UART là UART2Cấu hình chân LCD là cổng B và DCấu hình chân chọn chip SC, và tín hiệu Reset là CS của ENC28J60Cấu hình giao tiếp SPI là SPI2 để giao tiếp với ENC28J60Bỏ các cấu hình ADC, SPI1 đối với giao tiếp thẻ nhớ EEPROM, SD, MMC

Trong file: HardwareProfile.h1. Chọn phần cứng là cho dsPic là là dòng dsPic: #define EXPLORER_16

2.Tại dòng 739, cấu hình cho chân LED, nút nhấn, ENC28J60, và UART//dinh nghia LED #define LED0_TRIS (TRISAbits.TRISA6) // Ref D3

#define LED0_IO (LATAbits.LATA6)#define LED1_TRIS (TRISAbits.TRISA7) // Ref D4#define LED1_IO (LATAbits.LATA7)#define LED2_TRIS (TRISAbits.TRISA9) // Ref D5#define LED2_IO (LATAbits.LATA9)#define LED3_TRIS (TRISAbits.TRISA10) // Ref D6#define LED3_IO (LATAbits.LATA10)#define LED4_TRIS (TRISAbits.TRISA12) // Ref D7#define LED4_IO (LATAbits.LATA12)#define LED5_TRIS (TRISAbits.TRISA13) // Ref D8#define LED5_IO (LATAbits.LATA13)#define LED6_TRIS (TRISAbits.TRISA2) // Ref D9#define LED6_IO (LATAbits.LATA2)#define LED7_TRIS (TRISAbits.TRISA3)#define LED7_IO (LATAbits.LATA3)#define LED_GET() (*((volatile unsigned char*)(&LATA)))#define LED_PUT(a) (*((volatile unsigned char*)(&LATA)) = (a))

//dinh nghia nut nhan#define BUTTON0_TRIS (TRISCbits.TRISC1) // Ref S4#define BUTTON0_IO (PORTCbits.RC1)#define BUTTON1_TRIS (TRISCbits.TRISC2)#define BUTTON1_IO (PORTCbits.RC2)#define BUTTON2_TRIS (TRISCbits.TRISC3) // Ref S6#define BUTTON2_IO (PORTCbits.RC3)#define BUTTON3_TRIS (TRISCbits.TRISC4) // Ref S3#define BUTTON3_IO (PORTCbits.RC4)

//dinh nghia UART#define UARTTX_TRIS (TRISFbits.TRISF5)#define UARTTX_IO (PORTFbits.RF5)#define UARTRX_TRIS (TRISFbits.TRISF4)#define UARTRX_IO (PORTFbits.RF4)

// ENC28J60 I/O pins

Page 3: Bao Cao Ethernet Chandufo

#define ENC_CS_TRIS (TRISGbits.TRISG12)#define ENC_CS_IO (PORTGbits.RG12)#define ENC_RST_TRIS (TRISGbits.TRISG13) .#define ENC_RST_IO (PORTGbits.RG13)

//dinh nghia SPI2#if defined(__C30__) // PIC24F, PIC24H, dsPIC30, dsPIC33#define ENC_SPI_IF (IFS0bits.SPI2IF)#define ENC_SSPBUF (SPI2BUF)#define ENC_SPISTAT (SPI2STAT)#define ENC_SPISTATbits (SPI2STATbits)#define ENC_SPICON1 (SPI2CON1)#define ENC_SPICON1bits (SPI2CON1bits)#define ENC_SPICON2 (SPI2CON2)

3. Cấu hình LCD:Tại dòng 1066, trong file hardwareprofile.h

#if !defined(ENC100_INTERFACE_MODE) || (ENC100_INTERFACE_MODE == 0) // SPI only#define LCD_DATA_TRIS (*((volatile BYTE*)&TRISD))#define LCD_DATA_IO (*((volatile BYTE*)&LATD))#define LCD_RD_WR_TRIS (TRISBbits.TRISB5)#define LCD_RD_WR_IO (LATBbits.LATB5)#define LCD_RS_TRIS (TRISBbits.TRISB4)#define LCD_RS_IO (LATBbits.LATB4)#define LCD_E_TRIS (TRISBbits.TRISB6)#define LCD_E_IO (LATBbits.LATB6)

#endif

4. Chọn Fcy=80Mhz:Tại dòng 181.#elif defined(__dsPIC33F__)

// dsPIC33F processor//...#define GetSystemClock() (80000000ul) // Hz#define GetSystemClock() (80000000ul) // Hz (Fosc = 80Mhz #define GetInstructionClock() (GetSystemClock()/2)#define GetPeripheralClock() GetInstructionClock()

II. Các thiết lập để chạy chương trình:Trong file maindemo.c có các thiết lập sau:

Thiết lập bộ chia để Fcy=80MhzQui định chân vào/ra đối với nút nhấn, LED. (riêng LCD thì không cần, vì đã

được thiết lập trong chương trình LCD, ta chỉ cần chọn chân cho nó)Cấu hình để bắt sườn lên đối với nút nhấn.Bỏ các thiết lập ADC vì không dùng.

1. định nghĩa để p33 chạy ở tốc độ 40MIPs. Tại dòng 327 của maindemo.h:

#if defined(__dsPIC33F__) || defined(__PIC24H__)PLLFBD = 30; // Multiply by M=32 for 160MHz VCO output (10MHz External oscillator)CLKDIV = 0x0000; // FRC: divide by 2, PLLPOST: divide by 2=N1, PLLPRE: divide by 2=N2

2. Cấu hình để cho chương trình bắt sườn lên của nút nhấn, chân LED là chân ra, nut nhấn là chân vào. Trong maindemo.h:

Page 4: Bao Cao Ethernet Chandufo

static void InitializeBoard(void){

// LEDs qui dinh chan raLED0_TRIS = 0; //RA6LED1_TRIS = 0; //RA7LED2_TRIS = 0; //RA9

#if !defined(EXPLORER_16) // Pin multiplexed with a button on EXPLORER_16 LED7_TRIS = 0;

#endifLED_PUT(0xFF); //cho LED sangLED2_IO=1;

//dinh nghia chan vao cho ButtonBUTTON0_TRIS = 1; //RC1; RC2; RC3; RC4BUTTON1_TRIS = 1;

//bat theo suon len.AD1PCFGH=0XFFFF;AD1PCFGL=0XFFFF;

. III. Thiết lập không dùng bộ nhớ ngoài.

Bộ nhớ ngoài dùng để lưu trữ Web nhúng, Web ở đây định dạng http và http2. Bộ nhớ dùng để lưu trữ có thể có 3 loại: SD/MMD, EEPROM, Flash Serial.

Nếu muốn dùng Web nhúng, ta có thể lưu trữ vào bộ nhớ nội. lúc ấy, cần tạo một file bộ nhớ của Web định dạng MPFS. Để tạo ra file định dạng MPFS thì Microchip đã đưa ra công cụ MPFS2 trong folder Utilities để chuyển toàn bộ dữ liệu Web thành một file duy nhất. Web phải được đưa vào 1 folder, đối với trình dịch C30 thì file được xuất ra là MPFS.s.

Để sử dụng Web nhúng trong bộ nhớ nội, trong file TCPIPconfig.h bỏ thiết lập dùng bộ nhớ ngoài, và #include MPFS.s trong chương trình maindemo.c. Đặt lại tên mặc định của Web server là index.htm trong file TCPIPConfig.h dòng 465.

Tuy nhiên với mục đích không dùng Web nhúng, vì vậy ta không dùng Web http và các giao thức truyền nhần của http là SMTP và SNMP. Đồng thời sẽ không dùng bộ nhớ nội và ngoại để lưu Web nhúng nữa. Để làm điều này ta làm như sau:

Trong file TCPIPconfig.h bỏ các dòng đó đi://#define STACK_USE_HTTP2_SERVER//#define STACK_USE_HTTP_SERVER//#define STACK_USE_SMTP_CLIENT//#define STACK_USE_SNMP_SERVER

Và cũng đồng thời bỏ lưu trữ trong EEPROM và Flash memory//#define MPFS_USE_EEPROM//#define MPFS_USE_SPI_FLASH

Lúc này ta đã định nghĩa không dùng Web nhúng, và tất nhiên chúng ta cũgng không cần #include MPFS.s trong chương trình Maindemo.c

Page 5: Bao Cao Ethernet Chandufo

Định nghĩa địa chỉ IP,MAC, Hostname:Tất cả định nghĩa này được định nghĩa trong file TCPIPConfig.h.Chúng ta chỉ cần thay đổi IP, Submask Net, DNS.

1. Địa chi IP:Địa chỉ IP được thiết lập ban đầu là 192.168.1.1Địa chỉ này được thiết lập là IP động. Khi khởi động, TCP/IP sẽ gửi gói tin

ARP để hỏi xem địa chỉ này đã được sử dụng hay chưa, nếu chưa, thì IP này sẽ là IP của TCP. Còn nếu không TCP sẽ có một IP khác do mạng cung cấp.#define MY_DEFAULT_IP_ADDR_BYTE1 (192ul)#define MY_DEFAULT_IP_ADDR_BYTE2 (168ul)#define MY_DEFAULT_IP_ADDR_BYTE3 (1ul)#define MY_DEFAULT_IP_ADDR_BYTE4 (1ul)

2. Địa chỉ MAC và hostname:MAC được thiết lập với ENC là 00-04-A3-00-00-00. Hostname là:

#define MY_DEFAULT_HOST_NAME "1stChandufo"

3. Submask net, Gateway:Submasknet được chọn là: 255.255.0.0

#define MY_DEFAULT_MASK_BYTE1 (255ul)#define MY_DEFAULT_MASK_BYTE2 (255ul)#define MY_DEFAULT_MASK_BYTE3 (0ul)#define MY_DEFAULT_MASK_BYTE4 (0ul)

Cần chú ý trong thiết lập mạng LAN cũng phải cùng Submasknet. Mặc định của Windows là 255.255.255.0. Vì vậy ta phải định nghĩa lại là 255.255.0.0 trong thiết lập mạng LAN đối với Windows nhé.Hoặc ta có thể định nghĩa lại cho TCP là 255.255.255.0. Nhưng nói tóm lại là 2 cái thằng đó phải giống nhau.

Về mặt lí thuyết có thể không giống nhau cũng được, và vẫn có thể cùng mạng LAN. Chỉ cần giống nhau ở 2 lớp A và B, sau khi AND IP với SubmaskNet.

Page 6: Bao Cao Ethernet Chandufo

Đặc điểm của TCP/IP Stack:TCP/IP Stack là ứng dụng để tạo một Webserver nhúng, hoặc các giao thức

giao tiếp Enthernet hiện hành. Bao gồm các giao thức truyền dữ liệu TCP, UDP. Và hỗ trợ các module khác như: IP, ICMP, DHCP, ARP và DNS

TCP/IP cũng có các Module sử dụng cho lớp application như: HTTP cho Web, SMTP cho gửi và nhận Email, SNMP cho giao thức trạng thái và điều khiển. Telnet cho điều khiển từ xa, TFTP.

Cấu trúc thư mục của TCP/IP:TCP/IP v5.20 có bản cài đặt MCHP_App_ Lib v2010_02_09_Installer.zip

nặng 79Mb.Sau khi cài đặt, thư mục của TCP/IP như sau:

Thư mục chứ mã nguồn cho dòng dsPic là: \TCPIP Demo AppThư mục chứa chương trình dịch MPFS image là: Microchip\UtilitiesThư mục chưa chương trình C# để phát hiện IP, MAC, Hostname đã viết sẵn là Microchip\TCPIP Stack\Utilities\Source\Microchip Ethernet Discoverer

Chúng ta chỉ làm việc với 2 thư mục là Microchip và TCPIP Demo App. Các thư mục khác xóa đi cũng được.

Phần cứng hỗ trợ của TCPIP Stack

Page 7: Bao Cao Ethernet Chandufo

TCPIP hỗ trợ hầu hết các dòng PIC có giao thức SPI, bao gồm dòng Pic18, Pic24, dsPic30,dsPic33, Pic32.Sau đây là một vài dòng Pic đã được Microchip code sẵn:

Như trên thấy, dòng dsPic33FJ256GP710 tốc độ MIPS là 40MIPs, giao tiếp SPI với ENC, xung thạch anh là 8Mhz. Tốc độ truyền UDP trong mạng LAN là 256Kb/sec. TCP vì lí do bảo đảm dữ liệu và xác nhận nên tốc độ TCP luôn thấp hơn UDP, và với bộ đêm 200byte của FIFO thì tốc độ TCP trong mạng LAN là 77Kb/sec.

Các file cần thiết để cho TCP/IP: A main file- this is the file with your application code in it.. ARP.c and ARP.h- These files are used by the stack to discover the MAC address associated with a

given IP address. Delay.c and Delay.h – These files are used to provide delays for some stack functions. Note that it

would be best to not use these delays in your own code, as they do create blocking conditions. Physical layer files – These files are used to enable a specified physical layer. More information on

which files to include can be found in the Hardware Configuration section. Helpers.c and Helpers.h – These files contain helper functions used for miscellaneous stack tasks. IP.c and IP.h – These files provide internet layer functionality for the stack. StackTsk.c and StackTsk.h – These files contain the code to initialize the stack and perform the

callbacks that keep the stack going. Tick.c and Tick.h – These files implement a tick timer that is used to implement some timing

functionality within the stack. HardwareProfile.h – This configuration file is used to set up hardware options. TCPIPConfig.h – This configuration file is used to set up firmware options. MAC.h – This header file provides macros and structures relating to the hardware MAC layer.

TCPIP.h – This is the primary include file for the stack. Your main file should include TCPIP.h.

Page 8: Bao Cao Ethernet Chandufo

Porting cho dòng dsPic33FJ128GP708:Chạy demo của dòng dsPic33FJ256GP710, sử dụng ENC28J60. Code đã

được hỗ trợ sẵn trong thư mục Application/TCPIP Demo App-C30.mcpChọn Devices là dsPic33FJ128GP708.Cấu hình không sử dụng HTTP website và bộ nhớ EEPROM. (bỏ

STACK_USE_HTTP_SERVER, STACK_USE_HTTP2_SERVER,STACK_USE_SMTP_CLIENT,STACK_USE_SNMP_SERVER, #define MPFS_USE_EEPROM)

Thử dịch lại chương trình.

Hoạt động của TCP/IPKhi định nghĩa chế độ chạy ban đầu như trên, chương trình đã có rất nhiều

tiện ích cơ bản. như UDP, TCP, các hàm Barkeley, Pingdemo, UART. Vì vậy bạn có thể bắt tay vào tìm hiểu từng ứng tác vụ đã được viết sẵn.

TCP/IP Stack hoạt động gần giống cấu trúc của HĐH thời gian thực, tức là các nhiệm vụ sẽ được chia thành các tác vụ ( ở đây là TCP, UDP, Ping,…). Tất cả hoạt động của TCP/IP sẽ được một đồng hồ chung quản lí theo Time Split. Tức là có một Timer hệ thống (Timer1), cứ 1 khoảng thời gian ngắn sẽ ngắt (gọi là 1 TICK), khi bị ngắt, hệ thống sẽ treo lại, ngữ cảnh của tất cả các tác vụ được bộ lập lịch lôi ra, xem xét tác vụ nào được chạy theo kiểu chia sẻ thời gian (vì không có mức ưu tiên cho tác vụ). Sau đó cho phép tác vụ đó chiếm quyền thực thi của CPU. Đến TICK tiếp theo, hệ thống lại treo lại, và lại lôi ngữ cảnh ra, cứ tiếp tục như vậy mãi.

Với cơ chế hoạt động này, chip dsPic33 được coi như một lúc có thể vừa thực hiện TCP, vừa thực hiện UDP, Ping,…. Vừa có thể là Server và Client cùng một lúc.

Vì vậy, dsPic nếu được thiết lập ở chế độ TCP Server/Client sẽ hoạt động đồng thời cả 2 hoạt động này. Server lắng nghe kết nối từ Client nào đó trên mạng. Còn Client thì gửi lệnh mở cổng kết nối tới một Server nào đó cũng ở trên mạng, mà ta có thể xác lập được.

Vì vậy, hoạt động của các tác vụ là độc lập với nhau, không chịu ảnh hưởng lẫn nhau. Đây là điểm mạnh của hệ thống mô phỏng theo thời gian thực.

Kết nối giữa dsPic33 với PC có 2 chế độ:Chế độ mạng LAN, địa chỉ PC là 192.268.1.x, và Submasknet là

255.255.0.0. Kiểm tra TCP Server bằng Advanced Serial Port Terminal, UDP trên cổng 30303 bằng Microchip Ethernet Discoverer,…

Chế độ mạng toàn cầu, cứ cắm trực tiếp RJ45 từ moderm vào RJ45 của KIT, lúc đó sẽ thực hiện được các lệnh Ping Google, TCP client/server….

Page 9: Bao Cao Ethernet Chandufo

TCP Server/Client ProcessPhần này ta sẽ tìm hiểu 2 tác vụ TCP Server và TCP Client hoạt động như

thế nào.Kích hoạt TCP Server/Client: Uncomment 2 protype sau trong file Tcpipconfig.h:

#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP Client in GenericTCPClient.c#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE // Server in GenericTCPServer.c

1. TCP Client trong file: GenericTCPClient.c:TCP Client sẽ kết nối với Google bằng cổng 80 (cổng 80 là cổng LUÔN

LUÔN LISTEN ở bất cứ Server nào, giao thức TCP). Sau đó khi có tín hiệu kết nối, sẽ kết nối với Google.

TCP Client tiếp tục gửi lệnh tìm kiếm từ Chandufo, bằng phương thức truy cập là GET, URL tìm kiếm trên Google được định nghĩa là:

static ROM BYTE RemoteURL[] = "/search?as_q=Chandufo"

Phương thức GET bạn có thể tham khảo trên Internet để biết thêm cách thức câu lệnh, ở đây, là mã nguồn của phương thức GET:

TCPPutROMString(MySocket, (ROM BYTE*)"GET ");TCPPutROMString(MySocket, RemoteURL);TCPPutROMString(MySocket, (ROM BYTE*)" HTTP/1.0\r\nHost: ");TCPPutString(MySocket, ServerName);TCPPutROMString(MySocket, (ROM BYTE*)"\r\nConnection: close\r\n\r\n");

Lệnh GET là phương thức lấy nội dung HTML. Với Google, khi nhân được một lệnh là GET "/search?as_q=Chandufo” nó sẽ trả về kết quả tìm kiếm. Và kết quả này được dspic33 nhận về và Gửi vào UART để tam khảo sát xem có đúng kết quả tìm kiếm.

Khi muốn tìm kiếm, ta phải nhấn nút Button1 (_RC1) để thực hiện lệnh tìm kiếm này:case SM_DONE:// Do nothing unless the user pushes BUTTON1 and wants to restart the whole connection/download process if(BUTTON1_IO == 0u)

GenericTCPExampleState = SM_HOME;break;

2. TCP server trong file GenericTCPServer.c:TCP Server có nhiệm vụ mở một cổng 9760 để LẮNG NGHE các kết nối từ

máy Client. #define SERVER_PORT 9760

Lệnh mở một cổng 9760 để lắng nghe, tạo thành server như sau:

Page 10: Bao Cao Ethernet Chandufo

//TCP_OPEN_SERVER=0 nhe. server_port=9760MySocket = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER);

Khi có tín hiệu là một mã ASCII gửi tới cổng 9760, Server sẽ đổi thành chữ IN HOA, rồi gửi trả về cho Client. Trong đoạn code này, Chandufo đã code thêm đoạn là khi nhận được chuỗi string, server sẽ ghi lên LCD, rồi upcase để gửi lên công 9760 cho Client.

Chương trình TEST server bạn dùng Advanced Serial Port Terminal.

Host là địa chỉ IP của dsPic, hiện lên trên LCD, hoặc gửi qua cổng UART bạn có thể thấy khi Reset hoặc khi thay đôi IP.

Bạn hãy sent thử một chuỗi string xem nhé.

Page 11: Bao Cao Ethernet Chandufo

Mô phỏng TCP/ IP Stack của Microchip.File mô phỏng cho dòng Pic PIC24FJ128GA010, tuy nhiên bạn có thể thay

đổi Pic để nạp cho dòng dsPic33 như trên. File mô phỏng này là của bọn ProtelUs cung cấp, vì vậy, bạn có thể tìm thấy trong thu mục sample của nó.

Mã nguồn của nó được Chandufo gửi kém theo. Bạn có thể chạy nó để xem một vài kết quả.

Với mặc định là dùng Web nhúng, bạn hãy dùng FireFox gõ địa chỉ hiển thị trên LCD của Protelus, sẽ hiện ra được trang Web nhúng trong đó, dùng để điều khiển và hiển thị trạng thái của mạch.Protelus:

FireFox:Gõ địa chỉ 192.168.1.4, đó là địa chỉ của dsPic. Chương trình này là chương trình mô phỏng, có Web nhúng, trong thực tế, chandufo không dùng Web nhúng mà chỉ dùng dsPic để trao đổi dữ liệu thông qua Internet. Vì vậy không cần con EEPROM 25LC256 (256Kb)

Page 12: Bao Cao Ethernet Chandufo
Page 13: Bao Cao Ethernet Chandufo

UDP ServerUDP server được viết trong file Announce.cCổng của UDP server là :

#define ANNOUNCE_PORT 30303

Nhiệm vụ của UDP server, lắng nghe kết nối từ Client, khi có tín hiệu hỏi bắt đầu bằng kí tự “D”, thì trả về chuỗi tring cho Client bao gồm Hostname, MAC.

Khi có sự thay đổi IP, hoặc là khởi động hệ thống, UDP server sẽ gửi ra cổng 30303 một chuỗi gồm hostname, MAC và thông tin khởi động lại nguồn.

Microhip đã đưa sẵn một Utilities để kiểm tra hoạt động này, dựa trên mã nguồn C#.chương trình: \Microchip\TCPIP Stack\Utilities\Microchip Ethernet Discoverer.exe

Chandufo đã viết một chương trình tựa theo mã nguồn C# này để giao tiếp UDP với dsPic33. bật tắt LED, và hiển thị LCD.

Giao diện chương trình như sau.

Page 14: Bao Cao Ethernet Chandufo

Với UDP Client trên phần mềm C# có các đoạn Code sau:Đầu tiên phải mở Socket UDP. Sau đó kết nối tới port 30303 để xem IP của

thiết bị nào ở đấy. (ở đây là DsPic), tức là lấy địa chỉ IP của server dsPic. Sau đó tạo một cho chính mình (là client) một địa chỉ IP bất kì tại cổng 30303 luôn( có thể trùng số hiệu cổng ở cả Server và client mà), để lắng nghe các dữ liệu từ server gửi tới, sau đó tạo một đối tượng để thực làm nhiệm vụ lắng nghe đó

//tao doi tuong UDP GlobalUDP.UDPClient = new UdpClient();

//tim` kiem dia chi IP cua remoteGlobalUDP.EP = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("255.255.255.255"), 30303);

//tao mot cong listen de lang nghe du lieuSystem.Net.IPEndPoint BindEP = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 30303);

// tao cong lang nghe.GlobalUDP.UDPClient.Client.Bind(BindEP);

Gửi thông điệp lấy địa chỉ MAC, Localhost là chuỗi string có kí tự “D” đầu tiên. Mã lệnh gửi thông điệp như sau:// Gui thong diep chu "D" de lay thong tin he thong (ki tu dau tien la chu "D")byte[] DiscoverMsg = Encoding.ASCII.GetBytes("Discovery: Who is out there?");// truyen thong diep yeu cau`GlobalUDP.UDPClient.Send(DiscoverMsg, DiscoverMsg.Length, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("255.255.255.255"), 30303));

Mã lệnh trên có thể thay bằng lệnh sau ( vì địa chỉ IP của server chúng ta đã có được ở phần trên, (ở trong phần GlobalUDP.EP )// Gui thong diep chu "D" de lay thong tin he thong (ki tu dau tien la chu "D")byte[] DiscoverMsg = Encoding.ASCII.GetBytes("Discovery: Who is out there?");// truyen thong diep yeu cau`GlobalUDP.UDPClient.Send(DiscoverMsg, DiscoverMsg.Length, GlobalUDP.EP);

Các nhiệm vụ LED, LCD trên C# được thực hiện tương tự trong sự kiện on_click, ví dụ với LCD như sau: LCD sẽ gửi xuống một chuỗi kí tự độ dài 16bytes, để ghi lên hang trên của LCD. Mã lệnh là chữ “L”: (ở đây chưa xử lí đoạn nhập vào quá 16 kí tự, cũng khá dễ, bạn tự làm nhé, he):

//truyen thong diep ghi vao LCD, ma lenh la "L"//xu li de thong diep chi dung lai la 16 ki tustring str1 = "L" + txtLCD.Text;int kk = 0;for (kk = str1.Length; kk < 16; kk++) str1 = str1 + " "; //MessageBox.Show(str1);byte[] DiscoverMsg = Encoding.ASCII.GetBytes(str1);

Page 15: Bao Cao Ethernet Chandufo

// truyen thong diep yeu cau`GlobalUDP.UDPClient.Send(DiscoverMsg, DiscoverMsg.Length, GlobalUDP.EP);

UDP Server trên dspic:Nhiệm vụ là mở một UDP, để lien tục lắng nghe trên cổng 30303. Nếu có tín

hiệu chữ “D”, thì gửi MAC, Localhost. Nếu có tín hiệu chữ “L” thì hiển thị chuỗi string nhận được vào LCD, nếu có tín hiệu là “1”, “2”, “3” thì sẽ thay đổi trạng thái ON/OFF của đèn LED tương ứng trên cổng A (RA6, RA7, RA9).

File nguồn: Announce.c

Khai báo Socket và mở một Socket:static UDP_SOCKET MySocket;

// Open a UDP socket for outbound broadcast transmissionMySocket = UDPOpen(ANNOUNCE_PORT, NULL, ANNOUNCE_PORT);

Tham số ANNOUNCE_PORT đầu tiên là tên UDP, bạn có thể lấy bất cứ số nào, ví dụ như 2840, 2534…còn tham số ANNOUNCE_PORT thứ 2 là số hiệu cổng của UDP, là 30303 như khai báo.

Mã nguồn sau sẽ đọc dữ liệu mã lệnh và 16 kí tự trong bộ đệm nhận, Nếu không có 16 kí tự ( ví dụ như gửi LED, chỉ gưi mã lệnh thôi), thì chuỗi đọc về là bất kì. (điều đó không quan trọng, vì chỉ khi mã lệnh đúng, thì chắc chắn sẽ có chuỗi kí tự nhận được là đúng ):

// See if this is a discovery query or replyUDPGet(&i);UDPGetArray(&j[0],lenStr);

Mã lệnh để ghi LCD, đèn LED:if (i=='L'){

//cstringfor (kk=0; kk<lenStr; kk++)strLCD[kk]=j[kk];

#ifdef USE_LCD//LCDPos = 1;strcpy(LCDText, strLCD);LCDUpdate();

#endif}if (i=='1') LED0_IO=!LED0_IO;if (i=='2') LED1_IO=!LED1_IO;if (i=='3') LED2_IO=!LED2_IO;

Chú ý, kiểu enum khi biến ghi là DiscoverySM++, tức là trỏ tới giá trị thứ 2 trong tập hợp enum. Enum là một kiểu tập hợp của bất cứ kiểu nào.

Page 16: Bao Cao Ethernet Chandufo

Web nhúng vào dsPic33Với xậy dựng mô hình không có bộ nhớ EEPROM, vì vậy bạn cần lưu trữ

nội dung Web vào bộ nhớ. Để lưu trữ được, cần chuyển toàn bộ trang Web với ngôn ngữ html được

thiết kế bằng (notepad, Dreamwaver…) vào trong 1 kiểu dữ liệu mà Mplab hiểu được như một chuỗi hằng số.

Công cụ chuyển đổi là MPFS2.exe có dạng như sau:

Với trình dịch C30, file tạo ra là file MPFSImg2.s, file này được cho vào phần header của file Maindemo.c.

#include "MPFSImg2.s"

Và tất nhiên ta phải định nghĩa sử dụng dịch vụ http2 cùng dịch vụ mail. Và bỏ dịch vụ sử dụng bộ nhớ ngoài. Tất cả trong file TCPIPconfig.h. Điều này được nói ở phần trên. (phần III. Thiết lập không dùng bộ nhớ ngoài).

Khi nạp xong, ta chỉ cần truy cập vào IP của dsPic là có thể vào được trang Web nhúng này.

Hiện tại Chandufo thấy đang Debug sai phần này, và nếu khi nhúng vao Web, vậy thì các hàm function viết sẵn là javascript như %16, %17… được thực hiện như thế nào thì chưa biết. hic. Nhưng về mặt lí thuyết là như vậy, Chandufo đã kiểm chứng trong phần mô phỏng của Protelus.

Page 17: Bao Cao Ethernet Chandufo

Vấn đề Web trên PCKhi thực hiện dsPic như là một trạm thu thập dữ liệu, Enthernet chỉ là

phương thức để truyền tải dữ liệu. Thì một giao diện Web được thiết lập trên PC, lúc ấy, PC vừa là một server, vừa là một Client.

PC sẽ là Server cho các máy PC từ xa truy cập tới. Và PC là Client để kết nối tới dsPic nhằm lấy dữ liệu thu thập được, xử lí và trả về cho PC ở xa do yêu cầu.

Khi có một Request từ RemotePC, Server PC sẽ xử lí, mở cổng 9760 (TCP tới dsPic theo thiết lập ở trên), gửi dữ liệu theo tiêu chuẩn TCP, hoăc UDP (với cổng 30303) vào dspic. Dspic server lắng nghe, xử lí, trả lại cho PC Client. PCClient sẽ xử lí. Đối với RemotePC thì PC Client là PC server. PCserver trả lại RemotePC dữ liệu theo yêu cầu.

1. Vấn đề thiết lập mạng toàn cầuVấn đề thiết lập mạng toàn cầu. Tức là PC của mình thanh PC server để

RemotePC ở bất cứ đâu có thể truy cập được vào PC của bạn theo địa chỉ được ISP cung câp. Vì cần Free, bạn hãy đăng kí một tên miền trên trang www.dyndns.org cho PC nhà mình.

Cách thiết lập Chandufo đưa vào một tài liệu khác tên là Cấu hình Server trên PC nhà mình.doc. File được đính kèm trong cùng folder.

2. Vấn đề lập trình Web để giao tiếp với con DspicWeb Chandufo sẽ thiết kế bằng ngôn ngữ ASP.Net (hỗ trợ HTML), sử dụng

C# làm giao diện lập trình.Việc chọn C# bởi vì chương trình phần mềm đã có. Có thể tìm hiểu để đưa

vào.Việc chọn ASP. Net vì có thể sử dụng ngay trình server IIS của Windows

(khỏi phải dùng Apache và PHP).Hiện đây là việc hấp dẫn nhất là lập trình Web sử dụng C# để giao tiếp với

con dsPic. Chandufo vẫn đang tìm hiểu.