[c] yenimsp430

Viewer

copydownloadembedprintName: yenimsp430
  1. #include <msp430.h>
  2. #include "mcp2515.h"
  3.  
  4. enum OBD2_PIDs {
  5.   PIDS_SUPPORTED = 0x00,
  6.   MONITOR_STATUS = 0x01,
  7.   FREEZE_FRAME_DTC = 0x02,
  8.   FUEL_SYSTEM_STATUS = 0x03,
  9.   CALCULATED_ENGINE_LOAD = 0x04,
  10.   ENGINE_COOLANT_TEMPERATURE = 0x05,
  11.   SHORT_TERM_FUEL_TRIM_BANK1 = 0x06,
  12.   LONG_TERM_FUEL_TRIM_BANK1 = 0x07,
  13.   SHORT_TERM_FUEL_TRIM_BANK2 = 0x08,
  14.   LONG_TERM_FUEL_TRIM_BANK2 = 0x09,
  15.   FUEL_PRESSURE = 0x0A,
  16.   INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 0x0B,
  17.   ENGINE_SPEED = 0x0C,
  18.   VEHICLE_SPEED = 0x0D,
  19.   TIMING_ADVANCE = 0x0E,
  20.   INTAKE_AIR_TEMPERATURE = 0x0F,
  21.   MAF_AIR_FLOW_RATE = 0x10,
  22.   THROTTLE_POSITION = 0x11,
  23.   COMMANDED_SECONDARY_AIR_STATUS = 0x12,
  24.   OXYGEN_SENSORS_PRESENT_BANK1 = 0x13,
  25.   OXYGEN_SENSOR_1 = 0x14,
  26.   OXYGEN_SENSOR_2 = 0x15,
  27.   OXYGEN_SENSOR_3 = 0x16,
  28.   OXYGEN_SENSOR_4 = 0x17,
  29.   OXYGEN_SENSOR_5 = 0x18,
  30.   OXYGEN_SENSOR_6 = 0x19,
  31.   OXYGEN_SENSOR_7 = 0x1A,
  32.   OXYGEN_SENSOR_8 = 0x1B,
  33.   OBD_STANDARDS = 0x1C,
  34.   OXYGEN_SENSORS_PRESENT_BANKS4 = 0x1D,
  35.   AUXILIARY_INPUT_STATUS = 0x1E,
  36.   RUN_TIME_SINCE_ENGINE_START = 0x1F,
  37.   PIDS_SUPPORTED2 = 0x20,
  38.   PIDS_SUPPORTED4 = 0x40,
  39.   PIDS_SUPPORTED6 = 0x60,
  40.   PIDS_SUPPORTED8 = 0x80,
  41.   PIDS_SUPPORTEDA = 0xA0,
  42.   PIDS_SUPPORTEDC = 0xC0
  43. };
  44.  
  45. uint32_t rid;
  46. uint8_t mext, irq;
  47. uint8_t buf_send[8] = {1, 2, 3, 4, 5, 6, 7, 8};
  48. uint8_t buf_recv[8];
  49. volatile uint16_t sleep_counter = 20;
  50. volatile int i;
  51.  
  52. int engineCoolantTemp;
  53. int intakeAirTemp;
  54. unsigned int intakePressure;
  55. unsigned int vehicleSpeed;
  56. unsigned int supportedPIDs[32];
  57.  
  58.  
  59. void sendPid(uint8_t pid) {
  60.     uint8_t data[8] = {0x02, 0x01, pid, 0, 0, 0, 0, 0};
  61.     can_send(0x7DF, 1, data, 8, 3);
  62. }
  63.  
  64. void processReceivedData(uint8_t pid, uint8_t *data) {
  65.     switch (pid) {
  66.  
  67.         case PIDS_SUPPORTED:
  68.         {
  69.             for (int i = 0; i < 4; i++) {
  70.                 for (int bit = 0; bit < 8; bit++) {
  71.                     supportedPIDs[* 8 + bit] = (data[3 + i] >> (7 - bit)) & 0x01;
  72.                 }
  73.             }
  74.  
  75.             break;
  76.         }
  77.  
  78.         case CALCULATED_ENGINE_LOAD:
  79.         {
  80.             unsigned int engineLoad = data[3];
  81.             float calculatedEngineLoad = (engineLoad / 255.0) * 100.0;
  82.             break;
  83.         }
  84.  
  85.         case ENGINE_COOLANT_TEMPERATURE:
  86.         {
  87.             int coolantTemp = data[3];
  88.             engineCoolantTemp = coolantTemp - 40;
  89.             break;
  90.         }
  91.  
  92.         case SHORT_TERM_FUEL_TRIM_BANK1:
  93.         {
  94.             int stftBank1 = data[3];
  95.             float shortTermFuelTrimBank1 = (100.0 / 128.0) * stftBank1 - 100.0;
  96.             break;
  97.         }
  98.  
  99.         case LONG_TERM_FUEL_TRIM_BANK1:
  100.         {
  101.             int ltftBank1 = data[3];
  102.             float longTermFuelTrimBank1 = (100.0 / 128.0) * ltftBank1 - 100.0;
  103.             break;
  104.         }
  105.  
  106.         case SHORT_TERM_FUEL_TRIM_BANK2:
  107.         {
  108.             int stftBank2 = data[3];
  109.             float shortTermFuelTrimBank2 = (100.0 / 128.0) * stftBank2 - 100.0;
  110.             break;
  111.         }
  112.  
  113.         case LONG_TERM_FUEL_TRIM_BANK2:
  114.         {
  115.             int ltftBank2 = data[3];
  116.             float longTermFuelTrimBank2 = (100.0 / 128.0) * ltftBank2 - 100.0;
  117.             break;
  118.         }
  119.  
  120.         case FUEL_PRESSURE:
  121.             {
  122.                 unsigned int fuelPressure = data[3];
  123.                 float fuelPressureValue = fuelPressure * 3.0;
  124.                 break;
  125.             }
  126.  
  127.         case INTAKE_MANIFOLD_ABSOLUTE_PRESSURE:
  128.             {
  129.                 intakePressure = data[3];
  130.                 break;
  131.             }
  132.  
  133.         case ENGINE_SPEED:
  134.             {
  135.                 double engineSpeed = ((data[3] * 256) + data[4]) / 4.0;
  136.                 break;
  137.             }
  138.  
  139.         case VEHICLE_SPEED:
  140.             {
  141.                 vehicleSpeed = data[3];
  142.                 break;
  143.             }
  144.  
  145.         case TIMING_ADVANCE:
  146.             {
  147.                 double timingAdvance = (data[3] / 2.0) - 64.0;
  148.                 break;
  149.             }
  150.  
  151.         case INTAKE_AIR_TEMPERATURE:
  152.             {
  153.                 intakeAirTemp = data[3] - 40;
  154.                 break;
  155.             }
  156.  
  157.         case MAF_AIR_FLOW_RATE:
  158.             {
  159.                 int mafHighByte = data[3];
  160.                 int mafLowByte = data[4];
  161.                 float massAirFlow = ((mafHighByte * 256.0) + mafLowByte) / 100.0;
  162.                 break;
  163.             }
  164.  
  165.         case THROTTLE_POSITION:
  166.             {
  167.                 unsigned int throttlePosition = data[3];
  168.                 float throttlePosPercentage = (100.0 / 255.0) * throttlePosition;
  169.                 break;
  170.             }
  171.  
  172.         case OXYGEN_SENSOR_1:
  173.         case OXYGEN_SENSOR_2:
  174.         case OXYGEN_SENSOR_3:
  175.         case OXYGEN_SENSOR_4:
  176.         case OXYGEN_SENSOR_5:
  177.         case OXYGEN_SENSOR_6:
  178.         case OXYGEN_SENSOR_7:
  179.         case OXYGEN_SENSOR_8:
  180.             {
  181.                 unsigned int voltage = data[3];
  182.                 unsigned int fuelTrim = data[4];
  183.                 float oxygenVoltage = voltage / 200.0;
  184.                 float fuelTrimValue = (fuelTrim == 255) ? 0 : (100.0 / 128.0) * fuelTrim - 100.0;
  185.                 break;
  186.             }
  187.  
  188.         case RUN_TIME_SINCE_ENGINE_START:
  189.             {
  190.                 double runTime = (data[3] * 256) + data[4];
  191.                 break;
  192.             }
  193.  
  194.         default:
  195.             break;
  196.     }
  197. }
  198.  
  199. void taskCanRecv() {
  200.     if (can_recv(&rid, &mext, buf_recv) && mext == 0) {
  201.         processReceivedData(buf_recv[2], buf_recv);
  202.     }
  203. }
  204.  
  205. int main() {
  206.     WDTCTL = WDTPW | WDTHOLD;
  207.     DCOCTL = CALDCO_16MHZ;
  208.     BCSCTL1 = CALBC1_16MHZ;
  209.     BCSCTL2 = DIVS_1;
  210.     BCSCTL3 = LFXT1S_2;
  211.  
  212.     P1DIR |= BIT0;
  213.     P1OUT &= ~BIT0;
  214.  
  215.     can_init();
  216.     can_speed(500000, 1, 3);
  217.     can_rx_setmask(0, 0x7FC, 1);
  218.     can_rx_setfilter(0, 0, 0x7E8);
  219.     can_rx_mode(0, MCP2515_RXB0CTRL_MODE_RECV_STD_OR_EXT);
  220.  
  221.     can_ioctl(MCP2515_OPTION_LOOPBACK, 0);
  222.     can_ioctl(MCP2515_OPTION_ONESHOT, 0);
  223.  
  224.     WDTCTL = WDT_ADLY_16;  // WDT'yi 16 milisaniye aralıkla ayarla
  225.     IFG1 &= ~WDTIFG;
  226.     IE1 |= WDTIE;
  227.  
  228.  
  229.     while (1) {
  230.         if (mcp2515_irq & MCP2515_IRQ_FLAGGED) {
  231.             irq = can_irq_handler();
  232.                if (irq & MCP2515_IRQ_RX) {
  233.                    taskCanRecv();
  234.                 }
  235.          }
  236.  
  237.         if (!sleep_counter) {
  238.  
  239.             for (int pid = 0x1F; pid >= 0x00; pid--) {
  240.                 sendPid(pid);
  241.                 __delay_cycles(16000000);
  242.                 taskCanRecv();
  243.             }
  244.  
  245.  
  246.                sleep_counter = 20;
  247.  
  248.          }
  249.                 __bis_SR_register(LPM0_bits + GIE);
  250.     }
  251. }
  252.  
  253. // Watchdog Timer ISR
  254. #pragma vector=WDT_VECTOR
  255. __interrupt void WDT_ISR(void) {
  256.     IFG1 &= ~WDTIFG;
  257.     if (sleep_counter)
  258.         sleep_counter--;
  259.     else
  260.         __bic_SR_register_on_exit(LPM0_bits);
  261. }
  262.  
  263. // PORT1 ISR
  264. #pragma vector=PORT1_VECTOR
  265. __interrupt void P1_ISR(void) {
  266.     if (P1IFG & CAN_IRQ_PORTBIT) {
  267.         P1IFG &= ~CAN_IRQ_PORTBIT;
  268.         mcp2515_irq |= MCP2515_IRQ_FLAGGED;
  269.         __bic_SR_register_on_exit(LPM0_bits);
  270.     }
  271. }
  272.  

Editor

You can edit this paste and save as new:


File Description
  • yenimsp430
  • Paste Code
  • 02 May-2024
  • 6.98 Kb
You can Share it: