- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: NIBOBee mit BASCOM Programmieren

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847

    NIBOBee mit BASCOM Programmieren

    In diesem Threat werden Programme und Fragen gepostet, die sich um das Thema Bascom mit der Bee drehen.

    Gleich mal mein Programm wo ich ein SRF05 an die Bee angeschlossen habe:
    Code:
    'Verwendeter Compiler Bascom V 1.11.9.3
    '
    'Aufgabe:
    'Entfernung wird gemessen und in Zentimetern über
    'RS232 ausgegeben
    'Autor: Pinsel120866
    '###################################################
    
    $regfile = "m16def.dat"
    $crystal = 15000000
    $baud = 9600
    $hwstack = 32
    $framesize = 32
    $swstack = 32
    Dim Zeitmessung As Word
    Dim Entfernung As Word
    Wait 1
    Print "**** SRF05 mit NIBOBee *****"
    Print "Entfernung in cm anzeigen"
    Print " "
    Config Pinc.2 = Output[
    Do
    Portc.2 = 0
    Pulseout Portc , 2 , 40
    Pulsein Zeitmessung , Pinc , 2 , 1
    Zeitmessung = Zeitmessung * 10
    Entfernung = Zeitmessung / 58
    Print "Entfernung: " ; Entfernung ; " cm"
    Wait 1
    Loop
    Noch eine Frage an die BASCOM-Profis:

    Wie werden die Motoren der NIBOBee mit Bascom angesteuert?

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hmm, vielleicht hätte ich diesen Threat ins BASCOM-Forum stellen sollen. Jetzt habe ich den ganzen Nachmittag damit verbracht aber ich komme einfach nicht drauf wie die Motoren richtig angesteuert werden.

    Hat keiner Erbarmen mit mir und gibt mit einen Tipp?

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

    *lol* Ich bin ja auch kein Bascom-Guru, deshalb würde ich einfach das Timer1-Setup der nibobee-Lib (oder des RP6) eins zu eins nach Bascom übersetzen. Profis würden wohl den passenden Config-Timer-Befehl von Bascom verwenden. Als C-Anwender braucht man aber gelegentlich reichlich Zeit um die kleinen Ungereimtheiten der Bascom-Configs zu ergründen, deshalb führt das direkte Manipulieren der Timerregister wohl schneller zum Ziel. Wenn der Timer mal läuft und die OC1x-Pins richtig ansteuert werden, braucht man nur noch die OCR1x-Register mit dem gewünschten PWM-Wert zu laden und mit PD6/7 die jeweilige Drehrichtung auszuwählen. Ich denke, das wirst du hinbekommen.

    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!

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.427
    wo hängen die motoren dran? wenn sie an den hardware pwm ins hängen guck einfach mal nach pwm bsp programmen im rn-wiki oder bei den Bascom bsp programmen. ansonsten mal probiern den jeweiligen pin einschalten und dann nach softwarepwm suchen
    was gibt es noch zu sagen

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Der Motortreiber hängt an den Hardware-PWM-Pins OC1A/B und an PD6/7 für die Drehrichtung. Das RN-Wissen ist natürlich auch ein toller Tipp:
    http://www.rn-wissen.de/index.php/Bascom_und_PWM
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    OK,

    ich weiss nur nicht wie ich mit einem PIN umschalten kann. Mein Code sieht so aus:

    Code:
      $regfile = "m16def.dat"
      $crystal = 15000000
    
      Declare Sub Motordir(byval Motleftdir As Byte , Byval Motrightdir As Byte)
      Declare Sub Motorspeed(byval Motleftpwm As Byte , Byval Motrightpwm As Byte)
    Init:
    
      Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    
      Const Driverwd = 0
      Const Drivefwd = 1
    
    Main:
      Do
        Call Motordir(drivefwd , Drivefwd)
        Call Motorspeed(100 , 100)
        Wait 1
        Call Motorspeed(0 , 0)
        Wait 1
      Loop
    
    Sub Motordir(byval Motleftdir As Byte , Byval Motrightdir As Byte)
      Ddrd.6 = 1
      Ddrd.7 = 1
      If Motleftdir.0 = 0 Then
        Portd.6 = 1
      Else
        Portd.6 = 0
      End If
      If Motrightdir.0 = 0 Then
        Portb.7 = 1
      Else
        Portb.7 = 0
      End If
    End Sub
    
    Sub Motorspeed(byval Motleftpwm As Byte , Byval Motrightpwm As Byte)
      Ddrd.5 = 1
      Ddrd.4 = 1
      Pwm1a = Motleftpwm
      Pwm1b = Motrightpwm
    End Sub

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Ich komme einfach nicht weiter. Mit dem oben gezeigtem Programm drehen sich die Räder, aber beide in entgegengesetzte Richtung. Mir ist das einfach nicht klar.

    Wie muss ich nun das Programm abändern dass ich die Drehrichtung umsteuern und die Geschwindigkeit anpassen kann?

    Bitte nochmals um Hilfe.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Hallo Nachbar,

    in Bascom bin ich ja die bekannte Doppelnull - wo ich doch schon in Cäh ne Null bin. Aber hier mal auf die Schnelle ein Schnippsel, wie ICH bei meinen Döschen die Motoren schalte (ist aber ein H-Brücken-IC). Weiß ja nicht ob Dir das hilft. In den Wahrheitstabellen der H-Brücken-ICs gibts vielleicht auch ne Hilfe/Erklärung.
    Code:
    Initialisierung:
    /* ============================================================================== */
    /* ==  PWM-Routinen zur Motoransteuerung  ======================================= */
     void TC0PWM_init(void)	//Init Timer/Counter0 für Erzeugung des PWM-Signals
     {
       TCCR0A |= (1<<COM0A1)|(1<<COM0B1);   //Clear/set OC0A/OC0B on Compare Match,
                                            //    doc S102 , OC0A/OC0B ist Port PD6/D5
       TCCR0A |= (1<<WGM01)|(1<<WGM00);     // Fast PWM, TOP=0xFF=dez255,     doc S104
                    //  das ergibt aus 20 MHz mit Prescaler 1/64  1220 Hz
       TCCR0B |= (1<<CS01)|(1<<CS00);       // Prescaler ist clk/64           doc S106
       TIMSK0 &= ~(1<<OCIE0A)|(1<<OCIE0B);	// Tmr/Cntr0 Oput CompB Match intrrpt dsabld
       TIMSK0 &= ~(1<<TOIE0);		// Tmr/Cntr0 Overflow interrupt disabled
       OCR0A     = 0;                       // PWM auf Null setzen
       OCR0B     = 0;                       // PWM auf Null setzen
       Iz_diff0  = 0;
       isum12    =  isum34    = 0;
       ie_mot12  =  ie_mot34  = 0;
       ie_alt12  =  ie_alt34  = 0;
    }            
    /* ============================================================================== */
    void setPWMrechts(uint8_t speed)        //Geschwindigkeit Motor 12 (rechter)
    {OCR0B = speed;}                        //  PWM auf PD5/OC0B, korrig. 24mrz09
    /* ============================================================================== */
    void setPWMlinks(uint8_t speed)         //Geschwindigkeit Motor 34 (linker)
    {OCR0A = speed;}                        //  PWM auf PD6/OC0A, korrig. 24mrz09
    /* ============================================================================== */
    ...
    und die verschiedenen Richtungen:
    //  Drehrichtungsbefehle für Motor 1,2 = "rechter" Motor
     void M12pos (void)             // Mot12 dreht im Uhrzeigersinn = neg. math.
     { PORTB  |=  (1<<PB4);  PORTD  &= ~(1<<PD4);  mdir12 = 1; }
    //             r r r r r r r Motor 1,2 = rechter Motor r r r r r r
     void M12neg (void)             // Mot12 dreht im mathematisch positiven Drehsinn
     { PORTB  &= ~(1<<PB4);  PORTD  |=  (1<<PD4);  mdir12 = -1; }
    //             r r r r r r r Motor 1,2 = rechter Motor r r r r r r
     void M12stp (void)             // Motor 12 aus
     { PORTB  &= ~(1<<PB4);  PORTD  &= ~(1<<PD4); }
    //                -----------------------
    //  Drehrichtungsbefehle für Motor 3,4 = "linker" Motor
     void M34neg (void)             // Mot3,4 dreht im Uhrzeigersinn = neg. math.
     { PORTB  |=  (1<<PB0);  PORTD  &= ~(1<<PD7);  mdir34 = 1; }
    //             l l l l l l l Motor 3,4 = linker Motor l l l l l l
     void M34pos (void)             // Mot3,4 dreht im mathematisch positiven Drehsinn
     { PORTB  &= ~(1<<PB0);  PORTD  |=  (1<<PD7);  mdir34 = -1; }
    //             l l l l l l l Motor 3,4 = linker Motor l l l l l l
     void M34stp (void)             //  Motor 12 aus
     { PORTB  &= ~(1<<PB0);  PORTD  &= ~(1<<PD7); }
    // - - - -
    Anmerkung zum Code: beim Mot12 geht Mot12neg in die mathematisch positive Richtung, weil Motxxneg natürlich "fahre rückwärts" heißt.
    Vielleicht bringt Dir das RNWiki mehr Hilfe?
    Ciao sagt der JoeamBerg

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

    Das Drehrichtungsproblem wird tatsächlich vom Ansteuerungs-IC der H-Brücke verursacht. Deshalb sieht meine Motorsteuerung (ohne PWM) so aus:
    Code:
    #define DIR_R 7
    #define DIR_L 6
    #define PWM_L 5
    #define PWM_R 4
    
    void motorDir(uint8_t dir_left, uint8_t dir_right)
    {
    	if(dir_left)  PORTD |= (1<<DIR_L); else PORTD &= ~(1<<DIR_L);
    	if(dir_right) PORTD &= ~(1<<DIR_R); else PORTD |= (1<<DIR_R);
    }
    
    void motorSpeed(uint8_t speed_left, uint8_t speed_right)
    {
    	if(speed_left)  PORTD &= ~(1<<PWM_L); else PORTD |= (1<<PWM_L);
    	if(speed_right) PORTD &= ~(1<<PWM_R); else PORTD |= (1<<PWM_R);
    }
    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!

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Hallo pinsel120866,

    hast Du Dir die Bauanleitung (neue Doc!) Seite 7, Punkt 1.2.2 angesehen ? Da ist die Motorbrücke einigermassen erklärt. Dazu KÖNNTEST Du Dir noch den Schaltplan ansehen, Sheet 2.
    Ciao sagt der JoeamBerg

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress