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
Arduino und NmraDcc
27.02.2020, 22:54 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2020 16:09 von Bitklopfer.)
Beitrag #25
RE: Arduino und NmraDcc
Hallo Christian,
(27.02.2020 18:23)Christian_Moba-Arduino schrieb:  Ich hatte mir vorgestellt, die Software Saleae Logic liest den Kanal permanent ein und gibt das DCC Signal auf dem Monitor wieder, sodass wenn ich einen Weichenbefehl sende, diesen Befehl sehe. Tut es leider nicht, denn die Software macht nur Standbilder vom Protokoll , wenn ich auf die Schaltfläche "Start" drücke.
Hallo Christian,
ein LA ist dafür gemacht, Logik-Signale zu analysieren. Das sind in aller Regel keine sich gleichmässig wiederholenden Signale, die man - wie auf einem Oszi - als 'Lifebild' darstellen könnte. Auf dem DCC-Bus kommen ja ständig irgendwelche Signale, wie soll da etwas 'ansehbares' als Lifebild dargestellt wrden? Das geht nur als Standbild. Du siehst aber auf jeden Fall, dass das DCC-Signal ordentlich am Arduino ankommt.
Was da die Weichenbefehle sind, kann der LA nicht erkennen. Normalerweise stellt man eine 'Triggerbedingung' ein. Also eine Flanke auf einem Kanal und/oder eine bestimmte Signalkombination. Wenn Du dann auf 'Start' klickst, werden alle Kanäle ständig aufgezeichnet. Sobald die 'Triggerbedingung' auftritt läuft die Aufzeichnung noch eine voreinstellbare Zeit, und dann wird das Ergebnis angezeigt. Da siehst Du dann auch einen einstellbaren Bereich der Signale vor der Triggerbedingung.
Standardmäßig reagiert er auf eine beliebige Flanke auf irgendeinem Kanal - damit startet die Aufzeichnung sofort.
Als Triggerbedingung könnte man auch einen Ausgang vom Arduino nehmen, den man schaltet, wenn ein Telegramm erkannt wird.

Was da auf deinem seriellen Monitor ankommt, sieht mir nach Lok-Telegrammen aus ( Multifunktionsdecoder oder speed/Richtungsbefehle ). Die werden ja auf dem Bus ständig gesendet, damit auch eine neu aufgegleiste Lok gegebenenfalls gleich ihr Signal bekommt. D.h. aber auf jeden Fall mal, dass die Decodierung funktioniert.
Weichentelegramme werden nur bei Bedarf gesendet und ein paar mal wiederholt. Die werden also in den ständigen Strom der Lok-Befehle eingestreut. Man müsste sie auf dem seriellen Monitor aber kurz erkennen können.

P.S. ich hatte mal eine Version der Software, die die DCC-Signale auch decodieren konnte. Allerdings nur die Hex-Werte, so wie Du sie jetzt auch auf dem seriellen Monitor siehst. Seit der letzten Neuinstallation meines PC's geht das aber auch nicht mehr. Ich müsste mal schauen, wo ich das her hatte.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2020, 09:32 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2020 16:09 von Bitklopfer.)
Beitrag #26
RE: Arduino und NmraDcc
Hallo Christian,
ich habe jetzt auch den Analyser für DCC-Signale wiedergefunden. Auf dieser Webseite kanst Du ihn herunterladen. Dann wie beschrieben, die richtige Version ( 64 oder 32 Bit ) in das 'Analysers' Verzeichnis der Saleae-Installation kopieren.
Danach kannst Du dann in der LA-Oberfläche rechts unter 'Analysers' den DCC Interpreter dem Kanal zuweisen, an dem das DCC-Signal anliegt. Dann kennzeichnet die Software die entsprechenden Bereiche des Datenstroms ( Preambel, Start/Stopbits, Datenbytes und Prüfbyte ). Was die jeweiligen Datenbytes bedeuten, musst Du allerdings selbst interpretieren - so wie auch die Anzeige auf dem ser. Monitor.

Du kannst auch das Beispiel der NmraDcc Lib etwas modifizieren, indem Du in notifyDccMsg einen Impuls auf einem Pin erzeugst. Den kannst Du dann als Triggerbedingung für den LA nutzen. Wenn Du den Impuls noch davon abhängig machst, dass das erste Byte im Telegramm ( Msg->Data[0] ) NICHT 0xC0 ist, dann siehst Du wenn ein anderes Telegramm auf dem Bus erscheint ( die Abfrage könntest Du auch für die serielle Ausgabe machen, dann unterdrückst Du diese ständig gesendeten Telegamme und siehst besser was sonst noch erscheint ).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2020, 16:12 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2020 16:14 von Christian_Moba-Arduino.)
Beitrag #27
RE: Arduiono und NmraDcc
Hallo Franz-Peter,
Danke für ausführliche Antwort. Ich werde mich am Wochenende an das Problem ransetzen. Malschauen wie weit ich komme.

Du schreibst,
"ich hatte mal eine Version der Software, die die DCC-Signale auch decodieren konnte. Allerdings nur die Hex-Werte, so wie Du sie jetzt auch auf dem seriellen Monitor siehst. Seit der letzten Neuinstallation meines PC's geht das aber auch nicht mehr. Ich müsste mal schauen, wo ich das her hatte. "


Dazu noch eine kleine Frage, im Eingangspost meines Beitrages hast Du geschrieben das es bei Dir funktioniert, aber im letzten Beitrag schreibst Du gegenteilig das es nach einer Neuinstallation deines PC's nun auch nicht mehr funktioniert.
Ist das ein Windows 10 64Bit Problem ?

Ich habe mir die NMRA Bibliothek über IDE > Werkzeuge> Bibliothek verwalten>
NmraDcc installiert. Version 2.0
Hatte diese als einzige runtergeladen.

Kann es sein, das vielleicht beim Installieren der Bibliothek immer noch auf etwas Altem zurückgegriffen wird, und es dadurch nicht funktioniert ?


Das war es erstmal mit meinen Fragen, ich melde mich, wenn ich ein Ergebnis am Wochenende finde. Werde Dich dann nochmal anschreiben, wg.
( Msg->Data[0] ) NICHT 0xC0) das habe ich noch nicht so richtig verstanden, werde es aber verstehen lernen. Muss sehen, ob die Zentrale immer diese Zeile notifyDccMsg: C0 5F 9F sendet.


Vielen Dank
VG
Christian

p.s. Bist Du Franz-Peter Müller , der die NmraDcc mitentwickelt hat ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2020, 17:13 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2020 17:21 von MicroBahner.)
Beitrag #28
RE: Arduino und NmraDcc
(28.02.2020 16:12)Christian_Moba-Arduino schrieb:  Dazu noch eine kleine Frage, im Eingangspost meines Beitrages hast Du geschrieben das es bei Dir funktioniert, aber im letzten Beitrag schreibst Du gegenteilig das es nach einer Neuinstallation deines PC's nun auch nicht mehr funktioniert.
Ich glaube da hast Du etwas missverstanden. Das Beispiel der NmraDcc Lib auf dem Arduino funktioniert bei mir - es hat vor der Neuinstallation funktioniert, und auch jetzt nachdem ich es aufgrund deines Beitrages nochmal mit Arduino 1.8.12 getestet habe, funktioniert es.
Das, was nach der Neuinstallation erstmal nicht funktioniert hat, war die Auswertung des DCC Signals in der LA-Software von Saleae. Da habe ich aber inzwischen herausgefunden, wie man das wieder aktiviert, und den Link hatte ich im vorigen Post mitgeschickt. Dann sieht das Bild im LA so aus:
   
In der ersten Zeile ist das DCC-Signal, in der 2. das TX0-Signal an den seriellen Monitor. Über dem DCC-Signal wird die Bedeutung der jeweiligen Abschnitte angezeigt. Jedes Telegramm beginnt mit einer Preambel, dann kommen die Datenbytes und zu Schluß das Prüfbyte. Man sieht schön, wie nach jedem empfamgenen Telegramm die Ausgabe an den seriellen Monitor startet. Die Bedeutung der Datenbytes muss man dann allerdings selbst auswerten und interpretieren. Dazu braucht es dann schon etwas tiefere Kenntnisse des DCC-Protokolls.

(28.02.2020 16:12)Christian_Moba-Arduino schrieb:  wg. ( Msg->Data[0] ) NICHT 0xC0) das habe ich noch nicht so richtig verstanden,
Du änderst das Beispiel ein klein wenig ab:
Code:
void notifyDccMsg( DCC_MSG * Msg)
{
  if ( Msg->Data[0] != 0xC0) {
    Serial.print("notifyDccMsg: ") ;
    for(uint8_t i = 0; i < Msg->Size; i++)
    {
      Serial.print(Msg->Data[i], HEX);
      Serial.write(' ');
    }
    Serial.println();
  }
}
Dann werden nur Telegramm auf den Monitor ausgegeben, die nicht mit C0 anfangen. Du erkennst dann leichter, wenn etwas anderes ( z.B. ein Weichentelegramm ) gesendet wird.

(28.02.2020 16:12)Christian_Moba-Arduino schrieb:  Bist Du Franz-Peter Müller , der die NmraDcc mitentwickelt hat ?
ja, ich habe da ein klein wenig die Finger mit im Spiel Wink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2020, 21:31 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2020 21:43 von Christian_Moba-Arduino.)
Beitrag #29
RE: Arduino und NmraDcc
Hallo Franz Peter,
nach einigen Versuchen, habe ich scheinbar wieder eine Beispieldatei gefunden die funktioniert.
Mir ist unklar wieso das vorher nicht funktioniert hat, jetzt klappt es.
Habe mir den u.g. Quellcode auf den MEGA2560 hochgeladen mit der Version IDE 1.8.12

Code:
#include <NmraDcc.h>

// This Example shows how to use the library as a DCC Accessory Decoder or a DCC Signalling Decoder
// It responds to both the normal DCC Turnout Control packets and the newer DCC Signal Aspect packets
// You can also print every DCC packet by uncommenting the "#define NOTIFY_DCC_MSG" line below

NmraDcc  Dcc ;
DCC_MSG  Packet ;

struct CVPair
{
  uint16_t  CV;
  uint8_t   Value;
};

CVPair FactoryDefaultCVs [] =
{
  {CV_ACCESSORY_DECODER_ADDRESS_LSB, 1},
  {CV_ACCESSORY_DECODER_ADDRESS_MSB, 0},
};

uint8_t FactoryDefaultCVIndex = 0;

void notifyCVResetFactoryDefault()
{
  // Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset
  // to flag to the loop() function that a reset to Factory Defaults needs to be done
  FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
};

const int DccAckPin = 3 ;

// This function is called by the NmraDcc library when a DCC ACK needs to be sent
// Calling this function should cause an increased 60ma current drain on the power supply for 6ms to ACK a CV Read
void notifyCVAck(void)
{
  Serial.println("notifyCVAck") ;
  
  digitalWrite( DccAckPin, HIGH );
  delay( 6 );  
  digitalWrite( DccAckPin, LOW );
}

// Uncomment to print all DCC Packets
//#define NOTIFY_DCC_MSG
#ifdef  NOTIFY_DCC_MSG
void notifyDccMsg( DCC_MSG * Msg)
{
  Serial.print("notifyDccMsg: ") ;
  for(uint8_t i = 0; i < Msg->Size; i++)
  {
    Serial.print(Msg->Data[i], HEX);
    Serial.write(' ');
  }
  Serial.println();
}
#endif

// This function is called whenever a normal DCC Turnout Packet is received
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State)
{
  Serial.print("notifyDccAccState: ") ;
  Serial.print(Addr,DEC) ;
  Serial.print(',');
  Serial.print(BoardAddr,DEC) ;
  Serial.print(',');
  Serial.print(OutputAddr,DEC) ;
  Serial.print(',');
  Serial.println(State, HEX) ;
}

// This function is called whenever a normal DCC Turnout Packet is received
void notifyDccAccTurnoutBoard( uint16_t BoardAddr, uint8_t OutputPair, uint8_t Direction, uint8_t OutputPower )
{
  Serial.print("notifyDccAccTurnoutBoard: ") ;
  Serial.print(BoardAddr,DEC) ;
  Serial.print(',');
  Serial.print(OutputPair,DEC) ;
  Serial.print(',');
  Serial.print(Direction,DEC) ;
  Serial.print(',');
  Serial.println(OutputPower, HEX) ;
}

// This function is called whenever a normal DCC Turnout Packet is received
void notifyDccAccTurnoutOutput( uint16_t Addr, uint8_t Direction, uint8_t OutputPower )
{
  Serial.print("notifyDccAccTurnoutOutput: ") ;
  Serial.print(Addr,DEC) ;
  Serial.print(',');
  Serial.print(Direction,DEC) ;
  Serial.print(',');
  Serial.println(OutputPower, HEX) ;
}

// This function is called whenever a DCC Signal Aspect Packet is received
void notifyDccSigState( uint16_t Addr, uint8_t OutputIndex, uint8_t State)
{
  Serial.print("notifyDccSigState: ") ;
  Serial.print(Addr,DEC) ;
  Serial.print(',');
  Serial.print(OutputIndex,DEC) ;
  Serial.print(',');
  Serial.println(State, HEX) ;
}

void setup()
{
  Serial.begin(115200);
  
  // Configure the DCC CV Programing ACK pin for an output
  pinMode( DccAckPin, OUTPUT );

  Serial.println("NMRA DCC Example 1");
  
  // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up
  Dcc.pin(0, 2, 1);
  
  // Call the main DCC Init function to enable the DCC Receiver
  Dcc.init( MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0 );

  Serial.println("Init Done");
}

void loop()
{
  // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation
  Dcc.process();
  
  if( FactoryDefaultCVIndex && Dcc.isSetCVReady())
  {
    FactoryDefaultCVIndex--; // Decrement first as initially it is the size of the array
    Dcc.setCV( FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
  }
}

Der ArduionoIDE Serial Monitor zeigt folgendes an, wenn ich Weichenadresse "15" mit meiner RocoMulti Maus (angeschlossen an der DR5000 am XN/FB Buchse).

Code:
21:24:10.552 -> notifyDccAccState: 15,4,5,8
21:24:10.552 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.599 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.599 -> notifyDccAccState: 15,4,5,8
21:24:10.599 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.599 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.599 -> notifyDccAccState: 15,4,5,8
21:24:10.599 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.599 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.599 -> notifyDccAccState: 15,4,5,8
21:24:10.599 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.646 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.646 -> notifyDccAccState: 15,4,5,8
21:24:10.646 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.646 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.646 -> notifyDccAccState: 15,4,5,8
21:24:10.646 -> notifyDccAccTurnoutBoard: 4,2,1,1
21:24:10.646 -> notifyDccAccTurnoutOutput: 15,1,1
21:24:10.646 -> notifyDccAccState: 15,4,5,0
21:24:10.646 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.693 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.693 -> notifyDccAccState: 15,4,5,0
21:24:10.693 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.693 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.693 -> notifyDccAccState: 15,4,5,0
21:24:10.693 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.693 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.693 -> notifyDccAccState: 15,4,5,0
21:24:10.693 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.740 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.740 -> notifyDccAccState: 15,4,5,0
21:24:10.740 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.740 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.740 -> notifyDccAccState: 15,4,5,0
21:24:10.740 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.740 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.740 -> notifyDccAccState: 15,4,5,0
21:24:10.740 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.787 -> notifyDccAccState: 15,4,5,0
21:24:10.787 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0
21:24:10.787 -> notifyDccAccState: 15,4,5,0
21:24:10.787 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0


Wichtig sind ja zum Auswerten diese Zeilen
1:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0 // Weiche 15 Abzweig
21:24:10.646 -> notifyDccAccTurnoutOutput: 15,1,1 // Weiche 15 Geradeaus

Was sind das für Zeilen und deren Bedeutung ?
21:24:10.787 -> notifyDccAccTurnoutBoard: 4,2,1,0
bzw.
21:24:10.646 -> notifyDccAccTurnoutBoard: 4,2,1,1

Die scheinen von der Roco Maus zu stammen, die "4" darin ändert sich auch im Wert, wenn ich eine anderen Weichenadresse schalte.

Werde nun im Step by Step wieder alles in Ruhe programmieren und weiter verstehen lernen. Es ist toll solch eine gute Hilfe bei Euch zu bekommen.

Schönen Abend
wünscht Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.02.2020, 22:52
Beitrag #30
RE: Arduino und NmraDcc
Hallo Christian,
jetzt hast Du dir aber wieder eine alte Version der NmraDcc Lib installiert.
die Ausgaben
Code:
21:24:10.787 -> notifyDccAccState: 15,4,5,0
21:24:10.787 -> notifyDccAccTurnoutBoard: 4,2,1,0
21:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0
sind alles Reaktionen auf dasselbe Telegram, das nur etwas unterschiedlich interpretiert wird.
In der aktuellen Versionn wird da nur noch
notifyDccAccTurnoutBoard oder notifyDccAccTurnoutOutput ausgegeben, je nachdem wie das Bit 6 in CV29 steht:
Bit 6 - 0: 9-bit Decoder-Addressing, 1=11-bit output-addressing
Dieses Bit entscheidet, wie die Adressinformation für die Weiche ausgewertet wird.
Entweder als Decodernummer eines 4-fach Weichendecoders ( und der Weichennummer 0..3 dieses Decoders ), oder als durchgehend numerierte Weichennummer.

(28.02.2020 21:31)Christian_Moba-Arduino schrieb:  Wichtig sind ja zum Auswerten diese Zeilen
1:24:10.787 -> notifyDccAccTurnoutOutput: 15,1,0 // Weiche 15 Abzweig
21:24:10.646 -> notifyDccAccTurnoutOutput: 15,1,1 // Weiche 15 Geradeaus
Das ist nicht ganz richtig. Zwischen Abzeig und Geradeaus eintscheidet nicht der letzte Wert, sondern der in der Mitte:
notifyDccAccTurnoutOutput: 15,1,1 // Weiche 15 Abzweig
notifyDccAccTurnoutOutput: 15,0,1 // Weiche 15 Geradeaus
Der letzte Wert ist für das Ein/Ausschalten der Antriebsspule in der Weiche.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 11:43 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2020 11:44 von Christian_Moba-Arduino.)
Beitrag #31
RE: Arduino und NmraDcc
Hallo Franz-Peter,

ich habe heute zwei Projekte erfolgreich erstellt bekommen.
1x den Zubehördecoder
1x den Lokdecoder

Beim Lokdecoder konnte ich auch die CV 1 (Lokadresse auf "23" statt "24") umstellen. Damit funktioniert auch die CV Programmierung.

Ich verwende jetzt die Portable Arduino Version 1.8.10 und die NMRA Bibliothek
Version 2.0.0

Eine Frage,
Eine Frage, warum funktioniert das Decoder-Projekt mit dem Servo nicht ?
Ich weiß leider nicht, woher ich diese Bibliothek her komme.
Ich würde mich freuen, wenn Du mir dabei weiterhelfen kannst.

Vielen Dank
Christian


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 2.321 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 5.282 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 4.490 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 11.882 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf

Gehe zu:


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