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.
für alle, die es nicht kennen. Bitte mal einen Link oder Datenblatt posten axelR.
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.
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
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
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.
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.
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.
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.
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
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.
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
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
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.
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
@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?
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.
@Peter Wilbert: Seit wann ist 4 hoch 0 = 0? Des wüsst ich mal gern! gg
Du bist kleinkariert. 0 ist doch dicht an 1 dran. :-) ciao, Stefan.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.