mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen zwei Atmega88


Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Freizeitbastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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-M...


> 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

Autor: Mikki Merten (mmerten)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mikki Merten (mmerten)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.