[c] yenimsp430
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
- #include <msp430.h>
- #include "mcp2515.h"
- enum OBD2_PIDs {
- PIDS_SUPPORTED = 0x00,
- MONITOR_STATUS = 0x01,
- FREEZE_FRAME_DTC = 0x02,
- FUEL_SYSTEM_STATUS = 0x03,
- CALCULATED_ENGINE_LOAD = 0x04,
- ENGINE_COOLANT_TEMPERATURE = 0x05,
- SHORT_TERM_FUEL_TRIM_BANK1 = 0x06,
- LONG_TERM_FUEL_TRIM_BANK1 = 0x07,
- SHORT_TERM_FUEL_TRIM_BANK2 = 0x08,
- LONG_TERM_FUEL_TRIM_BANK2 = 0x09,
- FUEL_PRESSURE = 0x0A,
- INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 0x0B,
- ENGINE_SPEED = 0x0C,
- VEHICLE_SPEED = 0x0D,
- TIMING_ADVANCE = 0x0E,
- INTAKE_AIR_TEMPERATURE = 0x0F,
- MAF_AIR_FLOW_RATE = 0x10,
- THROTTLE_POSITION = 0x11,
- COMMANDED_SECONDARY_AIR_STATUS = 0x12,
- OXYGEN_SENSORS_PRESENT_BANK1 = 0x13,
- OXYGEN_SENSOR_1 = 0x14,
- OXYGEN_SENSOR_2 = 0x15,
- OXYGEN_SENSOR_3 = 0x16,
- OXYGEN_SENSOR_4 = 0x17,
- OXYGEN_SENSOR_5 = 0x18,
- OXYGEN_SENSOR_6 = 0x19,
- OXYGEN_SENSOR_7 = 0x1A,
- OXYGEN_SENSOR_8 = 0x1B,
- OBD_STANDARDS = 0x1C,
- OXYGEN_SENSORS_PRESENT_BANKS4 = 0x1D,
- AUXILIARY_INPUT_STATUS = 0x1E,
- RUN_TIME_SINCE_ENGINE_START = 0x1F,
- PIDS_SUPPORTED2 = 0x20,
- PIDS_SUPPORTED4 = 0x40,
- PIDS_SUPPORTED6 = 0x60,
- PIDS_SUPPORTED8 = 0x80,
- PIDS_SUPPORTEDA = 0xA0,
- PIDS_SUPPORTEDC = 0xC0
- };
- uint32_t rid;
- uint8_t mext, irq;
- uint8_t buf_send[8] = {1, 2, 3, 4, 5, 6, 7, 8};
- uint8_t buf_recv[8];
- volatile uint16_t sleep_counter = 20;
- volatile int i;
- int engineCoolantTemp;
- int intakeAirTemp;
- unsigned int intakePressure;
- unsigned int vehicleSpeed;
- unsigned int supportedPIDs[32];
- void sendPid(uint8_t pid) {
- uint8_t data[8] = {0x02, 0x01, pid, 0, 0, 0, 0, 0};
- can_send(0x7DF, 1, data, 8, 3);
- }
- void processReceivedData(uint8_t pid, uint8_t *data) {
- switch (pid) {
- case PIDS_SUPPORTED:
- {
- for (int i = 0; i < 4; i++) {
- for (int bit = 0; bit < 8; bit++) {
- supportedPIDs[i * 8 + bit] = (data[3 + i] >> (7 - bit)) & 0x01;
- }
- }
- break;
- }
- case CALCULATED_ENGINE_LOAD:
- {
- unsigned int engineLoad = data[3];
- float calculatedEngineLoad = (engineLoad / 255.0) * 100.0;
- break;
- }
- case ENGINE_COOLANT_TEMPERATURE:
- {
- int coolantTemp = data[3];
- engineCoolantTemp = coolantTemp - 40;
- break;
- }
- case SHORT_TERM_FUEL_TRIM_BANK1:
- {
- int stftBank1 = data[3];
- float shortTermFuelTrimBank1 = (100.0 / 128.0) * stftBank1 - 100.0;
- break;
- }
- case LONG_TERM_FUEL_TRIM_BANK1:
- {
- int ltftBank1 = data[3];
- float longTermFuelTrimBank1 = (100.0 / 128.0) * ltftBank1 - 100.0;
- break;
- }
- case SHORT_TERM_FUEL_TRIM_BANK2:
- {
- int stftBank2 = data[3];
- float shortTermFuelTrimBank2 = (100.0 / 128.0) * stftBank2 - 100.0;
- break;
- }
- case LONG_TERM_FUEL_TRIM_BANK2:
- {
- int ltftBank2 = data[3];
- float longTermFuelTrimBank2 = (100.0 / 128.0) * ltftBank2 - 100.0;
- break;
- }
- case FUEL_PRESSURE:
- {
- unsigned int fuelPressure = data[3];
- float fuelPressureValue = fuelPressure * 3.0;
- break;
- }
- case INTAKE_MANIFOLD_ABSOLUTE_PRESSURE:
- {
- intakePressure = data[3];
- break;
- }
- case ENGINE_SPEED:
- {
- double engineSpeed = ((data[3] * 256) + data[4]) / 4.0;
- break;
- }
- case VEHICLE_SPEED:
- {
- vehicleSpeed = data[3];
- break;
- }
- case TIMING_ADVANCE:
- {
- double timingAdvance = (data[3] / 2.0) - 64.0;
- break;
- }
- case INTAKE_AIR_TEMPERATURE:
- {
- intakeAirTemp = data[3] - 40;
- break;
- }
- case MAF_AIR_FLOW_RATE:
- {
- int mafHighByte = data[3];
- int mafLowByte = data[4];
- float massAirFlow = ((mafHighByte * 256.0) + mafLowByte) / 100.0;
- break;
- }
- case THROTTLE_POSITION:
- {
- unsigned int throttlePosition = data[3];
- float throttlePosPercentage = (100.0 / 255.0) * throttlePosition;
- break;
- }
- case OXYGEN_SENSOR_1:
- case OXYGEN_SENSOR_2:
- case OXYGEN_SENSOR_3:
- case OXYGEN_SENSOR_4:
- case OXYGEN_SENSOR_5:
- case OXYGEN_SENSOR_6:
- case OXYGEN_SENSOR_7:
- case OXYGEN_SENSOR_8:
- {
- unsigned int voltage = data[3];
- unsigned int fuelTrim = data[4];
- float oxygenVoltage = voltage / 200.0;
- float fuelTrimValue = (fuelTrim == 255) ? 0 : (100.0 / 128.0) * fuelTrim - 100.0;
- break;
- }
- case RUN_TIME_SINCE_ENGINE_START:
- {
- double runTime = (data[3] * 256) + data[4];
- break;
- }
- default:
- break;
- }
- }
- void taskCanRecv() {
- if (can_recv(&rid, &mext, buf_recv) && mext == 0) {
- processReceivedData(buf_recv[2], buf_recv);
- }
- }
- int main() {
- WDTCTL = WDTPW | WDTHOLD;
- DCOCTL = CALDCO_16MHZ;
- BCSCTL1 = CALBC1_16MHZ;
- BCSCTL2 = DIVS_1;
- BCSCTL3 = LFXT1S_2;
- P1DIR |= BIT0;
- P1OUT &= ~BIT0;
- can_init();
- can_speed(500000, 1, 3);
- can_rx_setmask(0, 0x7FC, 1);
- can_rx_setfilter(0, 0, 0x7E8);
- can_rx_mode(0, MCP2515_RXB0CTRL_MODE_RECV_STD_OR_EXT);
- can_ioctl(MCP2515_OPTION_LOOPBACK, 0);
- can_ioctl(MCP2515_OPTION_ONESHOT, 0);
- WDTCTL = WDT_ADLY_16; // WDT'yi 16 milisaniye aralıkla ayarla
- IFG1 &= ~WDTIFG;
- IE1 |= WDTIE;
- while (1) {
- if (mcp2515_irq & MCP2515_IRQ_FLAGGED) {
- irq = can_irq_handler();
- if (irq & MCP2515_IRQ_RX) {
- taskCanRecv();
- }
- }
- if (!sleep_counter) {
- for (int pid = 0x1F; pid >= 0x00; pid--) {
- sendPid(pid);
- __delay_cycles(16000000);
- taskCanRecv();
- }
- sleep_counter = 20;
- }
- __bis_SR_register(LPM0_bits + GIE);
- }
- }
- // Watchdog Timer ISR
- #pragma vector=WDT_VECTOR
- __interrupt void WDT_ISR(void) {
- IFG1 &= ~WDTIFG;
- if (sleep_counter)
- sleep_counter--;
- else
- __bic_SR_register_on_exit(LPM0_bits);
- }
- // PORT1 ISR
- #pragma vector=PORT1_VECTOR
- __interrupt void P1_ISR(void) {
- if (P1IFG & CAN_IRQ_PORTBIT) {
- P1IFG &= ~CAN_IRQ_PORTBIT;
- mcp2515_irq |= MCP2515_IRQ_FLAGGED;
- __bic_SR_register_on_exit(LPM0_bits);
- }
- }
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:
Latest Code Pastes