i found this code it is as more then i need, i still couldnt get anything to the LCD.
/**
*
*
- Copyright (c) 2008-2009 All rights reserved.
*/
#include "WConstants.h"
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "pins_arduino.h"
#include <inttypes.h>
#include "global.h"
#include "mcp2515.h"
#include "defaults.h"
#include "Canbus.h"
/* C++ wrapper */
CanbusClass::CanbusClass() {
}
char CanbusClass::message_rx(unsigned char *buffer) {
tCAN message;
if (mcp2515_check_message()) {
// Lese die Nachricht aus dem Puffern des MCP2515
if (mcp2515_get_message(&message)) {
// print_can_message(&message);
// PRINT("\n");
buffer[0] = message.data[0];
buffer[1] = message.data[1];
buffer[2] = message.data[2];
buffer[3] = message.data[3];
buffer[4] = message.data[4];
buffer[5] = message.data[5];
buffer[6] = message.data[6];
buffer[7] = message.data[7];
// buffer[] = message[];
// buffer[] = message[];
// buffer[] = message[];
// buffer[] = message[];
}
else {
// PRINT("Kann die Nachricht nicht auslesen\n\n");
}
}
}
char CanbusClass::message_tx(void) {
tCAN message;
// einige Testwerte
message.id = 0x7DF;
message.header.rtr = 0;
message.header.length = 8;
message.data[0] = 0x02;
message.data[1] = 0x01;
message.data[2] = 0x05;
message.data[3] = 0x00;
message.data[4] = 0x00;
message.data[5] = 0x00;
message.data[6] = 0x00;
message.data[7] = 0x00;
// mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), (1<<REQOP1));
mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
if (mcp2515_send_message(&message)) {
// SET(LED2_HIGH);
return 1;
}
else {
// PRINT("Fehler: konnte die Nachricht nicht auslesen\n\n");
return 0;
}
return 1;
}
char CanbusClass::ecu_req(unsigned char pid, char *buffer)
{
tCAN message;
float engine_data;
int timeout = 0;
char message_ok = 0;
// Prepair message
message.id = PID_REQUEST;
message.header.rtr = 0;
message.header.length = 8;
message.data[0] = 0x02;
message.data[1] = 0x01;
message.data[2] = pid;
message.data[3] = 0x00;
message.data[4] = 0x00;
message.data[5] = 0x00;
message.data[6] = 0x00;
message.data[7] = 0x00;
mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
// SET(LED2_HIGH);
if (mcp2515_send_message(&message)) {
}
while(timeout < 4000)
{
timeout++;
if (mcp2515_check_message())
{
if (mcp2515_get_message(&message))
{
if((message.id == PID_REPLY) && (message.data[2] == pid)) // Check message is the reply and its the right PID
{
switch(message.data[2])
{ /* Details from OBD-II PIDs - Wikipedia /
case ENGINE_RPM: // ((A256)+B)/4 [RPM]
engine_data = ((message.data[3]*256) + message.data[4])/4;
sprintf(buffer,"%d rpm ",(int) engine_data);
break;
case ENGINE_COOLANT_TEMP: // A-40 [degree C]
engine_data = message.data[3] - 40;
sprintf(buffer,"%d degC",(int) engine_data);
break;
case VEHICLE_SPEED: // A [km]
engine_data = message.data[3];
sprintf(buffer,"%d km ",(int) engine_data);
break;
case MAF_SENSOR: // ((256*A)+B) / 100 [g/s]
engine_data = ((message.data[3]*256) + message.data[4])/100;
sprintf(buffer,"%d g/s",(int) engine_data);
break;
case O2_VOLTAGE: // A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc)
engine_data = message.data[3]*0.005;
sprintf(buffer,"%d v",(int) engine_data);
case THROTTLE: // Throttle Position
engine_data = (message.data[3]*100)/255;
sprintf(buffer,"%d %% ",(int) engine_data);
break;
}
message_ok = 1;
}
}
}
if(message_ok == 1) return 1;
}
return 0;
}
char CanbusClass::init(unsigned char speed) {
return mcp2515_init(speed);
}
CanbusClass Canbus;