User Tools

Site Tools


arduino:rcan-de

RCAN: GC2a


gc2a-module.jpgcan-extframe.jpeg

Einführung

Die aktuelle CAN-GC*_Hardware-Serie basiert auf MC-PICs.
RCAN ist Firmware für CAN-basierte Lösungen auf der Arduino-Plattform.
Das Firmware-Ziel ist der Arduino Nano ATmega328P(B).


Abhängigkeiten

rcan.jpg Die einzige verwendete Nicht-Standard-Arduino-Bibliothek ist

die die Kommunikation mit dem MCP2515-IC ermöglicht.

Modifikationen

Zwei Modifikationen im Bibliotheks-Quellcode sind DEBUG zu deaktivieren und erhöhen des Timeout-Wertes in der mcp_can_dfs.h: (Zeilen 40 und 45)

// if print debug information
//#define DEBUG_MODE 1
 
/*
 *   Begin mt
 */
#define TIMEOUTVALUE    100

Der Original-Wert TIMEOUTVALUE von 50 ist zu gering und bringt Fehler beim Senden von Rahmen in einem CAN-Bus. (Abhängig davon, wieviel Verkehr auf dem CAN-Bus ist.)
Es ist sehr wichtig DEBUG_MODE zu deaktivieren, da anderenfalls nicht genügend Speicher verfügbar ist.
Die Arduino-IDE würde sich darüber beschweren und RCAN würde kontinuierlich neustarten.


GPIO-Baugruppe

Der Unterschied zwischen den Standard-PIC-basierten und Arduino-Baugruppen ist das FLAT-Adressierungsschema und dass nur lange Ereignisse unterstützt werden. (Lange/Kurze Ereignisse werden in Rocrail automatisch erkannt.)
pin_arduino_nano.jpg Das GPIO ist mit dem CAN-GC2 kompatibel. (Mit Ausnahme des Adressierungsschemas.)

Nanos mit dem ATmega328P können Port A6 und A7 nicht als digitale I/O verwenden und sind nur als analoge Eingänge verfügbar (analoagRead).


Nur-Eingangs-Stifte des ATmega328P

Nano Stift GC2a ArduCAN-IO
A6 10 2
A7 9 1

Variable

Variablen-Nr. Beschreibung
0 SYNCID
1 Knoten-Konfigurations-Byte
2…17 Port-Konfigurations-Bytes
18…19 Port-Status-Bytes (Nur lesend)
20 CANID

Knoten-Konfigurations-Byte

Bit Wert Funktion Bemerkung
0 1 Status speichern Speichert Ausgangs-Status bei Ausschalten der Stromversorgung im EEPROM.
1 1 Kurze Ereignisse Nicht verwendet.
2,3 0,0 250ms Puls-Zeit
2,3 1,0 500ms Puls-Zeit
2,3 0,1 1000ms Puls-Zeit
2,3 1,1 2000ms Puls-Zeit
4 1 Bei Betriebsbeginn (SoD) alle melden Meldet auch Low-Eingangswerte anstelle nur High.

Port-Konfigurations-Byte

Bit Wert Funktion Bemerkung
0 1 Eingang Initialisiert den Port als Eingang mit internem Pullup-Widerstand.
Die GC2a-Baugruppe bietet 10kΩ-Widerstands-Netzwerke, weil der interne Pullup-Wert zu hoch ist.
0 0 Ausgang Initialisiert den Port als Ausgang.
1 1 Eingang-Aus-Verzögerung Eingang mit 2 Sekunden Aus-Verzögerung für Belegt-Melder.
1 1 Ausgangs-Puls Puls-Länge entsprechend der globalen Knoten-Konfiguration.
2 1 Invertieren Invertiert den digitalen Port-Wert.
3 1 IR-Port Nicht verwendet.
4 1 Sync Synchronisiert den Ausgang auch mit der SYNCID


CBus

CBUS→RCAN Rocrail Bereich Bemerkung
Ereignis-Knoten-Nummer → CANID Bus 0…127 (standard 127) CBUS verwendet die 4 MSBits für Priorität. (Die Standard-CAN-Rahmen-ID ist 11 Bit.)
Ereignis-Adresse → Port Addresse 1…16 (fest) Dies ist die Port-Nummer.

Modul-Knoten-Nummer und Modul-CANID sind identisch und nur ein Wert in der Firmware.
Der CBUS-Lern-Modus wird nicht unterstützt und nicht benötigt.

Das gleiche FLAT-Adressierungsschema kann mit PIC-basierten Baugruppen verwendet werden, wenn die Ereignis-Knoten-Nummer auf die Modul-Knoten-Nummer und die Ereignis-Adresse auf die korrespondierende Port-Nummer eingestellt wird. Die Kurz-Ereignis-Option muss dann deaktiviert sein.
Falls geplant ist, die RCAN-basierten Module in einem existierenden CBUS-Netzwerk zu verwenden, wird empfohlen, die existierenden Module in das FLAT-Adressierungsschema zu konvertieren, um es transparent zu machen.


MBus

In Arbeit

Unterstützung für Märklin-CAN-Protokoll.

  • Eingänge werden als S88-Ereignisse gemeldet. (0x11)
  • Ausgänge reagieren auf 0x0B mit MM 0x3nnn. DLC 8 wird als Bus/Adresse verwendet.
  • Lese/Schreib-Konfiguration mit 0x07 und 0x08.
  • Ping wird auch als Abfrage im CBus-Knoten-Dialog unterstützt.


ZBus

In Arbeit

Unterstützung für Zimo-CAN-Protokoll. (Z21)

Rahmen

Ext. CAN-Rahmen
ID F DLC 8 Data
F GRP CMD MODE SID CF DLC RID DATA ZCAN-Verwendung
1 4 6 2 16 4 4 16 48 Anzahl der Bits
  • F = ZCAN Flag (Kennzeichen)
  • GRP = Group (Gruppe)
  • CMD = Command (Befehl)
  • MODE = request, command, event or ack (Abfrage, Befehl, Ereignis oder Bestätigung)
  • SID = Sender ID (Sender-Kennung; Muss eindeutig sein, um Kollisionen lösen zu können)
  • CF = CAN Flags (Kennzeichen)
  • DLC = Data-Length-Code (Anzahl der Daten-Bytes)
  • RID = Recipient ID (Empfänger-Kennung)
  • DATA = Optionale Daten



Serieller Monitor

500000 BPS

Befehl Beschreibung
dump Zeigt die ersten 64 EEPROM-Bytes
sod Betriebsbeginn (Start of Day)
init Neuinitialisierung aller I/O
stat Zeigt den I/O-Status
pub Veröffentlicht die Baugruppen-Identifikation und den Typ
loop Setzt Loopback-Modus (Schleife/Echo).
norm Setzt den Normals-Modus. (standard)
cbus Schaltet ins CBUS-Protokoll. (125k) (standard)
mbus Schaltet ins Märklin-CS2-Protokoll. (250k)
zbus Schaltet ins Zimo-CAN-Protokoll. (125k)
8m Setzt MCP2515-Taktrate auf 8MHz. (standard)
16m Setzt MCP2515-Taktrate auf 16MHz.
l0 Setzt das Stift-Schema passend zum CANGC2a. (standard) → Reset-Taste drücken, um Änderungen zu aktivieren.
l1 Setzt das Stift-Schema passend zum ArduCAN-I/O. → Reset-Taste drücken, um Änderungen zu aktivieren.
=<id> Setzt die CANID. <id> durch eine Zahl zwischen 1 und 127 ersetzen.
#<port><config> Konfiguriert einen Port. <port> durch ein Zeichen zwischen 0…9 und a…f ersetzen.
<config> kann sein: 0 für Ausgang, 1 für Eingang, 2 für Eingang mit Aus-Verzögerung, 3 für Puls-Ausgang.
Beispiel: "#a1" konfiguriert Port 10 als Eingang.
:SxxxxNxx…xx; ASCII-Rahmen, der auf dem CAN-Bus gesendet und von der Baugruppe ausgewertet wird. ("Gridconnect"-Schema wie von MERG CBUS verwendet.)
Siehe Kapitel 10 des MERG "Developer’s Guide for CBUS".

Im Seriellen Monitor ist auch der gesamte CAN-Verkehr und unterstützte OPCs zu verfolgen.

Loopback Mode

(Schleife/Echo)

Der Original-Text findet sich im Microchip MCP2515-Handbuch in Abschnitt 10.4.
Loopback mode will allow internal transmission of messages from the transmit buffers to the receive buffers without actually transmitting messages on the CAN bus.
This mode can be used in system development and testing.
In this mode, the ACK bit is ignored and the device will allow incoming messages from itself, just as if they were coming from another node.
The Loopback mode is a silent mode, meaning no messages will be trans- mitted while in this state (including error flags or Acknowledge signals). The TXCAN pin will be in a recessive state.
Übersetzung:
Der Loopback-Modus ermöglicht die interne Übertragung von Nachrichten von den Sendepuffern zu den Empfangspuffern, ohne dass tatsächlich Nachrichten auf dem CAN-Bus übertragen werden.
Dieser Modus kann bei der Systementwicklung und beim Testen verwendet werden.
In diesem Modus wird das ACK-Bit ignoriert und das Gerät lässt eingehende Nachrichten von sich selbst zu, so als ob sie von einem anderen Knoten kommen würden.
Der Loopback-Modus ist ein stiller Modus, d.h. in diesem Zustand werden keine Nachrichten übertragen (einschließlich Fehler-Kennzeichen oder Bestätigungssignale). Der TXCAN-Stift befindet sich in einem inaktiven Zustand.

Beispiel einer Monitor-Ausgabe-

GPIO board
MBus 0x3017
__AVR_ATmega328P__
pinlayout=0
port 00(02) set INPUT_PULLUP
port 01(03) set INPUT_PULLUP
port 02(04) set INPUT_PULLUP
port 03(05) set INPUT_PULLUP
port 04(06) set OUTPUT
port 05(07) set OUTPUT
port 06(08) set OUTPUT
port 07(09) set OUTPUT
port 08(15) set INPUT_PULLUP
port 09(14) set INPUT_PULLUP
port 10(13) set INPUT_PULLUP
port 11(12) set INPUT_PULLUP
port 12(11) set INPUT_PULLUP
port 13(10) set INPUT_PULLUP
port 14(0F) set INPUT_PULLUP
port 15(0E) set INPUT_PULLUP
CAN bps=250, MCP2515 8MHz
:X00310327N000030170300460C;
change of port 12 0->1 conf=1 timer=0
:X00230327N0017000C00010000


Einstellung


Der CBUS-IO meldet sich selbst als GC2a, Modul-Typ 12.
Die Firmware-Version wird nur mit der SocketCAN- und GC2a-Schnittstelle sichtbar.


CBUS-Protokoll

Das CBUS-Protokoll schreibt die Anzahl der Datenbytes für alle OPC-Bereiche vor.
Dies ist für CAN nicht sinnvoll, da das DLC-Feld für die Anzahl der Datenbytes verantwortlich ist, die in einer Nachricht verwendet werden.
Das CBUS-Protokoll scheint das LocoNet-Schema widerzuspiegeln …
Die OPC_PNN, eine Antwort auf eine Anfrage Module OPC_QNN, wird die DLC nicht auf 6, sondern auf 8 setzen. Die letzten zwei Bytes enthalten die Firmware-Version.
Offiziell liegt der OPC_PNN im Bereich von 6 Datenbytes.

Inkompatibilitäten

  • SLiM wird nicht unterstützt
  • FLiM wird nicht unterstützt
  • Lern-Modus wird nicht unterstützt
  • Das ‘Device Addressed’-Modell; Dies ist fest: NN → CANID, DN → Port 1…16
  • Die Drucktaste fordert keine Knoten-Nummer durch OPC_RQNN an, wird aber selbst durch durch OPC_PNN veröffentlicht.

Nachteile

Mit der FLAT-Adressierung ist es nicht möglich, Ausgänge mit einem Befehl, NN+DN, auf mehreren Baugruppen (Knoten) zu aktivieren.
Diese Option ist nicht oder nur schwer verwendbar und macht die Einstellung von Baugruppen unnötig sehr komplex.
Tipp: Mit der SYNCID können die Ausgänge mit anderen IDs synchronisiert werden.


Drucktaste

Die Drucktatse auf dem Arduino behält ihre ursprüngliche Funktion bei: Neustart. Nach jedem Neustart wird ein OPC_PNN gesendet, um das CBusNode-Dialogfeld in Rocview mit dem ausgewählten Knoten aufzurufen.
Diese Funktion kann verwendet werden, um einen Knoten zu identifizieren.


GC2a als USB-Schnittstelle

Der GC2a kann parallel als CBus-/MBus-Schnittstelle verwendet werden.
Sie verwendet den ASCII-Rahmen wie die CANGC1(e)-Schnittstelle. (Siehe Kapitel 10 des MERG "Developer’s Guide for CBUS".)

Erforderliche Schnittstellen-Einstellungen:

  • USB
  • 500000 BPS (Im Fall von Sub-Bibliothek = "USB" ist dies automatisch eingestellt.)
  • Kein Hardware-Handshake (RTS/CTS)
  • Linefeed

Mit dieser Option kann der GC2a auch alleinstehend betrieben werden (Standalone); das ist die minimale CBUS-Konfiguration.

Hinweis: Weil das ACK-Slot-Bit nicht durch andere CAN-Module gesetzt werden kann, wird ein Sende-Fehler gemeldet, der aber im Standalone-Modus ignoriert werden kann.


SyncID

Die SyncID-Option wurde hinzugefügt, um Eingangs-Ereignisse von Baugruppe X mit Ausgangs-Status von Baugruppe Y zu synchronisieren.
Die Port-Zuordnung ist 1:1.
Es kann auch verwendet werden, um mehrere Ausgänge mit einem Rocrail-Befehl zu schalten.

Beispiel

Auf Baugruppe mit ID 33 wird ein Eingangs-Port auf EIN geschaltet.
Eine andere Baugruppe (z.B. ID 22) deren SyncID auf 33 eingestellt ist, prüft dann, ob der korrespondierende Port ein Ausgang ist und synchronisiert diesen mit dem Eingangs-Port von Baugruppe 33.
Diese Situation wird oft für Schalt-Tafeln verwendet.


Quell-Code

Dokumentation

Schaltung und Platine

arduino/rcan-de.txt · Last modified: 2018/11/19 15:29 by rainerk