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

Thema: [gelöst] Problem bei 2 Timern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2007
    Ort
    Dresden
    Alter
    40
    Beiträge
    29

    [gelöst] Problem bei 2 Timern

    Ok war mein Fehler hatte den Pin OC1A im Timer aktiviert, dadurch war eine Spule des Schrittmotors abgeschalten, jetzt funktioniert es

    Hallo,

    ich habe mir ein Programm für RN-Control 1.4 geschrieben, welches einen Schrittmotor alle 4,19s um 10 Schritte bewegen soll. Dafür nutze ich Timer1 mit 16bit für den Start des Schrittmotor-Timers (Timer0 8bit). Dieser Timer bewegt den Motor mit jedem Interrupt (Isr_schritt) um einen Schritt weiter.
    Wenn ich den Schrittmotor-Timer starte ( sub schritt() ), dann funktioniert alles super.
    Bei Start des Timer1 ( Sub Initialisierung() ) springt der Motor, so als ob die Geschwindikeit zu hoch wäre. Wenn ich dann ohne Reset den Schrittmotor-Timer wieder starte, dann funktioniert auch hier nix mehr.

    Was passt da nich?
    Hier mal mein Programm, ich habs auf das wesentlichste reduziert:
    Code:
    'mit dem programm will ich testen, ob ich einen Schrittmotor aller 4,..s um 10 schritte bewegen kann.
    
    Declare Function Tastenabfrage() As Byte
    Declare Sub Schritt()
    Declare Sub Initialisierung()
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Dim Taste As Byte
    
    
    'Definitionen für ISR_Schritt
       Dim Schrittnummer As Byte
       Dim H1 As Integer
       Dim H2 As Byte
       Dim Schrittzahl As Integer
    
    'Definierter Start
       Schrittnummer = 0                                        '0 heißt 2 aktive Spulenpaare; 1 ein aktives Spulenpaar
    
    
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    
    On Oc1a Isr_regler                                          'Timer-Compare Interrupt für Regelung
    On Oc0 Isr_schritt                                          'Timer-Compare Interrupt für Schrittmotor
    
    Enable Interrupts
    
    Ddrd.4 = 1                                                  'linker Motor ein/aus
    Ddrc.6 = 1                                                  'linker Motdrehrichtung
    Ddrc.7 = 1                                                  'linker Motdrehrichtung
    Ddrd.5 = 1                                                  'rechter Motor ein/aus
    Ddrb.0 = 1                                                  'rechter Motdrehrichtung
    Ddrb.1 = 1                                                  'rechter Motdrehrichtung
    
    Ddra.7 = 0                                                  'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    
    Print "mC gestartet"
    Print "Version 0.31 mit Regler"
    Do
    
    
       Taste = Tastenabfrage()
       If Taste <> 0 Then
          'Print "Taste " ; Taste
          Select Case Taste
             Case 1
                 Tccr0 = &B00001000                             'SchrittmotorTimer stoppen
                Tccr1b = &B00001000                             'RegelungsTimer stoppen
                Print "Stopp"
             Case 2
    
             Case 3
                Call Initialisierung
                'stoppen mit 1
             Case 4
                 Call Schritt
             Case 5
    
          End Select
       End If
       Waitms 100
    Loop
    End
    
    
    
    
    
    
    
    
    Sub Schritt()                                               '10 schritte
       Print "Sub 10 Schritte"
    
       Portd.4 = 1                                              'Schrittmotor Spule AB ein
       Portd.5 = 1                                              'Schrittmotor Spule AquerBquer ein
       Timsk.ocie0 = 1                                          'Timer0  8bit  output compare match interrupt enable
       Timsk.ocie1a = 1                                         'Timer1A 16bit output compare match interrupt enable
    
       'Geschwindigkeiten:
       Ocr0 = 255                                               'Geschwindigkeit des Schrittmotors 78=200 Schritte/s
       Ocr1ah = &HFF                                            'Geschwindigkeit der Regelung 255;
       Ocr1al = &HFF                                            'OCR1A=Ocr1ah*2^8+Ocr1al   &h61A=10Regelungen/s
    
       Schrittzahl = 10
    
       'Schrittmotor starten
       Tccr0 = &B00001101
    
    End Sub
    
    
    
    
    
    
    Sub Initialisierung()
       Print "Regler wird gestartet"
    
       Portd.4 = 1                                              'Schrittmotor Spule AB ein
       Portd.5 = 1                                              'Schrittmotor Spule AquerBquer ein
       Timsk.ocie0 = 1                                          'Timer0  8bit  output compare match interrupt enable
       Timsk.ocie1a = 1                                         'Timer1A 16bit output compare match interrupt enable
    
    
    
       'Geschwindigkeiten:
       Ocr0 = 255                                               'Geschwindigkeit des Schrittmotors 78=200 Schritte/s
       Ocr1ah = &HFF                                            'Geschwindigkeit der Regelung 255;
       Ocr1al = &HFF                                            'OCR1A=Ocr1ah*2^8+Ocr1al   &h61A=10Regelungen/s
    
       Schrittzahl = 10
    
       'Regler starten
       Tccr1a = &B10000000
       Tccr1b = &B00001101
    
    End Sub
    
    
    
    
    
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
       Tastenabfrage = 0
    
          Start Adc
          Ws = Getadc(7)
          If Ws < 945 Then
             Select Case Ws
                Case 930 To 950
                   Tastenabfrage = 1
    
                Case 777 To 790
                   Tastenabfrage = 2
    
                Case 610 To 620
                   Tastenabfrage = 3
    
                Case 430 To 440
                   Tastenabfrage = 4
    
                Case 240 To 250
                   Tastenabfrage = 5
    
             End Select
    
             Waitms 50
    
    
          End If
    
    End Function
    
    
    
    
    
    
    
    
    Isr_regler:
       Print "isr_regler"
       Schrittzahl = 10
       Tccr0 = &B00001101                                       'Schrittmotor wieder aktivieren
    
    Return
    
    
    
    Isr_schritt:                                                'gibt den nächsten schritt des Schrittmotors aus
    
       'Print Tccr0 ; " ORCR0 " ; Ocr0 ; " TCNT0 " ; Tcnt0
       If Schrittzahl <> 0 Then
    
          If Schrittzahl > 0 Then                               'Richtung prüfen und Nummer erhöhen oder verringern
           Schrittzahl = Schrittzahl - 1                        'Richtung=1 heißt nach unten bewegen; oder Schrittzahl <0 soll sich nach unten beweden
           'Print Schrittzahl
           Schrittnummer = Schrittnummer + 2                    'schrittnummer von 0 bis 7
           Schrittnummer = Schrittnummer Mod 8
          Else
           Schrittzahl = Schrittzahl + 1
           'Print Schrittzahl
           Schrittnummer = Schrittnummer - 2
           Schrittnummer = Schrittnummer Mod 8
          End If
    
          H1 = Lookup(schrittnummer , Schritttab)
    
          H2 = H1 And 8                                         'bit 4 filtern
          Shift H2 , Right , 3                                  'um 3 nach rechts verschieben
          Portc.6 = H2                                          'ausgeben
    
          H2 = H1 And 4
          Shift H2 , Right , 2
          Portc.7 = H2
    
          H2 = H1 And 2
          Shift H2 , Right , 1
          Portb.0 = H2
    
          H2 = H1 And 1
          Portb.1 = H2
          'Print Portc.6 ; Portc.7 ; Portb.0 ; Portb.1
       Else
          Tccr0 = &B00001000                                    'Timer stoppen
       End If
    
    Return
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Isr_endlage:
    
       Print "Timer0 stopp"
       'T0laeuft = 0
       'Schrittzahl = 0
       Tccr0 = &B00001000
       'Ocr0 = 250
       'Richtung = Not Richtung
    
    Return
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    Schritttab:
    Data 10% , 8% , 9% , 1% , 5% , 4% , 6% , 2%

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2007
    Ort
    Dresden
    Alter
    40
    Beiträge
    29
    Hallo, weiß denn keiner woran es liegen könnte?
    das Problem mit 2 gleichzeitig laufenden Timern besteht immer noch

Berechtigungen

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

LiFePO4 Speicher Test