- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: MD23 an RN-Control, Drehgeber auslesen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21

    MD23 an RN-Control, Drehgeber auslesen

    Anzeige

    E-Bike
    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:



    Bild hier  



    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...

    Code:
    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:

    Code:
    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:

    Bild hier  

    Danke schonmal

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    YEAH das ging schnell

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

    Code:
    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();

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    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...

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    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?

    Bild hier  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress