Hallo Alle,
dieses Forum ist schon älter, aber ich habe es gebraucht und x-mal durchgelesen. Sehr interessant und vielen Dank an allen die Input geliefert haben.
Mein Interesse dran war für einen Kollegen der für seinen Sohn eine Märklin Modellbahn aufstellen möchte, ohne direkt viel Geld auszugeben ( lesen : CS3 kaufen ). Weil ich diese Lösung -- Märklin MS2 + Arduino UNO + Watterot CANdiy-Shield + RailUino -- schon kannte, versuche ich es für ihm am laufen zu bekommen. Es ist eine kleine Bahn, also sollte es reichen. ( 3 Loks, 12 Weichen ).
Ich habe eine für mich maßgeschneiderte Software (C#) geschrieben für UDP + CS2 die ich dann an Arduino anpassen werde, wobei der Arduino mit CAN-Shield nur der Durchreicher ist an der MS2.
Loks (MM2) und Weichen (MM2) am laufen zu bringen war kein Problem. Offen ist noch Mfx, aber auch dort sind viele Beiträge mit Information in dieses Forum zu finden.
Das Problem war die Rückmeldung. Um bei minimale Kosten zu bleiben, keine S88 oder sonstige Platinen aber die ReportIOX Rückmeldung.
Fertig ist es noch nicht, aber nach viele schlaflose Nächten ( : ) habe ich es geschafft die Rückmeldung mit dem beigelieferten MCP23S08 am laufen zu bekommen.
Das Problem ist das die Beschreibung nicht echt detailliert ist obwohl sehr viel drin steht, und in nach hinein sich auch als richtig und einfach herausstellt. Nur muss man jeder Zeile studieren und sich nicht von Programmierung abschrecken lassen. Das kostet Zeit und Geduld.
Meine Motivation war, das es so einfach sein musste. Dadurch lass ich mich doch nicht runterkriegen. Es soll funktionieren.
Auf jeden Fall ist die Lösung ausschließlich für das gelieferte Paket von Watterot….
Und genau da lag das Problem. Wie auch in der Beschreibung zu lesen ist, ist diese was RailUino betrifft für 16 Ports ( MCP23S17 ) geschrieben, aber geliefert wird ein MCP23S08.
Beschrieben sind die Anschlüsse einer MCP23S08, und hier kommt einen nicht-Spezialist auch schwer zu recht, wie im Forum öfters zu lesen ist.
Damit fang ich an : !! nur für Arduino UNO ( ob es hier auch verschiedene Versionen gibt weiss ich nicht ) und MCP23S08
Zeichnung Seite 62 ( c't Hacks 1/2013 ) SCLK -- Arduino 13 ( eine Port ohne Buchstabe ist Digital, sonst steht A(nalog) davor )
MOSI -- Arduino 11
MISO -- Arduino 12
RST -- Arduino 5V gefunden bei andere Apps mit MCP23S08 -- Ohne Gewähr
D6 -- Arduino 6 OK laut Skript
D3 -- Arduino 3 OK, weil fest gebunden an Interrupt 1
Dann folgt, wiederum ausschließlich wenn der Chip MCP23S08 aus dem Paket benutzt wird eine Anpassung an RailUino.cpp. Der Grund ist das hier der Chip MCP23S17 benutzt wird mit 16 Ports
Und so wird bei der MCP23S08 mit nur 8 Ports Register abgefragt die es nicht gibt. Das Ergebnis ist dann eher Zufall, inklusive eine Blockierung der Arduino nur aufzuheben durch das Programm wieder zu laden.
( zeigt sich an ein Leuchten von der LED <L> = loader )
======================================================================================
void handleInterrupt0() {
noInterrupts();
for (int i = 0; i < ioxCount; i++) {
ioxSwitches[2 * i] = readRegister(i, 9);
//ioxSwitches[2 * i + 1] = readRegister(16 + i, 9); <<<<< Angepasst
ioxSwitches2[2 * i] |= ioxSwitches[2 * i];
//ioxSwitches2[2 * i + 1] |= ioxSwitches[2 * i + 1]; <<<<<< Angepasst
}
interrupts();
}
=======================================================================================
Und so hat es bei mir dann funktioniert.
Auf folgendes noch achten, wenn das Programm Monitor benutzt wird : einkürzen auf 8 Ports ( die übrigen haben keinen Sinn )
Und das Interrupt reagiert nur auf eine Änderung!! Das heißt wenn ein Post schon zu ist wenn angefangen wird, dann wird diese nicht angezeigt.
So, das war es von mir. Das Ganze hat eine Woche gedauert. Ich hoffe hiermit einige das gleiche Los zu ersparen. Es macht aber viel Spaß wenn es läuft.
Viele Grüße,
Walter
PS : Deutsch ist nicht meine Muttersprache. Bitte verzeihe mir meine Grammatikfehler.