Do có nhiều bạn hỏi, nên mình upload luôn file thiết kế (sơ đồ nguyên lý và PCB) cùng với source code lên đây luôn, có ai cần thì cứ tự do sử dụng nhé.
https://drive.google.com/file/d/1w1w...ew?usp=sharing
https://drive.google.com/file/d/1UE1...ew?usp=sharing
https://drive.google.com/file/d/1b5m...ew?usp=sharing
Thông báo
Collapse
No announcement yet.
Giao thức TCP/IP và Web server với AVR
Collapse
This is a sticky topic.
X
X
-
Mọi người ơi TUT này lâu lắm rồi nhưng đọc vẫn nhiều cái hay. Có bạn nào từng lưu lại TUT này dưới dạng file không, mình thấy hình ảnh minh họa trên này mất hết rồi , nế có có thể share lại được ko, chân thành cảm ơn.
Leave a comment:
-
Help !
Em dùng Stm32cubeMX để xây dựng project giao tiếp ethernet trên kit stm32f429 discovery.
Khi build nó có add thêm cái Lwip Library.
Ai đã từng làm với cái này rồi có thế giúp em định hướng code được không. Với cái đống thư viện đó, đầu tiên mình xây dựng giao tiếp bằng cách nào được ạ.
Leave a comment:
-
up lại link cho mọi ngườiUpdate ADC value automatically when using Ajax engine
Leave a comment:
-
tự động cập nhật giá trị ADC- không refresh lại trang webUpdate ADC value automatically when using Ajax engine
Leave a comment:
-
Nguyên văn bởi hoangtek Xem bài viếtMình share mọi người tham khảo rồi cho ý kiến nhé! Có một vấn đề chưa giải quyết được là khi đăng nhập rồi thì các máy tính khác cũng vào được mà không cần đăng nhập nữa. Chắc phải có thêm phần logout nữa.
AVR Web Server - Download - 4shared - Hoang Tek
Leave a comment:
-
Nguyên văn bởi khanhyenxa Xem bài viếtthay cac ban chua co code va san pham hoan chinh toi up len cho moi nguoi dung luon chay rat on dinh netavr khanh-cuong
Leave a comment:
-
Chào thầy và các bạn không biết theard này còn hoạt động không. Cho e hỏi là e đang làm tới phần ICMP, thì e đã ping được từ PC -> module bằng cáp trực tiếp hoặc cắm module vào router và PC vào router thì ping cũng được nhưng cắm module vào router và PC bắt wifi từ router thì ping từ PC -> module không được. Không biết có ai thử trường hợp này chưa ạ? Debug thì lí do ping thất bại là thế này. Mong thầy và các bạn giúp e với. Cám ơn ạ!
Leave a comment:
-
Nguyên văn bởi nttam79 Xem bài viếtCó lẽ mình cần dừng lại để giải thích rõ hơn về hoạt động của 2 giao thức IP và ARP một chút, cũng như các sử dụng 2 loại địa chỉ IP và MAC trên mạng, trước khi viết code tiếp, tuy hơi dài dòng 1 chút nhưng sẽ giúp mọi người hiểu rõ hơn cách thức làm việc của TCP/IP, như vậy thì sẽ dễ hiểu code hơn và có thể tự viết hay sửa đổi code được dễ dàng.
Ta hãy xem xét 1 mạng ví dụ như sau:
- Mạng LAN tại nhà gồm 3 máy tính và 1 board mạch của chúng ta kết nối vào ADSL router, từ đó nối vào mạng của nhà cung cấp dịch vụ.
- Các bạn cũng cần biết là thực ra modem ADSL hay ADSL router mà ta dùng ở nhà, thật ra bên trong nó gồm 3 thiết bị: một HUB để mở rộng số lượng port, cho phép nhiều máy tính có thể cùng kết nối vào mạng; một Router IP đóng vai trò Gateway, thực hiện chức năng định tuyến giữa mạng bên trong (LAN) và mạng bên ngoài (WAN); và cuối cùng là 1 modem (Modulation - Demodulation) để có thể truyền dữ liệu trên đường dây ADSL.
Ta xẽ xem xét 2 ví dụ:
Ví dụ A: board mạch của chúng ta gửi dữ liệu đến 1 máy tính trong cùng mạng LAN, ví dụ là máy có địa chỉ 192.168.1.6.
Ví dụ B: board mạch gửi dữ liệu đến 1 máy tính nằm bên ngoài, ví dụ là máy có địa chỉ 203.162.44.164
A-Trường hợp gửi trong mạng LAN
Bước 1: Giao thức IP trong board mạch nhận được yêu cầu gửi dữ liệu đến địa chỉ IP 192.168.1.6
Bước 2: Nó đi hỏi giao thức ARP (thông qua hàm ArpIpOut) về địa chỉ này. ARP sau khi tìm trong bảng ARP cache không thấy, nó sẽ gửi 1 bản tin ARP request dưới hình thức broadcast đến mọi máy tính trong mạng. Máy tính có địa chỉ tương ứng sẽ trả lời.
Bước 3: ARP sẽ cập nhật bảng ARP cache và trả lời lại cho giao thức IP.
Bước 4: giao thức IP dùng thông tin này để điền vào frame ethernet và chuyển sang giao thứ ethernet để gửi đi.
B-Trường hợp gửi ra ngoài mạng LAN
Nếu vẫn làm theo cách cũ thì sẽ xảy ra trường hợp như sau:
Như vậy, nếu vẫn làm theo cách cũ, việc gửi dữ liệu sẽ thất bại.
Mọi việc phải được tiến hành như sau:
Có ai biết cách post flash lên forum không? Xin chỉ giúp. Vài minh họa bằng ảnh động có lẽ dễ hiểu hơn.
Leave a comment:
-
Nguyên văn bởi nttam79 Xem bài viếtĐể thay đổi không khí tí. Hôm trước mình đã nói là nếu viết xong giao thức ICMP, chưa cần TCP và UDP, thì đã có thể ping được tới board mạch của chúng ta. Từ đầu đến giờ chúng ta viết code quá trời luôn mà chưa thể nạp vào chip để chạy thử 1 cái, kể cũng hơi nản. Vậy tới đây mình dừng lại để hướng dẫn bổ sung một số hàm và viết hàm main() trong file “ntAVRnet.c” để có thể biên dịch nạp vào chip Atmega32, sau đó ta sẽ thử ping tới mạch xem mạch của ta đã hoạt động chưa nhé.
Đầu tiên, ta phải viết một số hàm mà từ đầu đến giờ ta vẫn chưa viết: đó là hàm printf sử dụng uart để xuất thông tin lên cổng COM trên máy tính và ngắt cho timer.
Phần này sẽ không giải thích chi tiết vì không phải là trọng tâm chính, các bạn tự tìm hiểu nhé:
Thêm vào project cặp file “uart.c” và “uart.h”
Nội dung file “uart.c”:
Code://---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include <stdarg.h> #include "ntAVRnet.h" #include "uart.h" //---------------------------------------------------------------------------- char UartRxBuffer[UART_RX_BUFFER_SIZE]; char UartTxBuffer[UART_TX_BUFFER_SIZE]; volatile unsigned char UartTxBufferStart; volatile unsigned char UartTxBufferLen; volatile unsigned char UartRxBufferStart; volatile unsigned char UartRxBufferLen; static char HexTable[] PROGMEM= "0123456789ABCDEF"; //---------------------------------------------------------------------------- void uartInit(unsigned long baudrate) { unsigned int bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);// UBRRL = bauddiv; #ifdef UBRRH UBRRH = ((bauddiv>>8) & 0x0F); // URSEL 7 // UMSEL 6 0:Asynchronuos/1:Synchronous // UPM1 5 Parity mode: 00:disabled/01:Reserved/10:Even/11:Odd // UPM0 4 // USBS 3 Stop bit: 0:1 bit/1:2 bit // UCSZ1 2 Char size:000:5/001:6/010:7/011:8/111:9/others:reserverd // UCSZ0 1 // UCPOL 0 UCSRC = 0x80 | (1<<UCSZ1) | (1<<UCSZ0); #endif UCR =((1 << TXEN) | (1 << RXEN) | (1<< RXCIE) | (1<< TXCIE));// UartTxBufferStart = 0; UartTxBufferLen = 0; UartRxBufferStart = 0; UartRxBufferLen = 0; sei(); } //-------------------------------------------------------------------------------------- SIGNAL(SIG_UART_TRANS) { if(UartTxBufferLen){ --UartTxBufferLen; UDR = UartTxBuffer[UartTxBufferStart++]; if (UartTxBufferStart == UART_TX_BUFFER_SIZE) UartTxBufferStart = 0; } } //-------------------------------------------------------------------------------------- SIGNAL(SIG_UART_RECV) { unsigned char i; char status,data; status = USR; data = UDR; if ((status & ((1<<FE) | (1<<PE) | (1<<DOR))) == 0){ if(++UartRxBufferLen == UART_RX_BUFFER_SIZE) UartRxBufferLen = UART_RX_BUFFER_SIZE; i = UartRxBufferStart+UartRxBufferLen; //Vi tri ky tu cuoi cung trong buffer if(i > UART_RX_BUFFER_SIZE) i -= UART_RX_BUFFER_SIZE; UartRxBuffer[i-1] = data; } } //-------------------------------------------------------------------------------------- char uartGetByte(void) { // char c; if(UartRxBufferLen){ UartRxBufferLen--; c = UartRxBuffer[UartRxBufferStart++]; if(UartRxBufferStart == UART_RX_BUFFER_SIZE) UartRxBufferStart = 0; return(c); } return(-1); } //-------------------------------------------------------------------------------------- void uartSendByte(char c) { unsigned char i; if((USR & (1<<UDRE)) && (UartTxBufferLen == 0)){ //Neu uart dang san sang va buffer trong UDR = c; //Gui luon }else{ //Neu uart dang ban while(UartTxBufferLen == UART_TX_BUFFER_SIZE); //Cho neu buffer dang day i = UartTxBufferStart + UartTxBufferLen; UartTxBufferLen++; if(i >= UART_TX_BUFFER_SIZE) i -=UART_TX_BUFFER_SIZE; UartTxBuffer[i] = c; //Ghi vao cuoi buffer } } //-------------------------------------------------------------------------------------- int printfP(const prog_char *format, ...) { // simple printf routine // define a global HexChars or use line below //static char HexChars[16] = "0123456789ABCDEF"; char c; unsigned int u_val, div_val, base; va_list ap; va_start(ap, format); for (;;) { while ((c = pgm_read_byte(format++) ) != '%') { // Until '%' or '\0' if (!c) { va_end(ap); return(0); } uartSendByte(c); } switch (c = pgm_read_byte(format++) ) { case 'c': c = va_arg(ap,int); default: uartSendByte(c); continue; case 'd': base = 10; div_val = 10000; goto CONVERSION_LOOP; // case 'x': base = 16; div_val = 0x10; case 'x': base = 16; div_val = 0x1000; CONVERSION_LOOP: u_val = va_arg(ap,int); if (c == 'd') { if (((int)u_val) < 0) { u_val = - u_val; uartSendByte('-'); } while (div_val > 1 && div_val > u_val) div_val /= 10; } do { //c =pgm_read_byte(HexTable+(u_val/div_val)); uartSendByte(pgm_read_byte(HexTable+(u_val/div_val))); u_val %= div_val; div_val /= base; } while (div_val); } } va_end(ap); } //--------------------------------------------------------------------------------------
Code://---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #ifndef UART_H #define UART_H #include <avr/pgmspace.h> //---------------------------------------------------------------------------- #define UART_TX_BUFFER_SIZE 8 #define UART_RX_BUFFER_SIZE 8 //-------------------------------------------------------------------------------------- #ifndef UART_INTERRUPT_HANDLER #define UART_INTERRUPT_HANDLER SIGNAL #endif //define for ATmega32 register #define USR UCSRA #define UCR UCSRB #define UBRR UBRRL #define EICR EICRB #define USART_RX USART_RXC_vect #define USART_TX USART_TXC_vect //-------------------------------------------------------------------------------------- void uartInit(unsigned long baudrate); char uartGetByte(); void uartSendByte(char c); int printfP(const prog_char *format, ...); #define printf(format, args...) printfP(PSTR(format), ## args) //-------------------------------------------------------------------------------------- #endif //UART_H
Nội dung file “ timer.c”:
Code://---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #include <avr/io.h> #include <avr/interrupt.h> #include "ntAVRnet.h" #include "timer.h" #include "ethernet.h" #include "arp.h" //#include "tcp.h" //---------------------------------------------------------------------------- extern volatile unsigned int time_watchdog; static volatile unsigned long UptimeMs; static volatile unsigned char Counter10ms; static volatile unsigned int Counter1s; //---------------------------------------------------------------------------- void timer1Init(void) { // initialize timer 1 // set prescaler on timer 1 TCCR1B = (TCCR1B & ~TIMER_PRESCALE_MASK) | TIMER1PRESCALE; // set prescaler TCNT1H = 0; // reset TCNT1 TCNT1L = 0; TIMSK |= (1<<TOIE1); // enable TCNT1 overflow TCNT1 = 0xFFFF - TIMER1_INTERVAL; } void timerInit(void) { timer1Init(); sei(); } //! Interrupt handler for tcnt1 overflow interrupt TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1) { //Tai nap gia tri timer 1 TCNT1 = 0xFFFF - TIMER1_INTERVAL; //Cap nhat watchdog timer if((time_watchdog++) > 120){ time_watchdog = 0; ethInit(); } Counter1s++; arpTimer(); //TCPCheckTimeOut(); }
Code://---------------------------------------------------------------------------- // Writen by NTTam - PTITHCM //---------------------------------------------------------------------------- #ifndef TIMER_H #define TIMER_H //---------------------------------------------------------------------------- #define TIMER_CLK_STOP 0x00 ///< Timer Stopped #define TIMER_CLK_DIV1 0x01 ///< Timer clocked at F_CPU #define TIMER_CLK_DIV8 0x02 ///< Timer clocked at F_CPU/8 #define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64 #define TIMER_CLK_DIV256 0x04 ///< Timer clocked at F_CPU/256 #define TIMER_CLK_DIV1024 0x05 ///< Timer clocked at F_CPU/1024 #define TIMER_CLK_T_FALL 0x06 ///< Timer clocked at T falling edge #define TIMER_CLK_T_RISE 0x07 ///< Timer clocked at T rising edge #define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask #define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default #ifndef TIMER_INTERRUPT_HANDLER #define TIMER_INTERRUPT_HANDLER SIGNAL #endif void timer1Init(void); void timerInit(void); #endif //TIMER_H
Thêm define vào ntAVRnet.h
Code:#define TIMER_PRESCALE 1024 #define TIMER1_INTERVAL (F_CPU/TIMER_PRESCALE) #define IPDOT(a,b,c,d) ((unsigned long)((unsigned char)a)<<24)+((unsigned long)((unsigned char)b)<<16)+((unsigned long)((unsigned char)c)<<8)+(unsigned char)d//((a<<24)|(b<<16)|(c<<8)|(d)) #define IPADDRESS IPDOT(192,168,1,10) #define NETMASK IPDOT(255,255,255,0) #define GATEWAY IPDOT(192,168,1,1) #define ETHADDR0 '0' #define ETHADDR1 'F' #define ETHADDR2 'F' #define ETHADDR3 'I' #define ETHADDR4 'C' #define ETHADDR5 'E'
Code:#include "arp.h" #include "ip.h"
Code:#include "icmp.h" #include "uart.h"
Mở “ntAVRnet.c”:
Thêm hàm khởi động các dịch vụ mạng:
Code:void netInit(unsigned long ipaddress, unsigned long netmask, unsigned long gatewayip) { // init network device driver #ifdef NET_DEBUG printf("Initializing Network Device\r\n"); #endif ethInit(); // init ARP #ifdef NET_DEBUG printf("Initializing ARP cache\r\n"); #endif arpInit(); // init addressing #ifdef NET _DEBUG printf("Initializing Addressing\r\n"); #endif ipSetConfig(ipaddress, netmask, gatewayip); //dhcpInit(); //TCPInit(); //httpInit(); }
Code://-------------------------------------------------------------------------------------- void PrintIPConfig() { printf("MAC Address: "); ethPrintAddr(&IpMyConfig.ethaddr); printf("\n\r"); printf("IP Address: "); ipPrintAddr(IpMyConfig.ip); printf("\n\r"); printf("Subnet Mask: "); ipPrintAddr(IpMyConfig.netmask); printf("\n\r"); printf("Default Gateway: "); ipPrintAddr(IpMyConfig.gateway); printf("\n\r"); }
Code:extern struct ipConfig IpMyConfig;
Code://-------------------------------------------------------------------------------------- void SystemInit() { timerInit(); uartInit(UART_BAUDRATE); }
Code:int main(void) { SystemInit(); printf("\r\nNTTam AVR network testing with enc28j60.\r\n"); printf("Initializing Network Interface and Stack\r\n"); printf("Ethernet chip init\r\n"); IpMyConfig.ethaddr.addr[0] = ETHADDR0; IpMyConfig.ethaddr.addr[1] = ETHADDR1; IpMyConfig.ethaddr.addr[2] = ETHADDR2; IpMyConfig.ethaddr.addr[3] = ETHADDR3; IpMyConfig.ethaddr.addr[4] = ETHADDR4; IpMyConfig.ethaddr.addr[5] = ETHADDR5; IpMyConfig.ip = IPADDRESS; IpMyConfig.netmask = NETMASK; IpMyConfig.gateway = GATEWAY; netInit(IpMyConfig.ip, IpMyConfig.netmask, IpMyConfig.gateway); PrintIPConfig(); while(1) { ethService(); } return 0;}
Địa chỉ IP, Subnet và gateway các bạn có thể thay đổi ở các define trong file « ntAVRnet.h » cho phù hợp với mạng ở nhà mình nhé.
Leave a comment:
-
cai nay sua chan lai cho gonAttached Files
- 1 like
Leave a comment:
-
toi la khanh co cai nay d ung duoc hay cho cac dong nghiep lam san phamAttached Files
Leave a comment:
-
thay cac ban chua co code va san pham hoan chinh toi up len cho moi nguoi dung luon chay rat on dinh netavr khanh-cuong
Leave a comment:
-
sao thấy TÂM không viết ra thành cuốn sách nhi được cuốn này thì rất hay
Leave a comment:
-
Ôi cực kỳ đơn giản mình đã làm được rồi. Sau khi các bạn build thành công MCUweb. Để kiểm tra ra WAN bằng cách như sau:
1/ Cấu hình NAT cho modem của các bạn. Modem nhà minh là TP-link thì theo hướng dẫn của link này Làm thế nào để mở ports trên TP-LINK ADSL Modem Router(Trendchip Solution) - Chào mừng đến với TP-LINK
+ Để biết virtual cỉcuit các bạn xem ở thẻ status sẽ thấy PVC đang ở mấy và địa chỉ IP của router
+ Ô đầu tiên Application các bạn đánh tên để phân biệt (đánh j cũng được). ô tiếp theo bỏ trống
+ Startport = Endport (tùy vào các bạn chọn) thường là 80
+ Local Ip: đánh địa chỉ IP mạch của các bạn vào
+ save lại
2/ Nhờ bạn của các bạn đang chat trên fb hoặc yahoo kiểm tra thử bằng cách đánh địa chỉ ip của router : số port (vd: địa chỉ Ip router nhà mình là 123.20.4.72:80)
3/ Cảm nhận cùng bạn của các bạn nhé...^^
Chúc các bạn thành công!
- 1 like
Leave a comment:
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi về mạch công suất bị dò DCbởi vandoanĐiện áp ở A và C được ghim bởi Transistor Q8. chuyện áp ra loa + hay - là do các trans khác bị chập chập bên nào thì thay bên đó.
-
Channel: Điện thanh
hôm nay, 12:00 -
-
bởi chinhnguyen9Sực nhớ dòng cân bằng có dạng xung vuông đối xứng, nghĩa là có thể đo bằng đồng hồ Ampe kep. Nên tôi đo test lại, và quả là đo được bình thường với các số liệu trong hình 1.
Qua kết quả này ta thấy mạch này tiên tiến và hửu dụng, nổi bậc ở chổ dung lượng từ...-
Channel: Hướng dẫn sử dụng diễn đàn
hôm nay, 07:10 -
-
bởi dinhthuong92Cảm ơn bác đã chia sẻ nhiều thí nghiệm thực tế.
Về mạch cân bằng cells pin thì theo cá ngân em, nó chỉ có chức năng bảo vệ quá xả và quá nạp cho các cell thôi. Tức là bất kì cell nào trong khi xả mà có áp thấp nhất và bằng...-
Channel: Hướng dẫn sử dụng diễn đàn
18-04-2024, 21:07 -
-
bởi jigokushoujoCó anh chị nào có thể cho em 1 mạch chống ngược cực, chập mạch, khi bị chạm mạch hay ngược cực thì nó sẽ tự động ngắt nguồn,khi không còn chạm thì nó sẽ đóng nguồn lại bình thường. Em có dùng nguồn 12V 75A từ ắc quy . Em cần chụi...
-
Channel: Điện tử dành cho người mới bắt đầu
18-04-2024, 18:24 -
-
bởi chinhnguyen9Tôi nghi ngại về sự hiện diện của điện trở 0,1R trong mach test có thể làm sai lạc và méo mó hoạt động của mạch. Sau khi tháo bỏ điện trở trên test lại thì thấy hoạt động cân bằng tích cực hơn rất nhiều và sờ thấy các most fet của...
-
Channel: Hướng dẫn sử dụng diễn đàn
18-04-2024, 15:01 -
-
bởi chinhnguyen9Test module cân bằng chủ động kiểu Flying Capacitor Balancing 4s 6A TQ
Hình thức board mạch có vẻ ổn. Hình 1 mặt trên và mặt dưới
Hình 2
Lắp bài test với 3 cell 32-650 (4000mAh) với các mức điện áp trong dòng thứ 2 cell số 5 là pin lion 10Ah để tạo độ...-
Channel: Hướng dẫn sử dụng diễn đàn
18-04-2024, 11:26 -
-
bởi chinhnguyen9Hính 1 Sản phẩm board cân bằng acquy Minh Quang
Hình 2 Sơ đồ nguyên lý hoạt động
Hình 3 Sơ đồ đấu dây
Dùng 2 khối pin 32-650 khối 1 4s=13V và khối 2 5s =16V bắt nối tiếp, đấu dây đen B0 vào âm, nguồn B1 vào cọc 13V, và B2 vào cọc 29V,...-
Channel: Hướng dẫn sử dụng diễn đàn
18-04-2024, 10:51 -
-
bởi chinhnguyen91- Sơ khai là mạch cân bằng thụ động do hiệu quả của mạch này là rất kém nên ta vứt nó vào quá khứ.
2- Mạch cân bằng chủ động, so áp liền kề gồm 2 nhánh: dùng từ trường và dùng điện tích
3- Mạch cân bằng chủ động toàn nhóm.(flying capacitor balancing)
Trong mạch cân bằng chủ...-
Channel: Hướng dẫn sử dụng diễn đàn
16-04-2024, 08:48 -
Leave a comment: