Forum: Mikrocontroller und Digitale Elektronik 1 Draht Verbindgung zwischen 2 Atmegas


von Guido S. (Gast)


Lesenswert?

Hallo,

ich habe hier einen Mega32, der über eine 1-Draht Verbindung an einen 
Mega8 eine Ziffer zwischen 0 bis 9 senden soll. Eine Rückantwort des 
Mega8 ist nicht erforderlich.

In BASCOM würde ich das ja mit Printbin usw. erledigen.

Wie stelle ich das aber in C an ?
Danke

Guido

von Peter (Gast)


Lesenswert?

warum nicht einfach Seriell senden? Ist denn bei beidem µC die UArt noch 
frei?

von H.Joachim S. (crazyhorse)


Lesenswert?

putchar(0x08), um eine binäre 8 zu senden.

von Anton (Gast)


Lesenswert?

Man könnte den TxD des einen Atmega32 mit dem RxD des anderen verbinden,
1 Draht wenn keine Rückantwort nötig, und das entsprechende Print von
C verwenden. Über kurze Entfernungen tut es der 5V-Pegel, sonst einen
RS-Baustein dazwischen schalten.
Sind die beiden Atmegas am gleichen Platz reicht vermutlich sogar der
interne Oszillator für die serielle Schnittstelle.
(Nach meiner Erfahrung (und mit einer "Autobaud-Routine"))

von Guido S. (Gast)


Lesenswert?

Die Megas sitzen max. 10cm nebeneinander. Evtl. kann ich sie sogar 
stapeln. Bin ich zwingend an TxD / RxD gebunden , oder kann ich die Pins 
auch frei wählen ? Wie realisiere ist das in C ?

von Falk B. (falk)


Lesenswert?

@  Anton (Gast)

>Sind die beiden Atmegas am gleichen Platz reicht vermutlich sogar der
>interne Oszillator für die serielle Schnittstelle.

Nein, das tut er nicht!

>(Nach meiner Erfahrung (und mit einer "Autobaud-Routine"))

Das ist ein glücklicher Einzelfall.

MFg
Falk

von Falk B. (falk)


Lesenswert?

@ Guido S. (Gast)

>Die Megas sitzen max. 10cm nebeneinander. Evtl. kann ich sie sogar
>stapeln. Bin ich zwingend an TxD / RxD gebunden ,

Ja.

> oder kann ich die Pins auch frei wählen ?

Nein, das geht nur mit einem Soft-UART, der ist aufwändiger.

> Wie realisiere ist das in C ?

Wozu überhaupt ZWEI AVRs? Wegen ein paar Zahlen anzeigen? Das macht EIN 
AVR nebenbei, und langweilt sich immer noch.

MFG
Falk

von Jakob B. (teddynator)


Lesenswert?

Falk Brunner schrieb:
> Wozu überhaupt ZWEI AVRs? Wegen ein paar Zahlen anzeigen? Das macht EIN
>
> AVR nebenbei, und langweilt sich immer noch.

woher weißt du dass er nur ein paar Zahlen anzeigen will?

von Karl H. (kbuchegg)


Lesenswert?

Thomas B. schrieb:
> Falk Brunner schrieb:
>> Wozu überhaupt ZWEI AVRs? Wegen ein paar Zahlen anzeigen? Das macht EIN
>>
>> AVR nebenbei, und langweilt sich immer noch.
>
> woher weißt du dass er nur ein paar Zahlen anzeigen will?

Standard-Erfahrung hier im Forum, die in 90% aller Fälle zutrifft:

Keine UART Verbindung von A nach B programmieren können aber für jeden 
Scheiss einen eigenen Prozessor vorsehen, weil der Hauptprozessor ja mit 
dem lösen von quadratischen Gelichungen soooooo ausgelastet ist.
Merke: Wenn man für das Erstellen einer Partyeinladung mit Word schon 
einen 3 GHz Prozessor braucht, dann muss zumindest jede einzelne Stelle 
einer 7-Segment Anzeige ihren eigenen 20Mhz-Prozessor bekommen.

Kann natürlich sein, dass wir falsch liegen und es tatsächlich sinnvoll 
ist, beim konkreten Proejekt eine Aufteilung in mehrere Prozessoren 
vorzunehmen. Möglich ist es, aber nicht sehr wahrscheinlich. Wer 
tatsächlich so ein aufwändiges Projekt macht, weiß wie eine UART 
funktioniert.

von Guido S. (Gast)


Lesenswert?

Nochmal Hallo zusammen,

vielen Dank für die sinnvollen Antworten. Ich bin mir allerdings nicht 
sicher, wie man sich hier im Forum den Status eines Moderatoren 
verdienen kann wenn die User Anfragen derart beantwortet werden.

Was für'n "Scheiss" ich hier zusammen bauen möchte, sollte doch 
tatsächlich meine Sorge bleiben. Ob mein angestrebtes Objekt einen 
weiteren Controller rechtfertigt oder nicht, dürfte ebenfalls von 
untergeordnetem Intresse sein.

Ich denke, dass ich meine Frage verständlich ausgedrückt habe. Und ich 
habe diese Frage gestellt, WEIL ich nicht weiss, wie eine UART in C 
programmieren kann.

Also Herr Buchegger. um in Ihrem Sprachgebrauch zu bleiben, "Behalten 
Sie doch ihren Scheiss für sich"

von Bernhard R. (barnyhh)


Lesenswert?

Als Ergänzung zu den 90%:

Die Ein-Draht-Verbindung setzt natürlich einen 2. (dicken) Draht 
voraus:
die Masseverbindung zwischen beiden Prozessoren.

Bernhard

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


Lesenswert?

> Und ich habe diese Frage gestellt, WEIL ich nicht weiss, wie eine
> UART in C programmieren kann.
Dann hast du aber die Suchfunktion hier im Forum nicht bemüht. Karl 
Heinz schreibt diese Pauschalierung nicht, weil ihm gerade nach 
Pauschalierungen ist. Sondern weil das Problem jeden Tag in irgenwelchen 
abwandlungen immer wieder auftaucht.
Sieh dir das doch mal an: 
http://www.mikrocontroller.net/search?query=%2Bavr+%2Brs232+%2Bcode&forums[]=1&forums[]=2&max_age=-&sort_by_date=0

von M803 (Gast)


Lesenswert?

Und weil die alle nicht faehig waren, die Suchfunktion zu benutzen.

Gast

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


Lesenswert?

M803 schrieb:
> Und weil die alle nicht faehig waren, die Suchfunktion zu benutzen.
Offenbar: denn für die Frage "wie mache ich mit einem AVR eine serielle 
Verbindung?" hätte prinzipiell 1 Antwort gereicht. Das ändert sich ja 
nicht jeden Tag...

> Und weil die alle nicht faehig waren, die Suchfunktion zu benutzen.
Oder: weil sie meinten, sie hätten das ultimative und alleinige Problem, 
eine RS232 Verbindung aufbauen zu müssen.

von Testfall (Gast)


Lesenswert?

Ich hätte jetzt gesagt, dass man, um 0..9 zu senden keinen UART o.Ä. 
braucht. Pin des einen an Pin des anderen. B lauscht jetzt immer 
meinetwegen 255 ms lang, ob da was kommt. A sendet 0..9 mit 1..10 
Impulsen mit 5 ms Länge und 5 ms Pause. Nach der Übertragung 100 ms 
Pause und Wiederholung. Dann nocheinmal eine Wiederholung nach 30 ms. B 
muss jede ms den Pin abfragen. Wenn Jetzt zwei mal das gleiche Ergebnis 
angekommen ist, ist die Übertragung erfplgreich gewesen. Ganz primitiv. 
Takte egal.

von Karl H. (kbuchegg)


Lesenswert?

Lothar Miller schrieb:
>> Und ich habe diese Frage gestellt, WEIL ich nicht weiss, wie eine
>> UART in C programmieren kann.
> Dann hast du aber die Suchfunktion hier im Forum nicht bemüht. Karl
> Heinz schreibt diese Pauschalierung nicht, weil ihm gerade nach
> Pauschalierungen ist.

Richtig.

 >Sondern weil das Problem jeden Tag in irgenwelchen
> abwandlungen immer wieder auftaucht.
> Sieh dir das doch mal an:
> 
http://www.mikrocontroller.net/search?query=%2Bavr+%2Brs232+%2Bcode&forums[]=1&forums[]=2&max_age=-&sort_by_date=0

Und dann gibt es auch noch das
AVR-GCC-Tutorial


Trotzdem bleib ich bei meiner Meinung:
Wer nicht weiß wie er 2 Prozessoren per UART miteinander verbindet, 
sollte sich zuallererst einmal fragen, ob er überhaupt wirklich 2 
Prozessoren benötigt. Diejenigen, die tatsächlich 2 oder mehr 
Prozessoren für ihr Projekt brauchen, müssen nämlich nicht nach UART 
fragen.


Wie gesagt: Das ist die Erfahrung, die sich hier im Forum im Lauf der 
Zeit angesammelt hat. Ganz nüchtern betrachtet.

von Guido S. (Gast)


Lesenswert?

@Testfall

Ja genau . Soetwas in der Richtung schwebte mir vor. Dann wäre auch der 
PIN egal , oder ?

von Testfall (Gast)


Lesenswert?

Vielleicht klebt der eine Mik ja auf Netzpotential und der andere nicht 
... ist doch auch möglich. Ich hab' ja schon ne primitive, schnelle und 
einfach Lösung genannt. Ist nicht unbedingt schön, aber fix umgesetzt.

von Testfall (Gast)


Lesenswert?

Pin ist vollkommen pappe. Musst hat nur den richtigen abfragen ;-)

von Testfall (Gast)


Lesenswert?

Achte drauf, dass du nicht zu 255 passende Pausen zwischen den 
Übertragungen wählst, dabei aber noch genug Luft hast, dass das Ende der 
ersten Übertragung sicher erkannt wir.

Sonst kommt nur Mist an.
Ich würde sagen, das Verhältnis von Sendezeit, Sendepause und 
Wiederholungspause sollte so ungefähr 1:3:10 sein. Allerdings jeweils so 
lange Zeiten wählen, dass die mindestens zwei Abtastzyklen (bei "B") 
entsprchen, damit du immer sicher ein "an" oder "aus" hast.

So. Mittagspause zu Ende.
Viel Erfolg.

von Guido S. (Gast)


Lesenswert?

@Testfall

Und falls ich nun einmal nach so einer routine suche: welchen 
technischen Begriff muss ich dafür in die Suchfunktin eintippen ? Das 
ist doch eine serielle Übertragung, oder ? In BASCOM ist das - wie in 
meinem ersten Post gesagt - ja recht einfach gehalten . COM definieren 
und senden.

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


Lesenswert?

> welchen technischen Begriff muss ich dafür in die Suchfunktin eintippen
Das ist eine Pulspaketübertragung (weil da immer ein Päcken Pulse 
übertragen wird). Aber wozu denn so ein Gewürge (du mußt den Pin pollen, 
Flanken erkennen, Timeouts auswerten...) wenn du doch eine RS232 übrig 
hast?

Ein Tipp: beschreib einfach, WAS du machen willst, nicht WIE du es 
machen willst. Denn sonst kommst du letztlich nie zu mehr Wissen. Denn 
du machst ja immer das, was du schon kannst...  :-/

von Karl H. (kbuchegg)


Lesenswert?

Guido S. schrieb:
> @Testfall
>
> Und falls ich nun einmal nach so einer routine suche: welchen
> technischen Begriff muss ich dafür in die Suchfunktin eintippen ? Das
> ist doch eine serielle Übertragung, oder ?

Ja und nein.
IMHO gibt es dafür keinen wirklichen Begriff. Das ist ein ziemliches 
Ad-hoc Verfahren. Am ehesten könnte man es noch als Puls-Count 
Übertragung bezeichnen, auch wenn es diesen Begriff so nicht gibt.

> In BASCOM ist das - wie in
> meinem ersten Post gesagt - ja recht einfach gehalten . COM definieren
> und senden.

Nur hilft dir das nicht viel, weil dein Empfäger in diesem Fall nun mal 
keine RS232 macht.
Am ehesten könnte man, auch wenn sich das jetzt naiv anhört, noch damit 
vergleichen, wie man sich naiv Rauchzeichen der Indianer vorstellt: 5 
Rauchwölkchen hintereinander bedeutet 5. 7 Rauchwölkchen eben 7. Das 
einzige Problem beim µC: man muss sicherstellen, dass man auch jeweils 
zum richtigen Zeitpunkt hinschaut, nicht ein Rauchwölkchen 2 mal zählt 
und die Pause zwischen den Gruppen richtig erkennt.

So banal, wie dir Testfall das verkaufen will, ist das nämlich gar 
nicht.

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich du wäre und die Hardware UART Pins nicht mehr frei sind und, 
ganz wichtig, sich auch nicht freischaufeln lassen, würde ich in die 
Codesammlung gehen und nach Software UART suchen. Irgendwas vom PeDa 
findet sich da sicher.

Meine erste Option wäre: Hardware UART
Meine zweite Option wäre: Software UART

Hradware UART hat den Charm, das man sich nach der Konfiguration um 
nichts mehr kümmern braucht. Trifft ein Zeichen ein, so wird ein 
Interrupt ausgelöst, der die Weiterverarbeitung in die Wege leitet.

Je nach Pin, kann man Software-Lösungen auch über Interrupts in die Wege 
leiten, allerdings ist das Timing dann nicht mehr so simpel 
hinzubekommen. Vor allen Dingen dann nicht, wenn der Prozessor ohnehin 
schon bis zur Decke mit Arbeit voll ist.

von Testfall (Gast)


Lesenswert?

Naja, man muss halt nachdenken, was passieren kann. Und man muss wissen, 
ob man nen Timer oder den UART übrig hat.
Rauchwölkchen. Das ist gut.
Ich persönlich bin ein Fan dieser Methode, weil man die mit ner LED 
prima nachvollziehen kann, wenn man den Tank etwas runterdreht. Und ja, 
ich weiß, alles andere ist störfester usw. aber manchmal ist das 
Rauchzeichenverfahren nützlich. Und manchmal geht's einfach schnell 
(bspw. mit nem unbekannten, uralten Optokoppler dessen Daten man nicht 
kennt und ihn nur braucht um mal eben Daten galvanisch getrennt zu 
übertragen). Guter alter Frickler-Stil eben. :-)

Aber der werte Starter dieses Threads hat sich scheinbar eine fertige 
Lösung gewünscht ... dann uss er eben lernen, mit dem UART umzugehen.

von Besserwisser (Gast)


Lesenswert?

Ich hätte das ganze mit einer PWM oder einer Impulslänge programmiert.
Geht mit einer Leitung, man muss allerdings einen Timer initialisieren, 
damit man messen kann, wie lange der Impuls ist.
Ich selbst würde bei 2 Prozessoren nicht die wertvolle UART verschwenden 
(bauche ich meistens für Debug-Zwecke oder zur Host-Kommunikation), 
sondern würde eine Eindrahtverbindung machen. Wie man einen Pin in C 
programmiert, sollte in jedem Sampel-Beginner-Programm drinn stehen, den 
Timer bekommt man auch noch hin. Der Sender muss seinen Port als Output, 
der Empfänger als Input konfigurieren.
Ob man zwei Prozessoren benötigt, hängt von der Anwendung ab. Wir haben 
mal einen zweiten wegen der Redundanz spendieren müssen, um 
sicherheitsrelevante Aufgaben zu erledigen (war im Gesetz gefordert).
Ob das Sinn macht oder nicht, haben wir hier nicht zu entscheiden.
Nur wenn gefragt wird, ob es eine bessere Lösung gibt.
 Na dann, viel Spass beim Wälzen des Tutorials...

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.