INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zykluszeit für CAN-Botschaften
17.05.2016, 16:45
Beitrag #1
Zykluszeit für CAN-Botschaften
Hallo zusammen,
ich habe folgendes "Problem":

Verwendete Hardware: Arduino UNO R3 + Aptotec CAN-Shield

Ich würde gerne einzelnen CAN Botschaften andere Zykluszeiten zuweisen. D.h. beispielsweise erste Botschaft alle 10ms, zweite Botschaft alle 20ms, dritte Botschaft alle 30ms, ...

Code:
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin


void setup()
{
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}

unsigned char msg1[8] = {0, 1, 2, 3, 4, 5, 6, 7};     // Botschaft 1
unsigned char msg2[8] = {7, 6, 5, 4, 3, 2, 1, 0};     // Botschaft 2
unsigned char msg3[8] = {5, 6, 7, 8, 9, 10, 11, 12};  // Botschaft 3

void loop()
{

    CAN.sendMsgBuf(0x100, 0, 8, msg1);  // Botschaft 1 - ID100, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg1
  
    CAN.sendMsgBuf(0x200, 0, 8, msg2);  // Botschaft 2 - ID200, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg2
    
    CAN.sendMsgBuf(0x300, 0, 8, msg3);  // Botschaft 3 - ID300, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg3
  
    delay(100);

    // Alle Botschaften werden alle 100ms gesendet
    
}

So werden alle Botschaften alle 100ms gesendet.

[Bild: kog65ons.jpg]

--------------------------------------------------------------------------------------

Code:
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin


void setup()
{
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}

unsigned char msg1[8] = {0, 1, 2, 3, 4, 5, 6, 7};     // Botschaft 1
unsigned char msg2[8] = {7, 6, 5, 4, 3, 2, 1, 0};     // Botschaft 2
unsigned char msg3[8] = {5, 6, 7, 8, 9, 10, 11, 12};  // Botschaft 3

void loop()
{



    CAN.sendMsgBuf(0x100, 0, 8, msg1);  // Botschaft 1 - ID100, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg1
    delay(10);
    
    CAN.sendMsgBuf(0x200, 0, 8, msg2);  // Botschaft 2 - ID200, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg2
    delay(20);
    
    CAN.sendMsgBuf(0x300, 0, 8, msg3);  // Botschaft 3 - ID300, Standardframe (11bit ID), DLC 8 Byte, Botschaft msg3
    delay(30);



    // delays werden addiert. Alle Botschaften werden alle 60ms gesendet
    
}

So werden alle Delays addiert und alle Botschaften werden alle 60ms gesendet.

[Bild: utxbivk4.jpg]


Gibt es die Möglichkeit die Zykluszeiten individuell anzupassen ? Für Tips und Ratschläge wäre ich sehr dankbar.



Und noch eine allgemeine Frage:
Ist es möglich mit einem Arduino zwei CAN Shields gleichzeitig zu betreiben ? Die Idee dahinter wäre es zwei Busse gleichzeitig zu "bedienen". (Bsp. 1x500kb/s und 1x 100kb/s)


Danke

Gruß
Basti
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.05.2016, 21:15 (Dieser Beitrag wurde zuletzt bearbeitet: 17.05.2016 21:24 von Bitklopfer.)
Beitrag #2
RE: Zykluszeit für CAN-Botschaften
Hallo,
also du hast hier das typische Problem wie bei Blinken ohne Delay....Big Grin
...also wenn du die jeweiligen Botschaften mit unterschiedlichen Zykluszeiten senden willst dann mußt du für jede Botschaft einen Zeitzähler einbauen.
Schau dir mal in der der IDE unter Beispiele "Blinken ohne delay" an....damit kannst du das lösen.
Das Ergebnis kannst ja auf dem PCANview kontrollieren...ein einfaches aber wirksames Tool um auf den CAN zu schauen...ich kenne das auch.

Zwei CAN Shields, von der Hardware (MCP2xxx Chip von Microchip wohl) her müßtest du lediglich an einem Shield den CS Pin auf einen anderen Port umverdrahten. Aber ob die CAN Lib sich so einfach auf einen anderen CS Pin umdefinieren läßt während das Programm läuft steht in den Sternen weil du nicht weißt ob Daten im RAM zwischengespeichert werden - käme auf einen Versuch an.
Abhilfe wäre mit 2 Arduino Mega je mit 1 CAN Shield und die Kommunikation zischen den beiden über eine der Seriellen 2 bis 4 zu realisieren....kommt drauf an wieviel Daten zu transferieren sind.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.05.2016, 19:19
Beitrag #3
RE: Zykluszeit für CAN-Botschaften
Hallo,
vielen Dank für den Tip. Nach ein bisschen rumprobieren habe ich es als blutiger Anfänger tatsächlich hinbekommen Big Grin ... Ich schnall zwar die Befehle noch nicht zu 100% aber es funktioniert Wink




Tadaaa

[Bild: 2xk8unoa.jpg]


Gruß
Basti
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.05.2016, 20:57
Beitrag #4
RE: Zykluszeit für CAN-Botschaften
(18.05.2016 19:19)Turbo-S schrieb:  Hallo,
vielen Dank für den Tip. Nach ein bisschen rumprobieren habe ich es als blutiger Anfänger tatsächlich hinbekommen Big Grin ... Ich schnall zwar die Befehle noch nicht zu 100% aber es funktioniert Wink
....

Na siehste, geht doch... aber an den 31 mS Zykluszeit solltest noch feilen das es 30 sind...Tongue
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zykluszeit für einen Loop oder einzelsätze Wampo 6 2.216 19.03.2015 14:10
Letzter Beitrag: Wampo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste