PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RNBFRA-CO als I2C Slave



PicNick
01.07.2006, 20:03
Da ich mit der RS232-Versíon des Servo Coprozessor nicht recht glückling war/bin, habe ich versucht, das ganze als I2C-Sklave zu machen. Beim RNKC10 gab's das zwar schon, aber da konnte man keine normalen I2c-Routinen verwenden, wegen der Geschwindigkeit.

Ich teste diese neue Version dzt. mit 100-400 kHz Master-Speed und versuche das Programm in einen Fehler zu hetzen.
Versuchen tu ich am Mega32 mit HW-TWI & Bascom-Soft I2C

Ihr würdet mir einen Gefallen tun , wenn sich es weitere Versuch-Kaninchen geben würde, die das Zeugs ein wenig testen könnten und ev. darüber berichten.
Es ist auch ein Test-Demo-Versuchsprogramm für dem AtMega32 dabei, also gewissermassen mundgerecht für die RNBFRA-Karte

Edit: Das RNSI2C.HEX ist für den AT90S1213 und
RNSTEST.BAS für den AtMega32

marvin42x
01.07.2006, 20:58
Mach mich gleich ran.

Netter Gruß

marvin42x
01.07.2006, 23:32
So, damit das nicht ganz so trocken ist, ein Bild Deiner Servo-farm.
Dazu ein Stück Terminalmitschnitt. Der ist mir noch nicht klar, schaue ich mir morgen noch mal an.
8 Servos laufen, jedenfalls dem Auge nach gleichzeitig und synchron, jetzt schon über eine Stunde, furchtbar, ticker, tickker, ticcker, tickker, tickker....., sssssst,
Die restlichen 2 Servoports machen exakt das gleiche wenn man die Servos mal umsteckt.
Ich meine wer hat den 10 Servos so auf die schnelle.
Die 3 LEDs blinken brav und der Kühlkörper auf dem Board wird richtig schön warm.

So, das war’s erstmal für Heute
Netter Gruß nach Wien und Kompliment der Herr

PicNick
02.07.2006, 10:06
...schon über eine Stunde, furchtbar, ticker, tickker, ticcker, tickker, tickker....., sssssst,
Siehst, so geht's mir auch.


Netter Gruß nach Wien und Kompliment der Herr

Küß' die Hand und g'schamster Diener !

EDIT: Das Log:
"S" / ServoNr / Position / TWI-Status (20 = "Schreibadresse not Acked")

Da hat der Co nicht geantwortet, vermutlich, weil grad bei der I2C-Startbedingung ein Timer-Interrupt aufgetreten ist.

Das läßt sich auch bei langsameren Geschwindigkeiten nie ganz vermeiden, deswegen auch eine einfache sendewiederholung.

Wenn wir dann Multimaster machen, kommen Konflikte ja dann häufiger vor (Arbitrierung der Master), das ist wie bei Ethernit Netzen.
Das muß ein Master dann abkönnen, das gehört dazu.

Ich find die Häufigkeit aber erträglich. Ich wär wirklich froh, wenn man den Co zuverlässig als I2C Slave einsetzen könnte.

Für unsere Routerei wär's auch gut, wenn da mal was weitergehen würde.


EDIT II: Du siehst, daß dieser Fall hauptsächlich (oder nur) beim ersten Servo auftritt. die anderen 9 Servos kommen ja gleich hinten nach (ohne stop mit repeated Start), da klappt's dann besser

marvin42x
02.07.2006, 21:28
Was Du für Wörter kannst, da musste ich erstmal in google nachgucken was „Arbitrierung“ überhaupt heißt.
Ich habe meinem Seriel-Jumper schon mal vorgewarnt, dass er möglicherweise Urlaub bekommt.
Bis dahin drück ich Dir die Daumen das da nix blödes mehr in den Weg kommt.
Zumindest haben wir schon mal eine Maschine mit der man jemanden in den Wahnsinn treiben kann :-)

Netter Gruß

PicNick
03.07.2006, 07:30
.. jemanden in den Wahnsinn treiben ..

Vielleicht noch ein rhythmischeres Servo-Programm
Walzer: ssssssst, rtz, rtz, ssssssst, rtz, rtz, ssssssst, rtz, rtz, ...

:mrgreen:

Dirk
03.07.2006, 17:58
Einsame Spitze!

Darauf habe ich lange gewartet!
Jetzt kann es ja losgehen mit der I2C-Servoansteuerung auf der RNBFRA!

Vielen Dank PicNick!

Jetzt kommt noch was ganz dreistes: 8-[
Gibt es eine Chance, dein Prog auf dem 2313 kennen zu lernen? Wie hast du das hingekriegt? Ich würde das gern kapieren!

P.S.: Ich teste natürlich eifrig mit,- und das auf 2 RNBFRAs gleichzeitig (leider habe ich nur 8 Servos, die ich locker verteile).

Gruß Dirk

PicNick
03.07.2006, 19:06
@Dirk: freut mich, wenn's gefällt.
Das Programm besteht aus zwei Schweinereien: Die I2C Geschichte
und das Servofummeln. Letzteres ist dem RNS1 entnommen, und da sitzt der Frank drauf, da hat er sozusagen Copyright.

Aber die I2C-Geschichte kannst du schon haben, die derzeitige Version ist allerdings noch nicht konfektioniert, sprich, man muß im Bascom doch noch etwas rumwursteln. Ist eben ein Prototype.
Ich bin noch nicht sicher, wie ich das am besten einpacke (Schnittstellen), damit man vernünftig damit arbeiten kann.

Ich muß dazu kurz den Computer wechseln, ich stell das Zeugs mal rein, bis dann halt !

PicNick
03.07.2006, 20:02
So , da sind wir wieder. In der zip sind drei dinge:

2313.bas für den 2313 Co Prozessor
MyTwi.LIB die braucht er, die muß zu den anderen Bascom-libraries (muttu gucken, wo)

M32s.bas für den ATmega32

ABlauf : Master schickt 3 byte an der 2313. macht stop und PRINT
dann schickt er ein Byte an der 2313 (überschreibt das erste von den dreien)
macht gleich wieder START
und liest jetzt die drei Byte vom Slave
macht stop
und PRINT
Status sollte immer 28 oder 58 sein (ack)

Dann sendet er noch an das Powerport und blinkt
und PRINT sol auch 28 sein (ack)


Der Slave steht Lade-bei-fuß. Will der Master schreiben, empfängt er das, will er lesen, sendet er den gleichen Buffer zurück

Hat er ein Stop-gekriegt, sendet der Slave an den anderen PCF (Output) das erste Byte vom Buffer. Sollten also binär aufsteigend sein.


Wildes rumschicken, sollte auf keinen Fall wo hängen bleiben.

Alles Prototypes ohne Gewähr

Sachdienliche Hinweise erbeten, Fragen gerne

PicNick
03.07.2006, 20:09
..2 RNBFRAs gleichzeitig ..

Dzt. noch keine Möglichkeit eingebaut, die I2C adresse zu ändern.
Ist ja irgendeine Hausnummer. Gehört zu der "konfektionierung" dazu.
Weiss auch nicht recht, wie. Ich hab keine Pins auf dem 2313, die man jumpern könnte. Vielleicht irgenwas software-mäßiges und im ERAM speichern ?

marvin42x
03.07.2006, 21:07
*Hellhörig werd* 2 RNBFRA?
Sprung in die Kiste 2.RNBFRA rausgezerrt und auf den Tisch gelegt.
Wie würde man das Thema denn angehen?
Nur mal so als Überlegung.
Auf dem 2.RNBFRA der Mega32 als Multimaster auf welchem Bus?

Neugierige Gruß

PicNick
04.07.2006, 08:19
Morjen !
Die zwei RNBFRA würden über das I2C Kabel einfach verbunden werden, dann sind die beiden Busse einer. Master sind dann 2 x ATMEGA und (2x 2313, wenn's gut genug klappt, oder die 2313 sind eben auch 2 Slaves)

Problem: die PCF-Expander auf den Boards brauchen unterschiedliche Adressen, logo. oder man wechselt auf die andere Serie
https://www.roboternetz.de/wissen/index.php/I2C_Chip-%C3%9Cbersicht

Die Atmegas (oder einer) sind das Tor zur RS232 Welt. (RN-Comm)

Das ist dann ein WWW

(Werkstatt-wide-web) :-)

Dirk
04.07.2006, 18:58
Das ...

Problem: die PCF-Expander auf den Boards brauchen unterschiedliche Adressen
... habe ich so gelöst, wie PicNick gesagt hat:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=19498

Mit den wählbaren Adressen für den Co wäre das schon fein, aber ich will nicht wirklich beide Cos mit Servos behängen.
Ein anderes Prob: Auf meiner 2. RNBFRA sitzt kein AT90S2313, sondern ein ATtiny2313 und der spuckt Galle, wenn er die Servos steuern soll.
Ist das Prog reif für beide?
Sonst: Tests klappen wunderbar, ich bin begeistert.

P.S.:

Ich hab keine Pins auf dem 2313, die man jumpern könnte.
Wie wär's mit PD4? Allerdings muss man dann unten rumlöten.

Gruß Dirk

Fleischer
04.07.2006, 19:08
Hübsches Programm, das hatte ich schon lange erhofft, prima Arbeit. Könntest du vielleicht das Servoprogramm noch für den AT90S2313 kompilieren? Dann sollte das auch auf meinem RNBRFA 1.22 laufen...

Vielen Dank.

PicNick
04.07.2006, 19:28
At90S2313 / Attiny2313
Ich glaub', der Tiny ist Pinkompatibel, ist ja auch der Nachfolger. Muß mir mal die Datasheets anschauen, ob's da was hat. Wahrscheinlich muß ich nur auf "Tiny" kompilieren.
Adresse: Ich glaub, für's erste mach ich das einfach mit einem Befehl "adresse setzen" und merken im EERAM. Löten is weniger gut, glaub ich. Wenn man die vergebene adresse doch vergessen hat, braucht man nur nachbrennen.
Frank meint übrigens, ich kann die Adresse "68" verwenden (Als default)
Die 60-6E Serie is ja nur vom RN-Miniservo benutzt (62)

Wäre fein, wenn sich ausser Servos nun noch mehr sinnvolle Beschäftigungen für den Co-Prozessor finden ließen. Ich hab den Verdacht, dzt. steckt der auf vielen RNBFRA's einfach nur drin und macht nix (eigene Erfahrung).

Ich schau mir das mit den Tiny mal an, kann ja kein Problem sein.

Dirk
11.08.2006, 19:22
@PicNick:

so, jetzt habe ich RNSI2C lange in verschiedenen Varianten auf meiner RNBFRA getestet. Meine Servos zeigen schon erste Abnutzungen (vielleicht sollte ich ab jetzt welche mit Metallgetriebe kaufen!):

Ergebnis:
1. Läuft sehr stabil ohne Probleme.
2. Auffallend ist, dass "Sendeprobleme" bzw. -wiederholungen praktisch nur bei Servo 1 vorkommen und fast nie bei anderen Svnr. [EDIT: Peinlich! Das war ja wohl schon von Vortestern bekannt, sehe ich gerade!]
3. Auch durch zwischenzeitliche LCD-Ausgaben läßt sich RNS nicht beunruhigen.

Fragen:
1. Da ich ja 2 RNBFRAs habe -> Könntest du evtl. (Zumutung!) eine Version mit anderer Adresse zur Verfügung stellen? Gibt es da schon eine rn-Festlegung für die Adressen? Du hattest glaube ich 'mal 68 und 6A für den 2313 und 6C, 6E für den M32 geschrieben, oder?

2. Wäre es alternativ denkbar, die Adresse des 2313 auch via CMD zu ändern?

Dirk

PicNick
13.08.2006, 19:29
So, Männer, das ist einmal recht gut getestet. Anbei das ganze Set.
RNSTEST.BAS Testprogramm für den Atmega32 (oder was anderes)
RNSI2C.BAS Servoprogramm für den at90S2313
mit anderer "def" vielleicht für den TIny2313 probieren?
MYI2c.BAS I2C includefile dazu
MYI2C.LIB I2C Slave-Library dazu (in das Bascom lib-verzeichnis)

ServoAddr = &H68

Kann geändert werden: EEPROM lesen, erstes Byte auf die gewünschte adresse setzen, wieder zurückschreiben
Geht auch mit Command-4 / addr

Wenn mehrere Servos gleichzeitig gestellt werden sollen, isses besser kein I2CSTOP dazwischen, sondern gleich wieder I2CSTART

Dirk
14.08.2006, 17:34
Hallo PicNick,

super, einfach klasse! Jetzt ist die RNBFRA auch softwaremäßig komplett!

Jetzt geht das Testen wieder los. Ob ich wohl Rabatt kriege, wenn ich vom großen C 100 Servos kaufe? 8-[
Mein M32 auf RNBFRA 1 wird die beiden 2313 mit Servopositionen vollstopfen, der andere M32 funkt dann mit ein paar Zugriffen auf die PCFs dazwischen. Bin 'mal gespannt.

Bis die Servos dann fertig mit der Welt sind (ich denke da an 5 Testreihen a je 20 Servos über 5 Jahre O:) ), habe ich vielleicht ein bißchen von dem verstanden, was Du (und natürlich Frank) da umgesetzt hast! ](*,)

Vielen Dank!

Dirk

PicNick
14.08.2006, 18:30
Hallo, Dirk ?


Ob ich wohl Rabatt kriege, wenn ich vom großen C 100 Servos kaufe?

Ganz bestimmt, zumindest ein paar Werbekugelschreiber oder Feuerzeuge :mrgreen:

Das Kreuz und quer mit zwei ATmega32, drei PCF und einem 2313 geht tadellos, ich bin ja grad am Testen.
Wie erwähnt, geht ja jetzt ums Routen, PC(TCP/IP)<->RS232 und dann auf I2C.

Wenn irgendwas schräg' ist oder nicht funzt, bitte melden !

Dirk
18.08.2006, 19:04
@PicNick

auch wenn's nervt, ich versuche gerade, i2cslave zu verstehen. Für meinen 2. 2313 (der 1. hat mit den Servos zu tun!) habe ich mir ausgedacht, dass er für die IR-Kommunikation (und evtl. noch für die DCF-Decodierung) geradestehen soll. Da kommt mir so ein Sklave ganz recht.
Da habe ich mir dein i2cslave.zip vorgenommen und irgendwie haben sich 2 Fragen aufgedrängt:
1. Wo in der "I2C-Laberschleife" (etwas respektlos für die ganze I2C-Kommunikation) kann ich mich mit weiteren Aufgaben in Ruhe beschäftigen?
Im Code für den Sklaven ...

Do
If Twi_flag <> 4 Then ' wenn STOP war, auf START warten
' wenn Rep-Start war, natürlich nicht
'-------------------------------------------------------
Loadadr Twi_flag , Z ' Controll-Structor
Gosub Twi_wait_start ' da bleiben wir kleben
'-------------------------------------------------------
End If
If Twi_flag = 4 Then ' START oder REP-START ?
Loadadr Twi_flag , Z
Gosub Twi_get_addr ' I2C Adresse prüfen
If Twi_flag = 2 Then ' I2c WRITE (receive)

Gosub Twi_slave_tx_ack ' gut, ein ACK
Loadadr Twi_flag , Z
Gosub Twi_slave_rx_data ' daten empfangen bis Stop
' oder Rep-Start
' (wir acken dzt. alles)
'----------------------------------------
==> DA1
' Wenn er mit den Daten was machen will, sollte er es jetzt tun
' ------
' eventuell andere Daten zu abholen herrichten
' Twi_read = Varptr( was_anderes );
'----------------------------------------

Elseif Twi_flag = 3 Then ' I2c READ (send)

Gosub Twi_slave_tx_ack ' gut, auch ein ACK
Loadadr Twi_flag , Z
Gosub Twi_slave_tx_byte ' Master holt sich daten
' soviele, bis er NACK sagt
' wir haben dzt. kein Limit
Else
Gosub Twi_release ' was-weiss-ich (Bus freigeben)
==> DA2
End If
End If
If Twi_flag <> 4 Then ' Wenn kein REP-Start war, sollte
==> DA3
' der Bus jetzt kurz frei sein.

'2313 sendet jetzt selbst was

' Bascom ist für Multimaster
' aber nicht geeignet, da kann
' dzt. noch Konflikte geben
Waitms 10 ' kure Pause, wer weiss schon
I2cstart ' dzt, normales Bascom Soft I2C
I2cwbyte Out_adr ' LED geblinke
I2cwbyte M32_byte(1) ' das erste Byte des Buffers
I2cstop
End If
Loop
End
... gibt es da ja 3 aussichtsreiche Stellen (DA1, DA2, DA3).
Bei DA1 sollte ich neue Daten fürs Lesen/Schreiben vorbereiten, soviel ist klar. Wieviel Zeit habe ich dazu?
Bei DA2: Was kann ich da tun und wie lange? (Wenn ich z.B. DCF decodieren will, dauert das ziemlich lange.)
Bei DA3: Der Bus ist frei, also könnte ich hier senden, was kann ich da noch machen?

2. Noch 'ne Laien-Frage:
Warum braucht's hier eine MyTWI.lib?
RNSI2C funktioniert doch im Prinzip genau so, braucht aber die MyI2c.lib von dir. Bei beiden Anwendungen wird der 2313 zum Sklaven, der kein HW-TWI kann. Also laienhaft betrachtet dieselbe Aufgabe! Warum die 2 Libs? (Wahrscheinlich eine doofe Frage, aber ich versuch's zu verstehen!). 8-[
(Natürlich habe ich den I2cSlave schon mit deiner MyI2c.lib aus RNSI2C kompiliert, was ebenfalls natürlich nicht geklappt hat!)

Gruß Dirk

PicNick
18.08.2006, 19:50
Ja, da ist ein Durcheinander.
Hol' dir von da die aktuellste Version
http://www.oldformation.at/electronic/download/down.htm
"MyI2C.ZIP"
Das ist recht ähnlich, aber eben nicht gleich.
das ist das Slave-Programm das 2313.bas als Muster

Du hast recht, Mytwi.lib ist schon vom Namen her ein Schmarrn gewesen.

Sowohl für das RNSI2C als auch für dieses 2313.bas verwend' ich nun endgültig:

MYI2C.BAS bzw. MYI2C.LIB







Do
Loadadr I2c_flag , Z
Gosub I2c_get_addr ' I2C Adresse read
Select Case I2c_addr
Case Co1_adr:
Loadadr I2c_flag , Z
Gosub I2c_slave_rx_data ' daten empfangen bis Stop/Rep
Sent_flag = 1
'------------------------------------
' DA1
'------------------------------------

Case Co1_adrr:
'------------------------------------
' DA2
'------------------------------------

Loadadr I2c_flag , Z
Gosub I2c_slave_tx_byte ' daten senden bis NAK

Case Else
I2cinit
'------------------------------------
' DA3
'------------------------------------
End Select
Loop





DA2 is am sichersten, da hast du alle Zeit der Welt.
DA1 hast du Zeit, wenn kein Stop, sondern gleich wieder ein Start gekommen ist.



SOwohl für den RNSI2C.bas als auch für 2313.bas sollte der Master eine Schleife machen



DO
I2CSTART
I2CWByte adresse
IF ERR = 0 THEN
I2CWBYTE daten
I2CWBYTE daten
I2CWBYTE daten
I2CWBYTE daten
I2CWBYTE daten
else
WAITMS 20 '(in etwa)
END IF
I2CSTOP

LOOP UNTIL ERR = 0



Dann kann eigentlich so oder so nix passieren

Dirk
18.08.2006, 20:24
Merci vielmals,

ich mach mich an die Arbeit!


Gruß Dirk