- 3D-Druck Einstieg und Tipps         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 40 von 40

Thema: linker Antrieb klemmt + Base stürzt ab

  1. #31
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Anzeige

    Powerstation Test
    woran könnte es liegen, dass der RP6 beim anstecken des RC-empfängers im Reset gehalten wird

    Da musst Du schon etwas mehr Infos liefern. Was ist wo und wie angeschlossen? Funktioniert der RC Empfänger für sich alleine? Hast Du ein Multimeter? Falls ja miss die Stromaufnahme... usw.

  2. #32
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I♥ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    -.- das problem hat sich erledigt, der stecker war falsch angeschlossen, wahrscheinlich haben meine eltern wieder versucht meine Bastelecke aufzuräumen und haben aus versehen dabei den RC-empfänger abgesteckt und wieder falsch angesteckt... naja also dieses Problem ist gelöst, werde nun nochmal das Programm untersuchen


    MfG Julian

  3. #33
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    lol.. und der Hund hats Hausaufgabenheft gefressen
    Sind Sie auch ambivalent?

  4. #34
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I♥ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    ist schon nem freund passiert xD jaja ist doch jetzt eh egal wer das war


    ich hab jetzt das problem, dass nur mein rechter entrieb rückwärts fährt, wenn ich forwärts gas gebe. wenn ich zu mehr als 1,2 sek vollgas gebe bekomm ich dauernd 0xf8 raus... an dem setMotorPower(300-xxx) kann es nicht liegen, die zeile hab ich schon testweise rausgenommen, keine veränderung...
    ich hab mein altes linienfolgeprogramm nochmal ausgegraben, es funktioniert fast einwandfrei, keine errors, das einzige was nicht so läuft wie es soll ist: der RP6 fährt nur rückwärts ! auch wenn ich vorher changeDirection(FWD); oder setMotorDir(FWD,FWD); aufrufe...


    hier mal die ganzen programme bzw. die teile aus den master/slave Libs/progs die ich eingefügt habe:


    RC-Programm:
    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"    
    #include "RP6Control_I2CMasterLib.h"
    
    void I2C_requestedDataReady(uint8_t dataRequestID) 
    { 
       checkRP6Status(dataRequestID); 
    } 
    
    void I2C_transmissionError(uint8_t errorState) 
    { 
       writeString_P("\nI2C ERROR - TWI STATE: 0x"); 
       writeInteger(errorState, HEX); 
       writeChar('\n'); 
    }
    
    volatile uint16_t speed=0;
    volatile uint16_t dir=0;
    volatile uint16_t speedcount=0;
    volatile uint16_t dircount=0;
    
    ISR(TIMER1_COMPA_vect)
    {
        if (PINA & ADC5)
        {
            speedcount++;
        }
        else 
        {
            if (speedcount > 0)
            {
                speed=speedcount;
            }
            speedcount=0;
        }
        
        
        if (PINA & ADC3)
        {
            dircount++;
        }
        else 
        {
            if (dircount > 0)
            {
                dir=dircount;
            }
            dircount=0;
        }
    }
    
    void initRC(void)
    {
        TCCR1A = (0 << WGM11) | (0 << WGM10) | (0 << COM1A0) | (0 << COM1A1);    // CTC-Mode4, ohne OCR-Pin
        TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12)  | (1 << CS11) | (0 << CS10); // CTC und prescaler /8
        TIMSK |= (1 << OCIE1A);                                         // Interrupt ein
        OCR1A  = 20; // 100kHz?
        
        DDRA &= ~ADC5;
        PORTA &= ~ADC5; 
        DDRA &= ~ADC3;
        PORTA &= ~ADC3; 
    }
    
    int main(void)
    {
        initRP6Control();
        initLCD();
        initRC();
        
        startStopwatch1();
        
        mSleep(1000);
        
        I2CTWI_initMaster(100);  
        I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); 
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
        uint16_t speed1 = 0, dir1 = 0;
        
    while(1)
    {
        cli(); // Interrupts verbieten
        speed1=speed;
        dir1=dir;
        sei(); // Interrupts wieder zulassen
        
        
        if (speed1 < 150 && speed1 > 140)
        {
            if (dir1 > 180){ setMotorDir(BWD,FWD); setMotorPower(150,150); }
            if (dir1 < 120){ setMotorDir(FWD,BWD); setMotorPower(150,150); }
        }
        
        if (speed1 < 140) 
        { 
            setMotorDir(BWD, BWD); 
            if(dir1 < 140){ setMotorPower((300-speed1),(300-speed1)-dir1); }
            if(dir1 > 150){ setMotorPower((300-speed1)-(300-dir1),(300-speed1)); }
            if(dir1 < 150 && dir1 > 140) { setMotorPower(300-speed1, 300-speed1); }
        }
        
        if (speed1 > 150) 
        {
            setMotorDir(FWD, FWD); 
            if(dir1 < 140){ setMotorPower(speed1,speed1-dir1); }
            if(dir1 > 150){ setMotorPower(speed1-(300-dir1), speed1); }
            if(dir1 < 150 && dir1 > 140) { setMotorPower(speed1, speed1); }
        }
        
        if(adcLSL < 500 || adcLSR < 500) { PORTA |= ADC7; }                // Scheinwerfer an
        if(adcLSL > 500 && adcLSR > 500) { PORTA &= ~ADC7; }            // Scheinwerfer aus
        
        task_checkINT0(); 
        task_I2CTWI();
    }
        return 0;
    }
    setMotorDir und setMotorPower in der Control master lib:
    Code:
    void setMotorPower(uint8_t PWR_left, uint8_t PWR_right)
    {
        if(PWR_left > 210) PWR_left = 210;
        if(PWR_right > 210) PWR_right = 210;
        I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_PWR, PWR_left, PWR_right );
        while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    }
    
    
    void setMotorDir(uint8_t dir_left, uint8_t dir_right)
    {
        I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_DIR, dir_left, dir_right);
        while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    }

    die beiden funktionen im Base slave prog:
    Code:
    #define CMD_SET_MOTOR_PWR    13
    #define CMD_SET_MOTOR_DIR    14
    
    
    
    ....
    
    
    //einfügung in die switch-case funktion:
    
    
    case CMD_SET_MOTOR_PWR: setMotorPower(param1,param2); break;
    case CMD_SET_MOTOR_DIR: setMotorDir(param1,param2); break;
    wenns hilft hier noch das Linienfolgeprogramm, das ja bis auf die rückwärtsfahrt funktioniert:
    Code:
    #include "RP6ControlLib.h"
    #include "RP6ControlServoLib.h"     
    #include "RP6I2CmasterTWI.h"    
    #include "RP6Control_I2CMasterLib.h"
    
    void I2C_requestedDataReady(uint8_t dataRequestID) 
    { 
       checkRP6Status(dataRequestID); 
    } 
    
    void I2C_transmissionError(uint8_t errorState) 
    { 
       showScreenLCD("I2C ERROR: 0x",""); 
       writeIntegerLCD(errorState, HEX);  
    }
    
    int main(void) 
    { 
        initRP6Control();
        initLCD();
        
        mSleep(500);
        
        I2CTWI_initMaster(100);  
        I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); 
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
        
        setMotorDir(FWD,FWD);
        
        while(1) 
        { 
            if (adcLSL > adcLSR) 
            {  
                setMotorPower(100,50);
            } 
            else 
            { 
                setMotorPower(50,100);
            } 
        task_checkINT0(); 
        task_I2CTWI();
        getAllSensors();
        } 
        return(0); 
    }
    wo könnte der fehler sein -.- hab langsam keine lust mehr i-was mit meinem RP6 zu machen da fast nie was geht...


    MfG Julian

  5. #35
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Wie SlyD schon schreibt, diese Funktionen sind im orginalen Base-Slaveprogamm nicht vorhanden:

    #define CMD_SET_MOTOR_PWR 13
    #define CMD_SET_MOTOR_DIR 14

    Wichtig ist, dass beide Funktionen die Motorparameter libkonform ändern sonst klappt es nicht mit dem task_motionControl() in der Slave-Hauptschleife. Hier eine von mir geschriebene Funktion um die Motoren direkt anzusteuern im direkten Vergleich zum setMotorPower() aus der RP6RobotBaseLib:
    Code:
    // Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
    void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
    {
    extern uint8_t mleft_ptmp, mright_ptmp;
    
    	if(power_links > 210) power_links = 210;
    	if(power_rechts > 210) power_rechts = 210;
    	mleft_power=mleft_ptmp=power_links;
    	mright_power=mright_ptmp=power_rechts;
    
    	OCR1BL = power_links;
    	OCR1AL = power_rechts;
    
    	if(power_links || power_rechts)
    		TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
    	else
    		TCCR1A = 0;
    }
    
    void setMotorPower(uint8_t left_power, uint8_t right_power)
    {
    	if(left_power > 210) left_power = 210;
    	if(right_power > 210) right_power = 210;
    	mright_power = right_power;
    	mleft_power = left_power;
    }
    Vielleicht hilfts?

    Gruß

    mic

    [Edit]
    Ach, das steht ja auch in der Beschreibung von setMotorPower():
    * -------------------------------------------------------------
    * IT IS A BETTER IDEA NOT TO USE THIS FUNCTION AT ALL!
    * Use moveAtSpeed together with task_motionControl instead.
    * YOU CAN NOT USE setMotorPower AND setMotorDir WHEN YOU USE
    * task_motionControl! This will not work!
    * -------------------------------------------------------------
    http://translate.google.de/translate...+will+not+work!
    Geändert von radbruch (18.05.2011 um 14:45 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #36
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I&amp;#9829;ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    Ach, das steht ja auch in der Beschreibung von setMotorPower():
    * -------------------------------------------------------------
    * IT IS A BETTER IDEA NOT TO USE THIS FUNCTION AT ALL!
    * Use moveAtSpeed together with task_motionControl instead.
    * YOU CAN NOT USE setMotorPower AND setMotorDir WHEN YOU USE
    * task_motionControl! This will not work!
    * -------------------------------------------------------------
    oha... xD ganz überlesen.. mich wunderts dass es davor einwandfrei geklappt hat xD


    ich werds jetzt mal mit deiner funktion versuchen. die wird aber für die Base sein (bin mir eig sicher aber sicher ist sicher ) ?






    [EDIT] boah danke radbruch mit deiner funktion klappt es !! ich bekomm nur immer 0x20 raus und so klappt das schnelle richtung-ändern nicht, aber das krieg ich hin xD


    nochmal großen Dank an alle !


    [EDIT 2] anscheinend bekomm ich es doch nicht. ich hab die den inhalt der schleife in eine if-funktion mit einer wartezeit von 1ms gepackt, so bekomme ich keine errors mehr, aber der RP6 fährt nur rükwärts, egal ob ich fortwärts gasgebe rückwärts oder links rechts drehe, wenn ich garnichts mache bleibt er natürlich stehen, aber anscheinend funktioniert die richtungsänderung nicht richtig.. bin ich echt so dumm dass ich nicht mal das hinkriege ??

    [EDIT 3] wie viele edits werdns noch ?? ich nochmal herumexperimentiert und herausgefunden, dass wenn ich die das programm erst nach dem einschaltern der fernbedienung starte der rp6 bei irgendwelchen bewegungen immer rückwärts fährt, schalte ich die fernbedienung aber erst ein wenn das Programm läuft, bekomm ich auch wieder errors raus (0x20) und der RP6 fährt dann nur vorwärts.. oje... ob das nochmal was wird ?


    MfG Julian
    Geändert von I&amp;#9829;ROBOTIC (18.05.2011 um 16:04 Uhr) Grund: Update

  7. #37
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    oje... ob das nochmal was wird?
    Sicher, die nötige Hartnäckigkeit scheinst du ja zu besitzen. Wenn immer alles auf Anhieb funktioniert lernt man nicht so viel ;)

    Selbstverständlich sind die Funktionen für die Base gedacht, weil sie ja direkt auf die Motoransteuerung zugreifen. Da ich die Kommunikation zwischen Base und M32 noch nicht wirklich überblicke kann ich eigentlich nur raten. In RP6I2CslaveTWI.h ist Status 0x20 so definiert:

    Code:
    // TWI Master Transmitter staus codes
    #define TWI_MTX_ADR_ACK            0x18  // SLA+W has been transmitted and ACK received
    #define TWI_MTX_ADR_NACK           0x20  // SLA+W has been transmitted and NACK received
    #define TWI_MTX_DATA_ACK           0x28  // Data byte has been transmitted and ACK received
    #define TWI_MTX_DATA_NACK          0x30  // Data byte has been transmitted and NACK received
    Was das bedeutet kann ich aber wirklich nicht sagen ;)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #38
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I&amp;#9829;ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    ich dachte immer (habe irgendwo mal gelesen) das heißt dass die base nicht antwortet

  9. #39
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    ADR_ACK bedeutet vielleicht "Adresse verstanden " und ADR_NACK dann entsprechend "Adresse nicht verstanden". Keine Antwort wäre wohl eher irgendwas mit "timeout" oder "Verbindung verloren". Das wäre aber unterste Kommunikationsebene vom I2C und sollte eigentlich funktionieren, weil das bisher schon viele andere so genutzt haben. Aber wie schon geschrieben, ich kann, Mangels eigener Erfahrung, eigentlich nur raten.

    Oh, im Datenblatt des Mega32 steht auch was zu den TWI-Statusmeldungen auf Seite 184/185. Und SlyD verweist im Quellcode auch noch auf eine Appliation Note 311:
    http://www.atmel.com/dyn/resources/p...ts/doc2565.pdf

    Da muss man sich erst mal durchwursteln...

    btw: Mein lokales Datenblatt war schon veraltet, es hatte die Statusmeldungen auf Seite 188/189. Man beachte bitte auch den letzten Satz im Datenblatt!

    http://www.atmel.com/dyn/products/pr...0&part_id=2014
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #40
    Erfahrener Benutzer Fleißiges Mitglied Avatar von I&amp;#9829;ROBOTIC
    Registriert seit
    15.03.2010
    Ort
    Fürstenstein
    Alter
    27
    Beiträge
    112
    hm... naja aber es liegt anscheinend an der funktion changeDirection, denn die geschwindigkeitsregelung funktionier einwandfrei.

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

  1. LCD an RP6-Base
    Von radbruch im Forum Robby RP6
    Antworten: 5
    Letzter Beitrag: 09.11.2010, 22:11
  2. Zusammenspiel der BASE und M32 Control
    Von inka im Forum Robby RP6
    Antworten: 5
    Letzter Beitrag: 01.09.2010, 13:04
  3. bascom und ATTINY 85 PB0 klemmt
    Von kolisson im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 12.05.2009, 03:33
  4. RP6 Robot Base Hardware
    Von Dirk im Forum Robby RP6
    Antworten: 27
    Letzter Beitrag: 19.10.2007, 18:00
  5. Uart zwischen zwei Megas klemmt - - wieder einmal
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 06.05.2007, 17:12

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests