Nguyên văn bởi wind-gon
Xem bài viết
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
-
-
Nguyên văn bởi nacdanh90 Xem bài viếtVâng ạ! Em cảm ơn anh wind-gon. Em xin mạo muội đóng góp ý kiến của mình về câu hỏi của anh bên trên: Em tưởng là nối các thiết bị như cùng chức năng như: PC với PC; PC với mạch Enc28j60 thì mới dùng cap chéo chứ ạ? còn nối từ PC hoặc Enc28j60 đến modem hoặc swich thì dùng cap song song chứ ạ? Em nghĩ như vậy ko biết có đúng không? nếu sai mong các anh chém nhẹ! Hi.
Comment
-
Thầy và các anh cho em hỏi. Trong giao thức HTTP, khi hai bên client và server đã kết nối thì sau đó client có thể gửi bao nhiêu request đến server cũng được ạ? Trong một phiên TCP thì có giới hạn là client chỉ được gửi số lần hữu hạn request đến server không ạ? Hay là sau khi tạo kết nối client có thể gửi bao nhiêu request tùy ý miến là lần request tiếp theo vẫn chưa quá khoảng thời gian Keep alive mà hai bên đã thỏa thuận với nhau ạ?
Comment
-
có chương trình này muốn đưa ra để mọi người cùng bàn luận PIC16f877a + ENC28j60 dùng CCS
#include "tcpip/stacktsk.c" //include Microchip's TCP/IP stack
#include "ccshelper.c" //include CCS's PICDEM.net/PICNET helper
functions
#include "ccshelperui.c"
/////***** WEB PAGES STORED INTO PROGRAM MEMORY *****/////
//The following escape characters are used:
// %0 - AN0
// %1 - AN1
// %2 - BUTTON0
// %3 - BUTTON1
// %4 - Current LCD Message
// %5 - CHECKED if LED1 is ON
// %6 - CHECKED if LED1 is OFF
// %7 - CHECKED if LED2 is ON
// %8 - CHECKED if LED2 is OFF
// %9 - Temperature (EWL ONLY)
// %F - Message stack
//here is this examples / page
const char HTML_INDEX_PAGE[]=
"<html><body bgcolor=#FFFFFF text=#000000>
<br/>
<h1>CCS HTTP/CGI EXAMPLE</h1>
<h1>leethanhnc_nhim</h1>
<p><b><i>%F</i></b></p>
<form method=post>
<table border=0>
<tr><th>LCD:</th><td colspan=4><input type=\"text\" name=\"lcd\"
size=20 maxlength=16 value=\"%4\"></td></tr>
<tr><th>LED1:</th><td><input type=\"radio\" name=\"led1\" value=1
%5></td><td>ON</td>
<td><input type=\"radio\" name=\"led1\" value=0
%6></td><td>OFF</td></tr>
<tr><th>LED2:</th><td><input type=\"radio\" name=\"led2\" value=1
%7></td><td>ON</td>
<td><input type=\"radio\" name=\"led2\" value=0
%8></td><td>OFF</td></tr>
</table>
<input type=\"hidden\" name=\"msgStack\" value=\"LCD/LEDs
changed!\">
<br/><input type=\"submit\"></form>
<p><a href=\"/analog\">Analog Readings</a></p>
</body></html>";
//<img src=\"http://www.ccsinfo.com/images/CCSlogotiny.gif\">
const char HTML_ANALOG_PAGE[]=
"<html><body bgcolor=#ffffff text=#000000>
<h1>leethanhnc_nhim</h1>
<h1>PICNET ADC READINGS</h1>
<p>%0</p>
<br/>%1
<p>%2</p>
<br/>%3
<p>%9</p>
<p><a href=\"/\">Change LCD/LEDs</a></p>
</body></html>";
/////***** END OF WEB PAGES STORED INTO PROGRAM MEMORY *****/////
char g_HTTPMessageStack[20]="";
char g_HTTPLCDMessage[20]="CCS Webserver";
//this is a callback function to the HTTP stack. see http.c
//this demo provides to web "pages", an index (/) and an about
page (/about)
int32 http_get_page(char *file_str)
{
int32 file_loc=0;
static char index[]="/";
static char about[]="/analog";
if (stricmp(file_str,index)==0)
file_loc=label_address(HTML_INDEX_PAGE);
else if (stricmp(file_str,about)==0)
file_loc=label_address(HTML_ANALOG_PAGE);
return(file_loc);
}
//this isn't a required callback, this is an application function
being
//used by http_format_char.
int http_format_char_checked(int8 flag, char *str)
{
int len=0;
if (flag)
{
sprintf(str,"checked=\"checked\"");
len = 7;
}
return(len);
}
//this is a callback function to the HTTP stack. see http.c
//The following escape characters are used:
// %0 - AN0
// %1 - AN1
// %2 - BUTTON0
// %3 - BUTTON1
// %4 - Current LCD Message
// %5 - CHECKED if LED1 is ON
// %6 - CHECKED if LED1 is OFF
// %7 - CHECKED if LED2 is ON
// %8 - CHECKED if LED2 is OFF
// %F - Message stack
int8 http_format_char(int32 file, char id, char *str, int8
max_ret) {
char new_str[25];
int8 len=0;
int8 i;
switch(id) {
#if defined(ADC_CHAN_0)
case '0':
set_adc_channel(ADC_CHAN_0);
delay_us(100);
i=read_adc();
sprintf(new_str,"<B>AN%U = </B>0x%X",ADC_CHAN_0,i);
len=strlen(new_str);
break;
#endif
#if defined(ADC_CHAN_1)
case '1':
set_adc_channel(ADC_CHAN_1);
delay_us(100);
i=read_adc();
sprintf(new_str,"<B>AN%U = </B>0x%X",ADC_CHAN_1,i);
len=strlen(new_str);
break;
#endif
#if defined(USER_BUTTON1)
case '2':
sprintf(new_str,"<B>BTN1 = </B>");
if (!BUTTON_PRESSED(USER_BUTTON1))
sprintf(&new_str[14], "UP");
else
sprintf(&new_str[14], "DOWN");
len=strlen(new_str);
break;
#endif
#if defined(USER_BUTTON2)
case '3':
sprintf(new_str,"<B>BTN2 = </B>");
if (!BUTTON_PRESSED(USER_BUTTON2))
sprintf(&new_str[14], "UP");
else
sprintf(&new_str[14], "DOWN");
len=strlen(new_str);
break;
#endif
case '4':
strncpy(new_str, g_HTTPLCDMessage, sizeof(new_str));
new_str[sizeof(new_str)-1] = 0;
len = strlen(new_str);
break;
case '5':
len = http_format_char_checked(g_LEDState[0], new_str);
break;
case '6':
len = http_format_char_checked(!g_LEDState[0], new_str);
break;
case '7':
len = http_format_char_checked(g_LEDState[1], new_str);
break;
case '8':
len = http_format_char_checked(!g_LEDState[1], new_str);
break;
#if STACK_USE_TEMP
case '9':
sprintf(new_str, "Temp: %6.2wº F", read_full_temp());
len=strlen(new_str);
new_str[len]=0;
break;
#endif
case 'F':
strncpy(new_str, g_HTTPMessageStack, sizeof(new_str));
new_str[sizeof(new_str)-1] = 0;
len = strlen(new_str);
g_HTTPMessageStack[0] = 0;
break;
}
if (len){
strncpy(str, new_str, max_ret);
}else
*str=0;
return(len);
}
//this is a callback function to the HTTP stack. see http.c
//in this example it verifies that "pwd" is "master", if it is
//then it sets led1 and led2 ("led1" and "led2") based on their
value
//and changes the lcd screen ("lcd").
void http_exec_cgi(int32 file, char *key, char *val) {
static char led1_key[]="led1";
static char led2_key[]="led2";
static char lcd_key[]="lcd";
static char msgStack_key[]="msgStack";
int8 v;
// #if defined(USER_LED1)
if (stricmp(key,led1_key)==0) {
v=atoi(val);
g_LEDState[0]=v;
}
// #endif
// #if defined(USER_LED2)
if (stricmp(key,led2_key)==0) {
v=atoi(val);
g_LEDState[1]=v;
}
// #endif
if (stricmp(key, msgStack_key)==0)
{
strncpy(g_HTTPMessageStack, val,
sizeof(g_HTTPMessageStack));
g_HTTPMessageStack[sizeof(g_HTTPMessageStack)-1] = 0;
}
if (stricmp(key,lcd_key)==0) {
strncpy(g_HTTPLCDMessage, val, sizeof(g_HTTPLCDMessage));
g_HTTPLCDMessage[sizeof(g_HTTPLCDMessage)-1] = 0;
#if STACK_USE_PICDEM_LCD
printf(lcd_putc,"\f%s",val);
#endif
}
}
void splash(void) {
#IF STACK_USE_PICDEM_LCD
printf(lcd_putc,"\fCCS Webserver");
#ENDIF
#if STACK_USE_ANNOUNCE
InitAnnounce(" - EX_ST_WEBSERVER");
#endif
#if STACK_USE_SERIAL
fprintf(USER,"\r\n\r\nCCS ex_st_webserver\r\n");
ui_settings();
ui_menu();
#endif
}
void main(void)
{
fprintf(USER,"Init...");
init(); // ccshelpers.c
printf(lcd_putc,"\nAll Init OK ");
fprintf(USER,"\nInit OK");
delay_ms(1000);
splash();
while (TRUE) {
restart_wdt();
#if STACK_USE_SERIAL
if (kbhit(USER)) {
ui_handle();
}
#endif
//every second: refresh current IP, blink LED
if (second_counter>=1) {
display_ip_lcd();
#if defined(USER_LED3)
output_toggle(USER_LED3);
#endif
second_counter=0;
}
//just something to test the buttons
#if STACK_USE_CCS_PICNET
if (BUTTON_PRESSED(USER_BUTTON1))
{
output_low(USER_LED1);
}
else
{
if (g_LEDState[0])
output_low(USER_LED1);
else
{
output_high(USER_LED1);
}
}
if (BUTTON_PRESSED(USER_BUTTON2))
{
output_low(USER_LED2);
}
else
{
if (g_LEDState[1])
output_low(USER_LED2);
else
{
output_high(USER_LED2);
}
}
#elif STACK_USE_CCS_PICENS
if (g_LEDState[0])
output_high(USER_LED1);
else
{
output_low(USER_LED1);
}
if (g_LEDState[1])
output_high(USER_LED2);
else
{
output_low(USER_LED2);
}
if (BUTTON_PRESSED(USER_BUTTON1)) output_low(USER_LED3);
#endif
#if STACK_USE_PPP
if (ppp_is_connected()) {
#endif
StackTask(); //Microchip's TCP/IP stack handler.
Must be called routinely.
#if STACK_USE_PPP
}
#endif
}
}
Điện tử viễn thông - Hutech
Comment
-
Hình như hồi trước em gặp lỗi này rồi! Nếu như chưa tìm ra cách sửa anh thử gỡ winavr ra cài lại xem có được ko?
Sao firmware của anh trong ntAVRnet.h lại có hàm main ạ? em thấy trong ntAVRnet.c cũng có. TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1) cũng bị lặp 2 lần.Last edited by nacdanh90; 04-06-2012, 16:39.
Comment
-
uhm mình thấy rồi thanks bạn nha. mà mình tháo ra cài avr studio rồi mà vẫn bị vậy ko biết tại sao nữa
Nguyên văn bởi nacdanh90 Xem bài viếtHình như hồi trước em gặp lỗi này rồi! Nếu như chưa tìm ra cách sửa anh thử gỡ winavr ra cài lại xem có được ko?
Sao firmware của anh trong ntAVRnet.h lại có hàm main ạ? em thấy trong ntAVRnet.c cũng có. TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1) cũng bị lặp 2 lần.
Điện tử viễn thông - Hutech
Comment
-
nhờ bạn debug chương trình mình xem dc ko sao làm hoài ko debug dc bạn ơi chán quá
bị lỗi khác nữa hixhixx
chuongtrinh viet tren AVR studio.rar
Điện tử viễn thông - Hutech
Comment
-
Các anh cho em hỏi tại sao mạch của em khi lắp thêm 8 role từ để điều khiển 8 thiết bị lúc bật tắt các role cùng một lúc mạch hay bị chạy sai, thậm chí treo, khởi động lại. Em đã lắp thêm diod vào role, lắp nguồn cho role riêng nhưng thỉnh thoảng vẫn còn hiện tượng đó.
Comment
Bài viết mới nhất
Collapse
-
bởi dinhthuong80Xin cảm ơn tất cả sự góp ý giúp đỡ.
Từ diện tích bạn mèomướp vẽ và tính giúp:
S' ~ 3272mm2 => độ dày cánh:
d=S'/156 = 21*10^-3m
S = pi/4 [ D1^2 - D2^2 ] ~ 0.785*[38^2-7^2]cm2 ~ 1095cm2 = 0.1095m2
Lưu lượng gió tại số 2, quạt 3 cánh:...-
Channel: Điện tử gia dụng
hôm nay, 15:24 -
-
bởi appongthoGiới thiệu về lỗi H-56 trên máy giặt Panasonic
https://appongtho.com/xoa-loi-h-56-may-giat-panasonic/
Máy giặt Panasonic là một trong những dòng máy giặt hiện đại với nhiều tính năng tiên tiến. Tuy nhiên, trong quá trình sử dụng, máy...-
Channel: Điện tử gia dụng
hôm nay, 09:59 -
-
bởi nguyendinhvanCần bổ sung cột số liệu nhiệt độ động cơ sau khi hoạt động 60 phút....
-
Channel: Điện tử gia dụng
hôm nay, 01:53 -
-
bởi nguyendinhvanHình dạng cánh quạt được thiết kế tùy thuộc vòng quay.
Vòng quay càng lớn, cánh càng nhỏ.
Làm thế, hiệu suất mới cao.
Cái chân vịt tàu thủy, cánh nó to như kiể tai voi, vì động cơ tagu thủy vòng quay thấp.
Cánh quạt...-
Channel: Điện tử gia dụng
hôm nay, 01:47 -
-
bởi mèomướpDạ quạt của chị ấy cánh bằng sắt han rỉ nhìn cũ lắm nhưng hông thấy hỏng chạy chắc tốn điện lắm ạ nên tiết kiệm hông dám dùng. Trưa Hôm nào cụ trưởng bản cũng sang thăm là chị ấy đóng kín cửa lúc sau ra thấy người mồ hôi...
-
Channel: Điện tử gia dụng
Hôm qua, 20:10 -
-
Trả lời cho Thay đổi led 7 đoạn 8051 asmbởi davidcopyDưới đây là đoạn code Assembly cho vi điều khiển AT89C51, thực hiện chức năng như bạn yêu cầu:
Nhấn nút lần 1, LED 7 đoạn hiển thị số 05.
Nhấn nút lần 2, LED 7 đoạn hiển thị số 08.
Nhấn nút lần 3, LED...-
Channel: Vi điều khiển họ 8051
Hôm qua, 19:00 -
-
bởi appongthoMã lỗi H-54 Máy giặt Panasonic là gì?
https://appongtho.com/khac-phuc-loi-...iat-panasonic/
Mã lỗi H-54 trên máy giặt Panasonic là dấu hiệu cảnh báo sự cố liên quan đến rơ-le điều khiển, một linh kiện quan trọng giúp máy giặt thực...-
Channel: Điện tử gia dụng
Hôm qua, 11:37 -
-
bởi dinhthuong80Hình ảnh minh họa:
1. Đo tốc độ quay_ vòng/phút: (+/-10vg/phút)
2. Đo công suất: (+/-0.2W)
...-
Channel: Điện tử gia dụng
Hôm qua, 09:31 -
-
bởi Hóa chất HHNGalvex 18.01 - Giải pháp tẩy rửa tối ưu trong ngành điện tử công nghiệp
Giới thiệu về Galvex 18.01
Trong ngành điện tử công nghiệp, việc duy trì độ sạch của linh kiện là yếu tố quan trọng giúp đảm bảo hiệu suất và độ bền của sản...-
Channel: Điện tử công nghiệp
Hôm qua, 09:26 -
Comment