Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen 2 AVRs über einen Anschluss


von Christoph H. (Gast)


Lesenswert?

Hallo Allerseits,

schon seit längerem wollte ich die Datenübertragung mit nur einem 
Anschluss zwischen 2 AVR-Prozessoren realiseren.

Dazu habe ich ein Programm geschrieben, welches für einen 
Masterprozessor und einen Saveprozessor unterschiedlich kompiliert 
werden kann.

Die Kommunikation hat im Moment folgende Eingenschaften:

- Ping/Pong Verfahren: Die Kommunikation ist immer bidirektional
- Übertragungsgesschwindigkeit: 1KByte/Sec bidirectional ( also ca. 
20KBaud )
- Master/Slave: der Master schickt ein Byte zum Slave, der Slave ein 
Byte zurück


Es gibt nur 2 Funktionen:

masterping : sendet ein Byte zum Slave und wartet auf die Antwort
slavepong : wartet auf das Byte vom Master und sendet ein Antwortbyte 
zurück

Was haltet Ihr davon?

Gruss,
Christoph

Der Code befindet sich hier: 
http://www.roboterclub-freiburg.de/AtmelAVR/Software/chEinAnschlussKom_V1.0.c.zip

von nop(); (Gast)


Lesenswert?

Man kann vieles machen. Was soll's denn werden ? Einfach etwas in 
Konzepten stochern ?

von Troll B. (blaubeer)


Lesenswert?

Wie sieht das eigentlich mit dem Timing aus, wenn die AVRs neben der 
Kommunikation noch andere Arbeit erledigen müssen?

Ich frage deshalb, weil ich (als unwissender C-Muffel) im Code keinerlei 
Synchronisation mit Timer finden konnte, dafür aber den Aufruf von 
Delay-Routinen. Meine AVRs sollen eigentlich andere Arbeit tun als in 
Software Wartezeiten abzuzählen. Dafür gibt es Timer, die machen das im 
Hintergrund (in Hardware) ganz akkurat, während sich der AVR 
sinnvolleren Dingen widmen kann.

MfG, Blaubär

von Christoph H. (Gast)


Lesenswert?

> Was soll's denn werden ? Einfach etwas in Konzepten stochern ?

Ja, es geht mir ein wenig um Konzepte. Ausserdem möchte ich die Konzepte 
neu ordnen. Alle bisherigen Übertragungsverfahren haben ihre Anwendungen 
aber für bestimmte Anwendungen auch Nachteile z.B. benötigt der I2C-Bus 
2 Leitungen und ist für einen Attiny13 ungeeignet. Die 
Ein-Anschluss-Schnittstelle ist  sehr gut für 8-Pin Mikrokontroller 
geeignet.
Ausserdem wird als Übertragunsverfahren Puls-Code-Modulation verwendet. 
Das hat gegenüber einem RS232 Protokoll den Vorteil, das die 
Taktfrequenzen der beiden Kontroller nicht so gut synchronisiert sein 
müssen. Das ist vor allen Dingen bei den internen RC-Oszillatoren 
wichtig. Meine grobe Schätzung ist ein verkraftbarer 
Taktfrequenzunterschied von 20%.

>Ich frage deshalb, weil ich (als unwissender C-Muffel) im Code keinerlei
>Synchronisation mit Timer finden konnte, dafür aber den Aufruf von
>Delay-Routinen. Meine AVRs sollen eigentlich andere Arbeit tun als in
>Software Wartezeiten abzuzählen.

Ja, es sind Delay-Routinen.  Einen Timer zu benutzen bedeutet allerdings 
auch schon wieder den Verbrauch einer Resource, die man im System 
vielleicht schon wieder an anderer Stelle gebrauchen kann.
Es wäre natürlich schade, wenn der Prozessor seine Wartezeit mit Delays 
verbrät.Das kann man aber ändern, wenn man die Datenübertragung schnell 
genug macht. Ich halte es für möglich, mit dem dargestellten Konzept 
250KBit/sec bis 500Kbit/sec zu erreichen, dann muss man für die 
Übertragung eines Bytes nur noch 40-80us warten. Das dürfte für die 
allermeisten Anwendungen ausreichend sein.

Ausserdem ist die Kommunikation synchron ausgelegt. Man kann den 
Anschluss am Slave z.B. an den Interuptpin hängen. Dann löst der Master 
mit seiner Anfrage den Interupt aus.
Bis der Slave die Anfrage beantwortet, entsteht in der aktuellen 
Implementation im Master eine Wartezeit. Wenn die 
Interrupt-Slave-Response Time allerdings kurz ist, kann man auch diese 
verkraften.

von Hagen R. (hagen)


Lesenswert?

Mit deinen Worten:

Einen Delay() zu benutzten bedeutet einen Resourceverbrauch von exakt 
100% der gesammten MCU.

Na da verbrauche ich aber lieber einen der vielen Timer und kann 
nebenbei noch das SPI, die RS232, den ADC, die PWMs, die Ports, den 
Analog Comparator, den EERPOM, FLASH, SRAM usw. benutzen.

Die Frage nach den Delays() ist gerechtfertigt. Eine auf Benutzbarkeit 
angelegte Bibliothek sollte niemals delays() benutzen, zumindestens 
nicht so massiv wie in deinem Source.

Gruß Hagen

PS: Außnahmen bestätigen die Regel. Ein Bootloader kann auch mit 
Delays() seine Kommunikation erschlagen, da macht es Sinn. im Allgmeinen 
aber nicht.

von Hannes L. (hannes)


Lesenswert?

Hagen Re wrote:
> Mit deinen Worten:
>
> Einen Delay() zu benutzten bedeutet einen Resourceverbrauch von exakt
> 100% der gesammten MCU.

Genau. Während eines Delays geht nix Anderes, nichtmal ein Interrupt, 
denn der verfälscht ja das Delay.

>
> Na da verbrauche ich aber lieber einen der vielen Timer und kann
> nebenbei noch das SPI, die RS232, den ADC, die PWMs, die Ports, den
> Analog Comparator, den EERPOM, FLASH, SRAM usw. benutzen.

Ich auch.

> PS: Außnahmen bestätigen die Regel ...

Stimmt, die Wartezeiten bei der (einmaligen) Initialisierung des LCDs 
generiere ich auch meist mit Zeitschleifen.


Zur Eindrahtverbindung:
Ich benutze gerne etwas Ähnliches. Allerdings schön langsam, damit es im 
(sowiso vorhandenen) Timer-Interrupt nebenbei mit laufen kann und daher 
nur ganz wenige Prozent der Rechenleistung beansprucht.
Beitrag "Re: Taktstabilität beim Tiny 13"

...

von Christoph H. (Gast)


Lesenswert?

> Hagen Re (hagen)
>Na da verbrauche ich aber lieber einen der vielen Timer und kann
>nebenbei noch das SPI, die RS232, den ADC, die PWMs, die Ports, den
>Analog Comparator, den EERPOM, FLASH, SRAM usw. benutzen.

Und was machst Du bei einem Attiny13 ohne SPI, RS232 und mit nur 5 
nutzbaren Portpins?

> Hannes Lux (hannes)
>Zur Eindrahtverbindung:
>Ich benutze gerne etwas Ähnliches. Allerdings schön langsam, damit es im
>(sowiso vorhandenen) Timer-Interrupt nebenbei mit laufen kann und daher
>nur ganz wenige Prozent der Rechenleistunght.

Hallo Hannes,
es wäre interessant, Deinen Code einmal zu sehen. Für viele Aufgaben ist 
eine langsame Übertragungsgeschwindigkeit ausreichend. Mir geht es bei 
meinem Versuch auch ein wenig darum, sehr hohe Geschwindigkeiten zu 
ermöglichen.

von Rolf Magnus (Gast)


Lesenswert?

> Und was machst Du bei einem Attiny13 ohne SPI, RS232 und mit nur 5
> nutzbaren Portpins?

Sicherlich mehr als nur die Kommunikation mit einem anderen. Damit die 
sinnvoll ist, muß man ja erstmal was zum Übertragen haben.

von Hagen R. (hagen)


Lesenswert?

>Und was machst Du bei einem Attiny13 ohne SPI, RS232 und mit nur 5
>nutzbaren Portpins?

Dann schicke ich den AVR in den Sleep Mode und spare so >60% Strom ein.

Mann du möchtest diskutieren um des Diskutieren willens, das bringt 
nichts.
Es ist fakt das eine Delay() die MCU zu 100% auslastet und ein Timer mit 
gleicher Verzögerung meistens nur 1-10% der Rechenzeit benötigt, die 
restliche Zeit kann man entweder andere Peripherie benutzen oder eben 
einfach den Sleep Mode aktivieren um kräftig Power zu sparen.

Es ist einfach bescheuert ein Kabrio zu kaufen und niemals das Verdeck 
zuzumachen, statt dessen lässt man es reinregnen. Die Timer in einem AVR 
sind dazu da das man sie benutzt.
Besser noch, mit deinem Auto kann man entweder Lenken oder den Motor 
anmachen, was nützt das ? Lenkrad nach Links, Moter einschalten par 
Meter fahren, Motor ausschalten, Lenkrad wieder nach Rechts, Motor 
wieder einschalten par meter fahren und wieder aus...

Nungut es geht aber noch weiter. Du bietest eine 
Kommunikationsschnittstelle an mit der ich entweder nur kommunizieren 
kann oder nicht kommunizieren kann wenn der AVR noch andere Sachen 
erledigen soll. Damit ist diese Kommunikationsschnittstelle nur in 10% 
aller Fälle brauchbar, denn in 90% aller Fälle soll der AVR ja auch 
Daten sammeln um diese über diese Kommunikatinsschnittstelle zu 
versenden. Das Sammeln der Daten muß aber meistens in sehr exakten 
zeitlichen Intervallen erfolgen. Zb. wir möchten ein Mikrofon per ADC 
sampeln und diese Daten kontinuierlich versenden. Hm, deine Schnittselle 
blockt die gesamte MCU und ergo ein sauberes Sampling des ADCs ist nicht 
mehr möglich.

Und falls doch mal der Fall eintreten sollte das alle Resourcen 
verbraucht sind dann heist dies meistens auch das die MCU zu mehr als 
100% ausgelastet ist. Ergo: Fehler in der Planung man hätte gleich eine 
größere MCU nehmen müssen. Wo ist das Problem ? faktisch können also die 
Resourcen niemals ausgehen, man hat sich nur verplant, verschätzt und 
nimmt eine größere MCU.

Gruß Hagen

PS: das ist eine gerechtfertigte Kritik und soll in keinem Falle deine 
Bemühungen und den Willen dein Wissen mit uns zu teilen, in den Schatten 
stellen !

von Hannes L. (hannes)


Lesenswert?

Christoph H. wrote u.a.:
> Hallo Hannes,
> Für viele Aufgaben ist
> eine langsame Übertragungsgeschwindigkeit ausreichend.

Für nur sehr wenige Aufgaben (Video, Sound) ist eine schnelle 
Übertragung nötig. Die kleinen AVRs können diese Aufgaben sowiso nicht 
bewältigen.

> Mir geht es bei
> meinem Versuch auch ein wenig darum, sehr hohe Geschwindigkeiten zu
> ermöglichen.

Diese sind bei kleinen AVRs sinnfrei, da die Speicherkapazität nicht 
ausreicht, um das Übertragungstempo zu rechtfertigen. Geschwindigkeit 
ist nicht alles, sie schafft oft mehr Probleme als Nutzen. "Sehr hohe 
Geschwindigkeiten" erhöhen auch das Unfallrisiko (Datensalat).

...

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.