Can Bus Anfänger Fragen

Hallo,

Ich bin sehr neu in Sachen Arduino,

Mein Bauteile

Mega 2560

MCP2515_CAN

1.30 IIC Display mit 4 Anschlüßen

Ich habe folgendes Problem bzw. ich versuche Daten aus dem CANBUS auszulesen und auf einem Display da zu stellen ( P,N,R,S,D vom Automatik Getriebe) , soweit funktioniert das schon aber jedes mal wenn nicht die entsprechende ID und entsprechenden Daten vom CAN Bus gesendet wird verschwindet die Anzeige im Display.
Meine Frage ist kann man die letzte Information vom Can Bus stehen lassen solange bis eine neue Information kommt und erst dann das Display wechselt.

Ich habe mal den Sketch eingefügt, bitte nicht lachen das geht bestimmt besser.

Display_4.ino (8.89 KB)

Hi

Ohne den Sketch angesehen zu haben (für die Umschreibung sind mit großer Sicherheit keine 8K Sketch nötig), wirst Du wohl das Display selber löschen, wenn eben keine Information zur Gangwahl übertragen wurde.

Also alten Status merken und die Anzeige nur Ändern, wenn der neue Gang nicht dem Alten entspricht.
Da ist Es dann auch egal, wie warm das Scheibenwischwasser gerade ist, oder was sonst noch Alles per CAN übermittelt wird.

MfG

bitte nicht lachen das geht bestimmt besser.

Doch!

Hi hi …

Du hast einen Vertauscher im EVA Prinzip.

Eingabe
Verarbeitung
Ausgabe

Die Frage, ob es was auszugeben gibt, gehört in die Verarbeitung.
Nicht in die Ausgabe, denn da ist es schon zu spät, und das alte Bild schon gelöscht.

Vorschlag:
Große Teile raus geschnitten um die Lösung zu verdeutlichen und um dir auch etwas Arbeit zu überlassen.

völlig ungetestet

#define    P_MOSI              B,2 // pin 51
#define    P_MISO              B,3 // pin 50
#define    P_SCK               B,1 // pin 52
#define    MCP2515_CS          B,0 // pin 53
#define    MCP2515_INT         E,4 // pin 3

#include <SPI.h>
#include "mcp_can.h"

#include "U8glib.h"

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

using FunctionPointer = void (*)(void);


long unsigned int rxId;
unsigned char len = 0;
unsigned char buf[8];
const int SPI_CS_PIN = 53;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()


{
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  CAN.init_Mask(0, 0, 1088);                         // there are 2 mask in mcp2515, you need to set both of them
  CAN.init_Mask(0, 0, 1089);
  CAN.init_Filt(0, 0, 1088);                          // there are 6 filter in mcp2515
  CAN.init_Filt(0, 0, 1089);
  {
    Serial.begin(115200);
    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 1000k
    {
      Serial.println("CAN BUS Module Failed to Initialized");
      Serial.println("Retrying....");
      delay(50);
    }
    Serial.println("CAN BUS Module Initialized!");
    Serial.println("Time\t\tID\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7");
  }
}


void draw0()   // DMK
{

  u8g.setFont(u8g_font_osb18);
  u8g.drawStr( 32, 25, "DMK");
  u8g.drawStr( 15, 55, "Motoring");
  u8g.drawFrame(0, 0, 128, 64);
}

void draw1()   //P
{

  u8g.setFont(u8g_font_osb35);
  u8g.drawStr( 50, 50, "P");
  u8g.drawFrame(0, 0, 128, 64);
}

void draw2()   //R
{

  u8g.setFont(u8g_font_osb35);
  u8g.drawStr( 50, 50, "R");
  u8g.drawFrame(0, 0, 128, 64);
}


void draw3()  //N
{

  u8g.setFont(u8g_font_osb35);
  u8g.drawStr( 50, 50, "N");
  u8g.drawFrame(0, 0, 128, 64);
}

void draw4()   //D
{

  u8g.setFont(u8g_font_osb35);
  u8g.drawStr( 50, 50, "D");
  u8g.drawFrame(0, 0, 128, 64);
}

void draw5()   //S
{

  u8g.setFont(u8g_font_osb35);
  u8g.drawStr( 50, 50, "S");
  u8g.drawFrame(0, 0, 128, 64);
}


// hier gekürzt


void loop()
{

  {
    CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

    rxId = CAN.getCanId();
    Serial.print("\t\t");
    Serial.print("");
    Serial.print(rxId, DEC);
    Serial.print("\t");

    for (int i = 0; i < len; i++) // print the data
    {
      if (buf[i] > 15)
      {
        Serial.print("");
        Serial.print(buf[i], DEC);
      }
      else
      {
        Serial.print("");
        Serial.print(buf[i], DEC);
      }
      Serial.print("\t");
    }
    Serial.println();
  }



  {

      FunctionPointer displayFunc {nullptr};
    
      if ((rxId == 1088) && (buf[1] == 128))
       displayFunc = draw1;

      if ((rxId == 1088) && (buf[1] == 119))
        displayFunc = draw2;

      if ((rxId == 1088) && (buf[1] == 96))
        displayFunc = draw3;

      if ((rxId == 1088) && (buf[1] == 80))
        displayFunc = draw4;

      if ((rxId == 1088) && (buf[1] == 192))
        displayFunc = draw5;


      // hier gekürzt

    if(displayFunc)
    {
      u8g.firstPage();
      do
      {
        displayFunc();
      }
      while (u8g.nextPage()) ;
    }
  }
}

schönes Code-Monster hast dir da gebaut.

Drück mal STRG-T in der IDE damit die Einrückungen angepasst werden.

was macht u8g.firstPage(); - genau! löscht das vieleicht?

wann liefert u8g.nextPage() true, wann false?

Vielen Dank Combie für die schnelle Hilfe

Der Sketch funktioniert jetzt, sage ich ja bin sehr neu auf der Arduino Plattform

bin sehr neu auf der Arduino Plattform

Das ist grundlegend.
Diese Konzepte existieren unabhängig von Arduino.
Sind allerdings anwendbar. bzw. sogar nötig.

Ich empfehle dir ein schönes dickes C++ Buch.
z.B. "Der C++ Programmierer"
Das zeigt dir einiges an Möglichkeiten und Grundlagen.