Skip to content

Entwickler

Marcel edited this page Jul 13, 2013 · 13 revisions

Table of Contents

Debugging

Die Arduino Plattform verfügt, von Hause aus, über keine Debugging Schnittstelle und die Serielle Schnittstelle ist durch die SRCP Kommunikation besetzt.

Um den Code trotzdem testen zu können verwende ich einen Arduino Mega und verbinde dessen Serial3 Schnittstelle mit einem Mini USB Adapter (RX/TX übers Kreuz verbinden). Alternativ kann auch ein Arduino mit ATmega328P (z.B. UNO) verwendet werden. Dazu wird die Library SoftwareSerial auf Pin 2 + 3 verwendet. Bei der Konfiguration ist darauf zu achten, dass die Pin's nicht anderweitig für Geräte oder von Shield's verwendet werden. Details zum Arduino und dem Mini USB Adapter siehe http://arduino.cc/en/Main/Products

Logger

Die Zentrale Klasse/Library zum Ein-/Ausschalten von Debugging Meldungen ist Logger im Verzeichnis log.

Anhand von verschiedenen Level's kann eingestellt werden, welche Meldungen angezeigt werden sollen. Die Level sind additiv, d.h. ist der höchste Level TRACE_LEVEL aktiviert, sind automatisch alle anderen Levels auch aktiviert.

Konfiguration des Levels anhand des Symbols LOGGER_LEVEL:

/////////////////////////////////////////////////////////////////////////////////
// Meldungen
#define	OFF_LEVEL		0		// keine Meldungen
#define	ERROR_LEVEL		1 		// Fehler in der Programmausfuehrung
#define	WARN_LEVEL		2		// Warnungen
#define	INFO_LEVEL		3		// Informationen, Start, Initialisierung i.o. etc.
#define	DEBUG_LEVEL		4		// Allgemeine Debug Infos
#define	TRACE_LEVEL		5		// Fein Detalierte Meldungen, nur in Ausnahmefaellen zu aktivieren

#define	LOGGER_LEVEL	INFO_LEVEL              // Ausgabe von ERROR, WARN und INFO Meldungen

Per Default sind beim Arduino Mega Info Meldungen aktiviert und beim allen anderen die Meldungen ausgeschaltet.

ACHTUNG: Der Meldungslevel beim I2C Master sollte immer gleich oder höher als bei den I2C Slave's sein, ansonsten kann der I2C Bus blockieren. Und zu lange Meldungen bei I2C Slave's können ebenfalls den I2C Bus blockieren.

Einbindung in eigene Sourcen

Die Logger Klasse wird wie folgt verwendet, aufgezeigt anhand eines verkürzten microSRCPServer Sketches:

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Logger.h>			// in dieser Datei kann das Logging an/abgeschaltet werden
...
/**
 * Initialisierung - Protokoll, Geraete etc.
 */
void setup()
{
	BEGIN( 9600 );                                         // Initialisierung Debugging Schnittstelle
	INFO( "Logger ready" );                                // Einfache Info Meldung
        ......

#if ( LOGGER_LEVEL >= INFO_LEVEL )                            // Komplexere Meldung mit zusätzlichen Ausgaben
	int values[6];
	DeviceManager.getDescription( 0, 0, srcp::LAN, values );	// liefert die Anzahl Geraete pro Typ.
	INFO( "Devices");
	Logger.print( "\tFB ");
	Logger.print( values[0] );
	Logger.print( "-" );
        ....
#endif
        ....
	INFO ( "Server listen " );
}

/**
 * Endlosloop
 */
void loop()
{
	// Host Meldungen verarbeiten
	server.dispatch( SENSOR_POLLING );

	// Refresh der Sensoren bzw. Abfragen ob Aenderungen stattgefunden haben
	DeviceManager.refresh();

        TRACE( "im Loop" );                  // Trace Meldung wird nur bei höchster Stufe angezeigt. 
}

Die dazugehörende Ausgabe (inkl. Subklassen) sieht wie folgt aus:

0I: void setup():125 "Logger ready"
1I: static void i2c::I2CDeviceManager::begin(int):45 "search I2C bus"
44T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "1:4:0:0:0:0:6:0
344T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "1, 1:0:255
375T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "2:4:0:0:0:0:6:0
677T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "2, 1:1:200
708T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "2:5:0:0:0:0:7
1009T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "2, :12:33:0:40:0:33:0:36:0:34:0:34:0
1071D: static void i2c::I2CDeviceManager::begin(int):62 "I2C addr: "2, FB 33-40, GA 33-36, GL 34-34
...
3516I: void setup():178 "Devices"        FB 1-41, GA 1-36, GL 1-34
3578I: void srcp::SRCPServerSerial::begin(long unsigned int):41 "open port ":115200
3666I: void setup():203 "Server listen "
3708T: void loop():217 "im Loop"
3743T: void loop():217 "im Loop"
....

Die Meldungen sind, wie folgt, aufgebaut:

(Millisekunden seit Start und Level E,W,I,D,T) (Klasse/Methode inkl. Zeilennummer) ("Meldung") (Optionale Parameter)

Für ein Beispiel, einer Klasse/Library und der Verwendung von Logger siehe z.B. I2CDeviceManager.

Für weitere Möglichkeiten der Ausgabe siehe die #define Anweisungen in Logger.h

Änderung der Schnittstelle/Pin's

Je nach dem welchen Shield man Testen will kann es vorkommen, dass die Schnittstelle/Pin's für das Debugging bereits belegt sind. Oder man verwendet, statt der Seriellen Schnittstelle für die Kommunikation mit dem Host (RocRail), den Ethernet Shield, wodurch die Pins 0 + 1 frei werden. Dann können die Meldungen auf eine andere Schnittstelle/Pin's umgeleitet werden:

Arduino Mega - #define ändern in Logger.h

#define Logger	Serial2           // Ausgabe neu auf Schnittstelle 2

Arduino mit ATmega328P (z.B. UNO) - Pin's ändern in Logger.cpp

SoftwareSerial	Logger( 0, 1 );   // Ethernet Shield vorhanden. Ausgabe auf Schnittstelle 1 statt Pin 2 + 3

Layout der Sourcen

Sketches sind die eigentlichen Hauptprogramme bzw. Steuerungen für die Arduino Boards. Libraries stellen Grundfunktionen zur Verfügung.

Die Sketches sind in einem eigenen Verzeichnis, welches gleich bezeichnet ist wie der Sketch, gespeichert. Libraries im Verzeichnis libraries.

Es existieren folgende Libraries:

  • dcc + dccgen - Eigene Implementierung des DCC Protokoll
  • dev - die Eigentlichen Geräte wie Signale, Servo's etc.
  • i2c - Hilfsklassen für die I2C Ansteuerung
  • lan - Hilfsklassen für die TCP/IP Ansteuerung
  • odcc - DCC Implementierung auf Basis des OpenDCC Projektes
  • srcp - SRCP Grundklassen
  • log - Debugging Meldungen
Die Funktionsweise und jeweilige Aufgabe der Sketche steht im SourceCode.

Alternative Entwicklungsumgebung

Personen welche mit professionellen Entwicklungsumgebungen arbeiten vermissen in der Arduino Entwickungsumgebung einige Funktionen, wie Code Komplettierung etc.

Für diese empfiehlt es mit Eclipse (www.eclipse.org) zu arbeiten. Die Installation ist ausführlich auf der Arduino Webseite http://playground.arduino.cc/Code/Eclipse beschrieben.

Diese Arbeitsweise bedingt jedoch C++ Kenntnisse!

Ich selber verwende Eclipse, deshalb gibt es neben dem Arduino Code im microSRCP/arduino Verzeichnis noch folgende Eclipse Projekte:

  • arduinoCore - Kopie der wichtigen Klassen aus der Arduino Entwickungsumgebung. Werden zur Library libarduinoCore.a compiliert
  • microSRCPCore - Grundklassen des microSRCP Projektes, gelinkt aus microSRCP/arduino/libraries. Werden zur Library libmicroSRCPCore.a compiliert
  • microSRCPxxx - Ausgesuchte Sketches als C++ Klasse zur Besseren Bearbeitung.
Jedes Projekt lässt sich für Arduino328P und Arduino2560 compilieren. Der erzeugte Code ist jedoch weit schlechter optimiert als in der Arduino Entwicklungsumgebung. Deshalb lohnt es sich den Code jeweils auch in der Arduino Entwicklungsumgebung zu compilieren.

Deshalb hat sich folgendes Vorgehen bewährt. Editieren, compilieren und Syntaxprüfung der Klassen und Sketches in Eclipse. Definitive Compilierung und Upload in der Arduino Entwicklungsumgebung.

Clone this wiki locally