Hallo,
kennt jemand von Euch, oder hat schon mal einer einen parallelen
Datenbus aufgebaut, um z.B. x AVRs miteinander kommunizieren zu lassen.
Iststand bei mir: Jeder Atmel ist über einen Port an den Datenbus
angekoppelt. Der Busmaster ist ein C167, der zyklisch alle
Requestleitungen pollt. Will ein Atmel Daten senden, setzt er seine
Requestleitung und erhält dann "irgendwann" sein Acknowledge über eine
weitere Leitung.
Das unschöne ist nur, der Bus ist unidirektional und mit jedem weiteren
Busteilnehmer werden wieder 2 weitere Leitungen (Request+Acknowledge)
benötigt.
Gibt es fertige Bausteine, die so eine einfache paralelle Busankopplung
ohne Begrenzung der Busteilnehmer ermöglichen?
Über jeden Hinweis wäre ich sehr dankbar.
Grüße
Oliver
Der Datenbus wurde im Glauben so konzipiert. Im nachhinein, denke ich,
könnte es auch ein serieller sein.
Gibt es denn eine serielle Lösung mit unbegrenzter Anzahl von
Busteilnehmern? CAN-Bus, Profi-Bus, Inter-Bus erst mal ausschließen.
Also unbegrenzte Anzahl an Teilnehmern natürlich nicht!!!
So 16. Nur wenn noch einer hinzu kommen sollte, dann wäre es schön, wenn
das Bussytem nicht ausgewechselt werden muß.
Du kannst ja den RS232 Standard verwenden.
und dann zuerst ein adress byte, damit der gewünschte Controller weiss
das er gemeint ist,
dann eine absender adresse für eine Antwort(nicht immer nötig)
und dann ein Datenbyte senden.
Son kann jeder Controller an jeden schreiben.
Nik
Eine Möglichkeit eine riesige Anzahl von Teilnehmern über SPI anzuhängen
sind die kaskadierbaren IO-Expander von Maxim. Einer von diesen sitzt am
SPI inklusive CS. Die Ausgänge des Expanders sind mit den CS-Eingängen
der anderen Teilnehmer verbunden, ein Selektier-Befehl an den Expander
und CS des entsprechenden Teilnehmers wird aktiviert.
Auf diese weise redet bei mir ein AT91 mit vielen kleinen AT90 Sklaven
;) Wenn einer von ihnen etwas zu sagen hat geht das auf eine art
Request-Controller der dem AT91 dann per UART vermittelt wer da etwas
wollte, dannach kann dieser gezielt abgefragt werden.
Das System hört sich vielleicht etwas umständlich an, aber hat sich bei
mir sehr bewährt.
Hallo Nik,
ganz so einfach ist das leider nicht. Wollen mehrere Teilnehmer
gleichzeitig senden, kommt es zu einer Kollision. Um dies zu verhindern,
wird eine Busarbitrierung benötigt. Dieser Schiedsrichter sagt den
Teilnehmern, wann sie senden dürfen und wann nicht.
Die einfachste Version wäre eine Daisy Chain. Aber auch dort kann es zu
Kollisionen kommen, die irgendwie aufgelöst werden müssen.
Gibt es nicht irgendeinen einfachen Baustein, der so was macht?
Grüße
Oliver
Es wäre auch möglich, ein counter( z.B cmos 4017, Dezimal Counter) in
mein "system" hinein zu hängen. Jeder ausgang des 4017 wäre
mit je einem eingang eines conrollers verbunden.
Sobald der eingang vom controller 1 high ist, darf dieser senden. Ist
der eingang von controller 2 high darf dieser senden. Alle anderen sind
dabei unberechtigt zu senden.
Dabei käme es zu keiner Kollision mehr.
Eine zweite Möglichkeit wäre es an alle uc's die selbe RTC anzuhängen,
dabei wäre festgelegt wann wer senden dürfte.
Nik
Hallo Sascha,
ich habe das so verstanden, daß nur über ein Request eines Atmel Sklaven
kommuniziert werden kann. Kann Dein AT91-Master auch gezielt einen
Sklaven ansprechen, um ihn z.B. zu konfigurieren?
Grüße
Oliver
Hallo Nik,
in einem Projekt habe ich das auch schon mal so ähnlich gemacht. 8
Atmels müssen sich eine TxD-Leitung(UART) teilen. Ein weitererer Atmel
pollt zyklisch die Request und erteilt dann demjenigen den Zuschlag, bei
dem er hängen bleibt (Round Robin).
Problem dieser Lösung ist, mit jedem weiteren Teilnehmer muß auch
komplett der Bus erweitert werden.
Besser wäre es, wenn der Bus so bleiben kann und es kommen nur die
Leitungen zur Busankopplung hinzu.
Aber ich denke, der Request-und Acknowledge - Vorgang muß durch ein
Bussystem realisiert werden und die eigentliche Kommunikation kann dann
über den UART erfolgen. Wenn einer was sendet, lauschen alle anderen an
der seriellen, ob das Paket für ihn bestimmt ist.
Grüße
Oliver