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
"Nichtlineare" Zähler
20.07.2016, 04:35
Beitrag #9
RE: "Nichtlineare" Zähler
@Arne: Danke für die schnelle Antwort und die Codeänderung Smile

Die unterschiedlichen Zykluszeiten funktionieren, die Zähler/Array leider nicht Confused
Alle Bytes bleiben "starr" und ändern sich nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 11:57
Beitrag #10
RE: "Nichtlineare" Zähler
Hallo,

da hat noch was nicht gepasst. Undecided
Jetzt werden die Zähler auch in die Arrays übernommen.
Code:
#include <mcp_can.h>
#include <SPI.h>

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);


// ZYKLUS-ZEITEN
unsigned long previousMillis = 0;
unsigned long currentMillis  = 0;
const long interval = 50;                  // 50ms

unsigned long previousMillis1 = 0;
unsigned long currentMillis1  = 0;
const long interval1 = 100;               // 100ms

unsigned long previousMillis2 = 0;
unsigned long currentMillis2  = 0;
const long interval2 = 200;               // 200ms

int counter[16] = {0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35};  // Botschaftenreihe
int i;

// ZÄHLER

int counter16 = 0;    // Counter + 16
int counter_16 = 240; // Counter - 16

unsigned char msg1[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char msg2[5] = {0x00, 0xA2, 0x87, 0x5F, 0x80};
unsigned char msg3[7] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C};


void setup()
{
  Serial.begin(115200);
    while (CAN_OK != CAN.begin(CAN_500KBPS))
    {
      Serial.println("CAN BUS Shield init fail");
      Serial.println(" Init CAN BUS Shield again");
      delay(100);
    }
  Serial.println("CAN BUS Shield init ok!");
}


void loop()
{
  // Zähler 1 (0+16)
  counter16 += 16;
  if (counter16 > 240) {        // wenn counter größer 240, dann ...
    counter16 = 0;
  }        // counter = 0 (Ausgangsposition)

  // Zähler 2 (240-16)
  counter_16 -= 16;
  if (counter_16 < 0) {          // wenn counter kleiner 0, dann ...
    counter_16 = 240;
  }          // counter = 240 (Ausgangsposition)

  msg1[0] = counter16;
  msg1[1] = counter_16;

  // Array für Botschaftenfolge (counter[i])
  for (i = 0; i <= 15; i++) {
    msg2[0] = counter[i];

    // Zykluszeit = 50ms
    currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;

      // Botschaft 1 mit 2 Zählern
      CAN.sendMsgBuf(0x100, 0, 8, msg1);
    }

    // Zykluszeit = 100ms
    currentMillis1 = millis();
    if (currentMillis1 - previousMillis1 >= interval1) {
      previousMillis1 = currentMillis1;

      // Botschaft 2 mit Array
      CAN.sendMsgBuf(0x200, 0, 5, msg2);
    }

    {
      // Zykluszeit = 200ms
      currentMillis2 = millis();
      if (currentMillis2 - previousMillis2 >= interval2) {
        previousMillis2 = currentMillis2;

        // Botschaft 3
        CAN.sendMsgBuf(0x300, 0, 7, msg3);
      }
    }
  }
}

Dir ist aber schon klar, dass das Programm so wie es geschrieben ist nicht alle Telegramme der Reihe nach sendet. Die drei Zeiten (50, 100 und 200ms) laufen auch asynchron zueinander weil es keine gemeinsame Startzeit gibt.

Die Zähler counter16 und counter_16 werden bei jedem Loop-Durchlauf geändert, es erfolgt aber nicht in jedem Loop-Durchlauf eine Ausgabe zum CAN-Bus.

Ich kann an der Stelle aber nicht helfen weil ich nicht weiß wie das Ergebnis aussehen soll.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 18:31
Beitrag #11
RE: "Nichtlineare" Zähler
Hey!

Die Werte in den Array's (die als variablen gesetzt werden) werden immer zufällig sein.

counter16 & counter_16 (wie ardu_arne schon beschrieben):
Werden nach jedem loop geändert aber nicht jeden loop gesendet

counter[i]:
gilt das selbe, es ist zufällig welche zahl diese sein wird, weil der Zähler i eine unbekannte Zahl (im Bereich von 0 bis 15) sein wird, wenn der Array gesendet wird.

Vielleicht ist das, was du willst:
(Veränderter Code von ardu_arne)
Code:
#include <mcp_can.h>
#include <SPI.h>

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);


// ZYKLUS-ZEITEN
unsigned long previousMillis = 0;
unsigned long currentMillis  = 0;
const long interval = 50;                  // 50ms

unsigned long previousMillis1 = 0;
unsigned long currentMillis1  = 0;
const long interval1 = 100;               // 100ms

unsigned long previousMillis2 = 0;
unsigned long currentMillis2  = 0;
const long interval2 = 200;               // 200ms

int counter[16] = {0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35};  // Botschaftenreihe
int i;

// ZÄHLER

int counter16 = 0;    // Counter + 16
int counter_16 = 240; // Counter - 16

unsigned char msg1[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char msg2[5] = {0x00, 0xA2, 0x87, 0x5F, 0x80};
unsigned char msg3[7] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C};


void setup()
{
  Serial.begin(115200);
  while (CAN_OK != CAN.begin(CAN_500KBPS))
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println(" Init CAN BUS Shield again");
    delay(100);
  }
  Serial.println("CAN BUS Shield init ok!");
}


void loop()
{
  // Zykluszeit = 50ms
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    msg1[0] = counter16;
    msg1[1] = counter_16;

    // Botschaft 1 mit 2 Zählern
    CAN.sendMsgBuf(0x100, 0, 8, msg1);

    // Zähler 1 (0+16)
    counter16 += 16;
    if (counter16 > 240) {        // wenn counter größer 240, dann ...
      counter16 = 0;
    }        // counter = 0 (Ausgangsposition)

    // Zähler 2 (240-16)
    counter_16 -= 16;
    if (counter_16 < 0) {          // wenn counter kleiner 0, dann ...
      counter_16 = 240;
    }          // counter = 240 (Ausgangsposition)

  }

  // Zykluszeit = 100ms
  currentMillis1 = millis();
  if (currentMillis1 - previousMillis1 >= interval1) {
    previousMillis1 = currentMillis1;
    msg2[0] = counter[i];

    // Botschaft 2 mit Array
    CAN.sendMsgBuf(0x200, 0, 5, msg2);

    i++;
  }

  {
    // Zykluszeit = 200ms
    currentMillis2 = millis();
    if (currentMillis2 - previousMillis2 >= interval2) {
      previousMillis2 = currentMillis2;

      // Botschaft 3
      CAN.sendMsgBuf(0x300, 0, 7, msg3);
    }
  }
}
Jetzt werden die Zähler (counter16, counter_16, i) erst weitergezählt, wenn sie einmal geschickt/verwendet wurden und "keine Daten werden mehr verloren sein" bzw. es kommen keine zufälligen Zahlen mehr. Smile

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 19:16
Beitrag #12
RE: "Nichtlineare" Zähler
Hey Leute. Danke für Eure Hilfe Smile

@ Scheams : Danke auch dir für deine Hilfe. Ich komme der Sache langsam näher Big Grin. Mit dem von dir geposteten Code funktionieren die Zähler und das Array, wie es sein soll.

Allerdings läuft das Array nur einmal durch und spielt dann verrückt Confused (Siehe Screenshot). Also die Reihe läuft einmal durch, fängt aber nicht wieder beim Ursprungswert an. Fehlt hier vielleicht noch eine Art "Array Loop" ?


   

Gruß
Basti
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 19:20
Beitrag #13
RE: "Nichtlineare" Zähler
Hey!

Code:
// Zykluszeit = 100ms
  currentMillis1 = millis();
  if (currentMillis1 - previousMillis1 >= interval1) {
    previousMillis1 = currentMillis1;
    msg2[0] = counter[i];

    // Botschaft 2 mit Array
    CAN.sendMsgBuf(0x200, 0, 5, msg2);

    i++;
    if (i >= 15) i = 0;
  }
Sorry, fehlt ja natürlich bei einem Overflow zurückzusetzten. Ansonsten hast du ja dann z.B. counter[16] was nicht sein soll Big Grin

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 19:38
Beitrag #14
RE: "Nichtlineare" Zähler
@ Scheams: Hui, das ging ja fix Smile

Scheint jetzt so zu laufen, wie es geplant war Big Grin

Danke nochmal Smile Smile

Gruß
Basti
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zähler Uwe1475 14 1.422 03.09.2016 20:45
Letzter Beitrag: Uwe1475
  Hardware Zähler MasT3r-A 4 522 24.01.2016 21:33
Letzter Beitrag: ardu_arne
  Array mit Zähler steuern ferdi 20 1.596 19.11.2015 15:11
Letzter Beitrag: ardu_arne
  BCD Zähler 0-9999 peterunterhofer 6 1.340 06.03.2015 12:49
Letzter Beitrag: Foto-Ralf
  Zähler in verschiedenen Modi betreiben Nimes 2 662 25.09.2014 10:19
Letzter Beitrag: Nimes
Bug Zähler von 0 - 1023 mit Rotary Encoder....Wie??? Wampo 1 1.494 15.12.2013 13:48
Letzter Beitrag: Wampo

Gehe zu:


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