Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
kevin
Date:
Sat Jan 02 18:05:33 2010 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r bc8591a28ec2 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jan 02 18:05:33 2010 +0000
@@ -0,0 +1,131 @@
+#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
\ No newline at end of file
diff -r 000000000000 -r bc8591a28ec2 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jan 02 18:05:33 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a0336ede94ce