mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Eigenes BUS-System


Autor: Sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

folgendes "Problem" stellt sich mir: Ich möchte die Lüfter in meinem
PC zentral steuern, jeden über einen eigenen AVR. Die Steuerung als
solche funktioniert auch soweit, nun muss nur noch die Kommunikation
mit einem Steuergerät her.

Hierzu möchte ich NICHT von jedem Steuermodul ein Kabel zum
Zentralgerät ziehen, sondern ein BUS-System bauen. - sprich, eine
Steuerleitung, die über alle Module drüber läuft.

Dazu habe ich mir gedacht, in jeden AVR eine eindeutige ID zu brennen
und mit dieser das jeweilige Gerät anzusprechen. Der absolute Overkill
wäre jetzt natürlich, wenn sich die Geräte auch noch am Zentralgerät
anmelden würden, so dass diese gar nicht mehr eingetragen werden
müssten... Das ist aber nicht wirklich nötig.

Doch auch ohne diese Anmelde-Prozedur, wie realisiere ich so ein
BUS-System? Über den UART? Gibt es da irgendeine Beispielschaltung? Ich
bin für jeden Tip dankbar...

BTW: Dieses Forum ist mehr als cool... Langsam verstehe ich das
Potential von AVRs zu nutzen, vor drei Monaten wusste ich noch nicht
einmal, dass die Dinger existieren.

THX a lot,
Sebezahn

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also entweder mit dem UART und dann einen RS485/RS422 Bus aufbauen. Da
sind allerdings die Transmitter nicht ganz günstig. Wenn das ganze
innerhalb eines PC's abläuft und günstig sein soll:

Master->Slaves:
Uart TX vom Master mit allen Uart RX der Slaves verbinden.

Slaves->Master:
Über jeweils einen Transistor ein Wired-AND aufbauen. Die Slaves dürfen
dann aber nur auf Anforderung senden. Ja nach Aufbau muß das Signal auf
Empfängerseite dan nochmal invertiert werden.

Matthias

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal das hier an:
http://www.thomasknauf.de/rap/seatalk1.htm#Har
Ist zwar für einen ganz anderen Zweck entwickelt, funktioniert aber
hervorragend.  (Ungeschirmte) Datenleitungen über eine Entfernung von
vielen Metern in einer "noisy" Umgebung sind kein Problem (und die
Regel) und die Comms Hardware besteht aus zwei Transistoren.

Reiner

Autor: Sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ok, ist noch ein wenig hoch das alles für mich, aber ich werde mich
durchkämpfen. Vielen Dank,

Sebezahn

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf vielen Motherboards werden einige Funktionen (z.B. die
Temperatursensoren) über den I²C-Bus angesteuert. Evtl. wäre es sogar
möglich, sich an den vorhandenen Controller anzuhängen (es gibt einige
Freeware-Tools, die die Sensoren abfragen - also muß es möglich sein).

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebezahn

Ist im Prinzip ganz einfach:
1. Die ATMEL UART wird für 9 Datenbits konfiguriert.
2. Jedes Device hört auf dem Bus bis der Bus frei wird und
   danach wartet das Device mit seiner eigenen Wartezeit (Priorität).
3. Danach kann das Device senden und hört seine eigene Sendung mit.
   Wird die Sendung gestört (anderes Device sendet) -> restart mit 1.
   Die anderen Devices erkennen den Abbruch daran, daß das Datagram
nicht die richtige Länge hat.

void ST_transmit_frame(unsigned int *frame, unsigned char size)
{
register int *fptr;    /* pointer to frame.    */
register int ch;    /* echo from bus.    */
register unsigned char retransmit = TRUE;/* retransmit flag.  */
register unsigned char i;  /* byte counter.    */

while (retransmit == TRUE)  /* while frame not sent    */
{
retransmit = FALSE;          /* assume we have success  */
fptr = frame;      /* set ptr to start of frame    */
while (!ST_idle);    /* wait for bus to idle.  */
while ((ch = ST_uart_getchar()) != -1);  /* empty ST queue.  */
for (i = size; i; i--)    /* transmit frame.    */
{
ST_uart_putchar(*fptr);    /* transmit a byte.    */
while ((ch = ST_uart_getchar()) == -1);  /* read the echo.  */
if (*(fptr++) != ch)    /* compare with echo          */
{
retransmit = TRUE;     /* no match      */
break;        /* stop transmission         */
}
}                                                  /* next byte      */
}
}

Autor: Sebezahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielen Dank, das hat mich schon sehr weiter gebracht. Ich werde mir
sowohl den UART als auch den I2C zu Gemüte führen.

Gruß
Sebezahn

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.