PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MD23 an RN-Control, Drehgeber auslesen



xxxsnowxxx
27.05.2010, 14:16
Hallo

ich habe ein kleines Problem mit dem Auslesen der Drehgeber des MD23 Motortreiber Boards, angeschlossen ans RN-Control 1,4 mit ATMega32.
Über das BASCOM Beispielprogramm drehzahl.bas funktioniert es, aber ich möchte es gern mit C in AVR Studio schreiben.

Hier mal ein Bild meines Roboters:



http://img707.imageshack.us/img707/44/dsc00062ka.jpg



Ich habe versucht den Code aus dem Bascom Beispielprogramm in C zu übersetzen, leider bekomme ich nur irgendwelche Zahlen, mal 90, mal 74, mal 255...
Ich habe zum Testen erstmal nur das kleinste Bit auslesen wollen, hier mein Code, mit dem ich bei jedem Tastendruck einen Motor beschleunige, dann den Wert auslesen will, dann den Motor wieder abbremse. Leider ampfange ich bei jedem Tastendruck die Zahl 124... :(




int data;

/*### Drehgebertest ### */
void vor(void)
{
i2c_init();
i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0xFF); //vorwärts
i2c_stop();

waitms(200);


i2c_init();
i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x05); //Byte 4 Drehgeber 1 Position (aus MD23 Data Sheet)
i2c_stop();

i2c_start(0xB1); //Slave Adresse Motortriber 1 + 1 Bit
data = i2c_read(0); //Lesen

i2c_stop();

sprintf(buff, "%d", data); //in char umwandeln

sendUSART(buff); //senden



waitms(200);

i2c_start(0xB0); //Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0x80); //anhalten
i2c_stop();

}



hier zum vergleich der Bascom code aus dem mitgelieferten Beispielprogramm:




Function Md23_impulse(byval Motor As Byte) As Long
Local W1 As Byte
Local W2 As Byte
Local W3 As Byte
Local W4 As Byte
Local Impulse As Long
Local I2cread As Byte


I2cread = Md23_slaveid + 1

If Motor = 1 Then
I2cstart
I2cwbyte Md23_slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop
Else
I2cstart
I2cwbyte Md23_slaveid
I2cwbyte 6 'Leseregister festlegen
I2cstop
End If

I2cstart
I2cwbyte I2cread
I2crbyte W1 , Ack
I2crbyte W2 , Ack
I2crbyte W3 , Ack
I2crbyte W4 , Nack
I2cstop

Impulse = 0
Impulse = Impulse Or W1
Shift Impulse , Left , 8
Impulse = Impulse Or W2
Shift Impulse , Left , 8
Impulse = Impulse Or W3
Shift Impulse , Left , 8
Impulse = Impulse Or W4


Md23_impulse = Impulse
End Function



Ich dachte ich hab es etwa genau so gemacht wie im bascom Programm, außer dass ich nur ein byte auslese.

kann mir jemand helfen?
was ist falsch am Code? kann es auch sein dass ich pull ups irgendwie falsch gesetzt habe oder die fusebits falsch eingestellt sind?

Fusebits:

http://img80.imageshack.us/img80/9448/fusesr.jpg

Danke schonmal

xxxsnowxxx
27.05.2010, 14:34
YEAH das ging schnell :)

ich habe jetzt mal alle bits ausgelesen, und jetzt bekomme ich schonmal die richtigen drehimpulse geliefert =)




char buffa [4];
char buffb [4];
char buffc [4];
char buffd [4];

int dataa;
int datab;
int datac;
int datad;


/*### Drehgebertest ### */
void vor(void)
{
i2c_init();
i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0xFF); //vorwärts
i2c_stop();

waitms(200);


// i2c_init();
i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x02); //Byte 2 Drehgeber 1 Position (aus MD23 Data Sheet)
i2c_stop();

i2c_start(0xB1); //Slave Adresse Motortreiber 1 + 1 Bit für Leserichtung
dataa = i2c_read(1); //Lesen
datab = i2c_read(1);
datac = i2c_read(1);
datad = i2c_read(0);

i2c_stop();

sprintf(buffa, "%d", dataa); //in char umwandeln
sprintf(buffb, "%d", datab);
sprintf(buffc, "%d", datac);
sprintf(buffd, "%d", datad);

sendUSART("\r\n Impulse: "); //senden
sendUSART(buffa);
sendUSART(buffb);
sendUSART(buffc);
sendUSART(buffd);



waitms(200);

i2c_start(0xB0); //Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0x80); //anhalten
i2c_stop();

xxxsnowxxx
27.05.2010, 14:35
wenn mir jemand vielleicht noch sagen könnte wie ich das ganze etwas eleganter schreiben könnte wäre ich dankbar, sieht etwas sehr "manuell" aus...

xxxsnowxxx
27.05.2010, 14:47
naja ein problem gibt es doch noch: ich erhalte manchmal eine 8 stellige Zahl ( so wie es sein soll) und aber manchmal auch nur eine 6 oder 7 stellige, woran liegt das? wird das letzte byte irgendwie nicht richtig ausgelesen?

http://img526.imageshack.us/img526/8046/64452559.jpg