Forum: Mikrocontroller und Digitale Elektronik RS485 von ms - immer noch Einschaltprobleme


von M. W. (mw73)


Angehängte Dateien:

Lesenswert?

Guten Morgen!

Ich arbeite jetzt wieder am RS485-Bus, bei dem mir der User ms vor zwei 
Jahren sehr geholfen hat. Leider funktioniert er immer noch nicht wie 
gewünscht.

Kurz zum Aufbau des Busses: Vier Mega328 kommunzieren über RS-485 mit 
max485 als Bustreiber. Ein Master und drei Slaves. An den Slaves hängen 
ein paar Taster und Aktoren und die Kommunikation wird über den Master 
gesteuert. Zum Einsatz kommt hier die 9 Bit Usart im MPCM-mode. Der 
RS-485 wird als zweileiter-Bus betrieben.

Zum Problem: Wenn der bus nach dem Einschalten angeht, die Betonung 
liegt auf wenn, dann funktioniert er einwandfrei für Stunden, Tage, 
Monate, in den meisten Fällen tut er das aber nicht. Alle Teilnehmer 
werden über ein Labornetzteil gespeist und somit gleichzeitig 
eingeschaltet. Man muss teilweise bis zu 10-Mal und öfter Einschalten, 
bis er endlich angeht.

Der Bus startet mit einer Blinksequenz von Leds. Drei Sekunden nach dem 
Einschalten sendet der Master an jeden Slave das Kommande seine Led 
einmal kurz blinken zu lassen. Das gewünschte Verhalten wäre dann, dass 
jeder Slave der Reihe nach seine Led kurz blinken lässt. In den meisten 
Fällen blinkt aber nur die Led vom ersten Slave (0x44) und das 
wiederholt sich ständig.

Ich habe bereits sehr viel an den timings gearbeitet und verschiedenste 
Controller im Einsatz gehabt. Das Problem dürfte aber am Master liegen. 
Interessant ist, dass verschiedene Controller als Master hierbei 
unterschiedliches Verhalten zeigen. Während ein Mega48 hier besseres 
Verhalten beim Einschalten zeigt, benötigen hier die größeren Brüder 
Mega88, 168, 328 deutlich mehr Einschaltvorgänge, bis der Bus richtig 
angeht. Weiters hatte ich einen Nano(mega328) getestet, der nahezu immer 
sofort richtig anging. Leider ist das nur bei diesem einen der Fall. Was 
ist bei diesem einen Nano anders, als bei den anderen von mir 
getesteten?.
Würde vielleicht ein "besseres" Board, wie zb. ein Xplained mini mit 
genauerem Quarz helfen? Was ich noch herausgefunden habe, da ich gestern 
noch einen Uno getestet habe, wenn ich nach dem Programmieren den 
ISP-Programmieradapter am Controller angesteckt lasse, geht er ebenfalls 
immer an. Warum?

Im Anhang habe ich die wesentlichen Schaltplanteile sowie den 
vollständigen Code für jeden Teilnehmer bereit gestellt. Vom Schaltplan 
her habe ich nur den Master und einmal die Busanbindung rausgenommen, da 
alle anderen Teilnehmer identisch sind. Die Failsave-Widerstände kommen 
nur einmal vor und die Abschlusswiderstände beim Master und beim letzten 
Slave.

Vielleicht könntet ihr euch das mal ansehen. Wenn noch etwas fehlt, 
bitte einfach melden. wäre vielleicht jemand bereit, mir bei der 
erstellung einer Timeout-Funktion zu helfen. Laut ms sollte diese noch 
in den Code mit rein.

Über eure Hilfe würde ich mich sehr freuen.
@ms, wenn Du das liest, wäre es toll, wenn Du mir nochmal helfen 
könntest.

Grüße
mw73

von Strubi (Gast)


Lesenswert?

Wo ich am Port JP2 nur zwei Signale lese, die erste Klassikerfrage: Ist 
GND mitverdrahtet? Wenn nicht: Die heissen Diskussionen darüber tauchen 
hier immer wieder auf, und der Fazit ist immer: Ohne Rückflusskanal ist 
ein Differentialsignal für die Katz und reine Glücksache, ob's läuft.

von RFI (Gast)


Lesenswert?

Versuchs mal mit 2x 0R in A und B (R5, R6).

Wenn du Probleme mit EMI hast, nimm die passenden Transceiver..

von Wolfgang (Gast)


Lesenswert?

Markus W. schrieb:
> Alle Teilnehmer werden über ein Labornetzteil gespeist und somit
> gleichzeitig eingeschaltet. Man muss teilweise bis zu 10-Mal und öfter
> Einschalten, bis er endlich angeht.

Echte Gleichzeitigkeit gibt es nicht - hat Einstein schon festgestellt.

Haben deine Slaves genug Zeit(-reserve) zum Starten, bevor der Master 
mit seiner Abfrage los legt?

von Stefan F. (Gast)


Lesenswert?

Starten die Slaves überhaupt zuverlässig?

füge mal am Anfang deines Programmes etwa dies ein:
1
int main()
2
{
3
   // PB0 kurz blinken
4
   DDRB |= 1;
5
   PORTB |= 1;
6
   _delay_ms(500);
7
   PORTB &= ~1;
8
   _delay_ms(500);
9
   PORTB |= 1;
10
   _delay_ms(500);
11
   PORTB &= ~1;
12
   _delay_ms(500);
13
}

An-Aus-An-Aus

Bei jedem Slave muss diese LED beim Einschalten dieses Blinkmuster 
zeigen. Wenn nicht, hat der Mikrocontroller nicht gestartet. Ursache 
dafür ist häufig das Netzteil. Wenn dessen Ausgangsspannung zu langsam 
ansteigt oder anfangs instabil ist, kann sich der Mikrocontroller 
aufhängen. In diesem Fall hilft eine Beschaltung des Reset Pins:

https://www.mikrocontroller.net/attachment/9818/reset.gif

Mit 10k Ohm und durchaus bis zu 100µF als Kondensator. Allerdings stört 
der Kondensator die ISP Schnittstelle, sollte daher durch einen Jumper 
abtrennbar sein.

von Thorsten Legat (Gast)


Lesenswert?

Wolfgang schrieb:
> Haben deine Slaves genug Zeit(-reserve) zum Starten, bevor der Master
> mit seiner Abfrage los legt?

Markus W. schrieb:
> Drei Sekunden nach dem
> Einschalten sendet der Master an jeden Slave das Kommande seine Led
> einmal kurz blinken zu lassen


Ich fürchte, da sind sie schon vor Langeweile wieder eingeschlafen...

Konstruktiv: Wie sieht die GND-Verbindungen der Geräte untereinander 
aus?

von Sascha W. (sascha-w)


Lesenswert?

Hallo Markus,

LEDs sind ja schön und gut, aber am RO des MAX485 macht du dir mit der 
LED den Pegel den du mit dem Pullup erreichen willst wieder kaputt.

Ich habe schon seit Jahren einen Bus mit 6 Geräten in Betrieb - ohne 
Probleme, und das obwohl die meisten Geräte eigene Stromversorgung haben 
und auch mal einzeln abgeschalten werden.

Sascha

von georg (Gast)


Lesenswert?

Stefanus F. schrieb:
> Bei jedem Slave muss diese LED beim Einschalten dieses Blinkmuster
> zeigen

Ich würde das noch erweitern: jeder Slave sollte einen Power-On-Selftest 
machen und das mit seiner LED anzeigen, im Betrieb wäre eine Anzeige des 
Link-Status auch nicht verkehrt.

Ist nach dem Start der Transmitter des Masters aktiv, die der Slaves 
nicht? Und funktioniert das Timing der Richtungsumschaltung?

Georg

von M. W. (mw73)


Lesenswert?

Vielen Dank für die schnellen Antworten.
Ich bin gerade am Testen und habe folgendes versucht:

Spielt das Mitführen von GND hier eine Rolle, der Aufbau befindet sich 
am Steckbrett und alles wird vom gleichen Netzteil versorgt. Ich habe 
aber mal alle GND-Anschlüsse von den Max485-Bausteinen miteinander 
verbunden, obwohl es hier eher sinnlos ist. Hat auch nichts gebracht. 
Mir ist klar, dass es normalerweise erforderlich ist, wenn zb. von 
verschiedenen Spannungsquellen gespeist wird.

Die Widerstände R5 und R6 hab ich mit Brücken ersetzt, hatte aber auch 
keinerlei Auswirkungen gezeigt.

Die Slaves sollten ausreichend Zeit zum Starten haben 200ms nach den 
Initialisierungen und zusätzlich 3s bis der Master seine Kommandos 
startet.

@Stefanus - das werde ich nachher gleich testen.

Grüße
mw73

von M. W. (mw73)


Lesenswert?

Nochmal eine Frage meinerseits:
Der Bus befindet sich ja auf dem Steckbrett. Ist hierfür eine gesonderte 
GND-Verbindung erforderlich?

> LEDs sind ja schön und gut, aber am RO des MAX485 macht du dir mit der
> LED den Pegel den du mit dem Pullup erreichen willst wieder kaputt.

Das hab ich auch befürchtet. Leider ist es aber nicht das Problem, bzw. 
führt eine wegnahme der Leds zu keiner Verbesserung des 
Einschaltverhaltens

> Ich habe schon seit Jahren einen Bus mit 6 Geräten in Betrieb
hättest Du hierzu noch Tips für mich?

> Und funktioniert das Timing der Richtungsumschaltung?
Ich kann nur sagen, dass es zumindest im Betrieb funktioniert.

mfg
Markus

von Jim M. (turboj)


Lesenswert?

Ich sehe neben der flasch angeschlossenen RX Led (die gehört active Low, 
sonst sieht man nix bei UART) auch eine fragwürdige Busanbindung.

Die 47R Serienwiderstände sind verdammt groß dimensionert, insbesondere 
verglichen zum 50 Ohm Busabschluss (2*100R parallel). Da kommt doch eine 
Busspannung raus die nur noch knapp über dem Limit liegen dürfte.

Abhilfe: RX-LED auslöten oder auf active Low umlöten, Serienwiderstände 
überbrücken oder auf 1..10R umstellen.

Sourcen als RAR schaue ich mir nicht an, das löst bei mir ein "insert 
Coin" aus.

von my2ct (Gast)


Lesenswert?

Jim M. schrieb:
> Sourcen als RAR schaue ich mir nicht an, das löst bei mir ein "insert
> Coin" aus.

Bei über 500kB muss da wohl mehr drin sein, als der Quellcode für ein 
paar blinkende LEDs ;-)

von M. W. (mw73)


Angehängte Dateien:

Lesenswert?

Danke Jim für Deinen Beitrag!

> Ich sehe neben der flasch angeschlossenen RX Led (die gehört active Low,
> sonst sieht man nix bei UART) auch eine fragwürdige Busanbindung.
Der Bus befindet sich am Steckbrett und die hab ich bereits weg gemacht. 
Hat aber nichts gebracht.

> Abhilfe: RX-LED auslöten oder auf active Low umlöten, Serienwiderstände
> überbrücken oder auf 1..10R umstellen.
alles bereits gemacht, leider ohne Erfolg

> Sourcen als RAR schaue ich mir nicht an, das löst bei mir ein "insert
> Coin" aus.
ich habe mal die Sourcen vom Master angehängt

Die "main" ist RS485_Master.c

Der Masterservice enthält eine State-machine, die über eines Status die 
zu sendenden Daten festlegt.

RS485 ist für die Kommunikationssteuerung

und crc16 eben für die Checksumme

Der Rest ist fürs lcd

Grüße
Markus

von M. W. (mw73)


Lesenswert?

> Bei über 500kB muss da wohl mehr drin sein, als der Quellcode für ein
> paar blinkende LEDs ;-)
...aber um Dich zu beruhigen handelt es sich hier um den gesamten Atmel 
Studio Projektordner, incl. aller Busteilnehmer und der Kompilate als 
Debug sowie Release.

Markus

von Stefan (Gast)


Lesenswert?

- Failsafewiderstände unbedingt raus! Allerhöchstens nur bei einem 
Busteilnehmer drin lassen!
- Serienwiderstände raus,  ansonsten allerhöchstens 10 Ohm! Wenn EMV 
Stress -> Slewratelimited Treiber verwenden!
- GND Mitführen

Lektüre von TI: Bulletproof RS485

Werner

von neuer PIC Freund (Gast)


Lesenswert?

Deine I2C Sachen haben dieses unrühmliche
1
while((TWCR & (1 << TWINT)) == 0);
drinnen. Wenn ein I2C-Device den Bus lahm legt, was es übrigens darf, 
dann steht auch deine Software. Vielleicht hier auch mal suchen.

von M. W. (mw73)


Lesenswert?

> - Failsafewiderstände unbedingt raus! Allerhöchstens nur bei einem
> Busteilnehmer drin lassen!
Sind nur beim Master dran!

> - Serienwiderstände raus,  ansonsten allerhöchstens 10 Ohm!
Hab ich bereits gebrückt, leider nichts gebracht.

> - GND Mitführen
HMM, Aufbau ist am Stecktbrett, wird alles vom gleichen NT versorgt.


> while((TWCR & (1 << TWINT)) == 0);

> drinnen. Wenn ein I2C-Device den Bus lahm legt, was es übrigens darf,
> dann steht auch deine Software. Vielleicht hier auch mal suchen.
Diesen Verdacht hatte ich auch schon. Macht aber bei meinem Problem 
keinen Unterschied

Danke für eure Beiträge!

von Stefan (Gast)


Lesenswert?

Hallo,

wenn du ein Oszi hast solltest du mal einen Versuch machen ob das reine 
Umschalten von Empfang auf Senden einen Pegelwechsel aud dem RS485-Bus 
verursacht oder nicht.
Das Problem ist, dass ein unerwünschter Pegelwechsel beim Umschalten den 
Start eines Zeichens vortäuschen kann und damit mindestens das erste 
gewollte Zeichen verloren geht (bzw verfälscht).
Abhilfe schafft hier nur den "Hardware-Fehler" (Pegelwechsel) beseitigen 
oder nach dem Umschalten mindestens eine Byte-Länge warten und dann erst 
mit dem Senden beginnen. So ermöglicht man dem Empfänger in jedem Fall 
eine Synchronisation auf den wahren Zeichenanfang.

Gruss

von M. W. (mw73)


Lesenswert?

Das Bulletproof RS485 von TI kannte ich bereits, hab es aber nochmals 
gelesen. Es hat aber auch keine neuen Erkenntnisse gebracht.

Mit den Bias-Widerständen hab ich eigentlich genug experimentiert und 
sämtliche Werte durch - auch mehrmals.

Ich probiere jetzt mal die Reset-Beschaltung und die Blinkmuster für die 
Slaves, wie Stefanus das vorgeschlagen hat.

von M. W. (mw73)


Lesenswert?

Hallo Stefan,

Danke für den interessanten Ansatz

> Abhilfe schafft hier nur den "Hardware-Fehler" (Pegelwechsel) beseitigen
> oder nach dem Umschalten mindestens eine Byte-Länge warten

Dafür ist im Modul RS485.c folgende Vorkehrung:
1
ISR(USART_TX_vect)  // Leztes Byte wurde gesendet
2
{
3
  NetSetTxEnable(false);
4
  NOP;
5
  NOP

Ein doppeltes NOP sollte doch reichen,oder?

Markus

von M. W. (mw73)


Lesenswert?

@Stefan, was wäre in diesem Fall eigentlich ein Hardware-Fehler?

Markus

von Stefan_123 (Gast)


Lesenswert?

Hallo,

ich sollte mich besser Stefan_123 nennen denn ich hab gesehen da ist 
noch ein Stefan.

Nein, 2 NOPs reichen nicht! Es muss wirklich mindestens eine Byte-Länge 
sein. Also bei 9k6 mindesten eine Millisekunde, das sind bei 1MHz Clock 
etwa 1000 NOPs.
Du musst bei einem fälschlichen Start eines Zeichen sein fiktives Ende 
abwarten, erst dann ist der "getäuschte" Empfänger wieder bereit.

Aber noch was anderes. Was willst du an den LEDs in den Datenleitungen 
sehen, die gehören da nicht hin, das ist Unsinn und verfälschen dir 
höchstens das Signal, kein Informationsgewinn.

Gruss

von Kaj (Gast)


Lesenswert?

Markus W. schrieb:
> Ein doppeltes NOP sollte doch reichen,oder?
Rechne doch mal aus wie lange ein Byte (8 Bit + Start- und Stoppbit) 
braucht.
Bei 9600 Baud sind das: 1/(9600/10) = ~1,05ms

Laeuft dein uC mit 16MHz sind ein NOP aber nur 62,5ns. Heisst: Du 
brauchst 1,05ms/0,0000625s = 16800 NOPs um eine Bytelaenge abzuwarten.

von Kaj (Gast)


Lesenswert?

Kaj schrieb:
> Du
> brauchst 1,05ms/0,0000625s = 16800 NOPs um eine Bytelaenge abzuwarten.
Es muss natuerlich 1,05ms/0,0000625ms heissen.

von Stefan_123 (Gast)


Lesenswert?

Hallo,

Markus W. schrieb:
> @Stefan, was wäre in diesem Fall eigentlich ein Hardware-Fehler?

Ich hab jetzt nicht nachgerechnet oder sonst was, aber wenn z.B. die 
LED-Beschaltung in der TX-Leitung den Ruhepegel der TX-Leitung verändert 
dann wäre das ein Hardware-Fehler.
Denn dann hab ich beim Umschalten von Empfang auf Sendung automatisch 
auch eine Änderung des Ruhepegels auf dem RS485-Bus.

Aber wie gesagt, ich weiss nicht ob sie das tut oder nicht.

Gruss

von Dietrich L. (dietrichl)


Lesenswert?

Stefanus F. schrieb:
> In diesem Fall hilft eine Beschaltung des Reset Pins:
>
> https://www.mikrocontroller.net/attachment/9818/reset.gif

@Markus W.:
Ergänzend oder alternativ: Hast du die Brown-out-Fuses passend 
eingestellt, um einen sicheren Reset zu garantieren?

von M. W. (mw73)


Lesenswert?

> Abhilfe schafft hier nur den "Hardware-Fehler" (Pegelwechsel) beseitigen
> oder nach dem Umschalten mindestens eine Byte-Länge warten
also ein wait einbauen - in die ISR?

Ich muss trotzdem noch einmal betonen, dass die Probleme nur beim 
Einschalten vorliegen. Geht der Bus erst an, arbeitet er wie gewünscht.

> Ich hab jetzt nicht nachgerechnet oder sonst was, aber wenn z.B. die
> LED-Beschaltung in der TX-Leitung den Ruhepegel der TX-Leitung verändert
> dann wäre das ein Hardware-Fehler
Die Leds hab ich bereits entfernt, hat aber das Problem nicht gelöst.

Grüße
Markus

von Stefan F. (Gast)


Lesenswert?

Was ist denn nun mit der Stromversorgung und dem Reset?

von Stefan_123 (Gast)


Lesenswert?

Hallo,

mach mal die frei gewordenen LEDs in die Sendeumschaltung von Master und 
den Slaves, dann weisst du zumindest wer gerade Senden will.
Vielleich blockiert ja einer und den Bus.

Gruss

von M. W. (mw73)


Lesenswert?

Stefanus und Stefan_123

ich musste kurz weg, teste das aber gleich
und melde mich dann zurück

Grüße

von Pandur S. (jetztnicht)


Lesenswert?

Was irgendwie zu fehlen scheint ist ein Protokol. Bei so einem Bus muss 
man irgend einen Teilnehmer irgendwann ausschalten koennen, irgendwann 
einschalten koennen, ohne die Anderen zu beeinflussen. Alles andere ist 
Quatsch.

von M. W. (mw73)


Lesenswert?

So, die Reset-Schaltung ist erledigt, jedoch hat sich nichts 
wesentliches verändert.
Das einzige, was Wirkung zeigte, war der Tausch auf eine andere 
Spannungsquelle. Hierfür hab ich statt dem Netzteil eine große 6V 
Batterie genommen (Mit ein paar Dioden in Serie).
Es funktioniert zumindest die Blinksequenz auf Anhieb. Dafür geht der 
Bus hinterher meistens aus - war aber auch nur ein Test.

Die Slaves gehen alle verlässlich an, hab ich mittels Led getestet.
Die initialisierungszeit beim Master hab ich um 100ms verlängert.
Hat aber auch nichts gebracht.

Als nächstes hänge ich die freien Leds in die Sendeumschaltung wie von 
Stefan_123 vorgeschlagen.

> Was irgendwie zu fehlen scheint ist ein Protokol
hast Du eines, das Du mir zeigen kannst?

Grüße Markus

von Pandur S. (jetztnicht)


Lesenswert?

>> Was irgendwie zu fehlen scheint ist ein Protokol

>hast Du eines, das Du mir zeigen kannst?

Ja. sicher. Also.
-Die Slaves machen von sich aus nichts, sind auf Empfang.
-Der Master ist auch auf Empfang ausser wenn er sendet. (*)
-Jede Kommunikation wird vom Master initiiert.
-Die Slaves sind adressiert, jede Meldung ist adressiert.
-Der Master sendet eine Anfrage, die adressierten Slaves antworten 
immer.
-Der Master wartet mit einem Timeout auf eine Antwort,
  wenn nichts kommt kann er repetieren oder vergessen.

Allenfalls, wahlweise
- kann jedes Packet mit einem CRC gesichert werden.

(*) Default auf Empfang bedeutet ein 2.Master kann existieren. Zb Zu 
Debugzwecken.

Uebergeordnet. Die Slaves werden der Reihe nach abgefragt. Die 
Zykluszeit richtet sich nach der gewuenschten Reaktionszeit.

Was noch zu tun waere .. es kommt ein neues Geraet an den Bus. Ist auch 
machbar.

: Bearbeitet durch User
von Stefan_123 (Gast)


Lesenswert?

Hallo,

jetzt noch eine Sache die man bei Startproblemen immer mal versuchen 
sollte ist zu testen ob der Oszillator auch sicher anschwingt.

Oder anders gesagt:
- bei Oszillatorproblemen empfielt sich ein 1MOhm Widerstand parallel 
zum Quarz. Wird heutzutage gern weggelassen aber mal ausprobieren, 
schaden tuts nicht.

Gruss

von M. W. (mw73)


Lesenswert?

Guten Morgen,

@Zitronen F
> Ja. sicher. Also.
> -Die Slaves machen von sich aus nichts, sind auf Empfang.
> -Der Master ist auch auf Empfang ausser wenn er sendet. (*)
> -Jede Kommunikation wird vom Master initiiert.
> -Die Slaves sind adressiert, jede Meldung ist adressiert.
> -Der Master sendet eine Anfrage, die adressierten Slaves antworten
> immer.
> -Der Master wartet mit einem Timeout auf eine Antwort,
> wenn nichts kommt kann er repetieren oder vergessen.

Danke für die Info aber hast Du einmal einen Blick auf den Code 
geworfen. Bis auf die Timeout-Funktion ist alles genau so, wie Du es 
beschrieben hast.
Der Bus funktioniert ja bis aufs Einschalten sehr gut.

Ich weis aber nicht, wie ich die Timeout-Funktion realisieren kann, bzw. 
welche Zeiten ich verwenden müsste - könnte das ein Grund für die 
Einschaltprobleme sein?

@Stefan_123
Danke für den Tipp, auch das werde ich anschließend testen.
> - bei Oszillatorproblemen empfielt sich ein 1MOhm Widerstand parallel
> zum Quarz.
Die 22pico Kerkos bleiben ober, oder?

-Das war auch eine meiner Fragen zu Beginn, ob es am 
Oszillator/Controller liegen könnte, da sich auch unterschiedliches 
Verhalten mit verschiedenen Controllern als Master gezeigt hat. Ein 
Mega48 geht nach 2-3Mal Einschalten, während größere Controller wie 
der168 oder 328 zwischen 5 und 20 Versuche benötigen.

-Sind die Standard HC-Quarze überhaupt ausreichend geeignet?
-Sollte ich überhaupt als Master ein Board wie zb das Xplained mini 
verwenden?

- Würde sich ein Arduino due als Master eignen? Wie würde denn eine 
Codeanpassung bzw. Programmierung dessen aussehen?

- Noch eine ganz wichtige Frage, deren Grund für mich unverständlich 
ist:
Warum geht der Bus immer nach dem Programmieren des Masters verlässlich 
an, und zwar so lange, bis ich den Programmieradapter abstecke?

Für Antworten wäre ich sehr dankbar!

Grüße
Markus

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus W. schrieb:
> - Noch eine ganz wichtige Frage, deren Grund für mich unverständlich
> ist:
> Warum geht der Bus immer nach dem Programmieren des Masters verlässlich
> an, und zwar so lange, bis ich den Programmieradapter abstecke?
Die Antwort nach dieser Frage würde ich zuerst suchen.
Was passiert, wenn du mal nur den Master zurücksetzt und neu startest?

von M. W. (mw73)


Lesenswert?

> Was passiert, wenn du mal nur den Master zurücksetzt und neu startest?
Ist der Bus nach dem Einschalten korrekt angeggangen, kann ich beim 
Master einen Reset ausführen. Der Bus startet mit der Blinksequenz an 
jedem Slave erneut und das nach jedem Reset.

Schalte ich den Bus ein, dieser läuft aber nicht wie gewollt an (Die 
Blinksequenz wiederholt sich immer beim ersten Slave) dann nutzt auch 
ein Reset am Master nichts.

Grüße Markus

von Stefan F. (Gast)


Lesenswert?

Ich habe das Gefühl, dass du nicht wirklich weißt, was deine 
Mikrocontroller im Störfall gerade machen.

Mir ist auch sehr unklar was "der Bus geht an" bedeutet.

Du solltest deine Gerät im Störfall mal ernsthaft Debuggen. Entweder mit 
einem Atmel ICE oder mit Hilfe von vielen Statusmeldungen, die über 
irgendeinen Pin seriell ausgegeben werden. Die kannst du dann mit einem 
Terminalprogramm auf deinem PC anzeigen.

Es ist eine ganz schlechte Idee, jetzt auf komplexere Mikrocontroller zu 
wechseln. Denn dein problem wird dadurch sehr wahrscheinlich nicht auf 
magische Weise verschwinden. Und wenn doch müsstest du ständig fürchten, 
dass es wieder kommt denn du hast die Ursache noch nicht erkannt.

Was die Quarze angeht: Ich war bisher davon ausgegangen, dass du fertige 
µC Module verwendet hast, wo man schon davon ausgehen kann, dass die 
Bauteile zusammen passen. Es ist auf jeden Fall so, dass nicht jeder 
Quarz geeignet ist und dass die Kondensatoren passend gewählt werden 
müssen. Die so oft genanten 22pF sind meistens Ok, aber eben nicht 
immer. Die Berechnung der korrekten Werte ist in dieser AppNote 
beschrieben: 
http://ww1.microchip.com/downloads/en/appnotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf

Bei Steckbrettern muss man z.B. noch die Kapazität der Steck-Kontakte 
subtrahieren. Hier läuft es mit 12pF oder ganz ohne Kondensatoren oft 
besser. Wichtig ist auch, dass die Leitungen an XTAL1 und XTAL1, sowie 
die Leitungen vom Kondensator zum GND-Pin des µC so kurz wie möglich 
sein müssen. Mehr als 2cm kämen mir da schon sehr verdächtig vor.

von Guenter (Gast)


Lesenswert?

Hallo

Hab deine Schaltung jetzt nicht genau studiert..
deshalb die Frage:

Hast du am Bus-Ende einen Abschlusswiederstand eingebaut ?

Gruß
Günter

von Pandur S. (jetztnicht)


Lesenswert?

Sind hinreichend Kondensatoren verbaut worden ?
Der Reset sollte ein 10k pullup mit einem 100nF sein. Nicht offen.

Der Timeout sollte die Zeit fuer einen sinnvolle Reaktion beinhalten.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Leute, lest doch mal bitte bevor Ihr Antworten gebt die längst da 
gewesen waren.

von Sascha W. (sascha-w)


Lesenswert?

Markus W. schrieb:
> Schalte ich den Bus ein, dieser läuft aber nicht wie gewollt an (Die
> Blinksequenz wiederholt sich immer beim ersten Slave) dann nutzt auch
> ein Reset am Master nichts.
So wie ich deinen Aufbau bisher verstanden habe würde das doch bedeuten 
das der Master nachdem er den 1.Slave angesprochen hat selbständig einen 
Reset macht!?

Sascha

von M. W. (mw73)


Lesenswert?

> Mir ist auch sehr unklar was "der Bus geht an" bedeutet.
Nach dem Einschalten kommt zuerst die Blinksequenz, bei der der Reihe 
nach die Led eines jeden Slaves einmal kurz blinkt.
Dannach wird jeder Slave zyklisch abgefragt (zb. aktueller ADC-Wert) und 
diese Wert erscheinen dann am lcd des Masters.

meistens nach dem Einschalten blinkt aber nur die Led des ersten Slaves 
und das war es dann. Am Lcd kommen natürlich keine weitere Ausgaben.

> Du solltest deine Gerät im Störfall mal ernsthaft Debuggen
Ich habe versucht mit Hilfe von Leds mir Durchblick zu verschaffen, bin 
aber hierbei zu keinen Erkenntnissen gekommen.

Auch ein Einbau der Leds in die Sendeumschaltung lieferte mir keine 
brauchbaren Resultate. Entweder funktioniert die Kommunikation nach dem 
Einschalten oder sie wiederholt sich an der besagten Blinksequenz des 
ersten Slaves.

Hast Du mal einen Blick auf den Code geworfen?

von M. W. (mw73)


Lesenswert?

> So wie ich deinen Aufbau bisher verstanden habe würde das doch bedeuten
> das der Master nachdem er den 1.Slave angesprochen hat selbständig einen
> Reset macht!?

> Sascha
Das hatte ich auch vermutet, dem ist aber nicht so. In der Statemachine 
des Moduls MasterService.c ist zu Beginn der Satus auf "wait". Nach 3 
Sekunden ändert sich der Status auf "flash_led1". Das wird auch 
ausgeführt denn die Led des ersten Slaves blinkt ja. Das habe ich mit 
einer Led überprüft, die, wenn er einen Reset machen würde, jetzt 
blinken würde.

Grüße Markus

von Stefan F. (Gast)


Lesenswert?

Markus W. schrieb:
> Ich habe versucht mit Hilfe von Leds mir Durchblick zu verschaffen, bin
> aber hierbei zu keinen Erkenntnissen gekommen.

Wundert mich nicht. Dein Problem ist zu komplex, um es mit ein paar LEDs 
zu untersuchen. Immerhin weißt du, ob die µC überhaupt starten, aber 
jetzt musst du weiter gehen.

Wenn du Debug-Meldungen seriell ausgibst, kannst du davon hunderte pro 
Sekunde haben und dennoch den Überblick bewahren, denn das 
Terminalprogramm zeigt sie in chronologisch korrekter Reihenfolge an. Du 
kannst quasi in die Vergangenheit zurück scrollen, um zu sehen, was 
vorher passierte. Dein LCD Display ist für so etwas zu klein.

Du könntest damit beginnen, am Anfang und Ende jeder einzelnen 
Funktionen eine Debug Meldung auszugeben, etwa:

main() start
initMasterService() start
initMasterService() end
main() enabling interrupts
main() interrupts are enabled
main() init LCD start
main() init LCD end
main() LCD output before main loop
main() Entering main loop
main() main loop executing
masterService() start
masterService() master_state=0
masterService() case STATE_WAIT start
masterService() case STATE_WAIT end
masterService() end
main() main loop executing
masterService() start
masterService() master_state=0
masterService() case STATE_WAIT start
masterService() case STATE_WAIT end
masterService() end

und so weiter. gebe die Werte wichtiger Variablen aus, und vor allem 
Stati von allem Möglichen. Immer wenn eine Bedingung geprüft wurde, dann 
logge das, so dass am Log genau abgelesen werden kann, welche 
Codeabschnitte warum durchlaufen wurden.

Benutze PSTR, PROGMEM und die _P Funktionen um RAM zu sparen. Wenn die 
Strings nicht in den Flash Speicher passen, dann musst du dich 
Schrittweise an den Kern des Problems heran tasten, anstatt alle Debug 
Meldungen gleichzeitig zu aktivieren.

Der entscheidende Vorteil dieser Methode ist, dass du nicht nur siehst 
wo er hängt, sondern auch, was vorher passiert. Idealerweise aktivierst 
du im Terminalprogramm die Anzeige on Zeitstempeln, dann siehst du auch 
ungefähr das Timing (welches durch die ganzen Debug Meldungen natürlich 
in gewissem Umfang versaut wird, aber besser als nichts).


> Hast Du mal einen Blick auf den Code geworfen?

Nein. Der interessiert mich erst, wenn das Problem weiter eingekreist 
wurde. Noch wissen wir nicht genau genug, an welcher Stelle es Hakt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was ein Protokoll betrifft: Ein simples, verbreitetes und etabliertes 
Protokoll wäre Modbus-RTU. Das hat den Vorteil, daß es dafür genügend 
freie Software gibt, mit denen man sowohl Modbus-Geräte als auch einen 
Modbus-Master simulieren kann.

Die zu transportierenden Inhalte sind primitiv - entweder ein 
16-Bit-Wert oder einzelne Bits. Alles darüber hinausgehende muss man 
sich auf einer Metaebene darüber zurechtschnitzen, aber das ist nicht 
wirklich ein Problem; in der realen Welt werden über die einfachen 
Modbus-Mechanismen auch echte float-Werte transportiert etc.

Wie Werte zu interpretieren sind, ist halt eine zweite Protokollebene, 
die im Schichtenmodell oberhalb des eigentlichen Modbus zu liegen kommt.

von M. W. (mw73)


Lesenswert?

Der Einbau von 1Mohm-Widerständen parallel zu den Quarzen hat auch 
nichts gebracht.

Grüße
Markus

von M. W. (mw73)


Lesenswert?

Danke mal zwischenzeitlich an Alle.
Ich denke ich werde die Methode von Stefanus forcieren und dahingehend 
versuchen neue Erkenntnisse zu erlangen.

Auch eine Implementierung von Modbus wäre eine weitere Möglichkeit, 
sollte ich das nicht in den Griff bekommen.

Ich melde mich, wenn ich das Problem weiter einkreisen konnte.

Grüße
Markus

von Dietrich L. (dietrichl)


Lesenswert?

Markus W. schrieb:
> So, die Reset-Schaltung ist erledigt, jedoch hat sich nichts
> wesentliches verändert.

Und hast du auch das gemacht?:

Dietrich L. schrieb:
> Hast du die Brown-out-Fuses passend
> eingestellt, um einen sicheren Reset zu garantieren?

von T Rroll (Gast)


Lesenswert?

Also. Vergiss mal den Bus. Die Komponenten alleine muessen schon 
zuverlaessig laufen, sonst ist eh nichts.
Also mach in alle einen Laufzeitzaehler rein, der seriell abfragbar ist. 
zB eine 32bit Variable, die alle Sekunden inkrementiert. Und dann wird 
darauf aufgebaut.

von Dietrich L. (dietrichl)


Lesenswert?

Markus W. schrieb:
> Ich weis aber nicht, wie ich die Timeout-Funktion realisieren kann, bzw.
> welche Zeiten ich verwenden müsste - könnte das ein Grund für die
> Einschaltprobleme sein?

Ich habe mir den Code jetzt nicht angeschaut, aber allgemein:
Wenn der Master nach dem Senden auf eine Antwort wartet und erst nach 
einer gültigen Antwort weiter macht, dann brauchst du unbedingt ein 
Time-Out. Sonst würde bei einer beliebigen Störung auf der Leitung oder 
beim Slave die "Maschine" hier hängen bleiben.

Wie Time-Out realisieren? Z.B.:
- Timer-Interrupt mit 1ms
- eine Time-Out-Variable wird zu Beginn des Wartens auf Antwort auf den 
gewünschten Wert gesetzt
- die Timer-ISR zählt die Variable bei jedem Aufruf herunter bis 0 
erreicht ist
- während des Wartens wird die Time-Out-Variable abgefragt, ob sie 0 
erreicht hat
- wenn 0 erreicht ist weiter mit erneutem oder nächstem Senden.

von T Rroll (Gast)


Lesenswert?

Ein Timeout muss natuerlich solange warten bis etwas gekommen sein muss. 
Wenn also ein Slave max 22ms fuer eine Antwort benoetigt. Setzt du das 
timeout auf 30ms. Oder so.
Das Timeout wird per interrupt runtergezaehlt.

von M. W. (mw73)


Lesenswert?

Dietrich und Troll, danke für eure Antworten!

Wie müsste ich den die Brown-out fuses setzen? Das hab ich nämlich nicht 
gemacht.

... und danke für die Tips mit der Timeout-funktion, ich werde 
versuchen, diese noch umzusetzten.

von Dietrich L. (dietrichl)


Lesenswert?

Markus W. schrieb:
> Wie müsste ich den die Brown-out fuses setzen?

Dann schau doch mal ins Datenblatt!
Da du mit +5V arbeitest, wäre BODLEVEL = 100 sinnvoll. Dann ist die 
Schaltschwelle für der Reset bei 4,3V +/- 0,2V.

von Michael A. (micha54)


Lesenswert?

Hallo,

ich möchte nochmal wegen der failsafe-Widerstände nachfragen: welcher
Pegel wird denn erzeugt, wenn kein Knoten sendet ? RS485 mit 
failsafe-Erkennung darf in den Sende-Pausen keine Unterbrechung 
erkennen.

Mir ist allerdings nicht klar, wie so überhaupt eine Unterbrechung 
erkannt werden kann.

Gruß,
Michael

von M. W. (mw73)


Lesenswert?

Ich hab sie auf 4,3V gestellt.

...hat funktioniert, 10x ein- und ausgeschaltet.

Dann den Programmieradapter abgesteckt - und vorbei.
Wieder das gleiche Verhalten.

Ich mach mich jetzt mal an eine Timeout-Funktion.

von M. W. (mw73)


Lesenswert?

@Michael, ich kann das nachher mal messen

von Stefan F. (Gast)


Lesenswert?

Markus W. schrieb:
> Ich hab sie auf 4,3V gestellt.
> ...hat funktioniert, 10x ein- und ausgeschaltet.
>
> Dann den Programmieradapter abgesteckt - und vorbei.
> Wieder das gleiche Verhalten.


Frage dich, was denn nun anders ist.

a) Der Programmieradapter stellt eine GND Verbindung zum PC her, und 
somit eventuell auch zur Erdung.
b) Der Programmieradapter erzeugt nach dem Hochfahren der 
Stromversorgung einen zweiten recht langen Reset-Impuls (jedenfalls 
macht meiner das).
c) Eventuell stellt dein Programmieradapter eine Stromversorgung bereit?

Das kann man doch auch ohne Programmieradapter man eben händisch 
simulieren.

von M. W. (mw73)


Lesenswert?

>Frage dich, was denn nun anders ist.

>a) Der Programmieradapter stellt eine GND Verbindung zum PC her, und
>somit eventuell auch zur Erdung.
>b) Der Programmieradapter erzeugt nach dem Hochfahren der
>Stromversorgung einen zweiten recht langen Reset-Impuls (jedenfalls
>macht meiner das).
>c) Eventuell stellt dein Programmieradapter eine Stromversorgung bereit?

>Das kann man doch auch ohne Programmieradapter man eben händisch
>simulieren.

ich habe den Diamex usb-isp-Programmer.
Die Stromversorgung habe ich immer ausgeschaltet, weil ich ja Versorgung 
über das Netzteil nutze.
Den Rest hab ich händisch schon simuliert.

Das Problem ist ja, das das mit dem Adapter ja nur nach dem 
Programmieren funktioniert. Sobald ich ihn abnehme, funktioniert es 
nicht mehr, auch wenn ich ihn erneut anstecke - bis ich den Master 
wieder programmiere, dann läuft es wieder einwandfrei

von nachtmix (Gast)


Lesenswert?

Markus W. schrieb:
>> - Failsafewiderstände unbedingt raus! Allerhöchstens nur bei einem
>> Busteilnehmer drin lassen!
> Sind nur beim Master dran!

Auch die 100 Ohm Abschlusswiderstände (R7) gehören nur an die beiden 
physikalischen Enden des Bus.
Ob dort der Master steht oder ein Slave oder nix, ist Wurst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.