CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Help with X10 home automation
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

X10 codes
PostPosted: Fri Sep 16, 2011 2:26 am     Reply with quote

Help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
my name is William and im implementing a home automation system using power line communication. Basically im using a motion sensor to send information through the power line using x10 codes. i understand that i have to use extended codes. This is what i used but it is not working.
so can u tell pls help with codes.

Code:
#include <18F4520.h>
#include <stdlib.h>
#include <Math.h>
#fuses INTRC,NOWDT,NOPROTECT,NOLVP
#use delay(clock=1000000)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int SensorL1=0;
int SensorL2=0;


void device_setup()
{

   
    // Set the internal oscillator
  // setup_oscillator( OSC_4MHZ|OSC_INTRC );

   // Setup Timer
   setup_timer_0(RTCC_INTERNAL);
    setup_timer_2(T2_DIV_BY_16, 124, 1);

   // Setup ADC
   // Setup ADC Ports

    setup_adc( ADC_CLOCK_INTERNAL );
    setup_adc_ports(AN0_TO_AN3_ANALOG|VSS_VDD);
   
   // Setup PWM

    set_tris_c(0);
 
    setup_ccp1(CCP_PWM);
    setup_ccp2(CCP_PWM);
   
   
}//end device_setup



double read_sensor (int channel)
{
       double value;
       setup_adc(ADC_CLOCK_INTERNAL);
        setup_adc_ports(ALL_ANALOG);
        set_adc_channel(channel);
      delay_ms(15);
      value =  read_adc();
     
       
        return value;
}//End read_sensor


  /*=========================start_code===============================*/
       
      void start_code(void) 
      {
   while ( !input(PIN_D0) );  // wait for zero crossing to go high
   output_high( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

   while ( input(PIN_D0) );  // wait for zero crossing to go low
   output_high( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

   while ( !input(PIN_D0) );  // wait for zero crossing to go high
   output_high( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

   while ( input(PIN_D0) );  // wait for zero crossing to go low
   output_low ( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);
      }

/*========================send a one============================*/
 void send_one(void)
{
   while ( !input(PIN_D0) );  // wait for zero crossing
   output_high( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

   while ( input(PIN_D0) );
   output_low ( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

}

 /*=======================send a zero===========================*/
   void send_zero(void)
{
   while ( !input(PIN_D0) );  // wait for zero crossing
   output_low ( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

   while ( input(PIN_D0) );
   output_high( PIN_C1);
   delay_ms(1);
   output_low ( PIN_C1);

}

 /*==================sensor data=====================================================*/
 void sensor_data(void){
 send_one();
 send_one();
 send_one();
 send_one();
 send_zero();
 send_zero();
 send_zero();
 send_zero();
 }
  void house_code(void)
  {
  send_zero();
  send_one();
  send_one();
  send_zero();
  }
/*==================extended_code=============================================*/
  void extended_code(void)
  {
  send_zero();
  send_one();
  send_one();
  send_one();
  send_one();
  }


 /*======================panicbutton data==============================================*/
 void panicbutton_data(void){
 send_zero();
 send_zero();
 send_zero();
 send_zero();
 send_one();
 send_one();
 send_one();
 send_one();
 }

void main()
{
   

 //  device_setup();
     
     
   while(1)
   {
       
       //Switch on LED --Power ON LED
        output_high(PIN_B0);   
        delay_ms(100000);
       
       SensorL1 = read_sensor(1);// Sensor N1
       SensorL2 = read_sensor(3);// Sensor N1
       


      /*if (SensorL1 > 128){
        output_high(PIN_B1);
       //output_low(PIN_B1);
       
      }
      if (SensorL1 < 128){
        //output_high(PIN_B1);
        output_low(PIN_B1);
      }
     if  (SensorL2 >128){
     output_high(PIN_B2);
     }
     if (SensorL2<128){
     output_low(PIN_B2);
     }*/
 /*================sending x10 sensor data================================================*/
     if (SensorL1 > 128){
// (output_high(PIN_B1)&&output_low(PIN_B2)){
     start_code();
     house_code();
     
     extended_code();
     sensor_data();
     
     
   while ( !input(PIN_D0) );   /* wait 3 half cycles of AC line*/
   while ( !input(PIN_D0) );   /*specified in protocol*/
   while ( !input(PIN_D0) );       
     start_code();
     house_code();
     extended_code();
     sensor_data();
     }
/*=========================sending x10panic button data=====================================*/
     if (SensorL2 > 128) {
//(output_low(PIN_B1)&& output_high(PIN_B2)){
     
     start_code();
     house_code();
     extended_code();
     panicbutton_data();
     
     
      while ( !input(PIN_D0) );   /* wait 3 half cycles of AC line*/
      while ( !input(PIN_D0) );   /*specified in protocol*/
      while ( !input(PIN_D0) );       
     start_code();
     house_code();
     extended_code();
     panicbutton_data();
     }
     if( (SensorL1 > 128) && (SensorL2 > 128) ) {
//(output_high(PIN_B1)&&output_high(PIN_B2)){
      start_code();
     house_code();
     extended_code();
     panicbutton_data();
     
     
   while ( !input(PIN_D0) );   /* wait 3 half cycles of AC line*/
   while ( !input(PIN_D0) );   /*specified in protocol*/
   while ( !input(PIN_D0) );       
     start_code();
     house_code();
     extended_code();
     panicbutton_data();
     }


 
 

   }
   
//End main
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Fri Sep 16, 2011 5:31 am     Reply with quote

First, I'd get rid of the 'double' casting for the ADC as you're using it in 8 bit mode anyway...
2nd, Get rid of the math library, you don't need anything in there for your application,
3rd, don't use the 'tris_x()' functions.Let the compiler handle do it automatically for you.
4th,don't include the 'stdlib',asgain, you don't need it.
5th, if you use RS232(...) be sure to add 'errors' to the options.
6th,why are you setting up timers? if needed are the values correct?
7th, setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
I couldn't see the value for 'CCP_PWM'....
8th,ADC doesn't need 15ms, 1ms, even 20us is OK...
9th, setup_adc only needs to be called or done once in the program
10...read the X10 example that CCS supplies for 'how it works'...

11..start with a simple 'turn on/off' a light bulb program.build from there...
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Fri Sep 16, 2011 6:00 am     Reply with quote

A few more remarks:
Don't revive a 9 years old thread. For new unrelated questions always start a new thread.

Code:
        delay_ms(100000);
       
       SensorL1 = read_sensor(1);// Sensor N1
A startup delay of 100 seconds is veeerrryyyy long. Besides, the delay function doesn't accept an int32 as parameter and truncates it to an int16, i.e. about 34 seconds with your parameter.

SensorL1 is declared as int but the read_sensor function returns a double. This is a bug and I'm surprised the compiler doesn't give you a warning. Change the read_sensor function to return an integer as well. Using floating point arithmetic in a small processor like the PIC is wasting a lot of memory and speed, better use integers with 'fixed point' arithmetic (use Google to find more about this topic).

+++++++++++++++++
Posts moved to new thread per request.

-- Forum Moderator
+++++++++++++++++
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sat Sep 17, 2011 5:46 am     Reply with quote

my code still doesnt work so i used this one just to check if the modem was gonna blink but nothing happens.pls help
Code:



#include <18F4520.h>
#fuses INTRC,NOWDT,NOPROTECT,NOLVP
#use delay(clock=1000000)
#include <x10.c>
#USE Fast_IO(B)



void main() {

SET_TRIS_B( 0b00000011 );


while(1){

output_low(pin_b5);
delay_ms(500);

x10_write('A',5);
output_high(pin_b5);

delay_ms(500);
}
}




temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Sep 17, 2011 6:04 am     Reply with quote

Edit program as follows...

Code:

#include <18F4520.h>
#fuses INTRC,NOWDT,NOPROTECT,NOLVP
#use delay(clock=1000000)
//#include <x10.c>
// #USE Fast_IO(B)

void main() {

//SET_TRIS_B( 0b00000011 );

while(1){

output_low(pin_b5);
delay_ms(500);

//x10_write('A',5);
output_high(pin_b5);

delay_ms(500);
}
}


...and report back if the LED blinks.
You have to start with something that works.
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sat Sep 17, 2011 7:40 am     Reply with quote

yeah it does blink
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Sep 17, 2011 1:19 pm     Reply with quote

Well the good news is the PIC is OK !

The X10 problem is either the x10 driver or x10 modules.

Now...confirm that they work using a standard controller.
If they do, then it's either a bad code or x10 controller module.

I can't help with that as I tossed out all my x10 stuff 30 years ago.....mainly due to reliablility issues..made my own after that.
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sun Sep 18, 2011 4:23 am     Reply with quote

ok this is my system.form the pic i have a the circuit to transmit the X10 codes. The circuit comes with the spec of the XM10 modem. i dont know whats happening but even the transmission is not goig through sinc nothing is blinking but its supposed to work so please.
Code:




#include <18F4520.h>
#fuses INTRC,NOWDT,NOPROTECT
#use delay(clock=1000000)
#include <x10.c>
#USE Fast_IO(B)



void main() {

SET_TRIS_B( 0b0000011 );


while(1){

output_high(pin_b5);
delay_ms(500);

x10_write('A',5);
output_high(pin_b5);

delay_ms(500);
}
}



[img]
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 18, 2011 5:44 am     Reply with quote

Simple basic questions...
Are you using a TW523 module and is it wired up exactly as the driver explains ?
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sun Sep 18, 2011 5:51 am     Reply with quote

yeah but im using the XM10E the european version.all the connections are good.
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sun Sep 18, 2011 7:07 am     Reply with quote

i removed the fast but still it doesnt work.since im in 220V and 50Hz isnt that affecting my code?
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 18, 2011 9:35 am     Reply with quote

YES!!!!!

The X10.c driver is designed for 60Hz operation NOT 50 Hz, so you'll have to adjust ALL the delays for 50Hz operation.

Voltage doesn't matter but the frequency sure does.

I suggest downloading the X10 manual/specifications and then figure out what has to be 'tweaked'.
You can't be the first to use X10 in Europe,so perhaps google 'x10e timing' or somethinglike that to find the correct info.
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Sun Sep 18, 2011 10:29 am     Reply with quote

ok cool i will look into it.
can u help me understand this code
Code:


#ifndef X10_ZERO_CROSS

#define X10_ZERO_CROSS  PIN_B0
#define X10_TO_PIC      PIN_B1
#define X10_FROM_PIC    PIN_B2

#endif

char const X10_HOUSE_CODES[16] = {'M','N','O','P','C','D','A','B','E',
                                  'F','G','H','K','L','I','J'};
BYTE const X10_KEY_CODES[16] = {13,14,15,16,3,4,1,2,5,6,7,8,11,12,9,10};


void wait_for_zero_cross() {

  if(input(X10_ZERO_CROSS))
     while(input(X10_ZERO_CROSS)) ;
  else
     while(!input(X10_ZERO_CROSS)) ;
}

void x10_write_bits(BYTE data, BYTE n, BYTE start) {
   BYTE i;
   BOOLEAN the_bit;

   for(i=1;i<=n;++i) {
     wait_for_zero_cross();
     the_bit=shift_right(&data,1,0);
     output_bit(X10_FROM_PIC, the_bit);
     delay_ms(1);
     output_low(X10_FROM_PIC);
     if(start==0) {
        wait_for_zero_cross();
        output_bit(X10_FROM_PIC, !the_bit);
        delay_ms(1);
        output_low(X10_FROM_PIC);
     }
   }
}

void x10_write(BYTE house_code, BYTE key_code) {
  BYTE i;

  i=0;
  while (X10_HOUSE_CODES[i]!=house_code)
    i++;
  house_code=i;
  if(key_code<16) {
     i=0;
     while (X10_KEY_CODES[i]!=key_code)
       i++;
     key_code=i;
  }
  x10_write_bits(7,4,1);
  x10_write_bits(house_code,4,0);
  x10_write_bits(key_code,5,0);
  x10_write_bits(0,6,1);
}

BYTE x10_data_ready() {
  port_b_pullups(TRUE);
  return(!input(X10_TO_PIC));
}

BYTE x10_read_bits(BYTE n) {
   BYTE data,i;

   for(i=1;i<=n;++i) {
     wait_for_zero_cross();
     delay_us(300);
     shift_right(&data,1,input(X10_TO_PIC));
     wait_for_zero_cross();
     delay_us(300);
   }
   data>>=8-n;
   return(data);
}

void x10_read(BYTE *house_code,BYTE *key_code) {

  port_b_pullups(TRUE);
  x10_read_bits(2);
  *house_code=x10_read_bits(4);
  *house_code=X10_HOUSE_CODES[*house_code];
  *key_code=x10_read_bits(5);
  if(*key_code<16)
    *key_code=X10_KEY_CODES[*key_code];
}
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 18, 2011 2:33 pm     Reply with quote

To understand the code better, look for a 'Dummies for X10' webpage.
Really, the C code is well written, at least for my old eyes! Each function is self explanatory, variables mean what they say, etc.
However you should consult an X10 website (I'm sure they exist, everything else does !) as to -why- the code is written this way.
30 years ago I did it all in Z80 assembler and the 'format' or 'construction' hasn't been changed, just the language.

To control a lamp...the basic flow is to construct a sequence of ones and zeros, properly timed and in sync with the power line frequency. It is that simple...'bit bang' and I/O pin and 'magically' an X10 light goes on, off,etc.
Once you see a flow chart or timing diagram, you should be able to see the pattern.

You do have a problem in getting it to work at 50Hz but again, there must be websites with that information.
miamomoualeu



Joined: 16 Sep 2011
Posts: 15

View user's profile Send private message

help
PostPosted: Mon Sep 19, 2011 1:54 am     Reply with quote

I have tried to look on the internet for the timing issues and I don't see where to set it up properly for 50Hz. The only thing available is that the length of the pulse is 1ms. I wrote a new code but still not working can you check and see if there is something wrong with it? Or is my problem in the circuit interface between the pic and the modem?
Code:

#include <18F4520.h>
#fuses INTRC,NOWDT,NOPROTECT,
#use delay(clock=1000000)

void start_code();
void house_code();
void key_code();
void send_one();
void send_zero();

 void start_code() 
      {
   while ( !input(PIN_B0) ){  // wait for zero crossing to go high
   output_high( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

   while ( input(PIN_B0) ){  // wait for zero crossing to go low
   output_high( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

   while ( !input(PIN_B0) ){  // wait for zero crossing to go high
   output_high( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}
   while ( input(PIN_B0) ){  // wait for zero crossing to go low
   output_low ( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}
      }


/*========================send a one============================*/
 void send_one()
{
   while ( !input(PIN_B0) ){  // wait for zero crossing
   output_high( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

   while ( input(PIN_B0) ){
   output_low ( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

}

 /*=======================send a zero===========================*/
   void send_zero()
{
   while ( !input(PIN_B0) ){  // wait for zero crossing
   output_low ( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

   while ( input(PIN_B0) ){
   output_high( PIN_B2);
   delay_ms(1);
   output_low ( PIN_B2);
}

}
void house_code()
  {
  send_zero();
  send_one();
  send_one();
  send_zero();
  }
void key_code()
{
send_zero();
send_one();
send_one();
send_zero();
send_zero();
}

void main()
{
   
   while(1)
   {
      output_high(PIN_B5);   
        delay_ms(1000);
        start_code();
      output_low(PIN_B5);
      delay_ms(1000);
        house_code();
      output_high(PIN_B5);
      delay_ms(1000);
        key_code();
      output_low(PIN_B5);

}
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group