Bascom RS232 sendet willkürlich Daten

dimmu

Neues Mitglied
11. Juli 2011
54
0
0
Schömberg bei Neuenbürg
Sprachen
  1. BascomAVR
Hallo Leute,

ich muss mich mal wieder mit einer etwas dämlichen Frage melden.
Seit ein paar Tagen habe ich einen Loxone Miniserver, mit dem ich meine gesamte Hifi Anlage steuere.
Also z.B. über Netzwerkbefehle den Receiver umschalten oder das XBMC bedienen.
Um etwas Geld zu sparen, und nicht die RS232 Extension kaufen zu müssen, habe ich mir mit einem Atmega 8 einen kleinen Adapter gebaut, der beim Schließen eines Ausgangs vom Miniserver einen On Befehl über RS232 zum Beamer schickt.
Wenn der Kontakt wieder öffnet soll der AVR ein Off Befehl zum Beamer schicken.

Hier ist mal der Code.



CodeBox BascomAVR
'Adapter Digital auf RS232
'Mittels eines digital Eingangs, wird über RS232 ein ein/aus Telegramm abgesetzt.
'Über eine LED wird der zuletz geschriebene Zustand angezeit.
'Ein Befehl, LED Ein
'Aus Befehl, LED Aus

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 400
$swstack = 400
$framesize = 42
$baud = 19200


'Pd0 Rxd
'Pd1 Txd
Config Pinb.0 = Input                                       'externer Pullup
On_off Alias Pinb.0
Config Portd.5 = Output                                     'zustands LED
Pwr Alias Portd.5

Dim Speicher As Bit                                         'speichert die letzte flanke
Speicher = 0

Do

If Speicher = 0 Then
   If On_off = 0 Then
      Print Chr(13) ; "*pow=on#" ; Chr(13) ;
      Pwr = 1
   End If
Elseif Speicher = 1 Then
   If On_off = 1 Then
      Print Chr(13) ; "*pow=off#" ; Chr(13) ;
      Pwr = 0
   End If
End If


If On_off = 0 Then
Speicher = 1
Else
Speicher = 0
End If

Loop


Wenn ich es teste funktioniert das auch so weit. Nur ist es jetzt so:
Wenn ich eine Weile Beamer schau, geht dieser plötzlich aus weil er vom Adapter einen Off Befehl geschickt bekommt.
Wenn ich nach der Arbeit heim komme, kann es sein das der Beamer sich über den Tag irgendwann automatisch eingeschaltet hat.

Mein verdacht war zunächst, dass der Ausgang am Miniserver kurzzeitig abfällt, oder sich kurzzeitig schließt.
Im Miniserver selber kann ich aber ein Logging der Ausgänge programmieren, dort kann ich keine willkürlichen Änderungen verzeichnen.
Auch wenn ich den Ausgang zurück auf einen Eingang vom Miniserver verbinde, und dort eine kleine Logik baue, die bei der ersten Änderung des Ausgang den Zustand mitschreibt kann ich keine Änderungen über den Tag feststellen.

Meine Frage ist nun, ob jemand von euch eine Idee hat warum der Adapter plötzlich einen On oder Off Befehl schickt.

Danke schon mal.
 
Was für ein Signal gibt der Server denn konkret an den AVR aus? Digitale TTL-Pegel? Irgendwas prellendes?

Wenn TTL, warum verwendest Du dann nicht statt der komplexen IF-Geschichte einfach einen flankengetriggerten externen IRQ?

(So auf den ersten Blick erschließt sich das geschilderte Verhalten nicht (wenn die IF-Abfrage so übersetzt wird, wie die Einrückungen glauben machen)).

Du müßtest das Steuersignal an den AVR (am AVR) irgendwie mitloggen (am besten analog), und gleichzeitig die Reaktion des AVR darauf (also den Zustand der Pwr-LED).
 
Hallo,

am Code kann ich auch keinen offensichtlichen Fehler entdecken.
Möglicherweise liegt das Problem aber ganz wo anders - wie ist denn der Eingang beschaltet ? PullUp ? RC-Glied ?
Lange (ungeschirmte) Leitung ? Masseführung ? Stromversorgung - Abblock-C (Keramik) ?
Der Atmega rennt extrem schnell durch die Schleife, da können selbst extrem kurze Impulse (Schaltflanken z.B. Kühlschrank) eingefangen werden (hochohmiger Eingang!).
Neben den o.g. Dingen könntest du die Schleife z.B. durch ein "waitms 100" langsamer machen und einen Zähler einbauen, sodass erst geschaltet wird, wenn der Eingang z.B. 3 x hintereinander einen anderen Zustand hat.
Dann könntest du evtl. noch einen PC / Laptop mit einem Terminalprogramm mit an die RS232 klemmen (nur RX und Masse) und mal mitloggen, wann der Befehl zum Schalten gesendet wird.

- gp177 -
 
Hallo ihr Beiden,

leider war ich verreist und komme deshalb erst jetzt zum Antworten.
@LotadaC
Der Server besitzt Relaisausgänge, also tatsächlich was prellendes. Das Prellen hatte ich aber eigentlich bereits ausgeschlossen, da das ungewollte ein und ausschalten ja plötzlich am Tag passiert, ohne das ich den Zustand vom Relais ändere.
Wenn ich mit einem Terminalprgramm die Befehle auswerte, wird der Ein bzw. Aus beim Schalten des Relais auch tatsächlich nur einmal geschickt.
Mit dam Analog verstehe ich das jetzt so, das ich einfach mal per ADC die Spannung die bei offenen bzw geschlossenem Relais am PB.0 anliegt messen soll.


@gp177
Hier mal noch einen ausschnitt vom Schaltplan. Der Max232 ist wie im Datenblatt beschrieben mit den Kondensatoren verschalten.
Max 232.PNG
Aufgebaut ist das bis jetzt alles auf einer Streifenrasterplatine. Von den Relais bis zur Platine sind die Leitungen so ca. 15 cm lang. Vom Max 232 zum Beamer liegt dann eine CAT7 Leitung an der ich den SUB D Stecker angelötet hab.
Ich muss zugeben, dass ich mir bisher noch nie so wirklich Gedanken über Masseführung und der gleichen gemacht habe, da ich bisher noch nie Probleme damit hatte.
Der Miniserver selbt wird mit einem 24V Schaltnetzteil mit Strom versorgt. Von dort bin ich einfach über ein 7805 und und nehme da die 5V für dem AVR ab. Kondensatoren sind nach den gängigen Faustregeln ausgwählt worden. Mit dem Oszi konnte ich da bis jetzt auch noch nichts ungewöhnliches erkennen.

Die Idee mit dem Wait gefällt mir sehr gut. Das werde ich auf jeden Fall mal mit einbauen.


Ansonsten hätte ich am Miniserver noch 0-10V Ausgänge. Haltet Ihr es für sinnvoller es vielleicht darüber zu steuern?
Was mir sonst noch einfällt, ich hätte vielleicht beim ersten Post noch erwähnen sollen, das die Ganze Anlage in einem Schaltschrank mit mehren Jalousietrennrelais verbaut ist. Ich kann das Fehlverhalten aber nicht Provozieren. Habe es eben mal getestet wenn ich wie wild die Relais schalten lasse, es wurden keine Telegramme abgesetzt.

Vielen Dank,
dimmu
 
...Der Server besitzt Relaisausgänge...
Öffner? Schließer? Umschalter?
Und was ist dann da wie angeschlossen? Der AVR liest den ist-Zustand über einen Schmitt-Trigger aus, also alles unter 0,2*Vcc wird als 0, alles über 0,6*Vcc als 1 gelesen. Du mußt also ordentliche (eindeutige) Pegel auf den Pin legen.

So wie das bis jetzt aussieht, erkennt der AVR irgendwann einen Flankenwechsel (warum auch immer), und sendet (aus seiner Sicht korrekt) die entsprechende Botschaft.

Mit dem Analog-Vorschlag meinte ich, daß Du den tatsächlichen Zustand am Pin mitloggst. Da das unter Umständen ein sehr langes Log wäre, könnte man auf die (vermeintliche) Erkennung des AVR triggern (also dessen umschalten der LED), wobei der aufgezeichnete Pre-Trigger dann hinreichend groß sein muß (läßt sich jetzt schlecht abschätzen, wie Dein Bascom-Code übersetzt wird, ich würde auf knapp zweistellige µs zwischen erkannter Flanke und Reaktion tippen. Und das LED-schalten sollte dann vor dem Print erfolgen). Da Du ein Oszi zu haben scheinst, kanns Du das vielleicht testen - generell könnte man natürlich auch einen zweiten AVR als DSO verwenden (Also ununterbrochen mi dem ADC das Signal messen und in einen Ringspeicher (SRAM) ablegen, bis der erste AVR anspringt. Mit'nem Oszi wäre das natürlich komfortabler.
...hätte ich am Miniserver noch 0-10V Ausgänge. Haltet Ihr es für sinnvoller es vielleicht darüber zu steuern?...
Analog? Digital?
D.h., Du kannst im Server Programmieren, welche analoge Spannung da anliegt?Und die umschalten? Wäre auch'ne Möglichkeit. Entweder über einen Spannungsteiler (direkt am AVR) oder besser galvanisch getrennt über einen Optokoppler auf den AVR-Pin (Also dann den Pin als Eingang mit aktiviertem Pullup nutzen, und den Koppler den Pin auf Gnd (des AVR) zwingen lassen.)

P.S.: Bei Deinem Programm könnte eine Flanke wenn sie zu einem ungünstigen Zeitpunkt kommt auch übersehen werden. Ich würde wie gesagt die Verwendung eines flankengetriggerten Intteruptes vorschlagen.
 
Öffner? Schließer? Umschalter?
Die Relais sind Schließer. Der Pin wird per Pullup (10K Widerstand) gegen 5V gezogen. Das Relais schließt gegen Gnd. Die Pegel habe ich bereits mit einem Multimeter nachgemessen. Bei geschlossenem Relais geht die Spannung annähernd auf 0V zurück. Über den Pullup habe ich bei geöffnetem Relais eine Spannung < 4,7V.
Das war natürlich nur eine Momentaufnahme, noch kein Datenlogging.

Den Gedanken mit dem Flankenwechsel hatte ich auch bereits. Ich Prüfe jetzt mal ob ich evtl. über die Analogeingänge von meinem Miniserver direkt eine Datenaufzeichnung starten kann. Damit hätte ich keinen neuen Programmieraufwand und kann das Log direkt auf dem PC anschauen.

So wie ich das mit den 0,2*VCC und 0,6*VCC verstehe kann ich mir die Spannungen auch direkt im Programm hinterlegen und eine Alarmmeldung vom Miniserver schicken lassen.


Und was ist dann da wie angeschlossen? Der AVR liest den ist-Zustand über einen Schmitt-Trigger aus, also alles unter 0,2*Vcc wird als 0, alles über 0,6*Vcc als 1 gelesen. Du mußt also ordentliche (eindeutige) Pegel auf den Pin legen.
Mit dem Oszi könnte ich natürlich auch noch messen, allerdings meins keins mit einem speicher, also müsste ich auch wieder die ganze Zeit daneben sitzen.


Ja ich kann am Server Analogausgänge Programieren die mir dann auf Wunsch eine Spannung zwischen 0V und 10V liefern.
Die Idee mit dem Spannungsteiler finde ich nicht schlecht. Ich denke eine galvanische Trennung sollte nicht notwendig sein, da ja eh alles am gleichen Netzteil hängt. Weiterer Vorteil ist, das ich es direkt probieren kann und nicht erst einen Optokoppler kaufen muss. Der Elektronikladen bei mir hat schon Feierabend.


Ich würde wie gesagt die Verwendung eines flankengetriggerten Intteruptes vorschlagen.
Zu Beginn hatte ich tatsächlich ein paar mal das Problem das der Schaltvorgang überhört wurde. Als ich dann aber alle Wait aus dem Programm rausgeschmissen habe war das weg. Klar, das Programm ist ja ohne dauernde Wartepausen deutlich schneller.
Die Interrupt Variante habe ich bis jetzt nicht gewählt weil mir noch nicht ganz klar ist, wie ich mit dem selben Pin einen Interrupt bei steigender und bei fallender Flanke auslösen kann. So wie ich die Hilfe bis jetzt verstanden habe kann ich entweder auf die steigende oder die fallende Flanke prüfen.


Danke
 
PinChangeInterrupts (die der Mega8 aber nicht hat) würden immer bei jeder Flanke 'nen Interrupt triggern. Die konventionellen externen Interrupt-Eingangspins können hingegen konfiguriert werden. Beim Mega8 INT0 und INT1. Grundsätzlich ist Triggerung durch einen Low-Level (dann ist der Pin invertiert quasi das Interruptflag, d.h. der Controller merkt sich einen einmal getriggerten IRQ nicht wenn der Pegel wieder rauf geht) oder durch eine Flanke (dann wird ein Flag gesetzt, und bleibt stehen bis die ISR abgearbeitet wird oder Dein Programm das Flag wieder löscht) möglich. Beim Flankengetriggerten gibts dann 3 Möglichkeiten: steigende, fallende, jede.
Eingestellt wird das im MCU Control Register (MCUCR) mit den Interrupt Sense Control Bits (ISCnx). Steht genauer im Datenblatt unter External Interrupts. Da ist dann auch 'ne Tabelle.
In Bascom gibts bestimmt irgend'n Config-Befehl dazu, aber Du kannst auch einfach MCUCR den entsprechenden Wert zuweisen.
Du könntest also entweder jedesmal die scharfe Flanke umschalten, oder auf beide triggern, und dann in der ISR fallunterscheiden.

Prinzipiell könntest Du den Server-Analogausgang also auch zwischen 0V und 5V wechseln lassen um das Signal an den AVR zu übertragen - durch die höheren Pegel und den Teiler dicht am AVR wirds aber störunanfälliger.
Vorteil der Methode mit dem Optokoppler wäre, daß AVR und Server unterschiedliche Massen haben könnten -> ok, Du erzeugst die AVR-Versorgungsspannung eh mittels Linearregler aus der Server-Spannung, hast dieselbe Masse...

Klar, ich war einfach von 'nem DSO ausgegangen... aber Du scheinst ja den Server auch als DSO (wenn man das bei der erzielbaren Samplefrequenz noch so sagen darf) programmieren zu können (wenn ich dich recht verstanden habe)
 
So,
nach einer kleinen Pause kann ich jetzt von neuen Erkenntnissen berichten.
Ich habe jetzt eine Woche einen PC mit Terminal Programm laufen gehabt und gleichzeigt im Miniserver mehrere Zähler Programmiert die je nach Spannung am Analogeingang immer um 1 hochzählen. Ich habe 5 Zähler, >0,2V, >0,5V, >1V, >1,5V, >2V.

Der 0,2V Zähler hat relativ Viel auf der Uhr Stehen. Die anderen stehen alle +- 5 auseinander.
Im Terminal Programm müsste ich die Telegramme Zählen, da die Aufzeichnung aber ca. 1 Seite lang ist, und die Zähler nicht mal 10 auf der Uhr stehen haben, denke ich ist die genau Anzahl im Terminal Programm nicht interessant.

Weiterhin kann ich im Terminal Programm erkennen, das nur Telegramme geschickt werden, die ich auch in meinem Programm angelegt habe. Allerdings nicht in der zu erwartenden Reihenfolge.
Ich hätte erwartet, das immer Ein Aus Ein Aus geschickt wird. Tatsächlich kommt aber 5 bis 6 mal Ein danach 5 mal Aus. Glücklicher weise zeigt das Terminal wie lange die Telegramme auseinander liegen. Teilweise folgen diese direkt aufeinander, manchmal liegen aber auch Stunden dazwischen.

Also für mich sieht es jetzt so aus, wie wenn der AVR da irgendwas macht was er nicht soll.
Da er nur angelegte Telegramme schickt, denke ich das er tatsächlich Änderungen am Eingang erkennt. Irgendwelche Ideen wie das sein kann.
Kann es sein das der AVR aufgrund von EMV oder sowas neu startet und deshalb das Telegramm erneut schickt? Ich hätte sowas bisher noch nie gelesen.

Achso, bis jetzt habe ich am Bascom Code noch nichts verändert. Ich denke es ist sinnvoller zuerst die Ursache für die wilden Telegramme zu finden, bevor ich den Code auf Interrupts umbaue.

Danke
 
Hi,

Also für mich sieht es jetzt so aus, wie wenn der AVR da irgendwas macht was er nicht soll.
Da er nur angelegte Telegramme schickt, denke ich das er tatsächlich Änderungen am Eingang erkennt. Irgendwelche Ideen wie das sein kann.
Kann es sein das der AVR aufgrund von EMV oder sowas neu startet und deshalb das Telegramm erneut schickt? Ich hätte sowas bisher noch nie gelesen.

Achso, bis jetzt habe ich am Bascom Code noch nichts verändert. Ich denke es ist sinnvoller zuerst die Ursache für die wilden Telegramme zu finden, bevor ich den Code auf Interrupts umbaue.

Mach doch noch eine RS232-Ausgabe wenn er startet. Dann weißt du ganz sicher ob er zwischendurch spinnt und durchstartet.

Wegen EMV usw ...

Jedes Versorgungspärchen (Vcc/GND , AVcc/AGND) mit einem 100nF direkt (so nah wie möglich) an den Pins puffern. Dann einen 10-22µF für den gesamten Atmel. Dem RS232-Treiber sollte man auch entsprechende Kondensatoren angedeihen lassen.

Den Atmel hast du über den Miniserver versorgt. Die RS232 hängt am Beamer. Also hast du die Masse (GND) des Miniservers galvanisch mit der des Beamers verbunden. Sind beide an der selben Steckdose? Evtl Masse- oder Erdschleifen? Ist der Ausgang des Miniservers ein potentialfreier Kontakt? Dann könntest du den Atmel mal über ein getrenntes Netzteil versorgen (zum testen). Wenn es dann problemlos läuft, dann hast du Probleme mit der GND-Verbindung vom Miniserver (Versorgung) zum Beamer (RS232). Das könnte man über einen zwischengeschalteten DC/DC-Wandler beheben. Du legst also die 24V vom Miniserver auf einen Wandler der am Eingang 24V ab kann und am Ausgang 5V zur Verfügung stellt. Sieh mal hier ... NMF1205SC - DC/DC Konverter NMF-Serie 1W, 5V DC, SIP, Single Bei dem mußt du allerdings noch von den 24V auf 12V runter. Du hast aber wie bei Schaltnetzteilen eine Leistungsanpassung (also weniger Strom auf der Eingangsseite).

Den Eingang am Atmel (vom Kontakt des Servers) kann man noch über einen Tiefpaß EMV-fester machen. Dafür würde ich einen 1-4,7nF parallel vom Atmel-Pin an GND schalten. In Reihe zum Kontakt einen 1k Widerstand. Wenn du dann einen 10k-PullUp vom Atmel-Pin zu Vcc legst, wirst du erstens eine kleine Entprellung und zweitens wegen dem Kondensator einen Kurzschluß für HF-Einstreuungen haben.

Zusätzlich könnte man den Zustand des Eingangs über eine Sekunde mitteln und dann den Pegel als gegeben annehmen der zu 90% erkannt wurde. Wenn der Pegel weniger als 90% erkannt wurde wird einfach nichts gemacht. Damit bekommt man dann starke Einstreuungen auf der Softwareseite eliminiert.

Gruß
Dino
 
Hallo,

nach ein paar weiteren Tagen Aufzeichnung kann ich wieder berichten.

Ein Befehl der beim Starten geschickt wird hat zunächst mal gezeigt das der AVR nur neu Startet wenn er tatsächlich vom Strom getrennt war.
Ich habe jetzt mal die Vorschläge von dino umgesetzt.
mit einem anderen Netzteil und den zusätzlichen Kondensatoren gab es nun die letzten Tage keine Störungen. Da es soweit Stabil gelaufen ist habe ich es jetzt wieder an mein Netzteil vom Miniserver mit angeschlossen. Den Tag über heute hatte ich ebenfalls noch keine Störungen.

Ich glaube in Zukunft muss ich immer dino fragen wo überall was für Kondensatoren wo hinmüssen.
Ob es jetzt am Tiefpass liegt, oder an den zusätzlichen Pufferkondensatoren kann ich jetzt nicht sagen. Aber in Zukunft werde ich die Kondensatoren wohl so ähnlich auswählen.

Der Vollständigkeit halber noch die restlichen Antworten auf dinos Fragen.
Sämtliche Geräte die in irgendeiner Form mit dieser Anlage verbunden sind, sind auf der selben Sicherung angeschlossen. Ob das jetzt wegen Erdschleife oder sowas gut oder schlecht ist, kann ich nicht bewerten. Da aber in diesem Fall keine Ausgleichsströme über die Schirmleitung fließen denke ich mal sollte es so eher besser als schlechter sein.

Die Spannungsanpassung mit dem Linearregler ist eigentlich nur ein schneller Versuchsaufbau. Verlustleistungsmäsig ist es ja nicht ganz der Bringer fast 20V Spannung an dem Regler verheizen zu lassen. Nur findet sich eigentlich immer so ein 7805 in der Bastelkiste......
Langfristig soll da aber schon ein Stepdown Wandler hinkommen.

Die nächsten Tage bin ich im Ausland. So lange werde ich die Aufzeichnung jetzt nochmal laufen lassen. Aber so wie es bis jetzt aussieht, sollte jetzt alles stabil laufen. Ich melde mich dann wieder wenn es neue Erkenntnisse gibt.

Vielen Dank an alle helfenden.
 
So, jetzt ein letztes Update.

Ich habe alles jetzt seit ca. einer Woche so in Betrieb wie es mal sein soll. Seither gab es jetzt keine Störungen. Ich denke das Thema sollte damit also erledigt sein.
Vielen dank an alle Helfer für den wie immer guten Rat.
 
Danke für die Rückmeldung.

Wir hatten ja eigentlich schon relativ früh vermutet, daß Störungen auf der Signalleitung zum AVR (warum/woher auch immer) dafür verantwortlich sein könnten (deswegen "mitloggen").
Wann man die "Störungen" nicht selbst abgestellt bekommt, kann man eben versuchen, diese mit einem Hardware-Tiefpaß rauszufiltern, und/oder sie mit einem Software-Tiefpaß (o.ä.) zu ignorieren.

Grüße
LotadaC
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)