Forum: Mikrocontroller und Digitale Elektronik Servocontroller SD20 am I2C Bus - Register beschreiben


von Rainer (Gast)


Lesenswert?

Hallo Allerseits!

Ich geh mal davon aus, dass der SD20 Servocontroller bekannt ist, oder?
Ich moechte bei diesem gern den Offset in den Registern 22 und 23
einstellen. Kann ich das in einer Schreiboperation machen, also erst
Start senden, Adresse + W, Register (22), und dann die Datenwerte fuer
Reg. 22 und 23? Oder muss ich zwischendurch wieder ein Stop ueber den
Bus schicken, oder ganz anders?

Viele Gruesse,
Rainer.

von AxelR. (Gast)


Lesenswert?

für alle, die es nicht kennen.
Bitte mal einen Link oder Datenblatt posten
axelR.

von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Stimmt, gute Idee. Also hier das Datenblatt.

Irgendwie komisch, wenn ich die Register 22 u. 23 zuerst schreibe,
kommt beim naechsten Schreibbefehl ein "Slave address not ack."; wenn
ich Register 21 zuerst schreibe, dann kommt beim Schreibversuch von 22
u. 23 ein "Data not ack." nachdem ich die Registernummer geschickt
hab...
Irgendwas ist da faul... Hat jemand 'ne Idee?

Viele Grusse,
Rainer.

von AxelR. (Gast)


Lesenswert?

Was die Leute alles verkaufen... Nun kenn ich ihn auch, danke.
Aber warum der nun auf die Befehle nicht reagiert, kann ich beim besten
Willen nicht sagen, frag doch mal beim hersteller. Ich habe sowas zwar
auch schon mal programmiert, aber nicht mit I2C, sondern über die UART.
war mal für Überwachungskameras.

Poste mal dein Code. In der Beschreibung steht ja, verhält sich wie ein
EEPROM, Probier doch mal mit einem EEPROM...

Ich denke, jedes Register für sich ansprechen.
Axel

von Rainer (Gast)


Lesenswert?

Oha! Jetzt wirds komisch:

Ich spreche jetzt jedes Register einzeln an, und gebe immer in den
TWI-Interrupts per UART aus, welchen Status das I2C-Interface grade hat
(das heist auch, dass ich darauf warte, dass das UART bereit ist). In
diesem Fall geht soweit alles wunderbar.

Baue ich allerdings diese Status-Informationen aus (damit auch das
Warten auf das UART), geht die Kommunikation wieder schief... (Data not
ack, glaub ich...)

Kann das sein, dass der Servocontroller irgendwie zu langsam ist?

Gruss,
Rainer

von AxelR. (Gast)


Lesenswert?

der wird sicher nicht zu langsam sein. Du löscht das TWIE Bit bitte erst
(eine 1 reinschreiben),wenn Du soweit bist. Damit ziehst Du die
SCL-Leitung(war es die?) auf masse und somit muss der SD20 eigentlich
warten, bis Du soweit bist. Ohne Code kann ich aber nur raten.
läuft der SD20 als Slave.? sicherlich... Poste doch bitte mal deinen
Code, wenn wir Dir helfen sollen.

AxelR.

von Rainer (Gast)


Lesenswert?

Hmm... Code posten ist leider etwas schwierig, weil das naemlich ein
ziemliches Riesenprogramm ist (ich muesste eben ein ziemlich grosses
Stueck posten, damit man ueberhaupt kapiert was passiert, deshalb hab
ich das erstmal gelassen)

Aber ich hab jetzt auch eine Loesung gefunden: Register einzeln
beschreiben, und zwischendurch einige µs warten... Sonst kommt wirklich
ein "Data not acknowledged", wenn ich das zu schreibende Register
hinschicke. So ganz versteh ich zwar nicht, warum das sonst nicht geht,
aber da ich die beschriebene Prozedur nur beim Initialisieren
durchfuehren muss, macht das warten keine Probleme.

Danke nochmals fuer die Hilfe!

viele Gruesse,
Rainer.

von Stefan May (Gast)


Lesenswert?

Ich habe einen Servo-Controller mit einem Mega8 implementiert.
Ansteuerung funktioniert genauso wie beim SD20. Vorteil: Der Mega8
läuft mit dem internen RC-Oszillator und benötigt deshalb keinerlei
externe Bauelemente.

http://users.4finger.net/smay/avr/servomaster/
http://users.4finger.net/smay/avr/servotester/

Dazu habe ich noch einen Tester geschrieben, der auch in einen Mega8
reingehört.

ciao, Stefan.

von Rainer (Gast)


Lesenswert?

Hey, das ist ja auch schick!

Werd ich mir merken, wenn ich nochmal irgend sowas brauch! Irgendwie
auch praktischer, wenn man einfach noch einen Atmel nehmen kann, und
nicht so ein Sonderteil braucht!

Danke & ciao
Rainer.

von Peter Wilbert (Gast)


Lesenswert?

Hallo zusammen,

das Programm (ich hab mir nur das servomaster.c angesehen)
von Stefan May ist mit vielen Fehlern behaftet und nicht zu empfehlen
(der Master ist auch eigentlich ein Slave)!!!

Z.B. ist die Berechnung für SCL = 100KHz falsch.
     TWBR = (CLK / 100000 - 16ul) / 2;  // 100kHz
Mit dieser Formel läuft ein I2C-Busmaster nur mit 29,4KHz.
Richtig ist wenn prescale 1 ist:
TWBR = ((CLK / 100000 - 16ul) / 2) / 4;  // 100kHz
Der Wert für TWBR ist dann 8 und eindeutig zu niedrig also
mit 8MHz nicht zu realisieren. Mit 16MHz bekommt man einen Wert
fürs TWBR von 18.

Das Datenblatt vom M8 sagt dazu:
Note: TWBR should be 10 or higher if the TWI operates in Master mode.
If TWBR is lower than 10, the Master may produce an incorrect output on
SDA and SCL for the reminder of the
byte.

Das 16Bit-Register von Timer1 wird auch nicht richtig beschrieben
    TCNT1 = servo_delay; // int servo_delay
Das steht zwar so im Datenblatt vom M8, ist aber eindeutig falsch!
Richtig wäre:

    TCNT1H = (unsigned char)(servo_delay>>8);
    TCNT1L = (unsigned char)servo_delay;

usw. usw ....

Peter

von AxelR. (Gast)


Lesenswert?

ist ja nett, dass du dir das angesehen hast, soviel Erfahrung mit C habe
ich zum Beispiel nicht. Komme ja aus der Hardwareecke.
Aber die Software wird doch schon beim Stefan laufen. Kann doch aber
garnicht, wenn die Software so nicht funktioniert. Wassn nu?

Viele Grüße
AxelR.

von Peter Wilbert (Gast)


Lesenswert?

Das das Programm nicht funktioniert habe ich auch nicht behauptet. Wie
schon angemerkt läuft der Master dann nur mit 29,4 KHz und nicht mit
100KHz.

                   CPU Clock frequency
 SCL frequency = ------------------------
                 16 + 2(TWBR)*4 hoch TWPS

Bits 1..0 – TWPS: TWI Prescaler Bits.
Da beide Bits 0 sind ist Prescale 1 also mal 4 hoch 1.
Rechne selber nach!

Peter

von Peter Wilbert (Gast)


Lesenswert?

Sorry, unter WINAVR erzeugt der Compiler den richtigen Assembler-Code
für das Beschreiben eines 16Bit-Registers!

  TCNT1 = 0x1234;
 178:  84 e3         ldi  r24, 0x34  ; 52
 17a:  92 e1         ldi  r25, 0x12  ; 18
 17c:  9d bd         out  0x2d, r25  ; 45
 17e:  8c bd         out  0x2c, r24  ; 44

Peter

von Stefan May (Gast)


Lesenswert?

Also korrekterweise ist servomaster.c ein TWI-Slave. Wenn ich das
Datenblatt auch richtig interpretiere, dann ist es sogar völlig
unerheblich, welcher Wert in TWBR steht. Trotzdem ist die Berechnung
falsch. Werde ich im Code berichtigen. In der Doku zur AVR-Libc ist der
Code auch falsch. Da steht in
http://www.nongnu.org/avr-libc/user-manual/group__twi__demo.html genau
die gleiche Berechnung (ist sogar aus der übernommen).


Die folgende Zeile C-Code wird vom gcc richtig umgesetzt.

TCNT1 = servo_delay; // int servo_delay

 25a:   3d bd           out     0x2d, r19       ; 45
 25c:   2c bd           out     0x2c, r18       ; 44

Es wird also zuerst das High-Register beschrieben, dann das
Low-Register. Ich verlasse mich da auf das Verhalten vom gcc. Könnte
man drüber diskutieren, ob das schlau ist. Ich habe dazu mal im
gcc-Forum gefragt

http://www.mikrocontroller.net/forum/read-2-144488.html

Der Code funktioniert in meinem Testaufbau sehr zuverlässig, ich habe
aber noch gar kein Feedback zur Funktion bekommen.

Das waren nun zwei Fehler, über die wir jetzt diskuttiert haben. Von
vielen Fehlern sehe ich aber noch nicht wirklich was, was vom Einsatz
der Software abhalten sollte. Bitte deshalb um weitere Kritik, was
daran verbessert werden kann. So kann man die Kritik jedenfalls nicht
stehen lassen.

ciao, Stefan.

von Peter Wilbert (Gast)


Lesenswert?

Sorry sorry sorry .... Stefan, die Formel ist doch richtig, da der
Inhalt der beiden Bits aus TWPS genommen wird und nicht der
Teilungsfaktor. Somit ist 4 hoch 0 = 0 und taucht deshalb auch nicht in
deiner Programmformel auf!

nochmals sorry.

Peter

von Thomas K (Gast)


Lesenswert?

@SD20:
"Standard Modus: 256 Bit Auflösung von 1ms bis 2ms"
Das ist doch ein Fehler und soll in Wirklichkeit 256 Schritte (8-Bit)
heißen, oder nicht?

von Stefan May (Gast)


Lesenswert?

Ah, dann hilft nochmal Datenblatt lesen. Hab es in der Eile auch nicht
ganz erfasst, da ich mir nicht die Bedeutung von TWPS angeschaut habe.
:-)

@Thomas K

Das ist definitiv ein Fehler und soll heißen 256 Schritte. Würde ja
auch wenig Sinn machen, wenn es 1.157920e+77 Positionen geben würde.

ciao, Stefan.

von Hannes Hering (Gast)


Lesenswert?

@Peter Wilbert: Seit wann ist 4 hoch 0 = 0? Des wüsst ich mal gern! gg

von Stefan May (Gast)


Lesenswert?

Du bist kleinkariert. 0 ist doch dicht an 1 dran. :-)

ciao, Stefan.

von Peter Wilbert (Gast)


Lesenswert?

weil 10 * 4 hoch 0 = 10 und nicht 40 ist!
     10 * 4 hoch 1 = 40

Peter

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.