Hy zusammen,
ich möchte mich auf den Thread mit dem CAN TEENSY etwas anknüpfen → Alter Thread
Kurze erläuterung was ich mache:
Mit dem Arduino und einem Pythonprogramm Sniffe ich mein Fahrzeug auf der CAN BUS Leitung. Ich empfange also alle möglichen Daten und das in Echtzeit. Soweit kein Problem, unten noch ein Bild vom Sniffen.
Ich sehe also die ID´s der CAN Pakete und deren Inhalt mit dem ich auch soweit was anfangen kann.
Nun habe ich mir für das gleiche Shield mit dem MCP2515, einen kleinen Code geschrieben der mit bestimmte ID´s filtern soll und es mir auf nem 20x4 I2C Display ausgeben soll. Soweit passt auch alles in dem unten stehendem Code Filtere ich zb. Motordrehzahl und Wassertemp, diese werden mir ebenfalls in echtzeit angezeit ohne jegliche große verzögerung.
#include <LiquidCrystal_I2C.h>
#include <mcp_can.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);
MCP_CAN CAN(10);
unsigned char len = 0;
byte buf[8];
unsigned long canID;
unsigned char lenk;
unsigned char water;
unsigned char tmp;
float intemp;
unsigned int rpm;
float klimf;
float klimbf;
unsigned char midklim;
byte gc[8] = {
B11000,
B11000,
B00111,
B01000,
B01000,
B01000,
B00111,
};
void setup(){
lcd.begin(); // Setting pin 2 for /INT input
lcd.createChar(0, gc);
START_INIT:
if (CAN.begin(MCP_STDEXT, CAN_100KBPS, MCP_16MHZ) == CAN_OK) //CAN STANDART with 100KB/S and Chip-Crystal at 16MHZ
{
lcd.setCursor(0, 0);
lcd.print("INIT CAN BUS Shield");
lcd.setCursor(0, 1);
lcd.print(" Test OK! ");
}
else
{
lcd.setCursor(0, 0);
lcd.print("! INIT CAN FAILED !");
lcd.setCursor(0, 2);
lcd.print("! INIT CAN AGAIN !");
delay(800);
goto START_INIT;
}
CAN.init_Mask(0,0,0x07FF0000); // Init first mask...
CAN.init_Filt(0,0,0x00AA0000); // Init first filter...
CAN.init_Filt(1,0,0x01D00000); // Init second filter...
lcd.setCursor(0, 2);
lcd.print("MASK & Filter 1 Set!");
CAN.init_Mask(1,0,0x03FF0000); // Init second mask...
CAN.init_Filt(2,0,0x02E60000); // Init third filter...
CAN.init_Filt(3,0,0x032E0000); // Init fouth filter...
CAN.init_Filt(4,0,0x02EA0000); // Init fifth filter...
CAN.init_Filt(5,0,0x0C800000); // Init sixth filter...
lcd.setCursor(0, 3);
lcd.print("MASK & Filter 2 Set!");
CAN.setMode(MCP_LISTENONLY); // Set operation mode to normal so the MCP2515 sends acks to received data
delay(1000);
lcd.clear();
}
void loop(){
if (CAN.checkReceive() == CAN_MSGAVAIL) {
CAN.readMsgBuf(&canID, &len, buf); // Read data: len = data length, buf = data byte(s)
if (canID == 0x1D0){ //Wassertemperatur
water = buf[0];
}
if (canID == 0x0AA){ //Motordrehzahl
rpm = buf[5];
rpm = rpm << 8;
tmp = buf[4] & 0x3F;
rpm = rpm + tmp;
}
if (canID == 0x2E6){ //Fahrertemperatur
klimf = buf[2];
}
if (canID == 0x2EA){ //Beifahrertemperatur
klimbf = buf[2];
midklim = buf[3]; //Mittelrad Lüftung
}
if (canID == 0x32E){ //Innenraumtemperatur
intemp = buf[3];
intemp = intemp * 256;
intemp = intemp * 0.03125;
intemp = intemp / 100;
}
if (canID == 0xC8){ //Lenkwinkel
lenk = buf[2];
}
}
lcd.setCursor(0, 0);
lcd.print("RPM: ");
lcd.print(rpm/4);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("W: ");
lcd.print(water - 48);
lcd.write(byte(0));
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print("T: ");
lcd.print(intemp, 1);
lcd.write(byte(0));
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("Lenk: ");
lcd.print(lenk);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(klimf, 1);
lcd.write(byte(0));
lcd.print(" ");
lcd.setCursor(9, 3);
lcd.print(midklim);
lcd.print("% ");
lcd.setCursor(14, 3);
lcd.print(klimbf, 1);
lcd.write(byte(0));
lcd.print(" ");
}
Jedoch alles was in der zweiten Mask steht wird nur Sporadisch aktualisiert oder gar nicht angezeigt.
Jetzt meine Hauptfrage:
Setze ich den Filter richtig ein? Könnte man das nochmal für Dummys erklären ich werde aus dem Teil überhaupt nicht schlau:
CAN.init_Mask(0,0,0x01FF0000); // Init first mask...
CAN.init_Filt(0,0,0x00AA0000); // Motordrehzahl soll angezeigt werden
CAN.init_Filt(1,0,0x01D00000); // wasser soll angezeigt werden
lcd.setCursor(0, 2);
lcd.print("MASK & Filter 1 Set!");
CAN.init_Mask(1,0,0x0CFF0000); // Init second mask...
CAN.init_Filt(2,0,0x02E60000); // Init third filter...
CAN.init_Filt(3,0,0x032E0000); // Init fouth filter...
CAN.init_Filt(4,0,0x02EA0000); // Init fifth filter...
CAN.init_Filt(5,0,0x0C800000); // Init sixth filter...
Mein aktuelles Verständniss bezüglich des Filters:
Im Mask sage ich 0x01FF0000 somit lässt der Filter mir die Adressen bis 0x01FF0000 zu,alles was drüber geht wird ignoriert?
Welche funktion hat Mask 0 und 1 ?
Gruß Daniel