|
Projects:
Keller LD
|
|||||
|
Interfacing the Keller I2C LD series transmitters
|
|||||
Code:
#include "9ld.h"
#include "i2c.h"
float Pmin, Pmax;
unsigned char ZSSCget[5]; //array to receive data frame
BYTE get_PnT_GPIO(BYTE ADDR, BYTE MODE);
BYTE ld_busy(BYTE ADDR);
//CODE**********************************************************************
BYTE get_PnT_GPIO(BYTE ADDR, BYTE MODE)
{
float ZI_pressure; //single float (IEEE 754) in bar
float ZI_temperature; //single float (IEEE 754) in degC
BYTE ZI_status=0; //8 bit status variable
union {
FL floatingpoint;
UL twotimesU16;
} cast;
BYTE ZSSCerror;
if (MODE) { //Only have to read Pmin and Pmax once, every power up,
//the code here can be used to emulate function 48 of the
//Keller protocol used in the 33X RS485 transmitters...
//Function 48: Initialize and Release
//Read Pmin from 16bit locations 0x13 (MSB) and 0x14 (LSB)
//Cast into 32bit (IEEE 754) single float
WriteI2CAddressed(ADDR, 0x13);
while (ld_busy(ADDR)) wait; //poll ~9mS
ReadI2CAddressed(ADDR, (char*)ZSSCget,3);
cast.twotimesU16 = (((UL)(ZSSCget[1]))<<24) + (((UL)(ZSSCget[2]))<<16);
WriteI2CAddressed(ADDR, 0x14);
while (ld_busy(ADDR)) wait; //poll ~9mS
ReadI2CAddressed(ADDR, (char*)ZSSCget,3);
cast.twotimesU16 += (((UL)(ZSSCget[1]))<<8) + ((UL)(ZSSCget[2]));
Pmin=cast.floatingpoint;
//Read Pmax from 16bit locations 0x15 (MSB) and 0x16 (LSB)
//Cast into 32bit (IEEE 754) single float
WriteI2CAddressed(ADDR, 0x15);
while (ld_busy(ADDR)) wait; //poll ~9mS
ReadI2CAddressed(ADDR, (char*)ZSSCget,3);
cast.twotimesU16 = (((UL)(ZSSCget[1]))<<24) + (((UL)(ZSSCget[2]))<<16);
WriteI2CAddressed(ADDR, 0x16);
while (ld_busy(ADDR)) wait; //poll ~9mS
ReadI2CAddressed(ADDR, (char*)ZSSCget,3);
cast.twotimesU16 += (((UL)(ZSSCget[1]))<<8) + ((UL)(ZSSCget[2]));
Pmax=cast.floatingpoint;
}
WriteI2CAddressed(ADDR, 0xAC); //request new conversion
while (ld_busy(ADDR)) wait; //poll ~9mS
ReadI2CAddressed(ADDR, (char*)ZSSCget,5); //read results (5 bytes)
//interpret
ZI_status = ZSSCget[0]; //status
ZI_pressure = (float) ( (((US) (ZSSCget[1]))<<8) + (US) (ZSSCget[2]) ); //P[U16]
ZI_temperature = (float) ( (((US) (ZSSCget[3]))<<8) + (US) (ZSSCget[4]) ); //T[U16]
ZI_pressure = (ZI_pressure-16384) * (Pmax-Pmin)/32768+Pmin; //P[bar]
ZI_temperature = (((((US)ZI_temperature)>>4)-24)*0.05)-50; //T[C]
chs[1].result = (ZI_pressure-Pmin)*14.5; //Convert bar to psi
chs[4].result= (ZI_temperature * 9/5)+32.0F; //Convert degC to degF
return ZSSCerror;
}
BYTE ld_busy(BYTE ADDR)
{
BYTE st;
BYTE ts[3];
ReadI2CAddressed(ADDR, (char*)ts, 1); //read the status byte
st = ts[0] & 0x20; //bit 5, 1=busy
if (st) return 1;
return 0;
}
|
|||||
Contact:
|
|||||
| Copyright © 1991-2026 AdamG
Last Update: |