klucky
01.02.2006, 10:39
Hallo!
Ich habe mir vor einiger Zeit einen SD20 gekauft und habe jetzt nach langem rumprobieren endlich zumindistens kleinere Ergebnisse. Leider Funktioniert noch nicht alles zu meiner vollen Zufriedenheit und ich kann mir auch nicht unbedingt erklären woran es noch liegen könnte ... desswegen hoffe ich auf eure Hilfe! Zuerstmal ein paar Worte zur Hardware: Ich verwende zum ansteuern des SD20 (4Mherz durch Quarz) einen Atmega32 (16Mherz durch Quarz) den ich über I2C (Pullup an beiden Leitungen 10k) mit dem SD20 (Pin22 (SCL) vom Atmega an Pin14 (SLC) vom SD20 und Pin23 (SDA) vom Atmega an Pin15 (SDA) vom SD20. Als Servos habe ich zum einen einen S3003 von Robbe der im Normalen Modus gerade mal einen Stellbereich von ca 60 Grad schafft ... im Erweiterten Modus schaffe ich es dann sogar auf einen Stellbereich von 180 Grad allerdings kommt mir der Impuls mit einem Bereich von 0,299ms - 2,040ms (Reg22=1, Reg23=255, Reg21=32) ein wenig komisch vor da die Spezifikationen für Servos ja eigentlich einen Bereich von 1ms-2ms vorsehen und ich gedacht hätte das diese Werte zumindist ansatzweise eingehalten werden. Und zum anderen habe ich mir zum Testen einen 5€ Servo von Conrad gekauft, der überhaupt nicht zu meiner Zufriedenheit arbeitet. Im Normalen Modus bekommt man zwar Ausschläge die in etwa so Liegen wie die von dem S3003 aber spätetens nach dem dritten Ausschlag ist Schluss und der Servo bleibt in einer position stehen. Wenn ich dann den Servo abziehe und den S3003 dranklemme bleibt dieser auch bloß in der einen Position stehen, nach einem Reset (Accu abnehmen und wieder dran machen) läuft der S3003 dann aber wieder so wie er soll.
Hier einmal der Programmcode den ich für den erweiterten Modus beim S3003 benutze:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>
#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/
void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}
int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(22);
i2c_write(1);
i2c_stop();
i2c_init();
i2c_start(SD20_W);
i2c_write(23);
i2c_write(255);
i2c_stop();
i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(32);
i2c_stop();
while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}
Und hier der Programmcode den ich bei beiden Servos für den Normalen Modus benutze:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>
#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/
void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}
int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(0);
i2c_stop();
while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}
Ich hoffe Ihr könnt mir mit den Informationen die ich euch gegeben habe helfen ansonsten könnte ich am Wochenende nochmal ein Foto von der Platine reinstellen damit ihr euch die auch nochmal angucken könnt.
MFG Klucky
PS: Ich hab das Thema mal hier rein geschrieben weil es aus meiner Sicht bei den anderen Topics nicht wirklich reinpasst weil es ja net nur um C, Avr, oder Pic geht sondern eigentlich nen bisschen von allem ist ... ;)
PPS: Das gleiche Thema habe ich auch hier (http://www.roboter-teile.de/modules.php?name=Forums&file=viewtopic&p=460#460) gepostet wenn ihr wollt könnt ihr ja dort auch einmal reinschaun ...
Ich habe mir vor einiger Zeit einen SD20 gekauft und habe jetzt nach langem rumprobieren endlich zumindistens kleinere Ergebnisse. Leider Funktioniert noch nicht alles zu meiner vollen Zufriedenheit und ich kann mir auch nicht unbedingt erklären woran es noch liegen könnte ... desswegen hoffe ich auf eure Hilfe! Zuerstmal ein paar Worte zur Hardware: Ich verwende zum ansteuern des SD20 (4Mherz durch Quarz) einen Atmega32 (16Mherz durch Quarz) den ich über I2C (Pullup an beiden Leitungen 10k) mit dem SD20 (Pin22 (SCL) vom Atmega an Pin14 (SLC) vom SD20 und Pin23 (SDA) vom Atmega an Pin15 (SDA) vom SD20. Als Servos habe ich zum einen einen S3003 von Robbe der im Normalen Modus gerade mal einen Stellbereich von ca 60 Grad schafft ... im Erweiterten Modus schaffe ich es dann sogar auf einen Stellbereich von 180 Grad allerdings kommt mir der Impuls mit einem Bereich von 0,299ms - 2,040ms (Reg22=1, Reg23=255, Reg21=32) ein wenig komisch vor da die Spezifikationen für Servos ja eigentlich einen Bereich von 1ms-2ms vorsehen und ich gedacht hätte das diese Werte zumindist ansatzweise eingehalten werden. Und zum anderen habe ich mir zum Testen einen 5€ Servo von Conrad gekauft, der überhaupt nicht zu meiner Zufriedenheit arbeitet. Im Normalen Modus bekommt man zwar Ausschläge die in etwa so Liegen wie die von dem S3003 aber spätetens nach dem dritten Ausschlag ist Schluss und der Servo bleibt in einer position stehen. Wenn ich dann den Servo abziehe und den S3003 dranklemme bleibt dieser auch bloß in der einen Position stehen, nach einem Reset (Accu abnehmen und wieder dran machen) läuft der S3003 dann aber wieder so wie er soll.
Hier einmal der Programmcode den ich für den erweiterten Modus beim S3003 benutze:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>
#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/
void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}
int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(22);
i2c_write(1);
i2c_stop();
i2c_init();
i2c_start(SD20_W);
i2c_write(23);
i2c_write(255);
i2c_stop();
i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(32);
i2c_stop();
while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}
Und hier der Programmcode den ich bei beiden Servos für den Normalen Modus benutze:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>
#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/
void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}
int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(0);
i2c_stop();
while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}
Ich hoffe Ihr könnt mir mit den Informationen die ich euch gegeben habe helfen ansonsten könnte ich am Wochenende nochmal ein Foto von der Platine reinstellen damit ihr euch die auch nochmal angucken könnt.
MFG Klucky
PS: Ich hab das Thema mal hier rein geschrieben weil es aus meiner Sicht bei den anderen Topics nicht wirklich reinpasst weil es ja net nur um C, Avr, oder Pic geht sondern eigentlich nen bisschen von allem ist ... ;)
PPS: Das gleiche Thema habe ich auch hier (http://www.roboter-teile.de/modules.php?name=Forums&file=viewtopic&p=460#460) gepostet wenn ihr wollt könnt ihr ja dort auch einmal reinschaun ...