- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: Schleifen Problem

  1. #1

    Schleifen Problem

    Anzeige

    Praxistest und DIY Projekte
    hallo
    Ich habe ein RN-Controll und RN-Motor Board mit 2 Schrittmotoren in meine Bot Verbaut so weit so gut alles geht auch normal nur ich habe in Bascom das Problem das ich ein Programm schreiben will das der Robot zb 500 schritte macht und dann stop
    Jetzt meine überlegeung:

    Code:
     Dim Schritt as Integer
     Dim I2cdaten(6) As Byte
    Do
    
     I2cdaten(1) = 10   'Kennung muss bei RN-Motor immer 10 sein
     I2cdaten(2) = 7    'Befehlscode
     I2cdaten(3) = 0    '1 Parameter
     I2csend &H56, I2cdaten(1),5 'Befehl wird gesendet
     Incr Schritt
    print Schritt
    
    Loop until schritt =500
    das problem ist der bot bewegt sich keinen meter über die console zeigt er mir aber schön braf an das er die schleife sauber bis 500 hochzählt aber die motoren steh still

    Btw.: ja sonst passt alles motoren on usw wenn ich zb. ein prog schreib das sich die motoren endlos drehn sollen tun sie das auch
    Endlösung wäre hald ein kleines test Programm haben das der Bot zb 500 schritte grade aus dann 10 schritte nur linker motor rechts dann wieder 500 geradeaus usw. Hoffe mir kann jemand helfen

    Danke

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hi,

    schau Dir mal die Befehle "I2cinit", I2cstart" und I2cstop" an.

    Nutzt Du die vorgesehenen I2C-Pins oder fährst Du eine andere Konfiguration?

    Hast Du die Abschlußwiderstände richtig?

    Und poste bitte mal Deinen VOLLSTÄNDIGEN Code, das wird doch wohl kaum alles sein, oder?

    Grüße

    Torsten

  3. #3

    hier der Vollstaändige Code es geht um den Case 4

    Wie gewünscht der Vollständige code alles funkt nur wie oben schon gesagt nicht die 500 Schritt funktion
    Code:
    Declare Function Tastenabfrage() As Byte
    Declare Sub Aendereslaveid()
    
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    Const Befehl_maxstrom = 1
    Const Befehl_endlos_drehen = 6
    Const Befehl_ausschalten = 9
    Const Befehl_einschalten = 10
    
    Const Motor_links = 0
    Const Motor_rechts = 1
    Const Motor_beide = 2
    Const Motor_links_schritt = 0
    Const I2crnmotorslaveadr = &H56                             'I2C SlaveAdresse von RN-Motor Erweiterung
    Const I2crnmotorsreadlaveadr = &H57                         'I2C SlaveAdresse von RN-Motor Erweiterung
    
    Dim I2cdaten(6) As Byte                                     'Array um Befehlsfolge auszunehmen
    Dim I2cdaten_rechts(6) As Byte
    Dim Ton As Integer
    Dim Schritt As Integer
    Schritt = 0
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    I2cinit
    
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    Dim Taste As Byte
    Print
    Print "**** RN-Motor Test"
    Print "Schrittmotorn Test Simple"
    Print
    Do
       Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                'Motorstrom auf 200mA begrenzen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_maxstrom                   'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2cdaten(4) = 500 / 10                          '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                Print "Links Rennt"
                I2cstop
    
                I2cdaten_rechts(1) = 10                         'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten_rechts(2) = Befehl_maxstrom            'Befehlscode
                I2cdaten_rechts(3) = Motor_rechts               '1 Parameter
                I2cdaten_rechts(4) = 500 / 10                   '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten_rechts(1) , 5       'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                Print "Rechts Rennt"
                I2cstop
    
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_einschalten                'Befehlscode
                I2cdaten(3) = Motor_beide                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
             Case 2
    
    
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_endlos_drehen              'Befehlscode
                I2cdaten(3) = Motor_beide                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
             Case 3
    
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_endlos_drehen              'Befehlscode
                I2cdaten(3) = Motor_rechts                      '1 Parameter
    
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
             Case 4
                      Do
    
                      I2cdaten(1) = 10                          'Kennung muss bei RN-Motor immer 10 sein
                      I2cdaten(2) = 7                           'Befehlscode
                      I2cdaten(3) = 0                           '1 Parameter
                      I2csend &H56 , I2cdaten(1) , 5            'Befehl wird gesendet
                Incr Schritt
                Loop Until Schritt = 5
                Wait 1
    
    
    
             Case 5
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_ausschalten                'Befehlscode
                I2cdaten(3) = Motor_beide                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
                Print "Motoren aus....."
    
              End Select
       End If
    
       Waitms 100
    Loop
    
    
    
    
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
    
       Tastenabfrage = 0
       Start Adc
       Ws = Getadc(7)
       If Ws < 1010 Then
          Select Case Ws
             Case 400 To 455
                Tastenabfrage = 1
             Case 335 To 380
                Tastenabfrage = 2
             Case 250 To 305
                Tastenabfrage = 3
             Case 180 To 220
                Tastenabfrage = 4
             Case 100 To 130
                Tastenabfrage = 5
          End Select
       End If
    
    End Function
    End

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Ich sehe zwar 2x "Ic2stop", aber keinen "I2cstart"...

    Versuch doch mal, das Programm konsequent mit
    I2cstart
    I2csend
    I2cstop
    aufzubauen.

    Oder zumindest mit einem I2cstart vor jedem Send - damit hatte ich beimMega8 in Kombination mit einem PCF8574 schon Erfolg.

    Gruß

    Torsten

  5. #5
    Zitat Zitat von Torsten_G
    Ich sehe zwar 2x "Ic2stop", aber keinen "I2cstart"...

    Versuch doch mal, das Programm konsequent mit
    I2cstart
    I2csend
    I2cstop
    aufzubauen.

    Oder zumindest mit einem I2cstart vor jedem Send - damit hatte ich beimMega8 in Kombination mit einem PCF8574 schon Erfolg.

    Gruß

    Torsten
    also dann so zb.:
    Code:
     I2cstart
             Do
                      I2cdaten(1) = 10                          'Kennung muss bei RN-Motor immer 10 sein
                      I2cdaten(2) = 7                           'Befehlscode
                      I2cdaten(3) = 0                           '1 Parameter
                      I2csend &H56 , I2cdaten(1) , 5            'Befehl wird gesendet
    
    
    
                Incr Schritt
                Loop Until Schritt = 5
                I2cstop

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Nein... eher so:

    Code:
     
             Do 
                      I2cdaten(1) = 10                          'Kennung muss bei RN-Motor immer 10 sein 
                      I2cdaten(2) = 7                           'Befehlscode 
                      I2cdaten(3) = 0                           '1 Parameter
    
                      I2cstart
                      I2csend &H56 , I2cdaten(1) , 5            'Befehl wird gesendet 
                      I2cstop
    
    
                Incr Schritt 
                Loop Until Schritt = 5
    Oder auch ganz ohne I2cstop, nur mit I2cstart

    Gruß

    Torsten

Berechtigungen

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

LiFePO4 Speicher Test