Forum: Mikrocontroller und Digitale Elektronik Schritte im CTC Modus


von Thomas H. (datatom)


Lesenswert?

Hallo zusammen,

ich habe ein Bascomprogramm geschrieben, womit ich einen Schrittmotor 
drehen lasse. Der Timer läuft im CTC-Modus. Wie kann ich jetzt die 
Drehung des Schrittmotors auf einzelne Schritte begrenzen? Ich finde 
jetzt keine Stelle wo ich einen Zähler einbauen kann. Auf dem 
Schrittmotor ist ein Getriebe montiert und so wäre bei 1025 ganzen 
Schritten ein Winkel von 180° erreicht. Wie kann ich die Schritte auf 
1025 begrenzen?

Hie das Programm:
1
' Stepper Testprogram
2
3
$prog , 255 , &B11011001,
4
$regfile = "m2560def.dat"
5
$hwstack = 82                                               '80
6
$framesize = 68                                             ' 64
7
$swstack = 68                                               '44
8
9
10
$crystal = 16000000                                         'Quarzfrequenz
11
$baud = 19200
12
13
Config Pinb.5 = Output                                      ' Pin PB5 für Timer1/ OC1A im CTC-Modus
14
15
16
Config Pind.5 = Output
17
Led Alias Portd.5
18
19
Config Pinc.0 = Output                                      ' Stiftleiste JP 2; Pin 3; PC0
20
Stepper1_reset Alias Portc.0
21
22
Config Pinc.1 = Output                                      ' Stiftleiste JP 2; Pin 4; PC1
23
Stepper1_direction Alias Portc.1
24
25
Config Pinc.2 = Output                                      ' Stiftleiste JP 2, Pin 5; PC2
26
Stepper1_enable Alias Pinc.2
27
28
Config Pinc.3 = Output                                      ' Stiftleiste JP 2, Pin 6; PC3
29
Stepper1_step Alias Pinc.3
30
31
Config Pinb.7 = Output
32
Takt Alias Pinb.7
33
34
Dim I1 As Integer
35
Dim Takt_hz As Long
36
37
Echo Off
38
39
Led = 0                                                     ' LED einschalten
40
41
42
Do
43
   Toggle Led
44
   Waitms 75
45
   I1 = I1 + 1
46
Loop Until I1 = 20
47
48
Wait 5
49
50
Stepper1_direction = 0                                      ' Stepper1_direction = off (0 Volt); Stiftleiste JP 2; Pin 4; PC1
51
Stepper1_enable = 0                                         ' Stepper1_enable    = off (0 Volt); Stiftleiste JP 2, Pin 5; PC2
52
53
Tccr1a = &B01000000                                         ' Pin PB5 auf OC1A umschalten. I/ O sind damit ausgeschaltet
54
Tccr1b = &B00001101                                         ' Bit 3 = CTC Modus; Bit 0-2 = Prescaler 1024
55
56
Compare1a = 30
57
58
  Do
59
  Loop
60
61
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
62
End

Vielen Dank für die Hilfe.

Grüße

datatom

von Michael (Gast)


Lesenswert?

Thomas Holländer schrieb:
> Wie kann ich die Schritte auf 1025 begrenzen?
Indem du in einem Interrupt die Schritte mitzählst und nach den 1025 
Schritten den Timer abschaltest.

von Thomas H. (datatom)


Lesenswert?

Danke für den Tip.
1
I1 = 0
2
3
On Timer1 Timer1_i
4
Tccr1a = &B01000000                                         ' Pin PB5 auf OC1A umschalten. I/ O sind damit ausgeschaltet
5
Tccr1b = &B00001101                                         ' Bit 3 = CTC Modus; Bit 0-2 = Prescaler 1024
6
Enable Interrupts
7
8
Compare1a = 30
9
10
  Do
11
      Toggle Led
12
      Wait 5
13
14
15
'''''''''' Ändern der Drehrichtung '''''''''''
16
      Compare1a = 0
17
      Waitus 150
18
      Stepper1_direction = 1                                ' Stiftleiste JP 2; Pin 4; PC1
19
      Compare1a = 30
20
21
  Loop
22
23
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
24
End
25
26
Timer1_i:
27
28
I1 = I1 + 1
29
30
If I1 = 1025 Then
31
32
   Compare1a = 0
33
34
End If
35
36
Return

So sollte es mit dem Interrupt klappen, oder? Kann jetzt den 
Mikrocontroller nicht anschließen.

von CTC (Gast)


Lesenswert?

Auf die Schnelle:

Thomas Holländer schrieb:
> On Timer1 Timer1_i

ist der Overflow Interrupt.

Es sollte "On Compare1a Timer1_i" heißen.

von Spess53 (Gast)


Lesenswert?

Hi

>If I1 = 1025 Then
>   Compare1a = 0
>End If

Damit schaltest du den Timer nicht ab, sondern stellst die höchst 
mögliche Frequenz ein. Zum Abschalten entweder den Prescaler auf Noll 
setzen oder den Timer vom Port trennen.

MfG Spess

von CTC (Gast)


Lesenswert?

Achja, und ein Enable Compare1a muß auch noch rein.

von Thomas H. (datatom)


Lesenswert?

Irgendwas klappt nicht. Der Interrupt wird nicht erreicht.

Hier noch einmal mein Programm:
1
 
2
3
 ' Stepper Testprogram
4
5
$prog , 255 , &B11011001,
6
$regfile = "m2560def.dat"
7
$hwstack = 82                                               '80
8
$framesize = 68                                             ' 64
9
$swstack = 68                                               '44
10
11
12
$crystal = 16000000                                         'Quarzfrequenz
13
$baud = 19200
14
15
Config Pinb.5 = Output                                      ' Pin PB5 für Timer1/ OC1A im CTC-Modus
16
17
18
Config Pind.5 = Output
19
Led Alias Portd.5
20
21
Config Pinc.0 = Output                                      ' Stiftleiste JP 2; Pin 3; PC0
22
Stepper1_reset Alias Portc.0
23
24
Config Pinc.1 = Output                                      ' Stiftleiste JP 2; Pin 4; PC1
25
Stepper1_direction Alias Portc.1
26
27
Config Pinc.2 = Output                                      ' Stiftleiste JP 2, Pin 5; PC2
28
Stepper1_enable Alias Pinc.2
29
30
Config Pinc.3 = Output                                      ' Stiftleiste JP 2, Pin 6; PC3
31
Stepper1_step Alias Pinc.3
32
33
Config Pinb.7 = Output
34
Takt Alias Pinb.7
35
36
Dim I1 As Integer
37
Dim I2 As Integer
38
Dim Takt_hz As Long
39
40
Echo Off
41
42
Led = 0                                                     ' LED einschalten
43
44
45
Do
46
   Toggle Led
47
   Waitms 75
48
   I1 = I1 + 1
49
Loop Until I1 = 20
50
51
Wait 5
52
53
Stepper1_direction = 0                                      ' Stepper1_direction = off (0 Volt); Stiftleiste JP 2; Pin 4; PC1
54
Stepper1_enable = 0                                         ' Stepper1_enable    = off (0 Volt); Stiftleiste JP 2, Pin 5; PC2
55
56
I1 = 1
57
I2 = 50
58
59
On Compare1a Timer1_i
60
Tccr1a = &B01000000                                         ' Pin PB5 auf OC1A umschalten. I/ O sind damit ausgeschaltet
61
Tccr1b = &B00001101                                         ' Bit 3 = CTC Modus; Bit 0-2 = Prescaler 1024
62
Enable Compare1a
63
64
Compare1a = 30
65
66
  Do
67
      Toggle Led
68
      Waitms I2
69
70
71
'''''''''' Ändern der Drehrichtung '''''''''''
72
  '    Tccr1b = &B00001000                                   ' Timer/ Counter stopped, no clock source
73
  '    Waitus 150
74
  '    Stepper1_direction = 1
75
  '    Tccr1b = &B00001101                                   ' Stiftleiste JP 2; Pin 4; PC1
76
77
78
  Loop
79
80
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
81
End
82
83
Timer1_i:
84
85
I2 = 500
86
87
I1 = I1 + 1
88
89
If I1 = 10 Then
90
91
   Tccr1b = &B00001000                                      ' Timer/ Counter stopped, no clock source
92
93
End If
94
95
Return

Der Schrittmotor bleibt nicht stehen und das LED blinkt auch nicht 
langsamer:-(

von CTC (Gast)


Lesenswert?

Thomas Holländer schrieb:
> Irgendwas klappt nicht. Der Interrupt wird nicht erreicht.

Jetzt fehlt wieder ein Befehl zu den den Interrupts, den es in einer 
frühren Programmversion gab.

von Thomas H. (datatom)


Lesenswert?

Ich schätze mal das fehlt:
1
Enable Interrupts

Kanns heute Abend erst testen.

Aber das müsste es sein, oder?

von Nostalgie (Gast)


Lesenswert?

Thomas Holländer schrieb:
> Aber das müsste es sein, oder?

Früher (tm) hätt' man, statt zu rätseln, den Code im Simulator laufen 
lassen und geguckt ob nach der Initialisierung die betreffende 
Interrupts freigegeben sind. Dann hätte man den Timer vielleicht mal 
kurz vorn Überlauf gesetzt, um im Singlestep zu gucken, ob der Sprung in 
die ISR erfolgt.

von CTC (Gast)


Lesenswert?

Thomas Holländer schrieb:
> Ich schätze mal das fehlt:
> Enable Interrupts
> .
> Aber das müsste es sein, oder?

:-) Jap, das meinte ich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.