PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rn-Control - Servosteuerung über I2C



Dennis2006
19.10.2006, 20:58
Hi!

Habe das RN-Control 1.4 verbunden mit dem anx-s20:

http://www.autonomics.de/pd1123341209.htm?categoryId=1

Nun möchte ich das Servo 1 auf Mittelstellung setzen. Dazu habe ich folgenden Code:


$regfile = "m32def.dat" 'Die Anweisung bestimmt Ccntrollertyp, hier AVR Mega 32
$crystal = 16000000

$baud = 9600

' I2C SETUP
Config Scl = Portc.0
Config Sda = Portc.1
Config Twi = 100000

' CONSTANTS
Const ANX = &HC2

' FUNCTIONS
Declare Sub AnxWrite(byval Servo As Byte, byval Pos As Byte)

I2cinit
'Startet den I2C Bus

Sub AnxWrite(Servo As Byte, Pos As Byte)
I2cstart
I2cwbyte ANX
I2cwbyte Servo + 62 ' 8-Bit Register ab Reg. 63
I2cwbyte Pos
I2cstop
End Sub

Call Anxwrite(1 , 127)
Print "Servo 1 ist jetzt in Mittelstellung"


Doch beim Compilieren mit BASCOM spuckt er mir immer eine Fehlermeldung in der folgenden Zeile aus:



I2cwbyte Servo + 62 ' 8-Bit Register ab Reg. 63


Woran liegt das?

Kann das mit dem Code funktionieren?

Danke!

Gruß

Dennis

linux_80
19.10.2006, 21:02
Hallo,

es kann sein, das Bascom in der gleichen Zeile nicht rechnen kann, probier mal den Wert vorher extra zu berechnen, und dann diesen angeben.

Dennis2006
19.10.2006, 21:30
Hi!

Danke für die schnelle Antwort!

Ich bin leider Anfänger in Sachen BASCOM!

Kannst Du mir bitte das so machen und mir dann erläutern was Du da getan hast damit ich das verstehe?

Danke!

Gruß

Dennis

linux_80
19.10.2006, 22:36
Ganz einfach, Du rechnest vor dem Schreiben mit I2cwbyte den Wert den Du da übergeben willst aus, und übergibts den Wert dann in der Zeile bei I2cwbyte.
Soll heissen nicht in der gleichen Zeile eine Berechnung durchführen, in der auch I2cwbyte steht.

...
Servo = Servo + 62
...
I2cwbyte Servo
...

Dennis2006
20.10.2006, 15:29
Hi!

Habe das auch ausprobeirt jedoch funktioniert dies auch nicht!

Zur Verkabelung:

An dem RN-Control befindet sich eine 10 polige Wannenbuchse die mit I2C beschriftet ist.

An dem ANX-S20 befindet sich genau die gleiche Buchse.

Nun habe ich mir zwei Wannenstecker gekauft und ein passendes 10 adriges Flachbandkabel.

Dann habe ich die Stecker auf beiden Enden draufgequetscht!

Somit habe ich folgende 1:1 Verbindung zwischen den Steckern:

Pin 1 des ersten Wannensteckers auf Pin 1 des zweiten Wannensteckers
Pin 2 des ersten Wannensteckers auf Pin 2 des zweiten Wannensteckers
Pin 3 des ersten Wannensteckers auf Pin 3 des zweiten Wannensteckers
...

Das dürfte doch so richtig sein oder?

Sonst kann ich mir da keinen Verbindungsfehler vorstellen...

Danke!

Gruß

Dennis

Dennis2006
20.10.2006, 15:53
Hi!

Sind denn überhaupt die Pin's 1+3 jeweils mit einem 10k-Widerstand gegen +5V gelegt? Das muss doch auf dem RN-Control geschen oder?

Danke!

Gruß

Dennis

Frank
20.10.2006, 19:13
Bei RN-Control sind diese Widerstände schon drin. Also daran liegts nicht.
Das Board anx-s20 ist nicht 100% Steckerkompatibel. Pass auf das du Pin 9 bei RN-Control durch einen Jumper deaktivierst. Das anx-s20 Board hat diesen Pin mit der Servospannung verbunden, was etwas ungünstig ist. Die Servospannung ist zu niedrig um RN-Control eigenständig mit Spannung zu versorgen. Und umgekehrt in die RN-Control Spannung zu hoch für anx-s20 bzw. die Servos.
Also den entsprechenden Jumper rausziehen (siehe RN-COntrol Doku) und beide Boards mit eigener Spannung versorgen.

Die Synstax vom anx-s20 Board kenn ich nicht näher, frage am besten mal beim Hersteller nach einem kleinen Ansteuerbeispiel in Bascom Basic.

Siehe auch:
Roboternetz Steckerbelegungungen aller RN-Boards:
https://www.roboternetz.de/wissen/index.php/RN-Definitionen

Und wenn dann was nicht klappt, dann hier möglichst das ganze Programm posten, aus oberer Zeile kann man keine Fehler ersehen.

PicNick
20.10.2006, 19:56
VOr allem schau mal nach, ob das 1. Servo nun die Nummer "1" oder vielleicht doch die nummer "0" hat

Dennis2006
21.10.2006, 19:32
Hi!

Also das ANX-S20 ist ein Slave-Board.

An den Pins 5,7 und 9 des I2C Anschlusses vom ANX-S20 Board liegt Spannung an.

An dem I2C Anschluss des RN-Control Boards liegt keine Spannung an, da ich alle 3 Jumper vom JP6 vorher schon alle rausgezogen hatte.

Die PullUp Widerstände sind dann schon zu SCL und SDA am RN-Control geschaltet? Oder muss man die dann noch mit einem Befehl aktivieren?

Ich habe den Hersteller kontaktiert der hat mir folgenden Beispielcode zugesendet der mit dem Mega8 getestet worden ist:



'--------------------------------------------------------------
' I2C-Example1 for communication with anx-S20 servo controller

'
' don't forget to set the I2C-Pin options in Options / Compiler / I2C
'--------------------------------------------------------------
Declare Sub Write_i2c_b(byval Command As Byte , Byval Value As Byte)
Declare Sub Write_i2c_w(byval Command As Byte , Byval Value As Integer)
Declare Sub Write_i2c_b4(byval Command As Byte , Byval V1 As Byte , Byval V2 As Byte , Byval V3 As Byte , Byval V4 As Byte)

Const Addressw = 194 'slave write address
Const Addressr = 195 'slave read address

Dim B1 As Byte
Dim I As Integer

B1 = 5
Do
' set servo1+2+3 at once
Call Write_i2c_b4(107 , 1 , B1 , B1 , B1)

' set servo4
Call Write_i2c_b(66 , B1)

I = 0 ' PWMtime=0 means constant low
If B1 > 120 Then I = 5000 ' PWMtime=5000 means constant high

' set servo9 to high/low (output-pin)
Call Write_i2c_w(9 , I)


B1 = B1 + 10
Waitms 300
Loop


End


'writing a byte to I2C-chip
Sub Write_i2c_b(byval Command As Byte , Byval Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Command 'command
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 2 'wait a short moment
End Sub

' writing a Integer to I2C-chip
Sub Write_i2c_w(byval Command As Byte , Byval Value As Integer)
Dim H As Byte
Dim L As Byte

H = High(value)
L = Low(value)

I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Command 'command
I2cwbyte H 'high-byte first
I2cwbyte L 'low-byte last
I2cstop 'stop condition
Waitms 2 'wait a short moment
End Sub

'writing 4 byte-command to I2C-chip
Sub Write_i2c_b4(byval Command As Byte , Byval V1 As Byte , Byval V2 As Byte , Byval V3 As Byte , Byval V4 As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Command 'command
I2cwbyte V1 'value to write
I2cwbyte V2 'value to write
I2cwbyte V3 'value to write
I2cwbyte V4 'value to write
I2cstop 'stop condition
Waitms 2 'wait a short moment
End Sub


Kann mir noch einer sagen das &HC2 beudeutet in meinem Code:


Const ANX = &HC2

Danke!

Gruß

Dennis[/code]

Dirk
22.10.2006, 09:51
Hallo Dennis2006,


Kann mir noch einer sagen das &HC2 beudeutet in meinem Code:


Das ist der Hex-Wert von 194.
In dem Hersteller-Beispiel ist das die Konstante Addressw.

Gruß Dirk

Dennis2006
22.10.2006, 13:50
Hi!

Danke!

Was mir noch aufgefallen ist. dass BASCOM folgende Zeile:


Sub Anxwrite(Servo As Byte , Pos As Byte)

Immer so verändert:


Sub Anxwrite(servo As Byte , Pos As Byte)

Ist das schlimm wenn "Servo" dann klein geschrieben ist?

Danke!

Gruß

Dennis

Dennis2006
22.10.2006, 14:43
Hi!

Kann man den I2C Bus vielleicht messen? Eventuell ne Spannungsmessung von SDA und SCL zu GND während der Ausführung dees Programms?

Danke!

Gruß

Dennis

Dirk
22.10.2006, 15:27
Hallo Dennis,

die Kleinschreibung hinter einer Klammer macht der Editor in BASCOM. Tut nichts zur Sache!

Du kannst seine Umformattierungen auch ganz abschalten:
Options - Environment
Häkchen weg bei "Reformat BAS files" und/oder "Reformat code".
Dann bleibt alles so, wie du es eingegeben hast.

Gruß Dirk