xxxsnowxxx
27.05.2010, 15: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
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