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 vi van phamSao ? cháu đã chứng minh cánh quạt lớn không phải do ma sát làm giảm tốc độ chưa?
Đêm nay hắt hơi , sổ mũi, không ngũ được, uống "riệu" 1 mình chờ nhà thùng, không thấy đến, nói chuyện với cháu cho vui. Khi tôi còn là...-
Channel: Điện tử gia dụng
hôm nay, 00:03 -
-
bởi vi van phamCần chứng minh cánh quạt lớn không phải do ma sát làm giảm tốc độ....
-
Channel: Điện tử gia dụng
Hôm qua, 15:29 -
-
bởi dinhthuong80Thì bác thấy đó, theo công thức của cháu Q = w.n.S.d, trong đó:
- w [vòng /phút]: tốc độ quay của mô tơ đo được khi gắn cánh quạt thì cánh vuông với trục hay lệch góc mấy độ cũng đâu còn ảnh hưởng gì nữa, nó thể hiện luôn ở giá trị w đo được rồi còn gì.
- n: số lượng lá cánh...-
Channel: Điện tử gia dụng
Hôm qua, 13:24 -
-
bởi vi van phamKhác nhiều lắm cháu ơi.
Góc này người ta gọi là góc cắt không khí, nó ảnh hưởng đến tốc độ quạt, ảnh hưởng đến lưu lượng gió, cũng như lưu lương hút gió.-
Channel: Điện tử gia dụng
Hôm qua, 12:15 -
-
bởi dinhthuong80Mặt phẳng cánh quạt lệch 1 góc so với trục nên nhìn theo phương vuông góc với trục ta sẽ "thấy nó có một độ dày d", đây chính là chiều cao của "hình trụ tròn rỗng ruột" theo trục của quạt có thể tích V = d * S_vành khăn....
-
Channel: Điện tử gia dụng
Hôm qua, 11:46 -
-
bởi vi van phamCông thức tính lưu lượng gió cháu lấy ở đâu ra vậy? tôi thấy có gì đó không ổn.
Theo thí dụ trên, mặt phẳng cánh quạt vuông góc với trục sẽ có lưu lượng khác với mặt phẳng cánh quạt song song với trục, và khác với mặt...-
Channel: Điện tử gia dụng
Hôm qua, 11:19 -
-
bởi appongthoNguyên nhân mã lỗi H-57, H-58, H-59 Máy giặt Panasonic
https://appongtho.com/loi-h-57-h-58-...iat-panasonic/
Mã lỗi H-57, H-58, H-59 trên máy giặt Panasonic thường liên quan đến sự cố trong hệ thống sấy, bao gồm lỗi mạch khử từ...-
Channel: Điện tử gia dụng
Hôm qua, 09:56 -
-
bởi kiều phongchào mọi người
xin cho hỏi mạch nguồn máy hàn 110v chuyển sang 220v được không? thanks
...-
Channel: Nguồn!
Hôm qua, 09:48 -
-
bởi dinhthuong80Dạ, theo thí nghiệm của chủ thớt thì hiệu ứng đó không ảnh hưởng gì, vì nó được tính theo công thức lí thuyết hợp lí: lưu lượng khí bằng thể tích khí do quạt vận chuyển được trong một phút (chỉ ảnh hưởng, hợp lí khi máy đo...
-
Channel: Điện tử gia dụng
Hôm qua, 09:15 -
-
bởi tuyennhanChắc sai rồi quạt thông gió công nghiệp sử dụng mô tơ 3 pha 750 w mà lưu lượng gió chỉ 1500 m3 / h ....
-
Channel: Điện tử gia dụng
Hôm qua, 07:55 -
Comment