Schritte im CTC Modus

OP #2861360
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
OP #2861398
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.
Gast #2861425
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
OP #2862304
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:-(
Gast #2862486
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren