Looks like the following code does not dissassemble properly when compiled
and disassembled with the commands:

msp430-gcc -g a.c -mmcu=msp430x436 -o a.exe
msp430-objdump -dSt --disassembler-options=IAR a.exe > a.msa

Second "for" loop in SendSHTCommand function has incorrect branch offset in
the loop. That branch points in the middle of the
4 byte instruction.

----------------------------------------------------------------------------
-----------

#include <io.h>
#include <signal.h>
#include <msp430\adc12.h>

#define SHT_DATA      BIT1
#define SHT_SCK       BIT0
#define SHT_DELAY   asm("nop"); asm("nop");
#define SHT_DATA_LOW  P3OUT &= ~SHT_DATA
#define SHT_DATA_HIGH P3OUT |= SHT_DATA
#define SHT_SCK_LOW   P3OUT &= ~SHT_SCK
#define SHT_SCK_HIGH  P3OUT |= SHT_SCK

unsigned int SendSHTCommand(unsigned char command)
{
 unsigned int i;
 unsigned int result;
 P3DIR |= SHT_DATA;
 // reset it
 SHT_DATA_HIGH;
 for(i = 1; i < 11; i++) {
  SHT_SCK_HIGH;
  SHT_DELAY;
  SHT_SCK_LOW;
  SHT_DELAY;
 }
 // initiate TS
 SHT_DELAY;
 SHT_DATA_HIGH;
 SHT_DELAY;
 SHT_SCK_HIGH;
 SHT_DELAY;
 SHT_DATA_LOW;
 SHT_DELAY;
 SHT_SCK_LOW;
 SHT_DELAY;
 SHT_SCK_HIGH;
 SHT_DELAY;
 SHT_DATA_HIGH;
 SHT_DELAY;
 SHT_SCK_LOW;
 SHT_DELAY;
 //TS done
 for(i = 0; i < 8; i++) {
  if((command & 0x80) == 0x80) {
   SHT_DATA_HIGH;
  } else {
   SHT_DATA_LOW;
  }
  command <<= 1;
  SHT_DELAY;
  SHT_SCK_HIGH;
  SHT_DELAY;
  if(i == 7) {
   P3DIR &= ~SHT_DATA;
  }
        SHT_SCK_LOW;
 }
 SHT_DELAY;
 result = 0;
 // wait for data low
 while((P3IN & SHT_DATA) != 0) ;
 // ack it
 SHT_SCK_HIGH;
 SHT_DELAY;
 SHT_SCK_LOW;
 // wait for data high
 while((P3IN & SHT_DATA) == 0) ;
 // wait for result - data low
 while((P3IN & SHT_DATA) != 0) ;

 for(i = 0; i < 8; i++) {
  result <<= 1;
  if((P3IN & SHT_DATA) != 0) {
   result |= 1;
  }
  SHT_SCK_HIGH;
  SHT_DELAY;
  SHT_SCK_LOW;
  SHT_DELAY;
 }
 P3DIR |= SHT_DATA;
 SHT_DATA_LOW;
 SHT_DELAY;
 SHT_SCK_HIGH;
 SHT_DELAY;
 SHT_SCK_LOW;
 P3DIR &= ~SHT_DATA;
 SHT_DELAY;
 // next data byte
 for(i = 0; i < 8; i++) {
  result <<= 1;
  if((P3IN & SHT_DATA) != 0) {
   result |= 1;
  }
  SHT_SCK_HIGH;
  SHT_DELAY;
  SHT_SCK_LOW;
  SHT_DELAY;
 }
 return result;
}

void main(void)
{
 SendSHTCommand(3);
}


Reply via email to