-         
+ Antworten
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: RNBFRA Software: Schrittmotoren mit Timern ansteuern (BASCOM

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.04.2004
    Ort
    Friesenheim - Baden
    Beiträge
    199

    RNBFRA Software: Schrittmotoren mit Timern ansteuern (BASCOM

    Das Programm kann helfen Bascom Timersteuerung zu verstehen

    Basis:
    -http://www.roboternetz.de/phpBB2/vie...ighlight=timer
    In HiTechs Post der Code über Timer

    -RNBFRA Beispielprogramme von der CD

    Code:
    '(###################################################
    
                         Timertest.bas
                Schrittmotoren Mit Timern Steuern...
                        Auf Dem Rnbfra 1.1
    
                    Moritz Wurth 10.05.2004
    
    #####################################################       ')
    Declare Sub Ledein(id As Word)                              'Subs zur Ledanzeige deklarieren
    Declare Sub Ledaus
    
    
    Dim Rightspeed As Byte                                      'Variablendefintion XXXspeed als Geschwindigkeitsangabe
    Dim Leftspeed As Byte                                       ' XXX = Right bzw Left für die jeweilige seite
    
    Dim Rightstatus As Bit                                      'Intern ben. Variable
    Dim Leftstatus As Bit                                       'Intern ben. Variable
    Dim Temp As Byte                                            'Intern ben. Variable
    Dim Tempspeed As Byte                                       'Intern ben. Variable
    
    
    $baud = 9600
    $crystal = 8000000
                                                                 'Ports für Schrittmotoren/LED einstellen
    Config Pinc.5 = Output
    Config Pinc.3 = Output
    
    Config Pinc.4 = Output
    Config Pinc.2 = Output
    
    Config Pind.6 = Output
    
    Const Writepowerport_adr = &H72
    Const Readpowerport_adr = &H73
    
    Dim I2cdaten As Byte
    
    
    Config Timer0 = Timer , Prescale = 256                      'Timer festlegen, Prescale legt fest welche X Takte der Timer aufgerufen wird
    On Ovf0 Tim0_isr                                            'Wenn Timer0 ausgelöst wird, rufe Tim0_isr auf
    
    Dim I As Integer                                            'Taktzähler
    Dim Cnt As Byte
    
    
                                                                'Timer anschalten
    Enable Timer0                                               'Interrupts anschalten
    Enable Interrupts
    
    '-----------------------------------------------------------------------
    ' Ab hier reguläres Programm
    ' Hier: An den 4 LED wird Binär bis 16 gezählt
    ' alle 1.6 Sekunden (16 * 100ms) wird die Geschwindigkeit auf dem Rechten Motor um 1 erhöht, links erniedrigt
    
    
    Rightspeed = 50                                             'Startgeschwindigkeit 50
    
    Do
      Cnt = Cnt + 1
      Call Ledein(cnt)                                          'LED setzen
      If Cnt = 15 Then                                          'Wenn 1 mal durchlaufen wurde
      Cnt = 0                                                   'LED zähler wieder auf 0
      Rightspeed = Rightspeed - 1                               'Rechts eins erniedrigen
      Leftspeed = 50 - Rightspeed                               'Links ebenfalls verändern
      If Rightspeed = 0 Then                                    'Wenn alles einmal durch ist (Rechts auf 0)
       Stop Timer0                                              'Timer stoppen
       Portd.6 = 0                                              'Schrittmotoren aus
      End If
      End If
       Waitms 100
    Loop
    
    
    Tim0_isr:
      I = I + 1
      Temp = I Mod Rightspeed
    
      If Temp = 0 Then
      Rightstatus = Not Rightstatus
      Portc.2 = Rightstatus
      End If
    
      Temp = I Mod Leftspeed
      If Temp = 0 Then
      Leftstatus = Not Leftstatus
      Portc.3 = Leftstatus
    End If
    
    Return
    
    
    End
    
    Sub Ledein(id)
       I2cstart
       I2cwbyte Writepowerport_adr
       I2cwbyte Id                                              'Datenbyte an PCF I2cstop
       I2cstop
     End Sub
    
    
    Sub Ledaus()
       I2cstart
       I2cwbyte Writepowerport_adr                              'Schreibbefehl an PCF schicken
       I2cwbyte 0                                               'Datenbyte an PCF
       I2cstop
    End Sub

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2004
    Alter
    50
    Beiträge
    25
    Hallo,

    so ganz verstehe ich dieses Programm nicht. Vielleicht würde ich es ein bisschen besser verstehen wenn ich es zum laufen bringen würde. Habe zwar die vorhanden Fehler ( I2cinit bzw. Port für I2C) beseitigt aber das hat nichts gebracht.

    Es will einfach nicht.

    mfg

    Tomkeule

  3. #3
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Ich denke das Programm ist noch etwas zu durcheinandergewirbelt um die Timerprogrammierung so zu verstehen. Müsste man etwas klarer strukturieren. Die Schrittbefehle in seperate Subroutinen und Kapseln und unnötiges raus!

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo Albanac,
    du startest deinen Timer0 nicht,also kommt es nie zum Interrupt und
    du setzt in deiner Interruptroutine deinen Timer0 nicht auf einen anderen Wert, hast also immer den gleichen Überlaufwert für deinen Timer.
    Im Interrupt setzt du auch nur einen Port, musst du nicht ein Schrittmuster generieren? etc.etc.
    Gruss, Michael

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2004
    Alter
    50
    Beiträge
    25
    Hallo,

    ich habe mal selbst versucht Schrittmotoren über Timer zu steuern.

    Code:
    'Testprogramm für 2 Schrittmotoren über Timer
    
    $crystal = 8000000                                          'Quarzfrequenz
    
    Declare Sub Ledein
    Declare Sub Ledaus
    
    Const Writepowerport_adr = &H72                             'I2C Adr PCF 2
    Const Readpowerport_adr = &H73                              'I2C Adr PCF 2
    
    Dim I2cdaten As Byte                                        'Datenbyte aus PCF8574
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    I2cinit
    
    '******** Diese 4 Befehle sind nur ab RNBFRA Version 1.2 (nicht in V 1.1)
    ' notwendig und bzw. möglich (erweiterte Energiesparfunktion und LED´s)
    ' Bei Board 1.1 bitte auskommentieren oder löschen
     I2cstart
     I2cwbyte &H74                                              'Schreibbefehl an PCF3 schicken
         ' Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
     I2cwbyte &B00000010                                        'Datenbyte an PCF3
     I2cstop
    '*********
    
    Config Pind.6 = Output                                      'Schrittmotoren Ein/Aus
    Config Pinc.5 = Output                                      'Schrittmotor Links Richtung
    Config Pinc.3 = Output                                      'Schrittmotor Links Step
    
    Config Pinc.4 = Output                                      'Schrittmotor Rechts Richtung
    Config Pinc.2 = Output                                      'Schrittmotor Rechts Step
    
    Dim X As Word
    
    Dim Y As Word
    
    Dim Verteilung As Byte
    
    Verteilung = 50                                             'Anfangseinstellung beide Motoren mit 50%
    
    Portd.6 = 1                                                 'Beide Schrittmotoren einschalten
    
    '-------------------------------------------------------------------------------
    On Timer0 Ontimer0
    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0
    
    On Timer2 Ontimer2
    Config Timer2 = Timer , Prescale = 1024
    Enable Timer2
    
    Enable Interrupts
    
    Do
    
       Input Verteilung
    
       X = 250 * Verteilung
       X = X / 100
       Y = 250 - X
       Print X ; "--" ; Y
    
    Loop
    
    
    End
    
    '-------------------------------------------------------------------------------
    Ontimer0:
       Timer0 = X
       Toggle Portc.2
    Return
    
    
    Ontimer2:
       Timer2 = Y
       Toggle Portc.3
    Return
    Meine Frage ist nun ob man das so machen kann??


    mfg

    Tomkeule

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo tomkeule,
    hmmm, du stocherst mehr, als dass du es verstehst?
    Ich weiss nicht, welchen Prozessor du verwendest, ich kenne das "RNBFRA" nicht. Hat jemand einen Link auf Datenblätter dazu?
    Dann startest du deine Timer immer noch nicht.
    Da Timer0 bei AVR's gewöhnlich ein 8bit-Timer ist, wirst du lustige Überläufe haben.
    Hat die Elektronik eigene "Intelligenz" ?. Woher weiss der Schrittmotor, dass es z.B. vorwärts geht?
    Gruss, Michael

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2004
    Alter
    50
    Beiträge
    25
    Hallo Michael,

    1. Warun stochern?

    2.Beide Timer werden doch gestartet

    3.Was verstehst du unter lustige Überläufe?

    4.Dieses Prog ist nur für den Test der Schrittmotoransteuerung. Ich gehe mal davon aus das du das Input übersehen hast.

    5.Die Auswertung der Sensoren ist hier noch nicht eingebaut.(Übersichtlichkeit)

    6.Im Augenblick funktioniert das Prog nur für eine Laufrichtung.

    Und zu gut letzt, das Prog funktioniert sogar.

    mfg

    Tomkeule

  8. #8
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Anleitung mit Portbeschreibung etc. findest Du hier http://www.roboternetz.de/phpBB2/dlo...le&file_id=106

    Ich komme leider jetzt nicht dazu ein kleines Timerbeispiel zu posten weil ich gerade selbst mit anderem Programm beschäftigt bin. Aber mach das bei Gelegenheit noch.
    Im Grunde ist es einfach, nur für die Berechnung der Timerzeit braucht man etwas Übung

    Das zweite Beispiel ist aber schon viel übersichtlicher. Könnte gehen! Timer wird doch gestartet!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo tomkeule,
    2.Beide Timer werden doch gestartet
    Nein. Der Eintrag Start Timerx fehlt für beide Timer.
    3.Was verstehst du unter lustige Überläufe?
    Schrieb ich schon in meinem letztem Posting.
    Denkanstoss: Der Timer0 hat 8bit, der Wert, den du reinschreibst hat x bit. Bestimme, ob x > 8
    4.Dieses Prog ist nur für den Test der Schrittmotoransteuerung. Ich gehe mal davon aus das du das Input übersehen hast.
    Nein, keineswegs. Funktioniert dieser Teil des Programmes?
    Und zu gut letzt, das Prog funktioniert sogar.
    Ich melde trotzdem Zweifel an *g*
    Ich sehe gerade (@Frank:danke für den Link), dass Timer2 auch 8bit hat. Obendrein kann in deiner Rechnung Y negative (Word-)Werte haben. Schreib mal einen "negativen" 16bit-Wert in eine 8bit-Variable. Das mein ich mit lustigen Überläufen.

    Gruss, Michael

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2004
    Alter
    50
    Beiträge
    25
    Hallo Michael,

    2.ich hoffe das ich mich nicht irre, aber die Timer werden mit "enable Timer" gestartet

    3.X und Y sind als WORd deklariert um bei der multiplikation einen Überlauf zu vermeiden.

    4.Ja

    Ja, Y kann negative sein. Aber nur wenn ich bei Input Müll eingebe.

    (Alles nur Test und Ausprobe)

    Aber Dank an Michael und alle Anderen für die Hilfe und Kritik.
    Nur wer seine Fehler kennt kann sie beseitigen.

    mfg

    Tomkeule

+ Antworten
Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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