Forum: Mikrocontroller und Digitale Elektronik 2 Atmega Kommunikation


von Sebastian (Gast)


Lesenswert?

Ich versuche hier zurzeit eine Kommunikation für 2 Megas untereinander 
aufzubauen.

Als Daten sollen nur eine 8 Bit Zahl schnell vom Master zum Slave 
gesendet werden. Im Slave soll dann diese Zahl auf 6 Angeschlossene 
Geräte passend verteilt werden wo der Master also noch eine 3Bit 
Adressierung mitsenden muss.

Meine Grundidee war es aufgrund Pinmangels den INT0 vom Slave als 
SendeStart zu benutzen dann 3 Pins für die Adressierung und ein 4Bit 
Datenbus der die 8bit Zahl jeweils als low und high byte schickt.

Macht am ende 8 Pins verbraucht. Gibts ne möglichkeit das besser zu 
lösen? Ich denke wahrscheinlich zu kompliziert. Usart währe ne andere 
Möglichkeit aber es sollte alles Fix von statten gehen.

Schönes Wochende euch , Gruss Sebastian

von Thorsten (Gast)


Lesenswert?

Definiere "fix".

von Weingut P. (weinbauer)


Lesenswert?

senden und empfangen mit 250000 baud über uart ist kein
problem und läuft interruptgesteuert "nebenher" für die
anderen parallelen Geschichten brauchste code, der
Ausführungszeit beansprucht, wird vermutlich nicht
viel schneller sein und du hast ne menge mehr
IO frei.

Wie schnell solls denn sein?

von Sebastian (Gast)


Lesenswert?

Tja das ist die Frage beim meiner Lösung brauche ich etwa 8 Takte zum 
senden.
Die Verarbeitung am Slave sollte sich auch dahingegen bewegen.

mir fehlt halt der Vergleich zwischen meiner Lösung und einer Usart 
Kommunikation bei welcher 11 Bit übertragen werden sollen.(3bit 
Adresse/8bit daten)

MFG Sebastian

von Sebastian (Gast)


Lesenswert?

Usart würde mir persönlich schon vom Pin Verbauch und Schaltungsaufwand 
besser gefallen.

von Weingut P. (weinbauer)


Lesenswert?

11 bit mit uart wird wohl auf 2 byte 16bit hinaus laufen

von Sebastian (Gast)


Lesenswert?

Ja das währe ja klar aber Geschwindigkeitstechnisch wo bewegen wir uns 
in Takten da ?

von Peter D. (peda)


Lesenswert?

Sebastian wrote:
> Tja das ist die Frage beim meiner Lösung brauche ich etwa 8 Takte zum
> senden.
> Die Verarbeitung am Slave sollte sich auch dahingegen bewegen.

Kannste voll vergessen.
Du brauchst mindestens schon 10 Zyklen, um in den Interrupt zu springen, 
Register sichern ist aber noch nicht bei.
Und Verzögerungen durch andere Interrupts auch nicht.

Schneller als mit nem Hardwareinterface (SPI, I2C, UART) gehts nicht.

Höchstens per Memoryinterface und 74HC646 gekoppelt, kostet aber massig 
Portpins.
Einer schreibt in den 74HC646 und der andere holt es ab, wenn er Zeit 
hat und setzt einen Pin, damit das nächste Byte gesendet werden kann.


Peter

von Nico E. (masta79)


Lesenswert?

Wieso nicht einfach via SPI? Da kannst du mit CLK/2 übertragen und 
brauchst 3 Leitungen (MOSI/SCK/!SS), falls du wirklich nur Master->Slave 
kommunizieren willst.

Wenn dir das zu langsam ist wirst du aber um ein parallel-Interface 
nicht drumherum kommen.

von Sebastian (Gast)


Lesenswert?

Meine Parallel Version hat den Vorteil das man Später bei bedarf noch 
einen slave hinzufügen kann den am Master ist genug frei. Würde dann 
auch mit Usart gehen blos da würde ich mir sorgen machen da ja alle 
Slaves ersteinmal in den Usart Interrupt gehen und dann erst per Zweiter 
Adressierung mitbekommen wer jetzt gemeint ist, was den jeweils anderen 
dann auch erst einmal in Pause versetzt.

Schön wen man zuviel Auswahl hat...

Würde was grundlegendes gegen den 4Bit parallel Datenbus sprechen?

von Ralph (Gast)


Lesenswert?

>>Würde was grundlegendes gegen den 4Bit parallel Datenbus sprechen?

JAA der Verwaltungsaufwand in der Software um dies alles zu 
organisieren.

Verwende die SPI Schnittstelle, und für jeden weiteren Slave benötigst 
du nur eine PIN als Chipselect ( SS oder CS genannt).

Bedarf an Portpins ist 3Pins an alle Slave ( MISO, MOSI, CLK) und ein 
Pin pro Slave (CS)

von Sebastian (Gast)


Lesenswert?

ah klingt ja sehr verlockend das schau ich mir mal näher an danke dir.

MFG Sebastian

von Nico E. (masta79)


Lesenswert?

Sebastian wrote:

> Würde was grundlegendes gegen den 4Bit parallel Datenbus sprechen?

Ja, einiges, entweder musst du dem master signalisieren das du die 4 
bits ausgelesen hast, oder du musst im Master eine feste zeit warten. 
Wenn du das ganze via Interrupts machst hast du einfach das problem das 
du deine Laufzeiten nur selten exakt vorhersagen kannst.

Wenn du eine der Hardware-Schnittstellen nutzt musst du dir um sowas 
normal keine Gedanken machen. Bei SPI würde ich es so realisieren das du 
beim Chipselect in einen Interrupt-handler springst und dort dann via 
Busy-Wait die beiden Bytes (Addresse und Daten) ausliest. Das ist von 
den Latenzen her ein wenig besser als zweimal auf den SPI Interrupt zu 
warten. Wenn du wirklich schnell übertragen willst solltest du aber noch 
eine Checksumme in irgendeiner Form mitführen, die ungenutzten 5 bits 
der Addresse bieten sich dafür an. Beim Board-layout sollte man dann 
auch ein bischen auf ungewollte Einflüsse achten 
(Kapazitäten/Induktivitäten).

von Peter D. (peda)


Lesenswert?

Sebastian wrote:

> Würde was grundlegendes gegen den 4Bit parallel Datenbus sprechen?

- langsamer
- braucht mehr Leitungen
- hoher Softwareaufwand (CPU-Last)

Wie schon gesagt, der Master muß immer schön warten, bis der Slave 
endlich in den Interrupt gesprungen ist und die Daten garantiert 
ausgelesen hat (Worst Case).

Hardware-Interfaces puffern aber mindestens 1 Byte (UART: 3 Byte) ganz 
ohne CPU-Last.
Der Slave kann sie also später abholen, ohne das der Master solange 
Däumchen drehen muß.


Peter

von Sebastian (Gast)


Lesenswert?

Danke euch allen, ich teste das jetzt per SPI und dem CS , gefällt mir 
persönlich auch besser so, da ich in der Schaltung ein paar Leitungen 
spare .

MFG Sebastian

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.