Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen zwei Atmega88


von Bobo (Gast)


Lesenswert?

Hallo AVR-Gemeinde,

ich habe da zwei Fragen, ich muss eine Kommunikation zwischen zwei 
Atmega88 Mikrocontrollern realisieren, unter C. Die USART Schnittstellen 
der beiden Atmega88 werden bereits verwendet (senden permanent Daten).
Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle 
wahrscheinlich empfählen.

Meine Fragen dazu sind:
Wie sollte ich die Master/Slave Einstellung machen, oder welche 
Einstellung muss man durchführen?
Laufen USART und I2C parallel oder sequentiell ab? Da der Datenfluss bei 
USART nicht unterbrochen werden darf


Vielleicht könnte mir dabei jemand helfen?

Danke im Voraus

Gruß Bobo

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle
> wahrscheinlich empfählen.
Nimm SPI.

> Laufen USART und I2C parallel oder sequentiell ab?
Der UART und die TWI-Interface (SPI, I2C) sind Hardwarekomponenten, da 
läuft alles unabhängig von der Software. Nur das jeweils nächste Datum 
(= Einzahl von Daten) muß in das entsprechende Senderegister eingetragen 
werden.


BTW: kommt
> empfählen
von Pfahl?

von Peter D. (peda)


Lesenswert?

Lothar Miller schrieb:
>> Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle
>> wahrscheinlich empfählen.
> Nimm SPI.

Nimm auf keinen Fall SPI!

Die AVRs haben nur ein arme-Leute SPI ohne Sendepuffer.
D.h. Du wirst Dir die Haare raufen und trotzdem Bytes verlieren.


Das I2C ist ideal, da es ein Handshake über SCL macht, Datenverluste 
sind daher ausgeschlossen. Der Bus wartet immer auf den langsamsten 
Teilnehmer.

Das Multimaster-I2C hat beim AVR leider einen Bug, daher mach den einen 
zum Master und den anderen zum Slave.
Das I2C sollte zumindest beim Slave als Interrupt gemacht werden.


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Die AVRs haben nur ein arme-Leute SPI ohne Sendepuffer.
Schade, eigentlich  :-(
Aber das wird durch den fehlenden Empfangspuffer mehr als ausgeglichen 
;-)

von Freizeitbastler (Gast)


Lesenswert?

Aus dem 88er Datenblatt:

The system is single buffered in the transmit direction and double 
buffered in the receive direction.
This means that bytes to be transmitted cannot be written to the SPI 
Data Register before
the entire shift cycle is completed. When receiving data, however, a 
received character must be
read from the SPI Data Register before the next character has been 
completely shifted in. Otherwise,
the first byte is lost.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:

> Das Multimaster-I2C hat beim AVR leider einen Bug, daher mach den einen
> zum Master und den anderen zum Slave.
> Das I2C sollte zumindest beim Slave als Interrupt gemacht werden.

Hast du hähere Informationen darüber? In den ATmega88-Errata findet sich 
nix darüber.

Gerade der Multimaster-Mode ist nämlich sehr interessant für Netzwerke: 
Jeder µC ist Master (Client) und kann was an einen anderen Teilnehmer 
senden, der daruch zum Slave (Server) wird um den Request zu 
beantworten.

Johann

von Peter D. (peda)


Lesenswert?

Johann L. schrieb:
> Hast du hähere Informationen darüber? In den ATmega88-Errata findet sich
> nix darüber.

http://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html


> Gerade der Multimaster-Mode ist nämlich sehr interessant für Netzwerke:

Stimmt.
Ich hatte sowas mal mit Philips-MCs aufgebaut und es hat einwandfrei 
funktioniert. Aber als Philips zu NXP wurde, hat man viele 8051-er 
abgekündigt und dann hab ich auf AVRs umgestellt.
Hat ziemlich lange gedauert, eh die Software wieder lief.


Peter

von Mikki M. (mmerten)


Lesenswert?

Oder nen Mega 164/324/644P nehmen, da kann man die beiden UARTs auch 
wahlweise im SPI Mode betreiben und hat dann Sende- und Empfangsbuffer. 
Sind ja auch nicht wesentlich teurer, machen aber das timing bei vielen 
Int Quellen wesentlich entspannter.

von Peter D. (peda)


Lesenswert?

Mikki Merten schrieb:
> Oder nen Mega 164/324/644P nehmen, da kann man die beiden UARTs auch
> wahlweise im SPI Mode betreiben und hat dann Sende- und Empfangsbuffer.

Das nützt bloß nix, die UART kann kein Slave-SPI.

Und der Slave ist es ja, der genau nur einen halben SCK-Takt Zeit hat, 
um das nächste Byte in das Schieberegister zu schreiben.


Peter

von Mikki M. (mmerten)


Lesenswert?

Stimmt, leider können die UART nur SPI Master. Da hat man wohl nicht 
ganz bis zu Ende gedacht, selbst beim Xmega mit gibt`s beim UART nur SPI 
Master Mode.

von Peter D. (peda)


Lesenswert?

Mikki Merten schrieb:
> selbst beim Xmega mit gibt`s beim UART nur SPI
> Master Mode.

Ich hätte jetzt gedacht, der XMEGA hat DMA?

Da sollte es doch möglich sein, im SPI-Slave z.B. 100 Byte Sendepuffer 
anzulegen und der DMA packt dann das nächste Byte sofort ins 
Senderegister, sobald ein Byte fertig ist.
D.h. der Master kann die 100 Byte ohne Delay abholen, bzw. neue 100 Byte 
zum Slave senden.

Man muß sich dann nur noch ein Protokoll ausdenken, damit der Slave 
vorher weiß, wieviel Byte er für den DMA vorbereiten muß.
Im einfachsten Fall eine konstante Paketlänge, z.B. 16 Byte.


Peter

von Bobo (Gast)


Lesenswert?

Danke schon mal für eure ganzen Beiträge. Das Problem ist das ich den 
Atmega88 verwenden muss und die Pins RXD und TXD werden permanent 
angesteuert, also fallen die schonmal weg. Ich muss nun parallel zu den 
empfangen daten über die USART noch andere Daten empfangen können und 
darum die Frage ob das über die I2C Schnittstelle geht???
Lg

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.