PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu TWI oder anderen Systemen und deren Auswirkungen



Kaiser-F
15.06.2005, 10:29
Guten Morgen,

Wie so oft habe ich da mal eine Frage.

Ich bin nun dabei mich in das Gebiet I²C bzw. TWI und ISP einzuarbeiten.

Zunächst würde ich zuvor gerne noch ein paar Sachen wissen, um später nicht enttäuscht zu sein.

Wenn Ihr euch bitte mal das Bild unten anseht:

Ich habe mehrere geschlossene Regelkreise (links) an meinen Hauptcontroller.

Bei den Regelkreisen handelt es sich um Getriebemotoren, deren Stellung durch ein Potentiometer erfasst wird. Der "Hauptcontroller" hat die Aufgabe eine Stellung zwischen 0 und 255, welche vorgegeben wird zu halten.

Funktioniert perfekt!

Nun will ich aber das ganze aus weiterer Entfernung und von mehreren Positionen aus steuern können.

Ich brauche aber um jedes Display Anzusteuern, und um alle Drehpotentiometer abzufragen eine imense Anzahl an Ports.

Meine erste Lösung wäre gewesen, da ich ja immer nur eine Position brauche, alle Signalleitungen mit Analog-Multiplexer umzuschalten.

Funktioniert auch gut, aber ich habe immer noch so viele Pins an meinen Hauptcontroller, und ich befürchte dass das Spätere LCD Menü den Controller bremst und die Funktion der Regelktreise beeinträchtigt.


Meine nächste Idee währe gewesen (wie in der Skizze unten), dass ich für jeden Posten einen µC habe, der die Werte der Potis erfasst und diese an den Hauptcontroller sendet. Dieser wiederum sendet die aktuellen Stellwerte an den Posten und dieser gibt die am LCD aus.

Nun meine Frage,

Wird der Hauptcontroller durch das ständige Senden und Empfangen von Daten so stark ausgebremst, dass meine Reglekreise nicht mehr richtig funktionieren?

Es werden immer folgende Werte in zum Hauptcontroller geschickt:

Drehpoti1 0....255 8Bit
Drehpoti2 0....255 8Bit
Drehpoti3 0....255 8Bit

Menüknopf1 1 Bit
Menüknopf2 1 Bit
Menüknopf3 1 Bit
Menüknopf4 1 Bit

Und folgende Werte werden zum PostenController geschickt:

RegelkreisAktuell1 0....255 8Bit
RegelkreisAktuell2 0....255 8Bit
RegelkreisAktuell3 0....255 8Bit

Menüoption 8Bit

rapo
15.06.2005, 19:18
Hallo,
ist prinzipiell machbar...
Faktor 1: Wie weit sind die Posten vom Hauptcontroller weg? I2C möglich? oder RS485?
Wie ist der Hauptc. mit dem Regeln beschäftigt? D.h. wieviel Zeit hast Du um Interrupts abzuarbeiten?
Grüße Ralf
Ach ja, hab heute das erste Mal erfolgreich einen mega8 als I2C-Slave laufen lassen, werde in absehbarer Zeit mal was ins Forum stellen, weil dieses Thema, so scheint es mir, oft angesprochen aber mangelhaft beantwortet wird...

Kaiser-F
16.06.2005, 11:22
Hallo Rapo,

Die "Posten" sind maximal 25m Entfernt, also 25meter abgeschirmtes 4-Adriges Telefonkabel hätte ich verwendet.

Allerdings gehen alle Kabel der 3 Posten am Hauptcontroller zusammen, macht ja eigentlich nichts, dass das ganze mehr sternförmig aussieht wie bus-förmig... Alle hängen zusammen....

Ich verwende TWI, also I²C von Atmel = TWI.

Habe in den Artikeln ein bisschen weitergeschnuppert, für strecken über 50m gäbe es sogar eine art "verstärker" für den I²C bzw. TWI - Bus.

Guggst du hier ganz unten:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=4585

Ich werd es jetzt einfach mal mit meinen zwei Testboards für den ATmega8535 ausprobieren.

Vorerst mal vielen Dank,

Gruß
Franz

Kaiser-F
16.06.2005, 12:16
Hier bin ich wieder.

Laut ATmega8535-Datenblatt habe ich gefolgert, dass man immer nur eine 8Bit breite zahl in das "TWI Data Register - TWDR" schreiben kann.

Find ich für meine Anwendung ein bisschen doof.

Hat von euch jemand Erfahrung wie man folgendes realisieren kann:

Man habe eine Bussystem mit µC1 , µC2, µC3 und µC4
Man habe die Variablen A B und C.
Jeweils auf 8Bit deklariert.

Der µC1 weiß immer die aktuellen Werte für A, B und C. Diese Werte soll nun auch µC3 wissen.

Wie stell ich das am sichersten an, ohne dass ich Vertauschungen riskiere?

rapo
16.06.2005, 16:45
Hallo nochmal,
na mit einem Protokoll...
Du verwendest TWI, also hat jeder uC eine Adresse (Slave oder Master mit R/W bit)
Übertragung: Start-Slaveadresse-ACK-ByteA-ACK-ByteB-ACK-ByteC-NoACK-Stop
So überträgst Du und in genau der Reihenfolge empfängst Du.
Wenn Du noch sicherer gehen willst, kannst Du den Bytes A-C eine Art Pionterbyte zuordnen.
Start-Slaveadresse-ACK-Pointerbyte-ACK-RepeatetStart-ByteA-NoACK-Stop.
Das heißt, Du schickst dem Slave schreibend ein Byte, dieses verarbeitet er und verzweigt nach der RepeatetStart Condition in eine Routine, in der er das nächste empfangene Byte genau zurodnen kann... So kompliziert würde ich aber das nicht machen, TWI ist da eh recht dankbar, weil eben alle Daten schön der Reihenfolge nach kommen...

Kaiser-F
16.06.2005, 17:14
Hallo Rapo,

Vielen Dank für deine Tipps!

Habe noch kleine Schwierigkeiten TWI in Ganz zu setzen, aber das wird schon....

Ich habe soeben in einem anderen Beitrag über TWI ein Beispiel gesehen, in dem jemand versucht hat diesen "20fach Servo - Controller" anzusprechen.

Hierbei sah die Übertragung folgendermaßen aus:

START-Slaveadresse-ACK-SERVONUMMER-ACK-STELLWERT-NoACK-STOP

Wäre eine Möglichkeit wenn man nicht immer alle Werte übermitteln braucht.

Aber die Möglichkeit die du vorgeschlagen hast:
START-Slaveadresse-ACK-WERT1-ACK-Wert2-ACK-Wert3-ACK-Wert4-NoACK-STOP

Wird wohl die Auserwählte sein ;-)

Weiß nur nochnicht wie das mit dem Reciever aussieht. Wie der die Daten varstaut, wenn die nacheinander reinkommen... aber das werd ich mir schon noch irgendwo erlesen....

Gruß
Franz