Probleme bei Modellbahnsteuerung mit Microcontroller
Hallo Forum,
Ich habe Anfang November begonnen eine Modellbahnanlage zu bauen. Die Gleise sind bereits verlegt. Ich habe mir vorgenommen die Sensoren (Reedkontakte), Signale und Weichen über zwei Microcontroller zu steuern. Diese arbeiten über den I2C Bus zusammen. Der Master ist ein Atmega 32 und der Slave ein Atmega 16. Ich habe allerdings dabei mehrere Probleme und ich hoffe ihr könnt mir dabei helfen.
1. Ich hab das Problem, dass wenn ich Weichen schalte, diese manchmal eine Störung auf das komplette System geben. Die Weichenantriebe laufen mit 16VAC und werden mittels eines Relais und einem ULN2004 vom Microcontroller aus gesteuert. Das heißt, es gibt eine galvanische Trennung zwischen µC und dem Antrieb und zum anderen laufen diese beiden über verschiedene Trafos, d.h. auch hier ist eine galvanische Trennung vorhanden. Die Frage ist nur, ob man was machen kann, damit nicht das ganze System zusammenbricht/gestört wird?
(Ich würde auch gern eine Zeichnung davon mit hochladen, ich hab nur kein geeignetes Zeichenprogramm. Könnt ihr mir ein kostenloses empfehlen?)
2. Ich verwende den I2C code vom RP6. Der funktioniert einwandfrei. Ich kann vom Master Befehle senden und diese werden vom Slave auch erfolgreich angenommen und verarbeitet. Meine Frage ist nur, ich habe die Reedkontakte am Slave angeschlossen. Jetzt möchte ich aber deren Zustände am Master auslesen. Leider funktioniert das nicht.
Auszug aus dem Slave, je nachdem ob der Sensor 1 oder 0 hat wird ja das entsprechende Bit in diesem Sensoren1.byte auf 1 oder 0 gesetzt.
Code:
union {
uint8_t byte;
struct {
uint8_t S1S4:1;
uint8_t S2S3:1;
uint8_t S5S8:1;
uint8_t S6S7:1;
uint8_t S9S0S12:1;
uint8_t S10S11:1;
uint8_t S20:1;
uint8_t S21:1;
};
} Sensoren1;
----
#define I2C_REG_STATUS1 0
#define I2C_REG_STATUS2 1
----
void task_updateRegisters(void)
{
if(!I2CTWI_readBusy)
{
I2CTWI_readRegisters[I2C_REG_STATUS1] = (uint8_t)(Sensoren1.byte);
I2CTWI_readRegisters[I2C_REG_STATUS2] = (uint8_t)(Sensoren2.byte);
}
}
----
void Gleissensor(void)
{
if(adc7 < 10)
{
Sensoren1.S2S3 = 1;
}
else if(adc7 > 300 && adc7 < 700)
{
Sensoren1.S1S4 = 1;
}
----
while(true)
{
Gleissensor();
task_ADC();
//task_Zugbremsung();
task_commandProcessor();
task_updateRegisters();
}
und über diesen will ich es bei Master abrufen und in eine Testausgabe umwandeln
Code:
#define Weichencontroller 10 // Adresse des Slave Microcontrollers
----
uint8_t messageBuf[2]; // Buffer for I2C Data
void test(void) //test() wird in der while-Schleife immer wieder abgerufen
{
I2CTWI_transmitByte(Weichencontroller, 0); // Start with register 0...
I2CTWI_readBytes(Weichencontroller,messageBuf, 2); //Sensoren1.byte und Sensoren2.byte auslesen
if(messageBuf[0] == 128) // 128 wäre, wenn Sensoren1.S1S4 betätigt wäre
{
Gleis2links.byte = 255; //steht dafür, dass 8 LEDs der Signale vom Gleis 2 leuchten sollen
}
}
Ich dachte, dass ich damit die Zustände auslesen konnte. Gibt es eine andere / bessere Lösung dafür, oder was mache ich falsch? Ich bin leider ziemlich ratlos. Könnte man die Abfrage auch so machen, dass sie nur durchgeführt wird, wenn es eine Änderung gab?
3. Wäre es sinnvoll, wenn ich den Watchdog aktiviere?
Ich hoffe ihr könnt mir helfen. Ich bin für jede Antwort dankbar. Wenn ihr noch Informationen benötigt, dann sagt es mir bitte. Ein Zeichenprogramm (freeware) wäre auch sehr schön.
Vielen Dank.
Frohe Weihnachten
MfG
Daniel
Liste der Anhänge anzeigen (Anzahl: 4)
Hi,
Danke, ich werde das mit dem Kondensator mal ausprobieren. Auf diese Idee bin ich noch gar nicht gekommen. Wobei, wenn ich mir das richtig überlege, würden dann ja eine spule und ein Kondensator in Reihe liegen, da der C ja parallel über den Relaiskontakt ist? Und Kondensatoren im Wechelstrom verhalten sich wie Kurzschluss. Ich werde es ausprobieren, aber ich könnte mir vorstellen, dass es probleme geben könnte.
So, ich habe mich mal hingesetzt und die Schaltung gemalt. Zusätzlich hab ich eine sehr grobe Skizze der Aufteilung mit dazu gemacht, nur dass man es sich besser vorstellen kann.
Ich hoffe, das hilft euch und ist nicht zu unübersichtlich.
Schönen 4. Advent
MfG
Daniel
PS: Wie kann man größer Anhänge hochladen, z.B. pdf dateien? weil die Qualität der Bilder sehr schlecht ist)
Liste der Anhänge anzeigen (Anzahl: 3)
Guten Morgen und fröhliche Weihnachten alle zusammen.
Da ich heute früh ab etwa 5.45 nicht mehr schlafen konnte, habe ich doch gleich mal eure Vorschläge in die Tat umgesetzt. Dabei gibt es eine gute und eine schlechte Nachricht. Zuerst die Gute. Ich habe jetzt beim Slave den Eingang AREF mit einem Kondensator(100n) zu AGND versehen, außerdem hab ich zwischen AGND und ACC noch einen Kondensator (100n) gelötet. Übrigens alle Entstörkondensatoren sind 100nF groß. Funktionstest war erfolgreich. Jetzt funktioniert die Auswertung.
Jetzt die schlechte Nachricht. Ich habe bei einem Relais die Kondensatoren (100n) über den Wechslerkontakt gelötet, also einen für den Schließer und einen für den Öffner. Nach dem Einschalten haben sich beide Controller normal gestartet. Ich muss dazu sagen, dass ich noch ein Display über einen PCF8574 dran habe, welches nur vom Master gesteuert wird. Es gibt mir den Status wieder. Auch das hat sich erfolgreich initialisiert. So ich habe das Relais betätigen lassen.
(Das läuft bei mir über eine IR - Fernbedienung, deren Empfänger am Mikrocontroller hängt und den ich nicht eingezeichnet hab, weil das einwandfrei funktioniert. Das habe ich schon zur Perfektion gebracht, dort ist kein Fehler, also habe ich es auch weggelassen.)
Das Relais hat angezogen --> Weiche ist umgesprungen --> kurz gewartet (5s) --> nächster Befehl --> Relais ist abgefallen --> Weiche zurückgesprungen --> Störung auf Bus --> Seitdem funktiniert der Master nicht mehr. Der Slave ist nach wie vor funktionsfähig. Das merkwürdige ist nur, dass ich auf die Fuses des Masters zugreifen kann und diese auch ändern kann. Neue Programme lassen sich auch einspielen, aber er führt diese nicht mehr aus. Ist er jetzt kaputt, oder kann man einen Totalreset machen und dann geht es wieder?
Ich bin euch dankbar über alle Hilfe, die ihr mir gebt.
Ich wünsche euch, falls wir uns heute nicht mehr schreiben, ein schönes und gesegnetes Weihnachtsfest.
MfG
Daniel
PS: Hier nochmal die Schaltpläne als pdf.