PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] Problem bei 2 Timern



frankne
22.11.2007, 16: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%

frankne
24.11.2007, 20:32
Hallo, weiß denn keiner woran es liegen könnte?
das Problem mit 2 gleichzeitig laufenden Timern besteht immer noch :(