duke luftuar me atë që është ndoshta një pjesë e drejtpërdrejtë e kodit për të kopjuar 2 bajt të marra nga një skllav I2C në një grup, në mënyrë që më pas të mund të konvertohem në INT dhe të kryej matematikë mbi të dhënat.
Ky kod me sukses (sipas analizuesit tim I2C) lexon 2 bajt të njëpasnjëshëm nga një adresë regjistri në një ADC 16 bit.
void ADC_Initialise( void )
{
_DINT() ; // disable all maskable interrupts
I2C_SCL_HIGH() ;
I2C_SCL_OUTPUT() ;
I2C_SDA_HIGH() ;
I2C_SDA_OUTPUT() ;
I2C_Write_Register_3B( ADC, 0x01, 0xC0, 0x83) ; // Write 2 bytes to ADC Config Register
for(i=0; i < 10000; i++);
I2C_Read_Register( ADC, 0x00 ); // Read the 2 byte ADC value
for(i=0; i < 10000; i++);
_EINT() ; // re-enable the interrupts
}
static unsigned char I2C_Read_Register( char Device_Address, char Register_Address )
{
unsigned char Value ;
I2CM_Start( ) ;
if( I2CM_Out( Device_Address << 1 ) ) //send write control byte + chip address
return 0 ;
else if( I2CM_Out( Register_Address ) ) //send register number
return 0 ;
I2CM_Start( ) ; // Restart
if( I2CM_Out(( Device_Address << 1 ) | 0x01 )) //send read control byte + chip address
return 0 ;
I2CM_In( &Value, 2 ) ; //RJ 6.8.19 input 2 byte ADC value to 'buf'
// return Value ; //rj placed after IC2M_In
I2CM_Stop( ) ;
return Value ; //rj placed after IC2M_Stop
}
static void I2CM_In( unsigned char* buf, int count )
{
unsigned char data ;
for( ; count--; ) // How do I store these 2 bytes in a char[] or INT
{
data = 0 ;
I2C_SDA_INPUT() ;
volatile unsigned int i = 0 ;
for( ; i < 8 ; ++i )
{
//Set Clock High
I2C_SCL_HIGH() ;
//shift the bit over
data <<= 1 ;
if( I2C_SDA_IS_HIGH() )
{
data |= 0x01 ;
}
//Set Clock Low
brief_pause( 0x04 ) ;
I2C_SCL_LOW() ;
}
//put the input data byte into the buffer, inc buffer pointer
*buf++ = data ;
//take sda to output ack
I2C_SDA_OUTPUT() ;
//Set Clock High
I2C_SCL_HIGH() ;
//Set Clock Low
brief_pause( 0x04 ) ;
I2C_SCL_LOW() ;
}
}
Pra, me sa duket më duhet një grup (char adcarray i panënshkruar [2] për të mbledhur / ruajtur leximet që rezultojnë, kështu që u përpoqa -
*buf++ = data ;
adcarray[] = data ;
adcarray[] = buf ;
'pritet një shprehje' me sa duket do të thotë se më duhet një formë e ciklit for për të mbushur grupin në çdo kalim, edhe pse vija *buf është tashmë brenda një cikli numërimi 2.
Ndihma e vlerësuar (C në IAR në MSP430 dhe ADS1115 ADC). Të fala, Ralph
adcarray
oseValue
- ju keni lënë jashtë deklaratat për ato variabla. - person Chris Turner   schedule 07.08.2019Value
? Duhet të përmbajë 2 bajt të lexuar nga 'I2CM_In. What's wrong with the content of
Value'? A është ndryshe nga ajo që shihni në analizuesin tuaj? - person Gerhardh   schedule 07.08.2019unsigned char Value;
Si duhet të mbajë kjo 2 bajt? - person Gerhardh   schedule 07.08.2019buf
ështëValue
, e cila shpërndan vetëm një bajt memorie. Vlera duhet të jetë ndoshta një grup ose një int 16 bit, dhe funksioniI2C_Read_Register
duhet të kthejë një int 16 bit. Nëse vendosni një pikë ndërprerjeje në*buf++ = data ;
, a shihni të njëjtën gjë që sheh analizuesi juaj? - person yhyrcanus   schedule 07.08.2019