muiim
|
|
« Reply #165 on: November 12, 2009, 09:51:49 AM » |
|
ถ้าอย่างนั่น ทำอย่างนี้รึป่าว ครับ void X10FuncExe(int House,int Number,int Fn) { int P;
//Private Function if(House== 'A' && Number==1) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT); break; case X10FN_OFF: //OFF output_low(X10OUT); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortA(); P&=0B00000100; if(P==0B00000100) X10Write(H,N,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write(H,N,X10FN_STATUS_OFF); break; } }
//ALL Unit Function switch(Fn) { case X10FN_ALL_UN_OFF: //All Units Off case X10FN_ALL_LG_OFF: //All Lights Off output_low(X10OUT); break;
case X10FN_ALL_UN_ON: //All Units On output_high(X10OUT); break; }
} คือว่าผมงง กับที่อาจารย์บออกนะครับ int P; . . . X10Write('A',1,X10FN_STATUS_ON);
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #166 on: November 12, 2009, 11:34:49 AM » |
|
ต้องแก้ที่ฟังชั่น X10Write ด้วยครับ
void X10FuncExe(int House,int Number,int Fn) { int P;
//Private Function if(House== 'A' && Number==1) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT); break; case X10FN_OFF: //OFF output_low(X10OUT); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortA(); P&=0B00000100; if(P==0B00000100) X10Write('A',1,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write('A',1,X10FN_STATUS_OFF); break; } } . . .
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #167 on: November 12, 2009, 11:37:19 AM » |
|
อ๋อ ขอบคุณครับอาจารย์ ไงเดี๋ยวเอาไปลองดูก่อนครับ ได้ผลยังไงเดี๋ยวมาบอก ครับ
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #168 on: November 12, 2009, 02:52:27 PM » |
|
ตอนนี้ผมสามารถควบคุมแบบแยกแอดเดรสได้แล้ว(กำหนดค่าแบบตรงตัวไม่ใช้ eeprom) แต่มีปัญหาที่ ฟังชันก์ตรวจสอบสถานะครับ มันตรวจสอบได้แอดเดรสเดียวจากทั้งหมด 4แอดเดรส ขออาจารย์ช่วยชี้แนะอีกทีครับ ขอบคุณครับ UARTReady(); //Check X10 Line Status if(X10READY()) { if(X10Read()) { switch(rFunction) { case 1: case 2: printf("(Fn%02d)-%s\r\n",rFunction,StrFunc); break; case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: //printf("%X %X %X ",HouseCode[1],KeyCode[1],kType[1]); printf("%c%02d(Fn%02d)-%s\r\n",rHouse,rNumber,rFunction,StrFunc); break;
default: printf("UnKnow Function\r\n"); } X10FuncExeADR1(rHouse,rNumber,rFunction); X10FuncExeADR2(rHouse,rNumber,rFunction); X10FuncExeADR3(rHouse,rNumber,rFunction); X10FuncExeADR4(rHouse,rNumber,rFunction); SoundOK(); } } น่าจะมีปัญหาช่วงนี้นะครับ
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #169 on: November 12, 2009, 03:13:01 PM » |
|
ผมเอาcode ในส่วน แอดเดรส มาให้ดูด้วยครับ void X10FuncExeADR1(char House,int Number,int Fn) { int H,N,P;
//Get Address form EEPROM House & Number // H=read_eeprom(0); // N=read_eeprom(1); //H='A'; //N= 01 ;
//Private Function // if(H==House && N==Number) if(House=='A' && Number==1) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT1); break; case X10FN_OFF: //OFF output_low(X10OUT1); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortA(); P&=0B00000100; if(P==0B00000100) X10Write('A',1,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write('A',1,X10FN_STATUS_OFF); break; } //ALL Unit Function } switch(Fn) { case X10FN_ALL_UN_OFF: //All Units Off case X10FN_ALL_LG_OFF: //All Lights Off output_low(X10OUT1); output_low(X10OUT2); output_low(X10OUT3); output_low(X10OUT4); break;
case X10FN_ALL_UN_ON: //All Units On output_high(X10OUT1); output_high(X10OUT2); output_high(X10OUT3); output_high(X10OUT4); break; }
} //Execute Function code void X10FuncExeADR2(char House,int Number,int Fn) { int H,N,P;
//Get Address form EEPROM House & Number // H=read_eeprom(2); // N=read_eeprom(3);
//Private Function // if(H==House && N==Number) if(House=='A' && Number==2) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT2); break; case X10FN_OFF: //OFF output_low(X10OUT2); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortA(); P&=0B00001000; if(P==0B00001000) X10Write('A',2,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write('A',2,X10FN_STATUS_OFF); break; } } //ALL Unit Function switch(Fn) { case X10FN_ALL_UN_OFF: //All Units Off case X10FN_ALL_LG_OFF: //All Lights Off output_low(X10OUT1); output_low(X10OUT2); output_low(X10OUT3); output_low(X10OUT4); break;
case X10FN_ALL_UN_ON: //All Units On output_high(X10OUT1); output_high(X10OUT2); output_high(X10OUT3); output_high(X10OUT4); break; }
} //Execute Function code void X10FuncExeADR3(char House,int Number,int Fn) { int H,N,P;
//Get Address form EEPROM House & Number // H=read_eeprom(4); // N=read_eeprom(5);
//Private Function // if(H==House && N==Number) if(House=='A' && Number==3) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT3); break; case X10FN_OFF: //OFF output_low(X10OUT3); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortE(); P&=0B00000001; if(P==0B00000001) X10Write('A',3,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write('A',3,X10FN_STATUS_OFF); break; } }
//ALL Unit Function switch(Fn) { case X10FN_ALL_UN_OFF: //All Units Off case X10FN_ALL_LG_OFF: //All Lights Off output_low(X10OUT1); output_low(X10OUT2); output_low(X10OUT3); output_low(X10OUT4); break;
case X10FN_ALL_UN_ON: //All Units On output_high(X10OUT1); output_high(X10OUT2); output_high(X10OUT3); output_high(X10OUT4); break; }
} void X10FuncExeADR4(char House,int Number,int Fn) { int H,N,P;
//Get Address form EEPROM House & Number // H=read_eeprom(6); // N=read_eeprom(7);
//Private Function // if(H==House && N==Number) if(House=='A' && Number==4) { switch(Fn) { case X10FN_ON: //ON output_high(X10OUT4); break; case X10FN_OFF: //OFF output_low(X10OUT4); break; case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortA(); P&=0B00100000; if(P==0B00100000) X10Write('A',4,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write('A',4,X10FN_STATUS_OFF); break; } }
//ALL Unit Function switch(Fn) { case X10FN_ALL_UN_OFF: //All Units Off case X10FN_ALL_LG_OFF: //All Lights Off output_low(X10OUT1); output_low(X10OUT2); output_low(X10OUT3); output_low(X10OUT4); break;
case X10FN_ALL_UN_ON: //All Units On output_high(X10OUT1); output_high(X10OUT2); output_high(X10OUT3); output_high(X10OUT4); break; }
}
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #170 on: November 12, 2009, 08:02:15 PM » |
|
อาจารย์ครับผมเพิ่มตัวนี้เข้าไปในฟังชันก์ X10FuncExe มันจะแสดง ออกน่าจอมั้ยครับ if(House=='A' && Number==1) { switch(Fn) { case X10FN_STATUS_ON: printf("A01 = STATUS ON\r\n"); break; case X10FN_STATUS_OFF: printf("A01 = STATUS OFF\r\n"); break; } }
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #171 on: November 13, 2009, 11:01:44 AM » |
|
สักครูนะครับ วันนี้มีประชุมหลายที่ครับ รู้สึกว่า ฟังก์ชันค่อนข้างจะซ้ำซ้อนมาก เดี๋ยวต้องใจเย็นๆ ทำความเข้าใจไปกับคุณ muiim ด้วย
|
|
« Last Edit: November 13, 2009, 04:52:37 PM by smitdh »
|
Logged
|
|
|
|
muiim
|
|
« Reply #172 on: November 13, 2009, 12:49:23 PM » |
|
ครับอาจารย์ อีกอย่างผมใช้แอดเดรสจาก eeprom ได้แล้วครับ ของ 18F458 เนี้ย มันจะเขียนไว้ตำแหน่งของเลขคู่ครับ คือ #rom 0xf00000={'A',0x1,'A',0x02,'A',0x03,'A',0x04} ก็จะเป็น ตำแหน่ง 0,2,4,6,8,A,C,E กว่าจะรู้เรื่องขอบคุณบทความของอาจารย์อีกทีครับ แล้วก็ โปรแกรม PICkit ด้วย ที่ทำให้เห็นว่ามันเขียนลงตำแหน่งอะไร(งงตั้งนาน)
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #173 on: November 13, 2009, 05:22:35 PM » |
|
ไม่ใช่ว่ามันจะเขียนไว้ที่เลขคู่หรอกครับ บังเอิญ Record size มันเท่ากับ 2 มันเลยลงที่เลขคู่ การเก็บข้อมูลลง eeprom ซึ่งมีขนาด 8 บิท โดยการจัดเก็บ จะเก็บเรียงต่อกันไป ในกรณีของเราใน 1 แอดเดรสจะมีข้อมูล 2 ไบท์เช่น 'A',01 หรือ 0x41 0x01 ดังนั้นใน 1 Record จะมีขนาด 2 ไบท์ หากเก็บข้อมูลต่อๆ กันไปการเข้าถึงข้อมูลหาได้จาก
eepromADR = RecordSize*RecNo; โดย RecNo มีค่าเท่ากับ 0-n ในกรณีของเรา RecordSize = 2 ดังนั้นการหาแอดเดรสของ eeprom ที่ RecNo ต่างๆ คือ 2*0 = 0 2*1 = 2 2*2 = 4 2*3 = 6 2*4 = 8 2*5 = 10 (0x0A) 2*6 = 12 (0x0C) 2*7 = 14 (0x0E)
ซึ่งจะเป็นตำแหน่งตามที่คุณ muiim สังเกตมา แล้ว ตกลงจะไปทิศทางไหนครับ
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #174 on: November 13, 2009, 06:06:07 PM » |
|
ขอบคุณอาจารย์ที่ช่วยให้ความเข้าใจเพิ่มเติมครับ ผมตกลงใจแล้วว่าจะไปในทิศทาง ของeeprom ครับ(แต่จริงๆก็อยากจะทำความเข้าใจทั้งสองอย่างนั่นแหละครับ อีกทางหนึ่งก็น่าจะทำความเข้าใจได้ง่ายกว่ามั้ย ) ยังไงก็ขอบคุณอาจารย์สมิทร์อีกทีครับ
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #175 on: November 15, 2009, 01:25:45 PM » |
|
ตอนนี้สามารถตรวจสอบสถานะแอดเดรสต่างได้แล้วครับ แต่ผมมีปัญหาใหม่คือ(18F458) case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortE(); P&=0B001; if(P==0B001) X10Write(H,N,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write(H,N,X10FN_STATUS_OFF); break; ฟังก์ชันนี้มันไม่ทำงานครับ(ประมาณว่ามันอ่าน พอร์ต E ไม่ได้ครับ ) ผมให้ พอร์ต E0 เป็น out put มันทำงานได้ แต่พอให้มันอ่าน พอร์ตเพื่อใช้ฟังก์ชัน 15 มันไม่ทำงาน
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #176 on: November 17, 2009, 11:50:19 AM » |
|
จากข้อมูลในคำถาม เข้าใจว่าใช้ RE0 เป็นเอาต์พุต
1) สำหรับการใช้งาน PORTD จะอยู่ที่การกำหนด 3 ส่วนนี้ครับ #define X10OUT PIN_D0 #define PORTD 0xF83
char ReadPortD(void) { #asm movf PORTD,0 //mov to W movwf _RETURN_ #endasm }
2) การเซ็ท I/O set_tris_d(0B00000000); เป็นเอาต์พุต
3) การใช้งาน ... case X10FN_STATUS_REQ: //12 ON ,13 OFF P=ReadPortD(); P&=0B00000001; if(P==0B00000001) X10Write(H,N,X10FN_STATUS_ON); //X10Write(H,N,12); else X10Write(H,N,X10FN_STATUS_OFF); break; ...
|
|
« Last Edit: November 18, 2009, 09:33:50 AM by smitdh »
|
Logged
|
|
|
|
muiim
|
|
« Reply #177 on: November 18, 2009, 08:26:03 AM » |
|
ขอบคุณอาจารย์ที่ตอบคำถามครับ สาเหตุที่ผมอ่าน PortEไม่ได้น่าจะมาจากสาเหตุที่ผมDefine port ผิด(เอะอะ ถามอยากเดียว ลืมเช็ค code ตัวเอง ) อีกอย่างครับ คือผมมตรวจสอบสถานะการทำงานด้วยการที่ ให้เครื่องหนึ่งทำเป็นตัวส่ง อีกเครื่องเป็นตัวรับ ตัวส่งก็ตัด ฟังชั่น ในส่วน case X10FN_STATUS_REQ://12 ON ,13 OFF . . แล้วเพิ่มส่วนนี้เข้าไป case X10FN_STATUS_ON: printf("A04 = STATUS ON\r\n"); break; case X10FN_STATUS_OFF: printf("A04 = STATUS OFF\r\n"); break; มันก็ทำให้สามรถตรวจสอบแบบหลายแอดเดรสได้(อาจารย์ช่วยแนะนำเพิ่มเติมด้วยครับ) ขอบคุณล่วงหน้าครับ
|
|
|
Logged
|
|
|
|
plom
|
|
« Reply #178 on: November 18, 2009, 02:48:55 PM » |
|
|
|
|
Logged
|
|
|
|
muiim
|
|
« Reply #179 on: November 19, 2009, 08:32:05 AM » |
|
ขอถามคุณ plom หน่อยละกันนะครับ ในคำว่า โมดูลอื่นๆ นะ มีความหมายเกียวกับอะไร จะใช้x10 lab เป็นเครื่องปลายทางเพื่อ ควบคุมโหลด(หลอดไฟ ,พัดลม ...) หรือใช้เป็นตัวกลางในการสื่อสารระหว่าง โมดูล ครับ
|
|
|
Logged
|
|
|
|
|