Forum: Mikrocontroller und Digitale Elektronik Atmega32 uart - 1 sender - n Empfänger


von Tom (Gast)


Lesenswert?

Hallo,

für eine Wohnraumbeleuchtung plane ich folgendes :
Auf einem Atmega32/644 liegen mehrere Makros, die Lichtszenarien 
beinhalten. Über eine Uart Verbindung sind 3-4 Attiny2313 (4PWM) 
angeschlossen.

Atmega sendet : Attiny1 , LED Kette langsam dimmen
                Attiny2 , LED Sternenhimmel langsames durchfade
                usw .....

Auf den jeweilgen Attinys findet dann die PWM Umsetzung der Makros 
statt.

Wie adressiere ich die einzelnen Attinys ?
Läuft die Steurung über ein Kabel / Verbindung ?

Kann mir jemand ein paar Infos oder Links zu diesem Thema liefern ?

Danke

von holger (Gast)


Lesenswert?

>Wie adressiere ich die einzelnen Attinys ?

Indem du ihnen Nummern verpasst.

>Läuft die Steurung über ein Kabel / Verbindung ?

Nö, GND muss auch noch sein. Also zwei Kabel.

von Tom (Gast)


Lesenswert?

@holger

Kannst du mir das bitte ein wenig genauer erklären ?

von holger (Gast)


Lesenswert?

>Kannst du mir das bitte ein wenig genauer erklären ?

ATTiny1 Hausnummer 1
ATTiny2 Hausnummer 2

Dann Master:

Sende Hausnummer1+ Befehl an ATTiny1
Sende Hausnummer2+ Befehl an ATTiny2

von spess53 (Gast)


Lesenswert?

Hi

UART im Multiprozessormode.

MfG Spess

von holger (Gast)


Lesenswert?

>UART im Multiprozessormode.

Das war jetzt ja wohl ein Griff ins Klo ;)

von Tom (Gast)


Lesenswert?

>ATTiny1 Hausnummer 1
>ATTiny2 Hausnummer 2

>Dann Master:

>Sende Hausnummer1+ Befehl an ATTiny1
>Sende Hausnummer2+ Befehl an ATTiny2

So habe ich mir das auch ähnlich gedacht. Wie adressiere ich die Attiny 
denn ?

von spess53 (Gast)


Lesenswert?

Hi

>Das war jetzt ja wohl ein Griff ins Klo ;)

Was ist daran gross anders, als bei deiner Variante? Ausser das Bit8 als 
Adresskennzeichen benutzt wird. Und die Slaves werden wesentlich weniger 
belastet.

MfG Spess

von holger (Gast)


Lesenswert?

>>Das war jetzt ja wohl ein Griff ins Klo ;)

>Was ist daran gross anders, als bei deiner Variante? Ausser das Bit8 als
>Adresskennzeichen benutzt wird. Und die Slaves werden wesentlich weniger
>belastet.

Nichts, außer das es für den Probanden zu kompliziert ist.
Siehe seine letzte Antwort bei der ich gar bitterlich weinen muss ;)

von Tom (Gast)


Lesenswert?

Der "Proband" möchte ja auch mal klüger werden, darum fragt er hier ja 
auch

von holger (Gast)


Lesenswert?

>Der "Proband" möchte ja auch mal klüger werden, darum fragt er hier ja
>auch

SendUart(Hausnummer1)
SendUart(Befehl)

SendUart(Hausnummer2)
SendUart(Befehl)

Klingelt jetzt was?

von spess53 (Gast)


Lesenswert?

Hi

>Nichts, außer das es für den Probanden zu kompliziert ist.
>Siehe seine letzte Antwort bei der ich gar bitterlich weinen muss ;)

Wenn er aber seinen Slaves auch noch beibringen muss, nicht auf falsche 
Daten zu reagieren, werden seine Fragen dich wahrscheinlich noch 
wesentlich weinerlicher stimmen.

@ Tom (Gast)

Nichts für ungut. Aber wenn du es machen willst, dann mach es richtig.

MfG Spess

von Tom (Gast)


Lesenswert?

@spess53

ich höre dir wissbegierig zu :-) Es soll schon funktionieren

von holger (Gast)


Lesenswert?

>@spess53
>ich höre dir wissbegierig zu :-) Es soll schon funktionieren

Mal sehen wie spess53 da wieder raus kommt ;)

von spess53 (Gast)


Lesenswert?

Hi

Gut eine Kurzeinführung:

Normalerweise werden 8 Bit zur Übertragung verwendet. Multi-processor 
Communication Mode (MPCM) werden 9 bit verwendet. das 9. Bit (Bit8) 
dient zu Kennzeichnung einer Adresse. Zusätzlich gibt es in UCSRA nnoch 
das MPCM-Bit. Wenn dieses Bit gesetzt ist wird ein RXC-Interrupt nur 
ausgelöst, wenn Bit 8 gesetzt ist. Bei der Initialisierung setzen alle 
Slaves ( deine ATTiny) dieses Bit. Wenn der Master (dein ATMega) einen 
Slave Adressieren will, setzt er Bit8 auf 1 und lädt die unteren 8 Bit 
(UDR) mit der Adresse. Bei allen Slaves wird beim Empfang ein 
RXC-Interrupt ausgelöst. Jetzt überprüfen alle Slaves, ob das die eigene 
Adresse (in UDR) ist. Wenn nicht kann weiter geschlafen werden. Der 
Slave mit der übereinstimmenden Adresse löscht jetzt das MPCM-Bit. Damit 
wird auch bei Bit8=0 ein RXC-Interrupt ausgelöst. Der Master sendet die 
Daten mit gelöschtem Bit 8. Damit empfängt nur der zuvor adressierte 
Slave die Daten. Die anderen werden davon überhaupt nicht belästigt. 
Wenn der Slave alle Daten empfangen hat, setzt er sein MPCM-Bit wieder 
auf 1 und wird dadurch wieder nur auf eine neue Adress empfänglich. 
Danach kann er in Ruhe die empfangenen Daten verdauen.

Ich hoffe das war einigemassen verständlich. Ist auch im Datenblatt 
nachzulesen.

MfG Spess

von Tom (Gast)


Lesenswert?

Soweit erste einmal Danke für die Kurzeinweisung. Ist schon was anderes, 
als ein paar LED zu dimmen :-)

Damit ich mich nun weiter schlau machen kann, ist mein Stichwort "RS485" 
?! Zumindest wurde dieses Protokoll genannt, als ich nach 
"Multiprozessormode" gesucht habe.

Und da ich keine bidirektionale Kommunikation brauchem sonder lediglich 
willige "Befehlsempfänger", reichen 2 Leitungen aus ?!

von Karl H. (kbuchegg)


Lesenswert?

Nicht böse sein spess53. Aber das ist doch für Tom noch viel zu 
kompliziert.

Lass ihn doch einfach seinen Master UART mit allen Slaves verbinden.
Der Master UART brüllt dann einfach raus: Befehl an Tiny mit der Nummer 
25, mach dieses.
Der Tiny mit der Nummer25 reagiert auf den Befehl, alle anderen 
ignorieren ihn ganz einfach.

Das ist so, wie wenn du 20 Schüler in einem Raum hast. Ehe alles 
losgeht, verpasst du jedem eine Nummer.
Und dann brüllst du einfach in den Raum hinein: 23, Fenster aufmachen.
Hans (der vorher die Nummer 23 zugeordnet bekommen hat) macht das dann, 
während Fritz (mit der Nummer 17) den Befehl ignoriert.

Du denkst dir ein Schema aus, welches es dir gestattet eindeutig 
zwischen Adresse und Befehl zu unterscheiden. Zb sind alle Befehle nru 
Nummer zwischen 0 und 127 und alle Adressen sind Zahlen zwischen 128 und 
255. Wenn ein Tiny ein Byte empfängt braucht er nur nachsehen:

  Ist das Byte größer 127?
  +- Wenn ja
  |    Stimmt die Adresse mit meiner eigenen überein?
  |    +- Wenn ja
  |    |    Schalte mich scharf, das nächste Byte ist mein Befehlsbyte
  |    +- Wenn nein
  |         nichts tun
  |
  +- Wenn nein
       Bin ich auf einen Befehl scharfgeschaltet?
       +- Wenn ja
       |    Befehl ausführen
       +- Wenn nein
            Nichts tun
       Scharfschaltung rückgängig machen

Du kannst dir ja auch mal überlegen, wie sich das Auswerteschema 
verändern würde, wenn man ganz einfach Befehl und Adresse umdrehen 
würde. D.h. zuerst wird der Befehl übertragen und dann an wen der Befehl 
gerichtet ist. Um beim Beispiel zu bleiben:
"Fenster auf"  - alle Schüler spitzen die Ohren
23             - Nur Hans geht, alle anderen spielen weiter Karten


  Ist das Byte kleiner 127?
  +- Wenn ja
  |    Befehl für eine mögliche Ausführung speichern
  +- Wenn nein
       Stimmt die Adresse mit meiner eigenen überein?
       +- Wenn ja
            Befehl ausführen

Das ganze ist wirklich keine Hexerei, geh einfach davon aus, dass du 
eine Menge von Menschen hast, die alle strohdumm sind und die du 
fernsteuern musst, indem du Zahlen in die Menschenmenge hineinbrüllst. 
Wie würdest du das machen?
Der von spess53 angesprochene Multiprozessormode ist nur eine 
Möglichkeit, wie man Adressierung and Daten voneinander trennen kann und 
wie die Slaves nur dann belästigt werden, wenn es notwendig ist. Bei dir 
ist aber die Last an den Slaves nicht besonders hoch, so dass du nicht 
darauf angewiesen bist, auch noch das letzte bischen Rechenzeit 
herauszuquetschen. Ehe du Sondermodi in der UART Übertragung benutzt, 
solltest du meiner Meinung nach erst mal mit den Standardmodi und einer 
Standardübertragung klarkommen.
Fang erst mal an den Master mit einem Slave reden zu lassen und dem 
Befehle zu schicken. Dann hast du schon mal ein wesentlich besseres 
Rüstzeug um mehrere Slaves an die UART zu hängen.

von Timmo H. (masterfx)


Lesenswert?

Wieso eigentlich nicht I²C nehmen? Das ist doch extra für solche zwecke 
gedacht!

von Karl H. (kbuchegg)


Lesenswert?

Timmo H. schrieb:
> Wieso eigentlich nicht I²C nehmen? Das ist doch extra für solche zwecke
> gedacht!

Leitungslänge.

von sam (Gast)


Lesenswert?

>Wieso eigentlich nicht I²C nehmen?

weil uart schon in hardware implementiert ist ... und für diese einfache 
aufgabe vollkommen ausreicht.
karl heinz hat das schon super beschrieben, dem kann ich nichts 
hinzufügen.

jeder slave lauscht auf dem TX des masters und entscheidet anhand von 
dem was er hört, ob er gerade angesprochen ist.
nicht sehr sicher, aber ob eine lampe mal nicht angeht interessiert den 
master ja herzlich wenig.


I2C wäre auch super geeignet, bedeutet auch nur einen geringfügigen 
mehraufwand.

die leitungslänge sollte man mal noch betrachten ....

von spess53 (Gast)


Lesenswert?

Hi

>Nicht böse sein spess53. Aber das ist doch für Tom noch viel zu
>kompliziert.

Der zusätzlich Aufwand beschränkt sich auf die Manipulation eines Bits 
beim Master und eines Bits beim Slave. Wenner das nicht packt, hat 
sowiso das falsche Hobby.

>Und da ich keine bidirektionale Kommunikation brauchem sonder lediglich
>willige "Befehlsempfänger", reichen 2 Leitungen aus ?!

Masse macht sich auch nicht schlecht. Also 3.

>Wieso eigentlich nicht I²C nehmen? Das ist doch extra für solche zwecke
>gedacht!

Wenn du das richtig, also mit der implementierung aller möglicher 
Zustände machst, ist es nicht ganz ohne.

MfG Spess

von Tom (Gast)


Lesenswert?

wow, danke für die rege Teilnahme.

Die Leitungslänge liegtbei ca. 20 cm.

@Karl heinz Buchegger
Danke, super Erklärung. Ich denke, dass dies wohl doch erst einmal der 
richtige Weg für mich ist. Hört sich immer ncoh schwierig genug an. Bei 
diesem System "hört" der slave also ständig, ob der master etwas in den 
Raum brüllt. Dies "blockiert" also seine eigentliche Arbeit --> Dimmen 
und schalten von Licht ? Da diese Szenarien nicht ständig wechseln, wäre 
diese "Ablenkung" aber nicht tragisch ?!

@spess53
Naja, ich denke einmal , das auch du nicht als sprechender Mensch auf 
die Welt gekommen bist, aber es dennoch versucht hast, sprechen zu 
lernen. Ebenso versuche ich dies im Bereich der mc zu tun. Von einem 
"falschen" Hobby kann also meiner Meinung nach  nicht gesprochen werden. 
Dennocoh danke für deine Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:

> Raum brüllt. Dies "blockiert" also seine eigentliche Arbeit --> Dimmen
> und schalten von Licht ?

Kommt drauf an.
Bei Dimmen hat der µC ständig was zu tun. Er muss ja die PWM bedienen. 
Aber das kann der auch genausogut in Hardware machen.
Bei Schalten muss der µC ja nicht ständig was tun. Er schaltet das Licht 
ein oder aus und legt sich dann wieder schlafen. Wenn das Licht erst mal 
brennt oder aus ist, gibts ja nichts mehr zu tun. Du musst ja auch nicht 
dauernd beim Lichtschalter stehen bleiben :-)

> lernen. Ebenso versuche ich dies im Bereich der mc zu tun. Von einem
> "falschen" Hobby kann also meiner Meinung nach  nicht gesprochen werden.

Na ja.
Du denkst im Moment noch viel zu kompliziert und machst dir über Details 
Sorgen, die in Wirklichkeit keine sind. Dafür lässt du es an 
konstruktiver Phantasie mangeln. Das merkt man schon an deinen Fragen. 
Genauso wie man aus deinen Fragen heraushören könnte, dass dir noch 3 
oder 4 Vorstufen zu deiner Problemlösung fehlen.

von spess53 (Gast)


Lesenswert?

Hi

>Ebenso versuche ich dies im Bereich der mc zu tun. Von einem
>"falschen" Hobby kann also meiner Meinung nach  nicht gesprochen werden.
>Dennocoh danke für deine Hilfe

Das hatte sich lediglich auf das setzen eines Bits bezogen.

>Die Leitungslänge liegtbei ca. 20 cm.

Wenn du keine total elektrosmogverseuchte Umgebung hast, brauchst du bei 
der Entfernung kein RS485. Da reicht Signal und Masse.

MfG Spess

von sam (Gast)


Lesenswert?

>Dies "blockiert" also seine eigentliche Arbeit --> Dimmen
und schalten von Licht ? Da diese Szenarien nicht ständig wechseln, wäre
diese "Ablenkung" aber nicht tragisch ?!


wenn du die dimmung über eine hardware (timer) pwm realisierst, hast du 
die komplette rechenzeit des µC brachliegen ... selbst wenn du 100 mal 
pro sekunde dein beleuchtungsszenario änderst, wird sich der µC bei 
20MHz noch langweilen.


und sogar bei PWM in software brauchst ja auch max 200Hz für die 
PWM-frequenz ... d.h. der wird mehr warten als sich mit dem ändern der 
ausgänge beschäftigen.

von Tom (Gast)


Lesenswert?

Ok. Nochmals vielen Dank. Ich werde euch hoffentlich im Laufe meines 
Projektes ein paar Fortschritte zeigen können.
Bis dahin

von D. S. (datasheet)


Lesenswert?

Hi!

Ich hab mal mehrere UARTs über Multiplexer und Demultiplexer 
angesprochen. Ist zwar für Deine zwei Slaves ein höherer 
Schaltungsaufwand, aber dadurch vereinfacht sich die Software der Slaves 
und man hat kein Problem damit die ganze Geschichte zu erweitern.

bye
Data

von STK500-Besitzer (Gast)


Lesenswert?

>Ich hab mal mehrere UARTs über Multiplexer und Demultiplexer
>angesprochen. Ist zwar für Deine zwei Slaves ein höherer
>Schaltungsaufwand, aber dadurch vereinfacht sich die Software der Slaves
>und man hat kein Problem damit die ganze Geschichte zu erweitern.

Was ist einfacher anzupassen? Hardware oder Software?
Wenn man sich ein sinnvolles Protokoll ausdenkt, ist das auf jeden Fall 
einfacher (zu erweitern) als irgendwelche Hardware.

von Timmo H. (masterfx)


Lesenswert?

Ich verstehe immernoch nicht warum kein I²C. Das ist doch viel 
einfacher, und der AVR hats in Hardware drin. Man braucht nur noch die 
Adressen für jeden Empfänger festlegen und gut is.

von spess53 (Gast)


Lesenswert?

Hi

>Man braucht nur noch die Adressen für jeden Empfänger festlegen und gut is.

Hast du dir das Kapitel im Datenblatt mal richtig durchgelesen?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag @Timmo: Der ATTiny2313 den Tom verwenden will hat z.B. kein 
Hardware-I2C.

MfG Spess

von STK500-Besitzer (Gast)


Lesenswert?

>Ich verstehe immernoch nicht warum kein I²C. Das ist doch viel
>einfacher, und der AVR hats in Hardware drin. Man braucht nur noch die
>Adressen für jeden Empfänger festlegen und gut is.

I²C erwartet ein Handshake. USART nicht.
Wenn der Slave auf die I²C-Nachricht nicht antwortet, hängt der Master 
u.U. irgendwo im Programm fest.
Wenn der Slave keine Nachricht per USART empfängt, ist das dem Master 
sehr egal, weil er eh keine Antwort erwartet.

von Timmo H. (masterfx)


Lesenswert?

spess53 schrieb:
> Hast du dir das Kapitel im Datenblatt mal richtig durchgelesen?
Ja, und auch schon mehrfach benutzt.

>Nachtrag @Timmo: Der ATTiny2313 den Tom verwenden will hat z.B. kein
>Hardware-I2C.
Der 2313 hat USI und damit geht auch Two-Wire Mode, kann also auch als 
TWI verwendet werden. Dafür hat Atmel sogar eine Application Note: 
http://www.atmel.com/dyn/resources/prod_documents/doc2560.pdf

Gut ist programmiertechnisch vielleicht etwas aufwendiger als UART, aber 
der Quellcode ist ja schon fertig.

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.