frankne
22.11.2007, 17:54
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:
'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%
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:
'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%