-         
Ergebnis 1 bis 2 von 2

Thema: [gelöst] Problem bei 2 Timern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2007
    Ort
    Dresden
    Alter
    33
    Beiträge
    29

    [gelöst] Problem bei 2 Timern

    Anzeige

    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
    33
    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
  •