1 | interrupt [TIM0_OVF] void timer0_ovf_isr(void)
|
2 | {
|
3 | char Stop;
|
4 |
|
5 | //TCNT0=0xFC;
|
6 | TCNT0=0xFF;
|
7 |
|
8 | InPort = (((PIND & 0b00111100) >> 2) ^ 0b1111) ^ Cfg_InversIn;
|
9 | OutPort = (PORTC & 0b00111111) |((PORTB & 0b00000011)<<6);
|
10 |
|
11 |
|
12 | if (Step)
|
13 | {
|
14 | PORTC = portc;// ^ InversC; // Jetzt geht alles raus
|
15 | PORTB = portb;// ^ InversB;
|
16 |
|
17 | if (portc & P_Step) // wir haben einen Schritt gemacht
|
18 | {
|
19 | Position ++; // Position hochzählen
|
20 | ModuloCnt++; // Modulo Schritte hochzählen
|
21 | if (ModuloCnt == Cfg_Modulo) // Wenn wir die Anzahl erreicht haben null machen
|
22 | {
|
23 | // Alles was im Vollschritt gemacht werden darf
|
24 |
|
25 | ModuloCnt=0;
|
26 | // hier für die Referenz
|
27 | if (Mode & M_Reference)
|
28 | {
|
29 | // Erst mal Schauen ob wir Freifahren müssen
|
30 | // Das Bedeutet beide Sensoren müssen frei sein
|
31 |
|
32 | if (Mode & M_ReferenceFree)
|
33 | {
|
34 | if (!In_RefH && !In_Ref) Mode &=~M_ReferenceFree;
|
35 | }
|
36 |
|
37 | if ((Mode & M_ReferenceFree) == 0 )
|
38 | {
|
39 | if (In_RefH) Mode |= M_ReferenceH; // Stunde ist gefunden
|
40 |
|
41 | // ReferenzOK mit betrachten, dass wir nur die Flanke sehen
|
42 | // Wir haben Stunde und Minute und keine Referenz und einen Vollschritt OK
|
43 | if (((Mode & (M_ReferenceH|M_ReferenceOK))==M_ReferenceH) && In_Ref)
|
44 | {
|
45 | Position = Cfg_RefPosition; // Dann Setzen wir die Position
|
46 | Mode &= ~(M_Start); // und Start wegnehmen
|
47 | Mode |= (M_Stop | M_ReferenceOK); // Und Anhalten
|
48 | }
|
49 | }
|
50 | }
|
51 | }
|
52 | }
|
53 | Step = 0; // Step abschalten
|
54 | }
|
55 | else // hier sind wir mit den Schritt durch und müssen einen neunen Bauen
|
56 | {
|
57 | PORTC &= ~(P_Step|P_Dir);// ^InversC; // Erst mal Step aus
|
58 |
|
59 | portc &= ~(P_Step|P_Dir|P_Enable); // erst mal haben wir kein Step&Dir&Enable
|
60 |
|
61 |
|
62 | // Abhier geht der Motor los
|
63 | if (Mode & M_Enable)
|
64 | {
|
65 | if (Dir) portc |= P_Dir; // und wenn wir die Richtung haben auch die
|
66 |
|
67 | //hier die Entscheidungen für Stop
|
68 | if (Mode & M_Position) // Fahren wir in Positionsmode
|
69 | {
|
70 | if (Mode & M_Start) // Wenn wir noch Fahren
|
71 | {
|
72 | if ((DPosition - Position) < Ramp) // Ist der Rest kleiner wie die RampenZeit
|
73 | {
|
74 | Mode &= ~(M_Start); // Gehen wir von Start in Stop und raus von Position
|
75 | Mode |= M_Stop;
|
76 | AccCnt = Cfg_ACC; // und sorgen gleicg mal dafür, dass es langsammer wird
|
77 | }
|
78 | }
|
79 | }
|
80 |
|
81 |
|
82 | if (Mode & M_Stop) // wenn wir anhalten Wollen
|
83 | {
|
84 | Stop = 1; // Wir nehmen an wir können anhalten
|
85 |
|
86 | if (BresStep > Cfg_BresMin) Stop=0; // Nein wenn wir zu schnell sind
|
87 | if (ModuloCnt >0) Stop=0; // Nein wenn wir nicht im Vollschritt sind
|
88 |
|
89 | if (Mode & M_Position) // Wenn wir Position Fahren
|
90 | {
|
91 | if (Position < DPosition) Stop =0; // Nein wenn wir noch nicht da sind
|
92 | }
|
93 |
|
94 | if (Stop) // Wenn aber alles passt
|
95 | {
|
96 | Mode &= ~(M_Stop | M_Position |M_Reference |M_ReferenceH);
|
97 | }
|
98 | }
|
99 |
|
100 | if (Mode & (M_Start|M_Stop)) // Hier sind wir aktiv haben noch was zu tun
|
101 | {
|
102 | if (Tick==0)
|
103 | {
|
104 | BresE = -50; // Mit halber vorbelegen
|
105 |
|
106 | AccCnt++;
|
107 | if (AccCnt>=Cfg_ACC) // Haben wir Rampen Zähler erreicht
|
108 | {
|
109 | AccCnt = 0; // erst mal löschen
|
110 | portc |=P_Enable;
|
111 | if (Mode & M_Start)
|
112 | {
|
113 | BresStep++; // Auf Maximale Geschwindigkeit achten
|
114 | }
|
115 | else if (Mode & M_Stop)
|
116 | {
|
117 | BresStep--; // Auf Minimale Geschwindigkeit achten
|
118 | }
|
119 | }
|
120 | }
|
121 |
|
122 |
|
123 | if (Mode & M_Reference)
|
124 | {
|
125 | BresMax = Cfg_BresMaxReference;
|
126 | }
|
127 | else
|
128 | {
|
129 | BresMax = Cfg_BresMax;
|
130 | }
|
131 |
|
132 | if (BresStep < Cfg_BresMin) BresStep = Cfg_BresMin;
|
133 | if (BresStep > BresMax) BresStep = BresMax;
|
134 |
|
135 | /*
|
136 | if (BresStep == Cfg_BresMax)
|
137 | {
|
138 | Mode &=~M_Start;
|
139 | Mode |=M_Stop;
|
140 | }
|
141 |
|
142 |
|
143 | if (BresStep == Cfg_BresMin)
|
144 | {
|
145 | Mode &=~M_Stop;
|
146 | Mode |=M_Start;
|
147 | }
|
148 | */
|
149 |
|
150 |
|
151 | BresE += BresStep;
|
152 |
|
153 | if (BresE >=0)
|
154 | {
|
155 | portc |=P_Step; // Wir machen einen Step
|
156 | BresE -=100; // Bresenham zurücksetzen
|
157 | if (BresStep < BresMax) Ramp++;
|
158 | }
|
159 |
|
160 | Tick++;
|
161 | if(Tick== 100)
|
162 | {
|
163 | Tick = 0;
|
164 | }
|
165 | }
|
166 | }
|
167 |
|
168 | ISR_10_Cnt++; // wir erhöhen den 10 Millisekunden Zähler
|
169 |
|
170 | if (ISR_10_Cnt == ISR_10) // hier haben wir 10mS erreicht
|
171 | {
|
172 | ISR_10_Cnt = 0; // erst mal nullen
|
173 |
|
174 | //Alles was mit Stepper Enable zu tun hat
|
175 |
|
176 | if ((Mode & M_Start) || (Mode & M_Stop)) // und wir haben was zu Fahren
|
177 | {
|
178 |
|
179 | // Soderfall wenn Enable noch an ist, dann darf er sofort weiter
|
180 | if (Mode & M_Enable) EnableTimerCnt = EnableTimer;
|
181 |
|
182 | if (EnableTimerCnt < EnableTimer) EnableTimerCnt++;
|
183 | }
|
184 | else // wir haben nichts mehr zu fahren
|
185 | {
|
186 | if (EnableTimerCnt) EnableTimerCnt--;
|
187 | }
|
188 |
|
189 | // Hier entscheiden wir Enable on oder nicht
|
190 | if (EnableTimerCnt == EnableTimer) Mode |= M_Enable;
|
191 | if (EnableTimerCnt == 0) Mode &= ~M_Enable;
|
192 |
|
193 | // Ende -- Alles was mit Stepper Enable zu tun hat
|
194 | }
|
195 |
|
196 | if (EnableTimerCnt)
|
197 | {
|
198 | portc |= P_Enable; // ist hier was egal wieviel, Setzen wir das Bit
|
199 | LedGN = 1;
|
200 | }
|
201 | else
|
202 | {
|
203 | LedGN = 0;
|
204 | }
|
205 | Step = 1; // Step wieder ein
|
206 | }
|
207 | return;
|
208 | }
|