Pages: 1 ... 10 11 [12] 13 14 ... 19   Go Down
Print
Author Topic: เกี่ยวกับ Ac power line x-10  (Read 260802 times)
0 Members and 5 Guests are viewing this topic.
muiim
Jr. Member
**
Offline Offline

Posts: 67


Email
« 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 Offline

Gender: Male
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
Jr. Member
**
Offline Offline

Posts: 67


Email
« Reply #167 on: November 12, 2009, 11:37:19 AM »

อ๋อ ขอบคุณครับอาจารย์ ไงเดี๋ยวเอาไปลองดูก่อนครับ ได้ผลยังไงเดี๋ยวมาบอก ครับ
Logged
muiim
Jr. Member
**
Offline Offline

Posts: 67


Email
« Reply #168 on: November 12, 2009, 02:52:27 PM »

ตอนนี้ผมสามารถควบคุมแบบแยกแอดเดรสได้แล้ว(กำหนดค่าแบบตรงตัวไม่ใช้ eeprom) แต่มีปัญหาที่ ฟังชันก์ตรวจสอบสถานะครับ มันตรวจสอบได้แอดเดรสเดียวจากทั้งหมด 4แอดเดรส ขออาจารย์ช่วยชี้แนะอีกทีครับ ขอบคุณครับ
Code:
  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
Jr. Member
**
Offline Offline

Posts: 67


Email
« Reply #169 on: November 12, 2009, 03:13:01 PM »

ผมเอาcode ในส่วน แอดเดรส มาให้ดูด้วยครับ
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
Jr. Member
**
Offline Offline

Posts: 67


Email
« 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 Offline

Gender: Male
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
Jr. Member
**
Offline Offline

Posts: 67


Email
« 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 Offline

Gender: Male
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
Jr. Member
**
Offline Offline

Posts: 67


Email
« Reply #174 on: November 13, 2009, 06:06:07 PM »

ขอบคุณอาจารย์ที่ช่วยให้ความเข้าใจเพิ่มเติมครับ ผมตกลงใจแล้วว่าจะไปในทิศทาง ของeeprom ครับ(แต่จริงๆก็อยากจะทำความเข้าใจทั้งสองอย่างนั่นแหละครับ อีกทางหนึ่งก็น่าจะทำความเข้าใจได้ง่ายกว่ามั้ย Huh) ยังไงก็ขอบคุณอาจารย์สมิทร์อีกทีครับ
Logged
muiim
Jr. Member
**
Offline Offline

Posts: 67


Email
« 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 Offline

Gender: Male
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
Jr. Member
**
Offline Offline

Posts: 67


Email
« 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
Jr. Member
**
Offline Offline

Posts: 49


Email
« Reply #178 on: November 18, 2009, 02:48:55 PM »

สวัดดีครับพี่สมิธ ตอนนี้อึนมากเลยครับ  คือว่าผมจะต้องทดสอบตัวรับ ตัวส่ง ให้ได้ผลอย่างไรครับ ถึงจะแน่ใจได้ว่าสามารถนำไปใช่ส่งข้อมูลในโมดูลอื่นๆได้ครับ ช่วยแนะนำหน่อยนะครับ ตอนนี้เรียนหนักมากเลยครับพี่ ขอบคุณที่เป็นอาจารย์ที่ปรึกษาให้ครับ ขอบคุณมากครับ Smiley Smiley Smiley
Logged
muiim
Jr. Member
**
Offline Offline

Posts: 67


Email
« Reply #179 on: November 19, 2009, 08:32:05 AM »

ขอถามคุณ plom หน่อยละกันนะครับ
ในคำว่า โมดูลอื่นๆ นะ มีความหมายเกียวกับอะไร จะใช้x10 lab เป็นเครื่องปลายทางเพื่อ ควบคุมโหลด(หลอดไฟ ,พัดลม ...) หรือใช้เป็นตัวกลางในการสื่อสารระหว่าง โมดูล ครับ
Logged
Pages: 1 ... 10 11 [12] 13 14 ... 19   Go Up
Print
 
Jump to: