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%