Hallo,
Ich bin gerade dabein Multikontorllersystem mit 2 atmega8 aufzubauen
(später werden noch mehrere ATmega8 verbaut)
Der Sender wid folgendermassen initialisiert: (Master)
1
voidUSART_Init(unsignedintubrr)
2
{
3
// Set baud rate
4
UBRRH=(unsignedchar)(ubrr>>8);
5
UBRRL=(unsignedchar)ubrr;
6
// Enable receiver and transmitter--> 9 bit modus einstellen durch register bit UCSZ2
UCSRA=UCSRA|0b00000001;//multipozessor kommunikation aktivieren // es wird wieder auf die naechste adresse gewartet
11
}
Das ganze sollte so funktionieren:
Der Master schickt ein Adressframe. Der Slave erkennt ob das Adressframe
für ihn bestimmt ist. Wenn ja loescht er das MPCM bit (damit werden auch
Dataframes akzeptiert). Der Slave akzeptiert nun alle Dataframe bis
wieder ein Adresframe erkannt wird ( 9tes bit gesetzt) Das ganze
funtioniert auch soweit. Ich schicke zum Beispiel einmalig ein
Adressframe. Danach schicke ich nur noch Dataframes und sporadisch
erkennt der Slave meine Dataframes nicht mehr als Dataframes. Nur durch
erneutes senden der Adresse werden die Dataframes wieder akzeptiert.
Sieht jemand einen Fehler in meinem Code?
duron005 wrote:
> Hallo,>> Ich bin gerade dabein Multikontorllersystem mit 2 atmega8 aufzubauen> (später werden noch mehrere ATmega8 verbaut)
Wie darf ich mir das vorstellen? Da eignet sich RS232 nicht zu, es sei
denn Du benutzt RS485? Hier wuerde ich zum Bleistift TWI anbieten.
Sind die Prozessoren auf dem selben Board oder wie gross ist die
Distanz? Beschreibe erstmal, was Du machen willst, bevor Du nach einer
Loesung fragst.
Michael
>UCSRA=UCSRA|0b00000001
Gut, wenn man die Funktion des niedrigstwertigen Bits in UCSRA im Kopf
hat (ich muss da gerade leider passen). Sonst weiß man gar nicht, was
diese Zeile bewirkt, und müsste zur Klärung der Frage das Datenblatt
herauskramen.
Tipp: Jedem belegten Bit in den I/O-Registern ist ein Namenskürzel
zugewiesen, und wenn man es benutzt, macht das den Quellcode nicht
unverständlicher. Hat auch für einen selbst Vorteile, spätestens dann,
wenn man nach nem halben Jahr noch was an dem Code ändern will.
Na, erinnerst Du Dich an
Beitrag "atmega8 multiprozessor kommunikation rs232"):
>"Nein, sowas läuft zum>Beispiel ein paar Minuten und stürzt dann "völlig unerklärlicherweise">ab. Da kann man bei der Fehlersuche dann viel Spaß haben."
Fast schon prophetisch, was? ;-)
Hallo,
Die Distanzen sind mindestens 25 meter. TWI eignet sich daher leider
nicht dafür.
Der Grund wieso ich die rs232 Schnittstelle nehmen möchte ist, dass ich
weniger Bauteile benötige. Ich denke schon dass ich ein einfaches System
damit aufbauen kann, wenn immer nur Master an einen Slave Daten schickt,
und dieser dann antwortet. Slaves sollen niemals miteinander reden
dürfen.
lg
Ich habe deine routine gerade getestet. Hat manchmal funktioniert und
manchmal nicht (wie meine routine)
Das einzige was unterschiedlich ist sind die Funktionsaufrufe
clr_inbuf1(); // synchronisieren
clr_outbuf1(); // nichts mehr ausgeben
Diese habe ich nicht eingebunden, weil ich den Codeinhalt nicht kenne.
Kannst du mir den Code dieser routinen reinstellen, dass ich es mit
diesen noch versuchen kann?
danke und lg
Joa aber an ner RS232 kannst Du nur insg. zwei Controller anschliessen.
Und bei 25 Metern duerften auch nur kleine Baudraten moeglich sein. Kenn
jetzt die Spec nicht genau aber das ist schon ne ziemlich lange Strecke.
>Diese habe ich nicht eingebunden, weil ich den Codeinhalt nicht kenne.
Die brauchst Du nicht.
Welche Frequenz ist eigentlich auf Deinen Quarzen aufgedruckt?
Michael G. wrote:
> Joa aber an ner RS232 kannst Du nur insg. zwei Controller anschliessen.
Nööö...
Es gibt verschiedene Möglichkeiten, mehrere Controller über RS232
miteinander zu verbinden.
Man kann durch Protokoll dafür sorgen, dass die TX aller nicht
adressierten Slaves deaktiviert und hochohmig sind, worauf sie parallel
geschaltet werden können.
Man mann die TX aller beteiligten Controller über Puffer mit Open-Coll
führen, das gibt zusätzliche Sicherheit gegen Schäden bei Kollisionen,
erlaubt Kurzschlussschutz und erhöht etwas die Reichweite.
> Und bei 25 Metern duerften auch nur kleine Baudraten moeglich sein.
Kleine Controller mit kleinen RAMs (Mega8) brauchen wohl selten hohe
Bausraten, wenn sie Informationen austauschen wollen. Es ist halt kein
Multimedia.
> Kenn> jetzt die Spec nicht genau aber das ist schon ne ziemlich lange Strecke.
Sicher ist RS485 besser geeignet, erfordert aber auch einen höheren
Aufwand. Und der ist nicht in jedem Falle gerechtfertigt.
...
3.6864 MHZ.. Baudrate habe ich ganz gering eingestellt.. 9600 baud. An
Übertragungsfehler glaube ich kaum,weil wenn ich zuerst die Adresse
schicke und dann erst die Daten, es auch immer funktioniert.
Die Höhe der Baudrate ist mit ganz egal. Kann so klein wie möglich sein,
da es nicht viele Daten sind. Wichtig ist mir nur, dass es richtig
ankommt, auch wenn ich es 5 mal schicken muss. Zeitkritisch ist es auch
nicht. Wie gesagt möchte ich das Softwwartechnisch lösen, damit immer
nur einer sendet, und dieser nur mit dem Master kommuniziert. Die Slaves
müssen keine Daten miteinander austauschen. rs484 kommt nicht in Frage
da ich einen erhöhten bauteil aufwand habe und eine zusätzliche
Datenleitung brauche. 25 meter 3 adriges Kabel habe ich schon und möchte
mir nicht ein neues kaufen. Außerdem sind 4adrige Kabel teurer als 3
adrige.
lg
Wie wäre es als Alternative mit einer Ringleitung? Also
TxD Controller 1 an RxD Controller 2
TxD Controller 2 an RxD Controller 3
TxD Controller 3 an RxD Controller 4
TxD Controller 4 an RxD Controller 5
TxD Controller 5 an RxD Controller 6
TxD Controller 6 an RxD Controller 1
Man muss dann nur über die Programmierung sicherstellen, das die Daten,
die nicht für den jeweiligen Controller gedacht sind immer weiter
gereicht werden.
Das vermeidet es, einen Kollisionsschutz einbauen zu müssen. Jeder
Controller kann senden, wann er will, er muss nur nachher die
empfangenen Datenpakete weiter reichen, die nicht für ihn bestimmt sind.
Der Nachteil ist natürlich, das, wenn ein Controller ausfällt oder die
Leitung an einer Stelle defekt ist, das ganze System stillgelegt ist.
Florian
@ Alter Mann (Gast)
>Wie wäre es als Alternative mit einer Ringleitung? Also
Ist nicht sonderlich schön, weil
>Der Nachteil ist natürlich, das, wenn ein Controller ausfällt oder die>Leitung an einer Stelle defekt ist, das ganze System stillgelegt ist.
Strangförmiger Bus ist scon OK, und wenn nur ein Master die Slaves
abfragt, geht das schon.
MfG
Falk