Checksum problem

Everything related to protocols and IR codes
Post Reply
pere_et_fils
Posts: 2
Joined: Fri Aug 24, 2018 1:25 pm

Checksum problem

Post by pere_et_fils »

HI,
I'm math from france (so sorry for my poor english).

I have to pilot my AC Mitsubishi (MSZ-HJ50VA) by arduino. I have decodate IR frames and did this code :

Code: Select all

typedef enum HvacMode {
  HVAC_HOT,
  HVAC_COLD,
  HVAC_DRY,
  HVAC_FAN, 
  HVAC_AUTO // used for Toshiba only
} HvacMode_t; // HVAC  MODE

typedef enum HvacFanMode {
  FAN_SPEED_1,
  FAN_SPEED_2,
  FAN_SPEED_3,
  FAN_SPEED_4,
  FAN_SPEED_5,
  FAN_SPEED_AUTO
} HvacFanMode_;  // HVAC  FAN MODE

typedef enum HvacVanneMode {
  VANNE_AUTO,
  VANNE_H1,
  VANNE_H2,
  VANNE_H3,
  VANNE_H4,
  VANNE_H5,
  VANNE_AUTO_MOVE
} HvacVanneMode_;  // HVAC  VANNE MODE


// HVAC MITSUBISHI_
#define HVAC_MITSUBISHI_HDR_MARK    3400
#define HVAC_MITSUBISHI_HDR_SPACE   1700
#define HVAC_MITSUBISHI_BIT_MARK    433
#define HVAC_MITSUBISHI_ONE_SPACE   1299
#define HVAC_MITSUBISHI_ZERO_SPACE  433
#define HVAC_MITSUBISHI_RPT_MARK    433
#define HVAC_MITSUBISHI_RPT_SPACE   12980


/****************************************************************************
/* Send IR command to Mitsubishi HVAC - sendHvacMitsubishi
/***************************************************************************/
void sendHvacMitsubishi(
  HvacMode                HVAC_Mode,           // Example HVAC_HOT  HvacMitsubishiMode
  int                     HVAC_Temp,           // Example 21  (°c)
  HvacFanMode             HVAC_FanMode,        // Example FAN_SPEED_AUTO  HvacMitsubishiFanMode
  HvacVanneMode           HVAC_VanneMode,      // Example VANNE_AUTO_MOVE  HvacMitsubishiVanneMode
  int                     ON                  // Example false
)
{

  #define HVAC_MITSUBISHI_DATALEN 18
  byte mask = 1; //our bitmask
 byte data[HVAC_MITSUBISHI_DATALEN] = { B11000100, B11010011, B01100100, B10000000, B00000000, B00000100, B00010000, B10100000, B00001100, B10000010, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B11001101 };
  // data array is a valid trame, only byte to be chnaged will be updated.
  byte i;

  // Byte 6 - On / Off
  if (ON) {
    data[5] = (byte) B00000100; // Turn OFF HVAC
  } else {
    data[5] = (byte) B00000000; // Turn ON HVAC
  }

  // Byte 7 et 9 - Mode
  switch (HVAC_Mode)
  {
    case HVAC_HOT:   data[6] = (byte) B00010000; data[8] = (byte) B00001100; break;
    case HVAC_COLD:  data[6] = (byte) B00011000; data[8] = (byte) B01101100; break;
    case HVAC_FAN:   data[6] = (byte) B00011100; data[8] = (byte) B00001100; break;
    case HVAC_DRY:   data[6] = (byte) B00001000; data[8] = (byte) B01001100; break;
    default: break;
  }

  // Byte 8 - Temperature
  // Check Min Max For Hot Mode
  byte Temp;
  if (HVAC_Temp > 31) { Temp = 31;}
  else if (HVAC_Temp < 16) { Temp = 16; } 
  else { Temp = HVAC_Temp; };
  switch (HVAC_Temp)
  {
    case 16:   data[7] = (byte) B00000000; break;
    case 17:   data[7] = (byte) B10000000; break;
    case 18:   data[7] = (byte) B01000000; break;
    case 19:   data[7] = (byte) B11000000; break;
    case 20:   data[7] = (byte) B00100000; break;
    case 21:   data[7] = (byte) B10100000; break;
    case 22:   data[7] = (byte) B01100000; break;
    case 23:   data[7] = (byte) B11100000; break;
    case 24:   data[7] = (byte) B00010000; break;
    case 25:   data[7] = (byte) B10010000; break;
    case 26:   data[7] = (byte) B01010000; break;
    case 27:   data[7] = (byte) B11010000; break;
    case 28:   data[7] = (byte) B00110000; break;
    case 29:   data[7] = (byte) B10110000; break;
    case 30:   data[7] = (byte) B01110000; break;
    case 31:   data[7] = (byte) B11110000; break;
    default: break;
  }

  // Byte 10 - FAN / VANNE
  switch (HVAC_FanMode)
  {
    case FAN_SPEED_1:       data[9] = (byte) B10000010; break;
    case FAN_SPEED_2:       data[9] = (byte) B01000010; break;
    case FAN_SPEED_3:       data[9] = (byte) B11000010; break;
    case FAN_SPEED_4:       data[9] = (byte) B00100010; break;
    case FAN_SPEED_5:       data[9] = (byte) B00100010; break; //No FAN speed 5 for MITSUBISHI so it is consider as Speed 4
    case FAN_SPEED_AUTO:    data[9] = (byte) B00000010; break;
    default: break;
  }

  switch (HVAC_VanneMode)
  {
    case VANNE_AUTO:        data[9] = (byte) data[9] | B00000000; break;
    case VANNE_H1:          data[9] = (byte) data[9] | B00010000; break;
    case VANNE_H2:          data[9] = (byte) data[9] | B00001000; break;
    case VANNE_H3:          data[9] = (byte) data[9] | B00011000; break;
    case VANNE_H4:          data[9] = (byte) data[9] | B00000100; break;
    case VANNE_H5:          data[9] = (byte) data[9] | B00010100; break;
    case VANNE_AUTO_MOVE:   data[9] = (byte) data[9] | B00011100; break;
    default: break;
  }

  if (HVAC_VanneMode==VANNE_AUTO && HVAC_FanMode==FAN_SPEED_AUTO){
    data[9] = (byte) B00000001;
  }

  // Byte 18 - CRC
  data[17] = 0;
  //need help



  enableIROut(38);  // 38khz
  space(0);
  for (int j = 0; j < 2; j++) {  // For Mitsubishi IR protocol we have to send two time the packet data
    // Header for the Packet
    mark(HVAC_MITSUBISHI_HDR_MARK);
    space(HVAC_MITSUBISHI_HDR_SPACE);
    for (i = 0; i < 18; i++) {
      // Send all Bits from Byte Data in Reverse Order
      for (mask = 00000001; mask > 0; mask <<= 1) { //iterate through bit mask
        if (data[i] & mask) { // Bit ONE
          mark(HVAC_MITSUBISHI_BIT_MARK);
          space(HVAC_MITSUBISHI_ONE_SPACE);
        }
        else { // Bit ZERO
          mark(HVAC_MITSUBISHI_BIT_MARK);
          space(HVAC_MITSUBISHI_ZERO_SPACE);
        }
        //Next bits
      }
    }
    // End of Packet and retransmission of the Packet
    mark(HVAC_MITSUBISHI_RPT_MARK);
    space(HVAC_MITSUBISHI_RPT_SPACE);
    space(0); 
  }
}
My problem is to calculate checksum. I see it's XOR nibble.... But I don't know how calculate it ! Google didn't help me :|
Thanks for help.

Math
You do not have the required permissions to view the files attached to this post.
User avatar
AnalysIR
Site Admin
Posts: 776
Joined: Sat Aug 31, 2013 3:51 pm
Location: Dublin, Ireland
Contact:

Re: Checksum problem

Post by AnalysIR »

If you email me a set of signals with temperatures from 16degC to 30degC in order and put the temp into the button col.

...I will then check it out for you....
pere_et_fils
Posts: 2
Joined: Fri Aug 24, 2018 1:25 pm

Re: Checksum problem

Post by pere_et_fils »

Hi,

Thanks for attention.
this is an history from IRAnalysis
août 27 2018 171112_Session History mitsu_History.txt
.

Wath is difference between xor byte ant xor nibble ?
I look for a simple formula for each to understand differnce...

Math
You do not have the required permissions to view the files attached to this post.
User avatar
AnalysIR
Site Admin
Posts: 776
Joined: Sat Aug 31, 2013 3:51 pm
Location: Dublin, Ireland
Contact:

Re: Checksum problem

Post by AnalysIR »

What is difference between xor byte ant xor nibble ?
It goes thru the hex value one byte (or one nibble) at a time and calculates the result.
I look for a simple formula for each to understand differnce...
look for C code examples for XOR online, via search.

The signal is sent twice for each button press as you can see from the Trace on AnalysIR.

The checksum is the last byte of each part of the signal. (The last byte of the full signal also works as both parts are identical)

To use the checksum calculator:
- record the signals as above
- Select LSB8 from Powertools
- when completed, open the checksum calculator via Power tools & click Reset button.
- Set the Ignore @end to 1 byte
- Select any signal from the signals drop down
- You will then see the value in the XOP byte HEx is equal to the las byte at the top.
- Re-check for severalsignals, to confirm.

If you are not confident programming in c to implement this, please study some online examples first..

In the meantime you can just use RAW signals to resend any signal.
Post Reply