Forum: Mikrocontroller und Digitale Elektronik RS485 Differenz simulieren mit Atmega360p


von Kahn P. (Gast)


Lesenswert?

Hallo zusammen,

ich habe einen Trigger-Eingang der als RS485 alias(EIA-485)
Spezifiziert ist.

Nun möchte ich mit dem Atmega 360p die Pegeldifferenz simulieren,
ohne lauter Wiederstände anzuwenden.

Mit 2 IO-Ports kommt irgendwie Mist bei raus.
(Triggert nicht korrekt).

Kann ich mit zwei PWM Ausgängen das Differenzsignal hinbekommen ?

Gibt es Beispiele ?


Vielen Dank für jeden Hinweise
  Karsten aus Berlin

von Markus (Gast)


Lesenswert?

> Mit 2 IO-Ports kommt irgendwie Mist bei raus.

Was passiert konkret? Wie sieht die Generierung der Signale aus?

von Falk B. (falk)


Lesenswert?

@Karsten S. (kahnsoft)

>Nun möchte ich mit dem Atmega 360p die Pegeldifferenz simulieren,
>ohne lauter Wiederstände anzuwenden.

Kann man machen, man muss nur zwei IOs synchron umschalten. Also nicht 
NACHEINANDER sonder echt gleichzeitg. Das geht mit einem passenden 
Portzugriff.

>Kann ich mit zwei PWM Ausgängen das Differenzsignal hinbekommen ?

Braucht man nicht.
1
#define PIN1 PD0
2
#define PIN2 PD3
3
4
PORTD ^= (1<<PIN1) | (1<<PIN2);

von Kahn P. (Gast)


Lesenswert?

Hallo,

danke für deine Antwort.

Also es handelt sich um einen HighEnd -Controller für industrielle 
Anwendungen. Getriggert wird der also über eine RS485 Vereinbarung.
(Also keine Kommunikation nur ein Bit quasi)

Hier kann man schon bei Google sehen, das eine Leitung High geht wärend 
auf der anderen eine Flanke stattfindet, nur wird die nicht Null sondern
im 5V Fall z.b. 4.8V im Verhältnis zur Quittungsleitung 5V.

So bildet die "Quittung 5V" und das Signal(4.8V) eine Differenz also 
auch LVDS genannt.

Ich fummel mich da jetzt ran , setze mit einem Arduino die Quittung auf
analogout PWM 255 und das Signal auf dem zweiten AnlOut auf 250 nun wird 
das scheinbar gut durchgetriggert.

Ob ich durch den Pfusch nun Signale verliere kann ich nur schwer 
ermitteln.

Die Frequenzen sind niedrig im 200Hz Bereich.

Was mich nun stört das ich in testserien am Oszi das alles ausprobieren 
muss, wiederstände wollte ich da nicht einschustern in die Leitung.


Für Trainingshinweise bin ich sehr Dankbar, ich bin ja Informatiker und 
Touchiere die Mikroelektronik mit gefährlichem Halbwissen.

Läuft also so lala..

Dank Dir
 Grüße aus Berlin
   Karsten

von Markus (Gast)


Lesenswert?

> ... Informatiker ...

Unwahrscheinlich :)

von c-hater (Gast)


Lesenswert?

Markus schrieb:

>> ... Informatiker ...
>
> Unwahrscheinlich :)

Wieso? Ich jedenfalls habe nur recht wenige Informatiker kennengelernt, 
die tatsächlich programmieren können, aber eine ganze Menge, die viele 
Tage lang darüber reden können, wie man es richtig machen sollte...

Das sind dann die Leute, die bei SAP, T-Systems usw. das Sagen haben...

Ich vermute fast, das sie auch beim BER irgendwie beteiligt waren...

von Kahn P. (Gast)


Lesenswert?

Ach seit der Kindheit habe ich schon den Bastelgang Radioman von Kosmos
Und alle EE2050 Philips serien  :)  Und Softwareentwicklung mache ich 
seit zx81 zeiten also 1981

Langsam komme ich dahinter ..

Der LVDS Simulator sieht dann so aus:

inline void Trigger(void)//emit short diff flash
{
  //LVDS Signal emulator
  analogWrite(OUTPORT1,250);//Signal
  analogWrite(OUTPORT2,255);//Resp
  delayMicroseconds(500);

  analogWrite(OUTPORT1,255);//Signal
  analogWrite(OUTPORT2,0);//resp

  delayMicroseconds(500);

  vTrigger++;
}

Habe noch einen verdammten Teiler im Controller gefunden und umgestellt, 
nun komme ich auf gute Ergebnisse muss aber weiter prüfen..

Oft hilft es einfach nur von was zu qwatschen was das thema noch mal 
verinnerlicht.

Grüße aus berlin
 Kasrten

von Kahn P. (Gast)


Lesenswert?

Mensch jo das ist gut, ich lasse mich immer vom Arduino verführen..

#define PIN1 PD0
#define PIN2 PD3

PORTD ^= (1<<PIN1) | (1<<PIN2);



thx

von Falk B. (falk)


Lesenswert?

@Karsten S. (kahnsoft)

>Also es handelt sich um einen HighEnd -Controller für industrielle
>Anwendungen. Getriggert wird der also über eine RS485 Vereinbarung.
>(Also keine Kommunikation nur ein Bit quasi)

Schon klar.

>Hier kann man schon bei Google sehen, das eine Leitung High geht wärend
>auf der anderen eine Flanke stattfindet,

Nö, die Signale schalten praktisch gleichzeitig. Eins geht hoch, das 
andere  runter.

> nur wird die nicht Null sondern
>im 5V Fall z.b. 4.8V im Verhältnis zur Quittungsleitung 5V.

???

>So bildet die "Quittung 5V" und das Signal(4.8V) eine Differenz also
>auch LVDS genannt.

Nö, LVDS ist zwar auch differentiell, aber ein anderer, elektrischer 
Standard als RS485.

>Ich fummel mich da jetzt ran , setze mit einem Arduino die Quittung auf
>analogout PWM 255 und das Signal auf dem zweiten AnlOut auf 250 nun wird
>das scheinbar gut durchgetriggert.

Was zu Geier murkst du da rum? Duch braucht keine Sekunde PWM!!!

>Für Trainingshinweise bin ich sehr Dankbar, ich bin ja Informatiker und
>Touchiere die Mikroelektronik mit gefährlichem Halbwissen.

Merkt man.

von Falk B. (falk)


Lesenswert?

@ Karsten S. (kahnsoft)

>Mensch jo das ist gut, ich lasse mich immer vom Arduino verführen..

>#define PIN1 PD0
>#define PIN2 PD3

>PORTD ^= (1<<PIN1) | (1<<PIN2);

Vielleicht nicht soviel Kaffee/Red Bull/whatever saufen und mal 
versuchen, mit vernünftgen Worten einen vernünftigen Inhalt zu 
kommunizieren?

Was wolltest du uns mitteilen?

von Frank K. (fchk)


Lesenswert?

Warum nimmst Du nicht einfach ein Treiber-IC?

Das da z.B.?
http://www.ti.com/lit/ds/symlink/ua9638.pdf

Das wäre die saubere Lösung.

fchk

von Roland P. (pram)


Lesenswert?

Mit analogWrite wird das wahrscheinlich nix, da dies über PWM generiert 
wird.
Und mir scheint, du wolltest hier die 200mv simulieren, die mindestens 
erforderlich sind.
Du kannst direkt mit +-5V der Portpins rein gehen (Ein MAX485  erlaubt 
bis 12,5V am Eingang)

VG Roland

von Kahn P. (Gast)


Lesenswert?

Hi,

also danke an alle angeschlossenen Stationen :)

Läuft halt mit dem Register: PORTD ^= (1<<PIN4) | (1<<PIN5);
(das mit dem LVDS difference signal war hier bedenklich mit dem 
portswitch läuft das auch, und wohl sicher besser)

Alles jute danke für die Hilfen.


Grüße aus Berlin.

von Kahn P. (Gast)


Lesenswert?

Nur so geht es also, das ist die einzige gültige Flanke.
Sieht trivial aus aber nur mit der negation der bits
läuft das.
#include <avr/io.h>
DDRD = B00111000;//outport mask

//RS485 Trigger
void Trigger(void)
{
   PORTD = (1<<PIN4) | ~(1<<PIN5);
   delayMicroseconds(10);//ggf. anpassen
   PORTD = ~(1<<PIN4) | (1<<PIN5);
}

Danke nochmal der Hinweise. Alles zusammen hat das Problem gelöst,
getestet am Atmel360p via Arduino.

von A. S. (Gast)


Lesenswert?

Karsten S. schrieb:
> Nur so geht es also, das ist die einzige gültige Flanke.
> Sieht trivial aus aber nur mit der negation der bits läuft das.

Dir ist aber schon klar, dass Deine Erläuterungen Nonsens waren? Bsp:

Karsten S. schrieb:
> Hier kann man schon bei Google sehen,
Wenn man einen konkreten Typen hätte, einfaches rs485 war's ja nicht.

> das eine Leitung High geht wärend
> auf der anderen eine Flanke stattfindet,

Was unterscheidet Flanke von "high geht"

> nur wird die nicht Null sondern
> im 5V Fall z.b. 4.8V im Verhältnis zur Quittungsleitung 5V

Hier führst Du "Quittungsleitung" ein

> So bildet die "Quittung 5V" und das Signal(4.8V) eine Differenz also
> auch LVDS genannt.

Ohne Datenblatt deiner Aufgabe sind die Erläuterungen sinnfrei.

Dass dann Falk eine Lösung postet, 2 Bits zu invertieren, und Du 
stattdessen alle 8 setzt, zeigt: ja, Informatiker

von pssst.... (Gast)


Lesenswert?

psst... es reicht, einen der differentiellen Eingänge an 2,5V zu hängen 
und den anderen mit einem Portpin zu bespaßen...

von Kahn P. (Gast)


Lesenswert?

>>Autor:  Achim S. (achs)
>>Dass dann Falk eine Lösung postet, 2 Bits zu invertieren, und Du
>>stattdessen alle 8 setzt, zeigt: ja, Informatiker


Das hat am allerbesten geholfen !

von Falk B. (falk)


Lesenswert?

@Karsten S. (kahnsoft)


>void Trigger(void)
>{
>   PORTD = (1<<PIN4) | ~(1<<PIN5);

Über diesen Term denken wir dann doch noch einmal nach.

Siehe Bitmanipulation und

https://www.mikrocontroller.net/articles/Bitmanipulation_-_Standard_C_-_DeMorgan_Umformung

>   PORTD = ~(1<<PIN4) | (1<<PIN5);

Dito.

>Danke nochmal der Hinweise. Alles zusammen hat das Problem gelöst,
>getestet am Atmel360p via Arduino.

Da hattest du mehr Glück als Verstand. Schon mal überlegt, das die 
anderen Bits in dem Register machen?

von Kahn P. (Gast)


Lesenswert?

ist okay so.. machen was sie sollen danke nochmal !

von Einer K. (Gast)


Lesenswert?

Mein Vorschlag:
(unter der Voraussetzung, dass vorher schon ein Pin High und der andere 
Low gesetzt ist)
1
//RS485 Trigger
2
void Trigger(void)
3
{
4
   PIND = (1<<PD4) | (1<<PD5); // 2 Pin toggle
5
   delayMicroseconds(10);//ggf. anpassen
6
   PIND = (1<<PD4) | (1<<PD5); // 2 Pin toggle
7
}

von Halb Leerer (Gast)


Lesenswert?

Ich staune (mit grossen Augen) welch massives Wissen und
Fähigkeiten Informatiker mitbringen.

Dagegen sind wir Spaghetti-Codierschweine doch arme Würstchen.

von Kahn P. (Gast)


Lesenswert?

Hallo Ufo,

funktioniert leider nicht, die müssen sich als Paar gegenseitig
negieren beim zweiten signal nach 10-100 ns.
Ein Trigger besteht aus dem Wechsel der Bits daher exclude ~

Danke für deinen Hinweis!

Ist ggf. auch eine Eigenschaft der hohen Datensicherheit auf dieser 
Leitung.  1Kw Co2 Laser.

von Einer K. (Gast)


Lesenswert?

Karsten S. schrieb:
> Hallo Ufo,
Wer ist "Ufo"?

von Kahn P. (Gast)


Lesenswert?

Hallo UfUf :) Ufo war nicht korrekt :)

Was ich damit mache wenn es interessiert sieht man in einem Erklärvideo 
dazu: https://www.youtube.com/watch?v=jfWM6e0R0mk

Viele Grüße
  Karsten

von Einer K. (Gast)


Lesenswert?

Karsten S. schrieb:
> Ufo war nicht korrekt :)
OK....
Dann bin ich gemeint...

Atmega360p ist auch nicht korrekt.
Denn weder Microchip, noch Google kennt einen Atmega360p
(oder habe ich was übersehen?)

Karsten S. schrieb:
> funktioniert leider nicht, die müssen sich als Paar gegenseitig
> negieren beim zweiten signal nach 10-100 ns.
> Ein Trigger besteht aus dem Wechsel der Bits daher exclude ~
Ich habe deinen µC als halbwegs modernen ATMega angenommen, das P deutet 
darauf.
Und bei diesen funktioniert der Toggle auf diese Art.
Die Bedingungen, unter dem das von dir gewünschte Verhalten erzeugt 
wird, habe ich auch genannt.

Ich nehme also an, dass du nur behauptest, dass mein Code nicht 
funktioniert.
Getestet hast du das nicht.

Aber, wie so oft:
Das Datenblatt zu deinem µC gibt gerne zu dem Punkt Auskunft.

von Kahn P. (Gast)


Lesenswert?

Danke für den Hinweis es ist ein 328P. (2 Euro)

Ne läuft nicht durch Wiederholung des selben Musters.
Wie gesagt es wechselt sich der Inhalt alles gut,
läuft ja prima.

Danke für deine Hilfe.
  Gruß
    Karsten

von Einer K. (Gast)


Lesenswert?

Karsten S. schrieb:
> Ne läuft nicht durch Wiederholung des selben Musters.
> Wie gesagt es wechselt sich der Inhalt alles gut,
> läuft ja prima.


Kannst du das übersetzen?

Der 328p kann den Toggle über das PINx Register

von Falk B. (falk)


Lesenswert?

KEINE MACHT DEN DROGEN!!!

ADHS ist überall . . .

OMG!

von Einer K. (Gast)


Lesenswert?

Halb Leerer schrieb:
> Ich staune (mit grossen Augen) welch massives Wissen und
> Fähigkeiten Informatiker mitbringen.
>
> Dagegen sind wir Spaghetti-Codierschweine doch arme Würstchen.

Ich verstehe, dass dein Kommentar negativ bewertet wird.
Muss dir aber zustimmen!

Bin allerdings als Hobbyprogrammierer, als Arduinojünger, kaum in der 
Position, gestandene Informatiker kritisieren zu dürfen.

Aber in diesem Thread fallen mir einige Dinge auf.
z.B. mangelnde Sorgfalt.
(...,Ufo,360p,...)

Ich erwarte von einem Informatiker, dass er ganze und verständliche 
Sätze schreiben kann.
Das er die binären Operatoren vollständig beherrscht, oder zumindest 
weiß, wo man das nachlesen kann und und der Lage ist sich kundig zu 
machen.

Die in Beitrag "Re: RS485 Differenz simulieren mit Atmega360p" vorgestellte 
Funktion soll angeblich funktionieren.
ok...
Aber sie hat Seiteneffekte, welche mit Sicherheit nicht gewünscht sind, 
und einem (mit hoher Wahrscheinlichkeit) zu späterer Zeit derbe auf die 
Füße fallen werden.
Das ist das, was ich öfter mit "schlampige Arbeit" bezeichne.
Hier sage ich: "Mangelnde Sorgfalt."

Die Variante mit dem ^= ist da eindeutig vorzuziehen.
Meine Variante ist ein paar Takte schneller, braucht etwas weniger 
Flash, bietet sonst keine Vorteile.

Verwundern tut mich, dass mein Toggle Verfahren vom TE nicht verstanden 
wird/wurde. Und als defekt erklärt wird. Dabei ist das Verhalten doch 
eindeutig im Datenblatt beschrieben.


OK, vielleicht erwarte ich zu viel...
Vielleicht ist meine Position auch nicht die, dass ich überhaupt was 
erwarten "darf".

--
Alles in allem:
Dieser Thread "verstört" mich etwas.

von Halb Leerer (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Aber in diesem Thread fallen mir einige Dinge auf.

Ja ... da ist so ziemlich alles auffällig.
Danke dass sich jemand noch die Mühe macht dies alles
auch in einem anderem Licht zu betrachten. Scheinbar
gibt es hier genügend Leute die sehr enge Scheuklappen
aufgesetzt haben.

Arduino Fanboy D. schrieb:
> Dieser Thread "verstört" mich etwas.

So verstörend dass man schon mit hoher Sicherheit von
einem Troll-/Fake-Thread sprechen darf.

Oder man kann es einfach nicht glauben dass solche
"Informatiker" wirklich ihr Unwesen treiben und es
ist tatsächlich so.

von A. S. (Gast)


Lesenswert?

Karsten S. schrieb:
> Ist ggf. auch eine Eigenschaft der hohen Datensicherheit auf dieser
> Leitung.  1Kw Co2 Laser.

Das macht mir dann Angst.

von Tom (Gast)


Lesenswert?

Achim S. schrieb:
> Karsten S. schrieb:
>> Ist ggf. auch eine Eigenschaft der hohen Datensicherheit auf dieser
>> Leitung.  1Kw Co2 Laser.
>
> Das macht mir dann Angst.
Ja, ich hoffe auch, das da weitere Sicherheitsmechanismen verbaut sind, 
die nicht von unserem Informatiker entworfen worden.

von Kortschnoi (Gast)


Lesenswert?

Also hier läuft mal wieder eine Diskreditierung.

Der hat freundliche Fragen formuliert, und das sind
ganz normale Probleme auf die man stoßen wird.

Man sollte sich Ehre und Respekt erhalten, oder Sachlich bleiben
von wegen Drogensüchtiger und Psychischer ADHS Fall.
Trifft eher für die zu, die solche Hetzen veranstalten.

von achs (Gast)


Lesenswert?

Kortschnoi schrieb:
> Also hier läuft mal wieder eine Diskreditierung.
>
> Der hat freundliche Fragen formuliert, und das sind
> ganz normale Probleme auf die man stoßen wird.
>
> Man sollte sich Ehre und Respekt erhalten, oder Sachlich bleiben
> von wegen Drogensüchtiger und Psychischer ADHS Fall.
> Trifft eher für die zu, die solche Hetzen veranstalten.
mit dem letzten Absatz hast Du natürlich recht. Was ich hier jedoch 
bedenklich finde, ist weniger die fehlende HW-Kenntniss (die dann mit 
munter sinnfreie eingeworfenen Begriffen kaschiert wird) sondern
- kein Datenblatt oder Typ, um den sonst wirren Pegel- und 
Trigger-Ausführungen folgen zu können
- anscheinend kein Verständnis von boolschen Operationen als 
Informatiker.

Wenn er irgendwie erwähnte: PortD ist sonst nicht belegt, dann könnte 
man ja sagen: boah, abgefahrener Pfuscher. Aber so sehe ich ihn 
übermorgen posten: "Kühlung wird beim Triggern ausgeschaltet, 5V mit 
PWM-DAC erzeugen?"

von Kahn P. (Gast)


Lesenswert?

Alles gut Kortschnoi,

die jüngere Generation ist nicht mehr so wie früher wo man froh war 
überhaupt über ein Thema ohne Briefverkehr zu reden.

Und keine Sorge boolesche Algebra hatten wir auf dem zx81, da war mal 
jedes Bit wichtig , von 2 euro Rechnern mit 20Mhz haben wir nicht zu 
träumen gewagt. Sollte man mal zu schätzen wissen.

Dazu spielte Abba. Aber dieser LVDS kombinierte RS485 Port ist 
undokumentiert. Wir haben zuerst versucht mit versch. Pegeln die 
Differenz zu liefern, ausschlaggebend waren aber zwei Trigger mit 
gedrehtem Inhalt und zwar im ns Bereich gleichzeitig, und in einem 
bestimmten Zeit Fenster, das muss man erst austüfteln, und daher hier 
der Dialog, oft ist es wichtig drüber zu reden.

Und auch für die jüngeren ist das wichtig, die müssen sich erstmal an 
die Basis halten und schreien wenn was abweicht, später wird man 
lockerer.

Der Atmel 328P ist zum Testen. Wird später über eine S7 getriggert.

Grüsschen aus Berlin
   Karsten
     (InHale)

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.