Kevin Konradt
/
CanBusExample2
main.cpp
- Committer:
- kevin
- Date:
- 2010-01-02
- Revision:
- 0:bc8591a28ec2
File content as of revision 0:bc8591a28ec2:
#include "mbed.h" #include "TextLCD.h" // included in libmbed rev14 #include "CAN.h" //enable additional serial debug messages //#define DEBUG_CAN_TX 1 #define DEBUG_IR_RAW 1 AnalogIn ain(p20); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); TextLCD lcd(p14, p15, p16, p17, p18, p19, p21, 8); Ticker TickerSerialTx; Ticker TickerLcdUpdate; Ticker TickerCanTx; // conversion from IR sensor input voltage to nominal gas value #define CAN_GAS_MAX 4000 #define CAN_GAS_MIN 700 #define IR_MIN 0.28 #define IR_MAX 0.76 // 0.12 - 0.13 idle update: seen 0.02 .. // 0.76 max // CAN defines #define CAN_ID_EGAS_CTRL 0x700 #define CAN_DLC_EGAS_CTRL 1 #define CAN_ID_EGAS_NOMINAL_VALUE 0x701 #define CAN_DLC_EGAS_NOMINAL_VALUE 2 #define CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE 1 #define CAN_BYTE_LOW_EGAS_NOMINAL_VALUE 0 // CAN_RS pin at Philips PCA82C250 can bus controller. // activate transceiver by pulling this pin to GND. // (Rise and fall slope controlled by resistor R_s) // (+5V result in tranceiver standby mode) // For further information see datasheet page 4 DigitalOut can_Pca82c250SlopePin(p28); // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). CAN can2(p30, p29); // value which will be sent via can unsigned short u16_CanGasNominal = CAN_GAS_MIN; // IR sensor value float f_IrDistance = 0.0; // 2 can objects for TX CANMessage can_MsgTx_EgasCtrl; CANMessage can_MsgTx_EgasNominalValue; void CanSendEgas() { // idle if ( (f_IrDistance > IR_MAX) || (f_IrDistance < IR_MIN) ) { u16_CanGasNominal = CAN_GAS_MIN; } // valid input range else { u16_CanGasNominal = (unsigned short)( (((CAN_GAS_MAX-CAN_GAS_MIN)*(f_IrDistance-IR_MIN))/(IR_MAX-IR_MIN))+CAN_GAS_MIN ); } // debug //printf("u16_CanGasNominal: %d\n\r", u16_CanGasNominal); if (can2.write(can_MsgTx_EgasCtrl)) { #ifdef DEBUG_CAN_TX printf("CanTx--> id: 0x%x dlc: %d data: ", can_MsgTx_EgasCtrl.id, can_MsgTx_EgasCtrl.len); for (char i=0; i<can_MsgTx_EgasCtrl.len; i++) { printf("%x ", can_MsgTx_EgasCtrl.data[i]); } printf("\n\r"); #endif } can_MsgTx_EgasNominalValue.data[CAN_BYTE_LOW_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal); can_MsgTx_EgasNominalValue.data[CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal>>8); if (can2.write(can_MsgTx_EgasNominalValue)) { #ifdef DEBUG_CAN_TX printf("CanTx--> id: 0x%x dlc: %d data: ", can_MsgTx_EgasNominalValue.id, can_MsgTx_EgasNominalValue.len); for (char i=0; i<can_MsgTx_EgasNominalValue.len; i++) { printf("%x ", can_MsgTx_EgasNominalValue.data[i]); } printf("\n\r"); #endif } } void SerialSendIrDistance() { printf("f_IrDistance: %f\r\n", f_IrDistance); } void LcdPrintIrDistance() { lcd.printf("IrDist: %f", f_IrDistance); } int main() { // 500kbit/s can2.frequency(500000); // activate external can transceiver can_Pca82c250SlopePin = 0; // init everything can_MsgTx_EgasCtrl.id = CAN_ID_EGAS_CTRL; can_MsgTx_EgasCtrl.len = CAN_DLC_EGAS_CTRL; can_MsgTx_EgasCtrl.data[0] = 1; can_MsgTx_EgasNominalValue.data[CAN_BYTE_LOW_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal); can_MsgTx_EgasNominalValue.data[CAN_BYTE_HIGH_EGAS_NOMINAL_VALUE] = (unsigned char)(u16_CanGasNominal>>8); can_MsgTx_EgasNominalValue.id = CAN_ID_EGAS_NOMINAL_VALUE; can_MsgTx_EgasNominalValue.len = CAN_DLC_EGAS_NOMINAL_VALUE; #ifdef DEBUG_IR_RAW TickerSerialTx.attach(&SerialSendIrDistance, 0.35); #endif TickerLcdUpdate.attach(&LcdPrintIrDistance, 0.75); TickerCanTx.attach(&CanSendEgas, 0.1); while (1) { // get new distance from sensor f_IrDistance = ain.read(); // show distance with the 4 leds led1 = (f_IrDistance > 0.11) ? 1 : 0; led2 = (f_IrDistance > 0.30) ? 1 : 0; led3 = (f_IrDistance > 0.47) ? 1 : 0; led4 = (f_IrDistance > 0.74) ? 1 : 0; } } // TODO: no global variables