Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen 2 MC


von Pascal G. (pascalgieringer)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin noch ziemlicher Anfänger im Programmieren und komme gerade nicht 
weiter. google und ChatGPT bringen auch nichts und hier im Forum habe 
ich auch nichts passendes gefunden.

Ich versuche über UART einen Text von dem einen MC zum Anderen zu senden 
und diesen dann über ein LCD ausgeben zu lassen.
in erster linie dient es mir nur dazu mich mit dem system auseinander zu 
setzen und mit den Funktionen vertraut zu werden.

wenn ich die Daten vom ersten MC über des Serial Monitor vom PC auslese 
passt alles
wenn ich den Zweiten dran hänge RX>TX und TX>RX scheint es so als würden 
keine daten empfangen werden.

Ich schaffe es Leider nicht über den SerialMonitor von PIO Daten zum 
zweiten Mc zu senden um zu überprüfen ob bei der Programmierung alles 
passt.

über einen "kleinen" Tipp wo mein Fehler liegen könnte wäre ich euch 
sehr Dankbar

mfg Pascal
von Lutz S. (lutzs)


Lesenswert?

Funktioniert das LCD am zweiten Controller denn ohne die Eingabe über 
den seriellen Port?

Teste das mal (durch Codeänderung) indem du dort direkt Zeichen 
ausgibst, die dann später von der seriellen Schnittstelle kommen.

Also das klassische Vorgehen bei der systhematischen Fehlersuche: 
auftrennen in Blöcke und damit herausfinden, auf welcher Seite sich das 
Problem befindet.
von Rainer W. (rawi)


Lesenswert?

Pascal G. schrieb:
> über einen "kleinen" Tipp wo mein Fehler liegen könnte wäre ich euch
> sehr Dankbar

Deine Shift-Taste funktioniert nur sehr erratisch und die ','-Taste 
hakt.

> wenn ich die Daten vom ersten MC über des Serial Monitor vom PC auslese
> passt alles
> wenn ich den Zweiten dran hänge RX>TX und TX>RX scheint es so als würden
> keine daten empfangen werden.

Besitzt du einen Logikanalysator oder ein Oszi, um festzustellen, was 
dabei auf den Datenleitungen oder anderen GPIOs passiert?
Dann könntest du bspw. in der ISR mit einem Pin wackeln, um zu 
verifizieren, ob der Empfangsinterrupt ausgelöst wird. Ein Break Point 
verrät dir natürlich auch, ob die ISR angesprungen wird. Hast du dir im 
Debugger die Flags für die Freigabe des Interrupts angesehen? Oder woran 
machst du das "scheint" fest?

Programmieren ist keine Kernkompetenz vom ChatGPT.
: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Pascal G. schrieb:
> Ich versuche über UART einen Text von dem einen MC zum Anderen zu senden

MC --> Music Casette?

Zitat:

Die Abkürzung MC hat je nach Kontext verschiedene Bedeutungen. Die 
geläufigsten sind:

Musik & Entertainment: Steht für Master of Ceremonies 
(Zeremonienmeister). Im Hip-Hop bezeichnet es den Rapper, Entertainer 
oder die Person, die durch ein Event führt.

Motorrad-Szene: Steht für Motorcycle Club (Motorradclub), oft verwendet 
von klassischen, organisierten Motorrad-Banden.

Gastronomie & Handel: Steht umgangssprachlich oft für die 
Fast-Food-Kette McDonald’s.

Namen: Ist in schottischen und irischen Nachnamen (wie Mac) die Kurzform 
für Son of (Sohn von).

Medizin: Kann für Morbus Crohn (eine chronisch-entzündliche 
Darmerkrankung) stehen.
von Hans W. (hanswieland)


Lesenswert?

Wenn es mit Interrupt nicht klappt würde ich einen Gegentest ohne 
Interrupt (Polling der Statusregister in einer Loop) versuchen. Dann 
weisst du, ob das Interrupt-Handling fehlerhaft war, oder es woanders 
scheitert.
Beitrag #8052609 wurde vom Autor gelöscht.
von Pascal G. (pascalgieringer)


Lesenswert?

Das Display funktioniert, ich habe eine if Abfrage ob die 
Datenübertragung beendet ist, danach wird eine variable auf true gesetzt 
und in der while schleife auf ihre Richtigkeit geprüft.

Ist das der Fall soll der String in der 1. Zeile ausgegeben werden.
Ansonsten wird ein Standard Text ausgegeben der auch angezeigt wird.
von Pascal G. (pascalgieringer)


Lesenswert?

Hans W. schrieb:
> Wenn es mit Interrupt nicht klappt würde ich einen Gegentest ohne
> Interrupt (Polling der Statusregister in einer Loop) versuchen. Dann
> weisst du, ob das Interrupt-Handling fehlerhaft war, oder es woanders
> scheitert.

Gute Idee, werde das später gleich ausprobieren.
von Alexander (alecxs)


Lesenswert?

Wastl schrieb:
> Die Abkürzung MC hat je nach Kontext verschiedene Bedeutungen.

Und dieser Kontext fehlt in in diesem MännerClub / MüllContainer völlig.
von Norbert (der_norbert)


Lesenswert?

Pascal G. schrieb:
> wenn ich den Zweiten dran hänge RX>TX und TX>RX scheint es so als würden
> keine daten empfangen werden.

Nur zur Vollständigkeit:
Hast du denn auch Gnd <---> Gnd verbunden?

Add: Ansonsten zur Fehlersuche ohne Geräte
Test1: LED ein wenn ISR angesprungen wird.
Test2: Wenn der µC PWM auf die LED kann, Helligkeit (PWM duty) 
inkrementieren mit steigendem ›index‹
: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Ich kann mich auch nur anschließen und Dir empfehlen, einen 10€ Logic 
Analyzer zu kaufen. Auch wenn Du momentan noch nicht den Sinn erkennen 
magst, es wird für derlei Aufgaben dein Lieblingsinstrument werden. Dazu 
ist es wirklich leicht zu bedienen, bei den heutigen einfachen USB-LA 
bedarf es keiner großen Einarbeitung. Schau mal ein paar enstprechende 
Tutorials. Du wirst dann wunderbar beobachten können, was tatsächlich 
zwischen den beiden Seiten passiert.

So etwas wie das hier (nur Beispiel) reicht für den Anfang völlig:
https://www.amazon.de/Analyzer-Binghe-Unterst%C3%BCtzung-Sprungdraht-kompatibel/dp/B0D868ST5C
von Thomas W. (goaty)


Lesenswert?

Pascal G. schrieb:
> wenn ich die Daten vom ersten MC über des Serial Monitor vom PC auslese
> passt alles
> wenn ich den Zweiten dran hänge RX>TX und TX>RX scheint es so als würden
> keine daten empfangen werden.

Jeder Controller hat eine serielle Schnittstelle und du klemmst alle 
zwei plus PC direkt zusammen ?
Wieso brauchst du beim zweiten Controller die Verbindung bidirektional ?
Vielleicht verstehe ich es auch nicht wirklich....
von Pascal G. (pascalgieringer)


Lesenswert?

Thomas W. schrieb:

> Jeder Controller hat eine serielle Schnittstelle und du klemmst alle
> zwei plus PC direkt zusammen ?
> Wieso brauchst du beim zweiten Controller die Verbindung bidirektional ?
> Vielleicht verstehe ich es auch nicht wirklich....

Nein, ich verbinde beide Controller über RX + TX miteinander und nutze 
eine Externe Spannungsquelle, dementsprechend sollten die meiden 
Controller ja miteinander kommunizieren.

Die Verbindung über USB war nur um zu prüfen ob der erste etwas sendet.
oder Funktioniert die Kommunikation da dann anders?

Konkret sende ich vom einen Controller eine Zahl die am anderen über das 
LCD ausgegeben werden soll.
PS. das ist nur zum Testen, später sollen da mehrere werte und infos 
übertragen und ausgewertet werden ;)
von Pascal G. (pascalgieringer)


Lesenswert?

Norbert schrieb:
> Nur zur Vollständigkeit:
> Hast du denn auch Gnd <---> Gnd verbunden?

Jap, beide Controller sind über die gleiche Spannungsquelle verbunden,

> Add: Ansonsten zur Fehlersuche ohne Geräte
> Test1: LED ein wenn ISR angesprungen wird.
> Test2: Wenn der µC PWM auf die LED kann, Helligkeit (PWM duty)
> inkrementieren mit steigendem ›index‹

werde ich auch mal noch versuchen, danke :)
Meine Vermutung ist ja das ich im Code nen Bock geschossen hab(würde 
mich wundern wenn nicht)
von Mario M. (thelonging)


Lesenswert?

RXCIE0 ist in UCSR0B.
von Pascal G. (pascalgieringer)


Lesenswert?

Mario M. schrieb:
> RXCIE0 ist in UCSR0B.

Danke, das war der Fehler.
Beitrag #8052705 wurde vom Autor gelöscht.
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Das Problem hat sich ja erledigt. Trotzdem ein Nachsatz:

Wenn es nicht um sehr schnelle Übertragung oder große Datenmengen geht, 
nutze ich immer "Soft Serial". Das hat den Vorteil, dann man (fast) alle 
anderen GPIOs zu RX und TX machen kann, die dann entsprechend mit ihrem 
Gegenpart verbunden werden. Die wichtigsten Methoden dieser Klasse sind 
identisch mit denen von (Hard-) Serial.

Das hat den Vorteil, dass die UART, die mit dem USB-Wandler verbunden 
ist, für das Debugging bzw. neu Flashen frei bleibt.

Es gibt auch "Single Wire UART"-Libraries, die nur eine einzige Leitung 
für beide Richtungen benötigen, falls keine echte Duplex-Übertragung 
benötigt wird ...
: Bearbeitet durch User
von Pascal G. (pascalgieringer)


Lesenswert?

Frank E. schrieb:
> Das Problem hat sich ja erledigt. Trotzdem ein Nachsatz:
>
> Wenn es nicht um sehr schnelle Übertragung oder große Datenmengen geht,
> nutze ich immer "Soft Serial". Das hat den Vorteil, dann man (fast) alle
> anderen GPIOs zu RX und TX machen kann, die dann entsprechend mit ihrem
> Gegenpart verbunden werden. Die wichtigsten Methoden dieser Klasse sind
> identisch mit denen von (Hard-) Serial.
>
> Das hat den Vorteil, dass die UART, die mit dem USB-Wandler verbunden
> ist, für das Debugging bzw. neu Flashen frei bleibt.
>
> Es gibt auch "Single Wire UART"-Libraries, die nur eine einzige Leitung
> für beide Richtungen benötigen, falls keine echte Duplex-Übertragung
> benötigt wird ...

OK cool, werd ich mir mal anschauen,

Eine Frage hätte ich aber noch,
Es soll doch eine Möglichkeit geben über den SerialMonitor in PIO
Werte oder Zeichen an dem Microcontroller zu senden.
muss ich da noch irgendwas einstellen?
hab das Programm compiliert und den SerialMonitor gestartet, aber wo 
kann ich da eine Eingabe machen?
der Cursor blinkt aber es zeigt mir nichts an.
Auch mit dem Arduino Sketch der den Text zurücksenden soll den man 
Schickt kommt nichts zurück wenn ich Text eingebe und Enter drücke.
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Pascal G. schrieb:
> Es soll doch eine Möglichkeit geben über den SerialMonitor in PIO
> Werte oder Zeichen an dem Microcontroller zu senden.

Die Serielle ist kein Bus!

Warum verbindest du nicht deine 2 µC über I2C?
Dann bleibt die Serielle frei für die Kommunikation mit dem PC.
: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Pascal G. schrieb:
> Es soll doch eine Möglichkeit geben ...

Es soll auch die Möglichkeit geben, die Shift-Taste dort zu benutzen, wo 
es sich entsprechend den Gepflogenheiten der Rechtschreibung anbietet 
...
scnr
: Bearbeitet durch User
von Pascal G. (pascalgieringer)


Lesenswert?

Arduino F. schrieb:
> Pascal G. schrieb:
>> Es soll doch eine Möglichkeit geben über den SerialMonitor in PIO
>> Werte oder Zeichen an dem Microcontroller zu senden.
>
> Die Serielle ist kein Bus!
>
> Warum verbindest du nicht deine 2 µC über I2C?
> Dann bleibt die Serielle frei für die Kommunikation mit dem PC.

Weil es erstmal um die Kommunikation über UART geht.
Die Frage bezüglich pio war eher allgemein.
Wie kann ich unabhängig vom ersten Projekt Daten/Werte vom PC an den 
Controller senden. Das sollte doch mittels Serierlem Monitor 
funktionieren oder?
von Pascal G. (pascalgieringer)


Lesenswert?

Rainer W. schrieb:
> Pascal G. schrieb:
>> Es soll doch eine Möglichkeit geben ...
>
> Es soll auch die Möglichkeit geben, die Shift-Taste dort zu benutzen, wo
> es sich entsprechend den Gepflogenheiten der Rechtschreibung anbietet
> ...
> scnr

Und was hilft mir diese Aussage bei meinem Problem?
Hättest du mir die Frage beantwortet wenn ich jedes Wort richtig groß 
oder klein geschrieben hätte?
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich hab Soft Serial empfohlen, weil man damit am Einfachsten und 
ziemlich sicher zu einem Resultat kommt.

Natürlich kann ein Arduino auch I2C senden und es gibt Libs, um einen 
Client zu simulieren, oder SPI oder OneWire oder Ethernet ... geht 
alles, ist nur nicht so trivial.
von Pascal G. (pascalgieringer)


Lesenswert?

Frank E. schrieb:
> Ich hab Soft Serial empfohlen, weil man damit am Einfachsten und
> ziemlich sicher zu einem Resultat kommt.
>
> Natürlich kann ein Arduino auch I2C senden und es gibt Libs, um einen
> Client zu simulieren, oder SPI oder OneWire oder Ethernet ... geht
> alles, ist nur nicht so trivial.

Ok, das Problem mit dem Resultat hat sich ja erledigt, der Fehler lag ja 
am falsch gesetzten interrupt.

Allerdings bleibt aktuell noch das Problem mit der nicht 
funktionierenden Übertragung vom pc zum Controller.
Das brauche ich für nichts spezielles aber zum testen ob ein Controller 
etwas empfängt und verarbeiten kann, wäre es doch ein gutes Instrument.
Oder gibt es da andere Möglichkeiten?
von Christian M. (christian_m280)


Lesenswert?

Frank E. schrieb:
> es gibt Libs, um einen Client zu simulieren, [] ... geht alles, ist nur nicht so 
trivial.

Anscheinend schon, zumindest einen I2C Slave kann man mit der normalen 
Lib machen. Einfach die Adresse bei wire.begin angeben. Habe das grad 
heute in kürzester Zeit das erste Mal umgesetzt.

Gruss Chregu
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Christian M. schrieb:
> Habe das grad
> heute in kürzester Zeit das erste Mal umgesetzt.

Es ist wirklich ganz einfach!
Bis auf, dass die Slave Callbacks im ISR Kontext laufen. Da muss man 
schon in paar Kleinigkeiten beachten.
von Rainer W. (rawi)


Lesenswert?

Pascal G. schrieb:
> Und was hilft mir diese Aussage bei meinem Problem?

Dass ich beim Lesen nicht darüber gestolpert, sondern eher zu einer 
konstruktiven Antwort motiviert gewesen wäre.

Aber inzwischen ist ja eh klar, dass du nicht zwei Push-Pull-Ausgänge 
direkt miteinander verbinden darfst.

Aktuell finde ich nicht einmal den Schaltplan deiner uCs, um dir 
genauere Hinweise geben zu können.
von Ralph S. (jjflash)


Lesenswert?

Pascal G. schrieb:
> Allerdings bleibt aktuell noch das Problem mit der nicht
> funktionierenden Übertragung vom pc zum Controller.
> Das brauche ich für nichts spezielles aber zum testen ob ein Controller
> etwas empfängt und verarbeiten kann, wäre es doch ein gutes Instrument.
> Oder gibt es da andere Möglichkeiten?

Hm, scheinbar les ich nicht richtig (ob der Kopf beim Motorradunfall 
doch etwas abbekommen hat?).

Sehe ich das richtig und du möchtest vom PC zum Controller über UART 
etwas senden? Hierfür kannst du zwar den Serialmonitor von Arduino 
verwenden, dieser schickt allerdings komplette Strings und schickt 
seinen Text erst nach Betätigung der Return-Taste ab.

Vielleicht solltest du hierfür dann ein externes Terminalprogramm 
verwenden, dass die Zeichen eben Zeichenweise schickt und liest. Das 
Programm puTTY wäre hier ein sehr geeigneter Kandidat.

Und (da ich immer noch im Krankenhaus bin) passe ich vllt. das Progamm 
aus: Beitrag "Re: "Intelligenter" Textdisplayadapter mit Padauk PFS154" für AVR und 
Arduino an (wenn ich mich derzeit sowieso etwas mit Arduino 
beschäftige). Neben Nachteilen hat das hier den Vorteil, dass UART nicht 
belegt wird und das Textdisplay Steuerkommandos eines Terminals (CR, LF, 
TAB, BS) verarbeiten kann.
von Harald K. (kirnbichler)


Lesenswert?

Ralph S. schrieb:
> Das
> Programm puTTY wäre hier ein sehr geeigneter Kandidat.

Teraterm ist hier auch zu empfehlen. Man sollte allerdings den 
standardmäßig verwendeten Pixelfont auf was sinnvolles umstellen und 
dann die Einstellungen abspeichern, sonst wird man ... missmutig.
von Achim H. (pluto25)


Lesenswert?

Pascal G. schrieb:
> Allerdings bleibt aktuell noch das Problem mit der nicht
> funktionierenden Übertragung vom pc zum Controller.
> Das brauche ich für nichts spezielles aber zum testen ob ein Controller
> etwas empfängt und verarbeiten kann, wäre es doch ein gutes Instrument.
Zu einem Controller klappt problemlos nur alle drei zusammen nicht so 
ohne weiteres. Zumal der Pc dann nur mit einen sprechen könnte. Wie ich 
das verstanden haben soll der Pc nur zu Testzwecken dran hängen? Dann 
wäre es das einfachste die Controller zu trennen und beide an den Pc zu 
hängen. Dann kann der sehen was die einzelnen mitteilen und das selbe 
gleich zu dem anderen senden um dann dessen Antwort zu erkennen und auch 
weiter zu geben.
von Ralph S. (jjflash)


Lesenswert?

.... hochinteressant ist, dass es in der letzten Zeit (zumindest mir 
auffällig) immer häufiger "langjährige User (hier 26.06.2020)" einen 
Thread eröffnen. In diesem Falle hier genau 10 Posts! in den 6 Jahren 
(inklusive diesem hier) machen und im besten Fall einen oder 2 Anworten 
gibt.

Hmm, ich bin immer noch in der Reha und habe "einiges an Zeit" und habe 
für die Kommunikation zwischen 2 Controllern etwas älteres von mir 
(original für einen PFS154) an Arduino angepasst (weil ich damit im 
Moment für andere Projekte das etwas genauer betrachte und mich darin 
übe, wie mit Arduino im Gegensatz zu C oder auch C++ (ja ich weiß, 
Arduino IST C++) gemacht wird).

Die Portierung hat funktioniert (Kopplung von zwei UNO-Arduinos, an 
einem hängt ein Textdisplay), aber weil der Thread hier scheinbar tot 
ist, rentiert es sich wohl nicht, das gesamte auch zu dokumentieren.

Schade, dass ich auf solche Threads immer wieder reinfalle !
von Pascal G. (pascalgieringer)


Lesenswert?

Ralph S. schrieb:
> .... hochinteressant ist, dass es in der letzten Zeit (zumindest mir
> auffällig) immer häufiger "langjährige User (hier 26.06.2020)" einen
> Thread eröffnen. In diesem Falle hier genau 10 Posts! in den 6 Jahren
> (inklusive diesem hier) machen und im besten Fall einen oder 2 Anworten
> gibt.
>
> Hmm, ich bin immer noch in der Reha und habe "einiges an Zeit" und habe
> für die Kommunikation zwischen 2 Controllern etwas älteres von mir
> (original für einen PFS154) an Arduino angepasst (weil ich damit im
> Moment für andere Projekte das etwas genauer betrachte und mich darin
> übe, wie mit Arduino im Gegensatz zu C oder auch C++ (ja ich weiß,
> Arduino IST C++) gemacht wird).
>
> Die Portierung hat funktioniert (Kopplung von zwei UNO-Arduinos, an
> einem hängt ein Textdisplay), aber weil der Thread hier scheinbar tot
> ist, rentiert es sich wohl nicht, das gesamte auch zu dokumentieren.
>
> Schade, dass ich auf solche Threads immer wieder reinfalle !

Hallo Ralph,

Erstmal gute Besserung.

Zu dem Thema das ich oberhalb von 6 Jahren nur 10 Post gemacht habe, ja 
das stimmt. Ich kenne mich allerdings nur mäßig mit dem Thema aus und 
will nicht überall unnötig meinen Senf dazu geben. Außerdem war ich die 
letzten Jahre mit dem Hausbau beschäftigt und danach habe ich in 
Fernlehre meinen Techniker gemacht, was mich leider sehr viel Zeit 
gekostet hat.

Da ich jetzt hoffentlich wieder mehr Zeit habe möchte ich mich wieder 
mehr mit dem Thema programmieren beschäftigen.

Mir ist außerdem aufgefallen das ich auf deinen Thread nicht geantwortet 
habe, das tut mir leid und war absolut keine Absicht. Wie ich aber der 
Antwort auf deinen Beitrag geantwortet habe, dass ich mir die Programme 
zur Kommunikation zwischen PC und Controller anschaue, war das für mich 
inbegriffen.

Mit freundlichen Grüßen
: Bearbeitet durch User
von Ralph S. (jjflash)


Lesenswert?

.... okay: Was, warum und zu welchem Zweck möchtest du 2 µC miteinander 
koppeln. Bestimmte Wege wurden dir hier ja schon aufgezeigt, wobei I2C 
außerhalb von Arduino schon etwas "sportlich" ist, wenn man sich da 
nicht wirklich gut auskennt (hier meine ich ganz gezielt einen 
I2c-slave, ein I2C-master ist relativ trivial).

Dann die Frage nach UART. Das ist ja normalerweise ein sehr einfacher 
Weg und, wie ich hieraus schließe:

(Auszug aus deinem Listing)
1
#include <LiquidCrystal.h>
2
3
using namespace std;
4
5
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pin-Belegung für das LCD

hast du da Arduino am Start, verwendest aber dennoch eine "main" und 
gehst nicht über das setup/loop. Stellt sich hier die Frage: Warum?

Um einen Controller mit Daten vom PC zu füttern reicht ein 
Serial.begin(baudrate) ... und dann eben Serial.read / readln (um im 
Arduino Kontext zu bleiben).

Stellt sich also explizit die Frage, was du machen willst. Wenn es darum 
geht, tatsächlich "nur" ein Display an einen Controller zu hängen und 
diesen Controller von einem anderen anzufahren: viele Wege führen nach 
Rom (und hierfür hab ich ja eine Lösung gemacht).

Grundsätzlich, auch wenn das die Arduianer nicht gerne hören (und auch 
wenn ich einige Vorbehalte von mir Arduino gegenüber sehr beiseite 
geschoben habe): den seriellen Monitor der Arduino-IDE sollte man 
getrost übergehen. Oben wurde genannt puTTY (funktioniert unter Linux 
und Windows) und Teraterm (nur Windows) und damit bist du glaube ich 
wirklich besser bedient als mit dem seriellen Monitor von Arduino.

Also, schreib mal, was du explizit machen möchtest! (noch habe ich 
einiges an Zeit, wobei es zum Thema Arduino ganz sicher einige hier 
gibt, die die Arduino-Philosophie besser vertreten und dann in Ihren 
Programmen auch deutlich mehr Arduino und weniger Bare-Metall haben).
von Pascal G. (pascalgieringer)


Lesenswert?

Moin,

Das einbinden von arduino ist lediglich für die Ansteuerung des 
Displays.
Grundsätzlich geht es mir erstmal nur darum mich mit der Materie 
auseinanderzusetzen.
Während meines Technikers haben wir ein klein bisschen das Thema 
microcontroller programmieren gehabt, also so richtig mit den Registern 
und co, und da möchte ich mich jetzt einfach weiter damit beschäftigen. 
Es waren noch einige Fragen offen und die will ich nun eben angehen.

I2c werde ich später sicherlich auch mal noch behandeln.
Die arduino IDE nutze ich nicht sondern VSCode mit PIO,
Da bekomme ich zwar die Seriellen Daten vom Controller aber er empfängt 
irgendwie nichts.

Mein Versuch war,rein zu Übungszwecken für eventuelle spätere Projekte,
Eine Kommunikation zwischen 2 Controllern ODER zwischen Controller und 
PC,
Die Ausgabe via LCD war gedacht um besser kontrollieren zu können obs 
geht.
von Hans W. (hanswieland)


Angehängte Dateien:

Lesenswert?

Pascal G. schrieb:
> Das einbinden von arduino ist lediglich für die Ansteuerung des
> Displays.

Ist nicht nötig, es gibt dafür reichlich C Codes. Einen der ziemlich 
Low-Level ist habe ich als Beispiel angehängt.
: Bearbeitet durch User
von Rick (rick)


Lesenswert?

Rainer W. schrieb:
> Dass ich beim Lesen nicht darüber gestolpert, sondern eher zu einer
> konstruktiven Antwort motiviert gewesen wäre.
Man Rainer, dann halt doch einfach Deine Finger still, wenn Dir die 
Form, die Person oder die Wortwahl nicht passt.
Es würde dem Forum sehr gut tun, wenn sich alle zurückhalten, die nix 
zum Thema beitragen wollen.


Deshalb von mir noch was:
Pascal G. schrieb:
> Ich versuche über UART einen Text von dem einen MC zum Anderen zu senden
> und diesen dann über ein LCD ausgeben zu lassen.
Ein Foto vom Aufbau und die Erwähnung der verwendeten Plattform bzw, 
Controller und IDE helfen potentiellen Helfern das Problem einzukreisen.
Ich weiß, man steckt in 'seinem' Projekt drin, aber das Forum guckt 
einem ja nicht über die Schulter. Ich hätte jetzt nur anhand der 
Dateiendung (cpp) geraten, daß es sich evtl. um Arduinos handelt...

Arduino F. schrieb:
> Die Serielle ist kein Bus!
Ab wann ist des denn ein Bus? Wenn es einen Fahrplan gibt?!?

> Warum verbindest du nicht deine 2 µC über I2C?
Warum sollte er? Da fehlt ihm die Möglichkeit den PC als Gegenstelle zum 
Test (senden/empfangen) zu verwenden.
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rick schrieb:
> Ab wann ist des denn ein Bus?
Das solltest du selber in Erfahrung bringen können.

Rick schrieb:
> Da fehlt ihm die Möglichkeit den PC als Gegenstelle zum
> Test (senden/empfangen) zu verwenden.

"Ihm" vielleicht.
Aber "Du" scheinst nicht zu wissen, wie das geht.
von Ralph S. (jjflash)


Lesenswert?

Rick schrieb:
> Arduino F. schrieb:
>> Die Serielle ist kein Bus!
> Ab wann ist des denn ein Bus? Wenn es einen Fahrplan gibt?!?

Ein Bus ist dann ein "Bus", wenn an einer pyhsikalischen Leitung mehr 
als ein Device angesteuert wird / werden kann. Und so gesehen ist dann 
(und so hatte ich das auch mal in der Technikerschule) konkret gesehen 
USB an der USB-Buchse auch kein Bus, weil nur ein Gerät angeschlossen 
kann und die Bezeichnung "Universal Serial Bus" ist technologisch 
gesehen falsch!

I2C ist ein Bussystem, das singlewire (bspw. für DS18B20) ist ein 
Bussystem. UART ist es nicht.

Pascal G. schrieb:
> I2c werde ich später sicherlich auch mal noch behandeln.
> Die arduino IDE nutze ich nicht sondern VSCode mit PIO,
> Da bekomme ich zwar die Seriellen Daten vom Controller aber er empfängt
> irgendwie nichts.

Aber du verwendest anscheinend Arduino-Code, denn das hier:
#include <LiquidCrystal.h>

using namespace std;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pin-Belegung für das LCD

habe ich außerhalb von Arduino noch nie gesehen! .... hier wäre es dann 
mal höchstinteressant, deine LiquidCrystal.h zu sehen! ....

Wenn du das außerhalb von Arduino machen möchtest, auf Registerebene, 
dann empfielt sich eine der vielen SoftUart Sourcen.

Außerdem stellt sich die Frage: soll das eine "Einbahnstraße" sein, oder 
sollen die beiden Controller die du koppeln magst bidirektional sein.

Schade, ich habe mein Arduino Sender- und Empfängersketch für Text-LCD 
als Miniterminalausgabe gerade fertig gemacht, die Klasse halt..... dann 
erübrigt sich das Erstellen einer Library hierfür. Vllt. sollte ich das 
dann als Projekt einstellen, das hat jetzt in der Reha mich doch den 
ganzen Abend gestern und seit heute Morgen beschäftigt
von Pascal G. (pascalgieringer)


Lesenswert?

Danke Ralph für deine Mühe,
Das Missverständnis mit dem eingebunden Arduino Code tut mir leid.

Ich bin leider auch nicht perfekt aber das nächste Mal versuche ich mein 
Projekt besser zu beschreiben um sowas zu umgehen.

Ich meine aber öfter darauf hingewiesen zu haben das es um den UART und 
die Kommunikation zwischen Controllern bzw. dem PC geht.
Ich finde es klasse das du dir solch eine Mühe gemacht hast.

Die genannten Programme für den serialmonitor konnte ich mir leider noch 
nicht anschauen, aber bisher habe ich auch noch keine Antwort erhalten 
ob ich in VSCode was ändern muss das der integrierte SerialMonitor 
funktioniert oder ob er generell nur zum empfangen gedacht ist…

Euch allen noch ein schönes Wochenende
von Rick (rick)


Lesenswert?

Arduino F. schrieb:
> Aber "Du" scheinst nicht zu wissen, wie das geht.
Wenn Du wüßtest, was ich weiß und welche Messmöglichkeiten mir momentan 
zur Verfügung stehen...

Ralph S. schrieb:
> UART ist es nicht.
Ich kann an UART auch mehrere Devices anschließen und per Protokoll 
bestimmen, wer wann senden darf. Entweder realisiert man TX mit OC (open 
collector) oder man verknüpft die TX per NAND. BTDT.

Pascal G. schrieb:
> ob ich in VSCode was ändern muss das der integrierte SerialMonitor
> funktioniert oder ob er generell nur zum empfangen gedacht ist
Da kann ich nicht weiterhelfen. Aber Du könntest alternativ HTerm 
probieren...
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rick schrieb:
> Wenn Du wüßtest, was ich weiß und welche Messmöglichkeiten mir momentan
> zur Verfügung stehen...

Ich sehe, dass du mir überheblich und aggressiv gegenübertritst.
Kannst du natürlich machen...

Tipp:
Konstruktive Unterhaltungen, gehen anders.
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Tegtmeier klärt auf:
Zu wissen, was alles die KI mehr weiß als man selbst, verleitet schon 
sehr überheblich zu werden (Wenn Ihr wüßtet, was ich weiß...).
von Alexander (alecxs)


Lesenswert?

Ralph S. schrieb:
> Vllt. sollte ich das dann als Projekt einstellen

Vielleicht solltest Du Dir ein eigenes Projekt suchen. Pascal hat nicht 
darum gebeten. Er schrieb eindeutig dass er das selbst machen will. Er 
will lernen.
von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Alexander schrieb:
> Vielleicht solltest Du Dir ein eigenes Projekt suchen. Pascal hat nicht
> darum gebeten. Er schrieb eindeutig dass er das selbst machen will. Er
> will lernen.

sag mal, kannst du irgendetwas anderes hier, als Leute anstänkern? Es 
soll ja Menschen geben, die da echten und wirklichen Gefallen daran 
haben, anderen bei jedweder Möglichkeit ans Bein zu pinkeln. Deinen Nick 
habe ich schon öfters gelesen aber mir ist kein einziger positiver / 
konstruktiver Beitrag von dir in Erinnerung, geschweige denn ein 
Programm oder Projekt. Aber nichts desottrotz: Ich wünsche dir weiterhin 
viel Spaß beim Stänkern!

--------------------------------------------

Zu Pascal (auch wenn ich irgendwie den Post von dir noch etwas 
"unglaubwürdig" finde.

Pascal G. schrieb:
> Eine Frage hätte ich aber noch,
> Es soll doch eine Möglichkeit geben über den SerialMonitor in PIO
> Werte oder Zeichen an dem Microcontroller zu senden.
> muss ich da noch irgendwas einstellen?
> hab das Programm compiliert und den SerialMonitor gestartet, aber wo
> kann ich da eine Eingabe machen?
> der Cursor blinkt aber es zeigt mir nichts an.
> Auch mit dem Arduino Sketch der den Text zurücksenden soll den man
> Schickt kommt nichts zurück wenn ich Text eingebe und Enter drücke.

Ich werde jetzt einfach nicht schlau daraus, ob du nun innerhalb von 
Arduino etwas schreibst, oder VScode als Editor verwendest und welchen 
SerialMonitor du meinst. VScode hat imho keinen seriellen Monitor. Der 
von Arduino schickt nur einen kompletten String über UART, was heißt, 
der Text muß erst eingegeben werden, einzelne Buchstaben erscheinen erst 
mit Abschicken des Strings. Von daher ist der serielle Monitor von 
Arduino im besten Falle für Debug-Ausgaben geeignet.

So, um eine serielle Kommunikation von PC zu Controller (ich nehme hier 
aus dem Chatverlauf ATmegaxx8 an) aufzuzeigen, habe ich eine Demodatei 
erstellt, ganz bewußt aus einer einzigen Datei, die keine weiteren 
Abhängigkeiten zu weiteren Dateien besitzt, die den UART initialisiert 
und ein Textdisplay ansteuert. Sämtliche Funktionen für den UART und das 
Display sind in der Datei einhalten.

Um dieses Programm testen zu können und reinschauen zu können was es 
macht, benötigtst du auf PC-Seite ein serielles Terminalprogramm wie - 
oben genannt - puTTY, teraterm oder ähnliches.

Das Programm hier im Anhang erwartet auf der seriellen Schnittstelle ein 
Zeichen, trifft dieses ein, wird es auf der zweiten Zeile des Displays 
ausgegeben. Gibst du im seriellen Terminal ein '#' Zeichen ein, 
interpretiert das das Programm als "Pseudo-CR-LF" und generiert im 
seriellen Terminal einen CR-LF, auf dem Display das löschen der 2. Zeile 
und ein Springen an den Zeilenanfang.
von Hans W. (hanswieland)


Lesenswert?

Ralph S. schrieb:
> VScode hat imho keinen seriellen Monitor.

Doch hat es, ich habe ihn benutzt.

https://deepwiki.com/microsoft/vscode-arduino/4.1-serial-monitor-and-communication

Für erste Versuche ist der serielle Monitor mit seiner Zeilen-basierten 
Kommunikation durchaus Sinnvoll. Sie wird ja auch vom Framework 
unterstützt. Für den hier diskutierten Anwendungsfall jedoch eher nicht, 
da stimme ich dir zu.

Ich benutze gerne das von Rick empfohlene Hammer Terminal.
: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Hans W. schrieb:
> Doch hat es, ich habe ihn benutzt.

Das ist dann eine Erweiterung von vscode. Vscode selbst hat sowas nicht 
und weiß auch nicht, was ein Arduino ist.
von Hans W. (hanswieland)


Lesenswert?

Harald K. schrieb:
> Das ist dann eine Erweiterung von vscode.

Ja. Vscode benutzt man praktisch immer mit Erweiterungen, ganz besonders 
im Fall von Arduino.
: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Hans W. schrieb:
> Vscode benutzt man praktisch immer mit Erweiterungen

Eben. Aber dann hängt es eben ganz gewaltig davon ab, welche man 
verwendet. Wenn der Horizont nur aus Arduino besteht, dann natürlich 
nicht.
von Hans W. (hanswieland)


Lesenswert?

Harald K. schrieb:
> Wenn der Horizont nur aus Arduino besteht, dann natürlich
> nicht.

Der Pascal benutzt für sein Projekt den seriellen Monitor von Arduino 
(bzw. die entsprechenden vscode Erweiterung). Mir war das klar. Dein 
Horizont beschränkter erlaubte dir offenbar nicht, das zu erkennen.

Merkst du was? Man sollte ihn deswegen nicht beleidigen. So 
funktionieren Ratschläge nicht, die werden vom Gehirn direkt blockiert.
: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Hans W. schrieb:
> Merkst du was? Man sollte ihn deswegen nicht beleidigen.

Um Pascal ging es mir nicht, sondern um Deine Anmerkungen.

Du hast die vereinfachende und daher falsche Darstellung aufgebracht.
von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Ralph S. schrieb:
> UART ist es nicht.

UART ist da erstmal unabhängig. Packt man dort einen RS485-Baustein 
dran, wird ein Bus draus.
Wie bei jedem Bus erfordert dies eine koordinierte Kommunikation. Es 
kann nicht einfach zu jedem Zeitpunkt gesendet werden, wie bei 
bidirektionalen Verbindungen.
Daher wird es mit einem Terminal auch schwierig hier händisch 
Informationen einzufügen.
Also ist ein Bus für den TO sowieso unpassend.

Die Problematik hier ist nicht die Schnittstelle, sondern wie man Daten 
aus zwei Quellen die potentiell gleichzeitig senden können, 
zusammenführt.
Und das ist eigentlich schon fortgeschritten und kein Projekt für einen 
Anfänger.

Wenn man sicherstellen kann, dass immer nur einer sendet, dann kommt man 
mit UND-Gattern weiter (Bild)

Gruß
Jobst
von Alexander (alecxs)


Lesenswert?

Ralph S. schrieb:
> sag mal, kannst du irgendetwas anderes hier, als Leute anstänkern?

Keine Ahnung was Du meinst. Vielleicht ist eher andersherum.

Ralph S. schrieb:
> Deinen Nick
> habe ich schon öfters gelesen aber mir ist kein einziger positiver /
> konstruktiver Beitrag von dir in Erinnerung, geschweige denn ein
> Programm oder Projekt.

Vielleicht weil Du zu faul bist zum lesen.
von Ralph S. (jjflash)


Lesenswert?

:-) ... ich glaube Pascal interessiert sich nicht mehr für diesen 
Thread!
von Rainer W. (rawi)


Lesenswert?

Rick schrieb:
> Deshalb von mir noch was:
> Pascal G. schrieb:

Rick, wenn du zitierst, lass doch einfach die Finger von der automatisch 
erstellten Quellenangabe, damit der Link nicht bis zur 
Nichtfunktionalität zerstört wird und man dem Thread besser folgen kann.
von Harald K. (kirnbichler)


Lesenswert?

Rainer W. schrieb:
> damit der Link nicht bis zur
> Nichtfunktionalität zerstört wird

Ist er hier nicht, der Link funktioniert. Ist Dein Browser kaputt oder 
benutzt Du die "Mobilansicht"?

Hattest Du nicht neulich schon genau das gleiche Problem?
von Hans W. (hanswieland)


Lesenswert?

Harald K. schrieb:
> Um Pascal ging es mir nicht, sondern um Deine Anmerkungen.
> Du hast die vereinfachende und daher falsche Darstellung aufgebracht

Ach so, ja dann hatte ich dich missverstanden.

Deine Annahme zum Horizont trifft allerdings nicht zu. Ich benutze 
zahlreiche Entwicklungsumgebungen je nach Projekt. Arduino ist nur eine 
davon, und nicht die bevorzugte.
von Chris V. (nagut)


Lesenswert?

Falls sich irgendwer noch für Pascal und sein letztes verbliebendes 
Problem interessiert:

Pascal G. schrieb:
> Die arduino IDE nutze ich nicht sondern VSCode mit PIO,
> Da bekomme ich zwar die Seriellen Daten vom Controller aber er empfängt
> irgendwie nichts.

Pascal G. schrieb:
> bisher habe ich auch noch keine Antwort erhalten
> ob ich in VSCode was ändern muss das der integrierte SerialMonitor
> funktioniert oder ob er generell nur zum empfangen gedacht ist…


Mit "PIO" meint er vermutlich die Erweiterung "Platform IO" für VSCode, 
die auch Unterstützung für Arduino enthält, und darüber hinaus auch 
einen seriellen Monitor. Siehe hier:
https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html

Ich habe das bisher nicht benutzt. Sieht aber ganz nett aus, da es durch 
Nutzung gängiger Tools des jeweiligen OS offenbar einige Features hat 
und für das jeweilige Projekt entsprechend konfiguriert werden kann, 
aber dadurch leider für Einsteiger offenbar auch schwieriger in Gang zu 
bekommen ist.

Ich habe gerade nicht auf dem Schirm, ob Pascal schon verraten hat, ob 
er mit Windows oder Linux unterwegs ist.
von Pascal G. (pascalgieringer)


Lesenswert?

Also,
Erstmal vielen Dank an alle die sich hier KONSTRUKTIV Beteiligt haben,
an alle Anderen, habt ihr denn nichts Besseres zu tun???
Wer mein Projektaufbau nicht verstanden hat darf sich gerne Melden,
wie es schon erwähnt wurde habe ich es in der tat nicht richtig 
beschrieben und habe mich dafür auch schon Entschuldigt.

ich versuche es nun nochmal neu:

Mein Projekt (nur zum Üben) sieht vor Via UART einen Text/Zahl ect. von 
einem Controller zum anderen zu Senden.
Ziel ist es den Umgang und die Initialisierung des UART zum Senden und 
Empfangen zu Lernen.
Als Kontrollmöglichkeit war geplant das gesendete auf einem LCD 
anzuzeigen.
Der Einfachheit halber (Da ich mich nicht noch zusätzlich mit dem LCD 
auseinander setzen wollte - kommt wahrscheinlich zu nem späteren 
Zeitpunkt auch noch) habe ich dieses kurzerhand mit Arduino 
eingebunden(es sei mir verziehen).
Den Code habe ich in VSCode mit PIO geschrieben. Dort gibt es einen 
Serial Monitor. Mittlerweile habe ich auch erfahren das er zum Senden 
von Daten nicht zielführend ist und werde mir die anderen Programme die 
genannt wurden gerne mal anschauen.
GRUND für die versuchte Verwendung des SerialMonitors von PIO war das 
die 2. Controller keine Daten Empfangen hat was sich aber mittlerweile 
auch geklärt hat(falsche Initialisierung vom Interrupt). Es war zu 
Keinem Zeitpunkt angedacht alle 3 Geräte gleichzeitig miteinander 
Kommunizieren zu lassen.

Ich komme aus Privaten Gründen gerade nur langsam durch die ganzen 
angehängten Code Beispiele durch werde sie mir aber auf alle fälle noch 
Anschauen.
von Horst (alteskind)


Lesenswert?

Jobst M. schrieb:
> UART ist da erstmal unabhängig. Packt man dort einen RS485-Baustein
> dran, wird ein Bus draus.

Ist UART nicht ersteinmal ein Übertragungsprotokoll mit Start-, Stop- 
und ggf. Paritätbits unabhängig von einer Topologie, bspw. RS485, die 
man dann daran hängt?

Von daher wäre es dann doch korrekt weder von einem Bus noch von einem 
Nicht-Bus zu sprechen oder ? Nur eben UART!
von Pascal G. (pascalgieringer)


Lesenswert?

Chris V. schrieb:
> Falls sich irgendwer noch für Pascal und sein letztes verbliebendes
> Problem interessiert:
DANKE ;)

> Ich habe gerade nicht auf dem Schirm, ob Pascal schon verraten hat, ob
> er mit Windows oder Linux unterwegs ist.

Ich habe ein Linux System, macht dies ein unterschied in der Verwendung?
von Harald K. (kirnbichler)


Lesenswert?

Horst schrieb:
> Ist UART nicht ersteinmal ein Übertragungsprotokoll mit Start-, Stop-
> und ggf. Paritätbits unabhängig von einer Topologie, bspw. RS485, die
> man dann daran hängt?

UART* ist Hardware, die dieses Protokoll erzeugt und verarbeitet, und 
die, sofern man nicht mit zusätzlichen Treiberbausteinen nachhilft, eine 
bestimmte "Topologie" für die Übertragung herstellt - nämlich eine 
Punkt-zu-Punkt-Übertragung mit Logikpegeln (d.h. Versorgungsspannung der 
UART).
Das liegt daran, daß der Datenausgang der UART (TxD) eine 
Push-Pull-Treiberstufe verwendet; werden mehrere davon verbunden, gibt 
es einen Kurzschluss.

Um irgendwas anderes zu erreichen, braucht es Treiberbausteine, die 
diese Logikpegel in etwas anderes übersetzen und die dann auch, weitere 
Hard- oder Softwareunterstützung vorausgesetzt, auch eine 
Punkt-zu-Mehrpunkt-Übertragung ermöglichen. Diese weitere Hard- oder 
Softwareunterstützung besteht in der zeitlich korrekten Ansteuerung 
einer Sender-/Empfänger-Umschaltung, die z.B. ein RS485-Treiber 
benötigt.

Es gibt UARTs, die das in Hardware erledigen, und dafür eine 
Steuerleitung anbieten (z.B. ist das bei den in den USB-Seriell-Bridges 
von FTDI verwendeten UARTs der Fall), aber es gibt auch sehr, sehr 
viele, die genau das nicht tun, wo also mit Software und einem I/O-Pin 
nachgeholfen werden muss.

Aber ohne irgendeinen dieser Zusätze ist eine UART nur für eine 
Punkt-zu-Punkt-Verbindung nutzbar.


*) früher von einigen Hardwareherstellern auch mit anderen Akronymen wie 
z.B. ACIA oder SIO benannt
von Horst (alteskind)


Lesenswert?

Ich habe mal das Programm

Beitrag "Re: Kommunikation zwischen 2 MC"

von Ralph getestet. Wenn man das auf einem Controller laufen läßt und 
auf einem zweiten Controller dasselbe Programm, nur das was er setup und 
loop genannt hat, durch folgendes ersetzt:
1
void setup()
2
{
3
  uart_init(115200);
4
}
5
6
void loop()
7
{
8
  static int counter = 0;
9
  char puffer[20];
10
11
  itoa(counter, puffer, 10);
12
  uart_puts(puffer);
13
  uart_putchar('#');
14
  counter ++;
15
  _delay_ms(500);
16
}

und zusätzlich die Geschwindigkeit bei der Übertragung etwas einbremst
1
void uart_puts(const char *str)
2
{
3
  while (*str)
4
    uart_putchar(*str++);
5
  // dem Empfänger Zeit zur Verarbeitung geben bevor das nächste Zeichen gesendet wird 
6
  _delay_ms(10);           
7
}

und im Programm noch ein #include <stdlib.h> für das itoa hinzufügt, 
dann überträgt der zweite Controller den Wert in Counter an den ersten 
und zeigt diese Zahl auf dem Display an.

Ich finde das realtiv cool und werde mir das so merken. Wichtig hier 
ist, dass die Anschlußpins der ATmegas für RxD und TxD über kreuz 
angeschlossen werden müssen:

Pin2 (RxD) <=> Pin3 (TxD)

und

Pin3 (TxD) <=> Pin2 (RxD)
von Horst (alteskind)


Lesenswert?

Harald K. schrieb:
> UART* ist Hardware, die dieses Protokoll erzeugt und verarbeitet, und
> die, sofern man nicht mit zusätzlichen Treiberbausteinen nachhilft, eine
> bestimmte "Topologie" für die Übertragung herstellt - nämlich eine
> Punkt-zu-Punkt-Übertragung mit Logikpegeln (d.h. Versorgungsspannung der
> UART).
> Das liegt daran, daß der Datenausgang der UART (TxD) eine
> Push-Pull-Treiberstufe verwendet; werden mehrere davon verbunden, gibt
> es einen Kurzschluss.

und somit ist es eben doch kein BUS.
Danke für die ausführliche Klarstellung.
von Rainer W. (rawi)


Lesenswert?

Harald K.Harald K. schrieb:
> Rainer W. schrieb:
>> damit der Link nicht bis zur
>> Nichtfunktionalität zerstört wird
>
> Ist er hier nicht, der Link funktioniert.

Dann guck es dir selbst z.B. mit Chrome unter Android an.

> Ist Dein Browser kaputt oder benutzt Du die "Mobilansicht"?

Nein, ja

Die Langversion:
Der Link funktioniert nicht (bei Aufruf über Chrome unter Android), wenn 
der Autor des Beitrags die von der Forensoftware automatisch erzeuge 
Leerzeile vor der Quellenangabe wegeditiert, z.B. weil er dort rein 
schreibt "Deshalb von mir noch was:".

Chrome unter Win (funktionierte unter Win):

Rick schrieb:
> Deshalb von mir noch was:
> Pascal G. schrieb:

Chrome unter Android (funktioniert nicht, aber unter Win):

Rick schrieb:
> Deshalb von mir noch was:
> Pascal G. schrieb:

(jeweils Zitat der selben Stelle)
: Bearbeitet durch User
von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Pascal G. schrieb:
> Ich habe ein Linux System, macht dies ein unterschied in der Verwendung?

:-) das macht nicht wirklich einen Unterschied, aber in ein paar Dingen 
vllt. einfacher?!?

Im Anhang habe ich mal ein wirklich sehr sehr schmales Terminalprogramm 
für Linux auf Konsolenebene angefügt und ist in der Linuxwelt eigentlich 
sehr bekannt:

picocom

Ich habe das nur für die Textfarbe und die Überschrift beim Start 
(Farbe) des Terminals modifiziert.

Archiv auspacken in beliebiges Verzeichnis.

- make clean
- make

Du hast eine neue Datei namens: "picomon"

Das kannst du starten mit (wenn du bspw. einen Arduino-Clone ansprechen 
willst, der sich als USB0 anmeldet)

./picomon -b 115200 /dev/ttyUSB0

Damit hast du dann ein serielles Terminal, das auf jedes einzelne 
Zeichen das du eingibst reagiert und über dieses Terminal versendet.

Der Vorteil von picomon ist: es muß nichts installiert werden, hat keine 
"Abhängigkeiten" die auf einem Linuxsystem nicht vorhanden sind und wenn 
du das Programm wieder löscht, hat es keine Spuren hinterlassen.

Beendet wird das Programm mit einer etwas "unbekannten" 
Tastenkombination:

STRG-A-X

Viel Spaß und Erfolg
von Harald K. (kirnbichler)


Lesenswert?

Horst schrieb:
> und zusätzlich die Geschwindigkeit bei der Übertragung etwas einbremst
> void uart_puts(const char *str)
> {
>   while (*str)
>     uart_putchar(*str++);
>   // dem Empfänger Zeit zur Verarbeitung geben bevor das nächste Zeichen
> gesendet wird
>   _delay_ms(10);
> }

Das macht nicht, was Du glaubst. Das wartet nicht nach jedem Zeichen, 
sondern nur einmal, nach dem kompletten Absenden des Strings "str".

Um nach jedem Zeichen zu warten, müsste es so aussehen:
1
void uart_puts(const char *str)
2
{
3
  while (*str)
4
  {  
5
    uart_putchar(*str++);
6
    // dem Empfänger Zeit zur Verarbeitung geben bevor das nächste Zeichen gesendet wird
7
    _delay_ms(10);
8
  }
9
}
von Jobst M. (jobstens-de)


Lesenswert?

Harald K. schrieb:
> UART* ist Hardware, die dieses Protokoll erzeugt und verarbeitet, und
> die, sofern man nicht mit zusätzlichen Treiberbausteinen nachhilft, eine
> bestimmte "Topologie" für die Übertragung herstellt - nämlich eine
> Punkt-zu-Punkt-Übertragung mit Logikpegeln (d.h. Versorgungsspannung der
> UART).
> Das liegt daran, daß der Datenausgang der UART (TxD) eine
> Push-Pull-Treiberstufe verwendet; werden mehrere davon verbunden, gibt
> es einen Kurzschluss.

Zumindest bei einem Controller kann man, sobald die Übertragung 
abgeschlossen ist, die Push-Pull-Treiberstufe abschalten.
Damit könnte man im Prinzip einfach alle RxD und TxD miteinander 
verbinden.
Zum Schutz könnte man noch einen Widerstand an jeden TxD in Reihe 
setzen.

Bei einem 8051 muss man weder Treiberstufe abschalten, noch einen 
Widerstand einbauen, da er keine Push-Pull Ausgänge hat.

Allerdings wird der PC hierbei zum Spielverderber.

Gruß
Jobst
von Harald K. (kirnbichler)


Lesenswert?

Jobst M. schrieb:
> Zumindest bei einem Controller kann man, sobald die Übertragung
> abgeschlossen ist, die Push-Pull-Treiberstufe abschalten.

Das ist dann aber eines der von mir erwähnten Hilfsmittel, in diesem 
Fall Software. Die UART macht das von sich aus nicht.

Jobst M. schrieb:
> Bei einem 8051 muss man weder Treiberstufe abschalten, noch einen
> Widerstand einbauen, da er keine Push-Pull Ausgänge hat.

Die hat er an Port 0 nicht; liegt aber die UART nicht auf Port 3?

Man kann natürlich als primitivstes Hilfsmittel mit 'ner Diode und einem 
Pullup-Widerstand so eine Art "Open-Collector"-Ausgang nachbilden, aber 
-- auch das ist ein Hilfsmittel.
von Horst (alteskind)


Lesenswert?

Harald K. schrieb:
> Das macht nicht, was Du glaubst. Das wartet nicht nach jedem Zeichen,
> sondern nur einmal, nach dem kompletten Absenden des Strings "str".
>
> Um nach jedem Zeichen zu warten, müsste es so aussehen:void
> uart_puts(const char *str)
> {
>   while (*str)
>   {
>     uart_putchar(*str++);
>     // dem Empfänger Zeit zur Verarbeitung geben bevor das nächste
> Zeichen gesendet wird
>     _delay_ms(10);
>   }
> }

Du hast recht und das war ein Kopierfehler hier ins Eingabefenster, ich 
meinte diese Funktion hier (Wartezeit nach jedem gesendeten Zeichen):
1
void uart_putchar(char ch)
2
{
3
  while (!( UCSR0A & (1<<UDRE0)));                      // warten bis Transmitterpuffer leer ist
4
  UDR0 = ch;                                            // Zeichen senden
5
  _delay_ms(10);
6
}

Die Wartezeit beim Stringsenden habe ich wieder entfernt.
von Jobst M. (jobstens-de)


Lesenswert?

Harald K. schrieb:
> Die UART macht das von sich aus nicht.

Das macht nichts.
Auch ein RS485-Baustein macht das nicht von sich aus in Hardware.
Dann ist RS485 nach Deiner Definition also auch kein Bus.

Harald K. schrieb:
> Die hat er an Port 0 nicht; liegt aber die UART nicht auf Port 3?

Jo. Aber auch Port 3 ist kein Push-Pull.
Der 8051 hat auch KEINE Datenrichtungsregister.
An Port 0 hat der 8051 keine Pull-Ups, nur Open-Drain.

Gruß
Jobst
von Harald K. (kirnbichler)


Lesenswert?

Jobst M. schrieb:
> Auch ein RS485-Baustein macht das nicht von sich aus in Hardware.
> Dann ist RS485 nach Deiner Definition also auch kein Bus.

Irgendwo bist Du falsch abgebogen.
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.