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);
}