Rev 193 Rev 195
1 // DART01A verze programu 1.01 1 // DART01A verze programu 1.01
2 // (c)miho 2005 2 // (c)miho 2005
3 // 3 //
4 // 1.00 Uvodni verze 4 // 1.00 Uvodni verze
5 // 1.01 Doplneno nasatvovani parametru rozjezdu P2 u standardniho algoritmu 5 // 1.01 Doplneno nasatvovani parametru rozjezdu P2 u standardniho algoritmu
6   6  
7 #include "DART.h" 7 #include "DART.h"
8   8  
9   9  
10 #define BEEP0 PIN_A6 // pipak, prvni vystup 10 #define BEEP0 PIN_A6 // pipak, prvni vystup
11 #define BEEP1 PIN_A7 // pipak, druhy vystup 11 #define BEEP1 PIN_A7 // pipak, druhy vystup
12 #define PWM PIN_B3 // PWM vystup pro menic 12 #define PWM PIN_B3 // PWM vystup pro menic
13 #define REFPOWER PIN_B1 // napajeni zdroje Vref 13 #define REFPOWER PIN_B1 // napajeni zdroje Vref
14 #define MOTOR PIN_B2 // zapinani motoru 14 #define MOTOR PIN_B2 // zapinani motoru
15 #define SW0 PIN_B7 // konfiguracni prepinac 0 15 #define SW0 PIN_B7 // konfiguracni prepinac 0
16 #define SW1 PIN_B6 // konfiguracni prepinac 1 16 #define SW1 PIN_B6 // konfiguracni prepinac 1
17   17  
18   18  
19 void InitRS232() 19 void InitRS232()
20 // Inicializace HW RS232 (pro ladici vystupy) 20 // Inicializace HW RS232 (pro ladici vystupy)
21 { 21 {
22 SPBRG=xclock/9600/16-1; // ryclost 9600Bd 22 SPBRG=xclock/9600/16-1; // ryclost 9600Bd
23 RCSTA=0b10000000; // enable USART 23 RCSTA=0b10000000; // enable USART
24 TXSTA=0b00100100; // BRGH=1, TX enable 24 TXSTA=0b00100100; // BRGH=1, TX enable
25 } 25 }
26   26  
27   27  
28 void Putc(char c) 28 void Putc(char c)
29 // Posilani znaku pres HW RS232 29 // Posilani znaku pres HW RS232
30 { 30 {
31 while(TRMT==0); // cekej na prazdny TX buffer 31 while(TRMT==0); // cekej na prazdny TX buffer
32 TXREG=c; // predej data 32 TXREG=c; // predej data
33 } 33 }
34   34  
35   35  
36 // Globalni promenna pro data posilana na SSP 36 // Globalni promenna pro data posilana na SSP
37 // Nastavuje se funkci MotorPatternSet() 37 // Nastavuje se funkci MotorPatternSet()
38 // Vyuziva se v prerusovaci rutine IntSSP() 38 // Vyuziva se v prerusovaci rutine IntSSP()
39 unsigned int8 MotorPattern; // aktualni data pro SSP jednotku 39 unsigned int8 MotorPattern; // aktualni data pro SSP jednotku
40   40  
41   41  
42 void MotorPatternSet(unsigned int Gear) 42 void MotorPatternSet(unsigned int Gear)
43 // Na zaklade rychlostniho stupne nastavi MotorPattern pro SSP 43 // Na zaklade rychlostniho stupne nastavi MotorPattern pro SSP
44 // Rychlost 0 znamena stop, rychlost 8 je maximum 44 // Rychlost 0 znamena stop, rychlost 8 je maximum
45 { 45 {
46 // Tabulka rychlost -> pattern pro SSP 46 // Tabulka rychlost -> pattern pro SSP
47 unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff}; 47 unsigned int8 const ExpTab[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};
48   48  
49 // Vyber patternu 49 // Vyber patternu
50 if (Gear==0) // stav 0 znamena stop 50 if (Gear==0) // stav 0 znamena stop
51 { 51 {
52 output_low(MOTOR); // klidovy stav 52 output_low(MOTOR); // klidovy stav
53 SSPSTAT = 0; 53 SSPSTAT = 0;
54 SSPCON1 = 0; // SPI stop 54 SSPCON1 = 0; // SPI stop
55 disable_interrupts(INT_SSP); // neni preruseni od SSP 55 disable_interrupts(INT_SSP); // neni preruseni od SSP
56 } 56 }
57 else // rizeny vykon 57 else // rizeny vykon
58 { 58 {
59 if (Gear>7) // stav 8 a vice znamena plny vykon 59 if (Gear>7) // stav 8 a vice znamena plny vykon
60 { 60 {
61 Gear=8; // plny plyn 61 Gear=8; // plny plyn
62 } 62 }
63   63  
64 MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP 64 MotorPattern=ExpTab[--Gear]; // prevod z hodnoty plynu na data pro SSP
65 output_low(MOTOR); // klidovy stav 65 output_low(MOTOR); // klidovy stav
66 SSPSTAT = 0; 66 SSPSTAT = 0;
67 SSPCON1 = 0x22; // SPI OSC/64 67 SSPCON1 = 0x22; // SPI OSC/64
68   68  
69 SSPBUF=MotorPattern; // prvni data pro vyslani 69 SSPBUF=MotorPattern; // prvni data pro vyslani
70 enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP 70 enable_interrupts(INT_SSP); // az budou vyslana prijde interrupt od SSP
71 } 71 }
72 } 72 }
73   73  
74   74  
75 // Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP. 75 // Obsluha preruseni od SSP jednotky, posila data z promenne MotorRun do SSP.
76 #INT_SSP 76 #INT_SSP
77 void IntSSP() 77 void IntSSP()
78 { 78 {
79 SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP 79 SSPBUF=MotorPattern; // znova hdnota PWM patternu na SSP
80 } 80 }
81   81  
82   82  
83 void MotorSet(unsigned int Gear) 83 void MotorSet(unsigned int Gear)
84 // Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim 84 // Nastavi vykon motoru dle hodnoty Gear a zahaji posilani PWM dat pres SSP pod prerusenim
85 // od SSP jednotky 85 // od SSP jednotky
86 // 0 stop 86 // 0 stop
87 // 1-7 pocet 1/8 vykonu 87 // 1-7 pocet 1/8 vykonu
88 // >7 plny vykon 88 // >7 plny vykon
89 { 89 {
90 // Nastav PWM pattern 90 // Nastav PWM pattern
91 MotorPatternSet(Gear); // nastav PWM pattern pro SSP 91 MotorPatternSet(Gear); // nastav PWM pattern pro SSP
92   92  
93 // Povol preruseni 93 // Povol preruseni
94 enable_interrupts(GLOBAL); // povol preruseni 94 enable_interrupts(GLOBAL); // povol preruseni
95 } 95 }
96   96  
97   97  
98 void InitT0() 98 void InitT0()
99 // Inicializace casovace T0 (cca 1000x za sekundu) 99 // Inicializace casovace T0 (cca 1000x za sekundu)
100 { 100 {
101 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4 101 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // T0 z internich hodin 1/4
102 enable_interrupts(INT_RTCC); // generuj preruseni od T0 102 enable_interrupts(INT_RTCC); // generuj preruseni od T0
103 enable_interrupts(GLOBAL); // povol preruseni 103 enable_interrupts(GLOBAL); // povol preruseni
104 } 104 }
105   105  
106   106  
107 // Globalni promenna pro mereni casu 107 // Globalni promenna pro mereni casu
108 // Nastavuje se procedurou TimeSet() 108 // Nastavuje se procedurou TimeSet()
109 // Testuje se funkci TimeIf() 109 // Testuje se funkci TimeIf()
110 // Modifikuje se pri preruseni od casovace IntTo() 110 // Modifikuje se pri preruseni od casovace IntTo()
111 unsigned int16 TimeTime; 111 unsigned int16 TimeTime;
112   112  
113   113  
114 void TimerSet(unsigned int16 Time) 114 void TimerSet(unsigned int16 Time)
115 // Nastavi casovac na zadany pocet ms 115 // Nastavi casovac na zadany pocet ms
116 // Test uplynuti casu se dela pomoci TimerIf() 116 // Test uplynuti casu se dela pomoci TimerIf()
117 { 117 {
118 // Nastav hodnotu 118 // Nastav hodnotu
119 disable_interrupts(INT_RTCC); // nesmi prijit preruseni 119 disable_interrupts(INT_RTCC); // nesmi prijit preruseni
120 TimeTime=Time; // pri nastavovani hodnoty 120 TimeTime=Time; // pri nastavovani hodnoty
121 enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu) 121 enable_interrupts(INT_RTCC); // promenne (o delce vice nez 8 bitu)
122 } 122 }
123   123  
124   124  
125 int1 TimerIf() 125 int1 TimerIf()
126 // Vraci TRUE pokud casovac jiz dobehl 126 // Vraci TRUE pokud casovac jiz dobehl
127 { 127 {
128 int1 Flag; // pomocna promenna 128 int1 Flag; // pomocna promenna
129   129  
130 // Otestuj casovac 130 // Otestuj casovac
131 disable_interrupts(INT_RTCC); // nesmi prijit preruseni 131 disable_interrupts(INT_RTCC); // nesmi prijit preruseni
132 Flag=(TimeTime==0); // behem testu promenne 132 Flag=(TimeTime==0); // behem testu promenne
133 enable_interrupts(INT_RTCC); // ted uz muze 133 enable_interrupts(INT_RTCC); // ted uz muze
134   134  
135 // Navratova hodnota 135 // Navratova hodnota
136 return Flag; // TRUE znamena dobehl casovac 136 return Flag; // TRUE znamena dobehl casovac
137 } 137 }
138   138  
139   139  
140 // Globalni promenne pro akceleraci 140 // Globalni promenne pro akceleraci
141 // Nastavuje se metodou MotorStart() 141 // Nastavuje se metodou MotorStart()
142 // Pouziva se v obsluze preruseni IntT0() 142 // Pouziva se v obsluze preruseni IntT0()
143 unsigned int8 MotorTime; // aktualni casovac pro rozjezd 143 unsigned int8 MotorTime; // aktualni casovac pro rozjezd
144 unsigned int8 MotorDelay; // spozdeni mezi razenim rychlosti 144 unsigned int8 MotorDelay; // spozdeni mezi razenim rychlosti
145 unsigned int8 MotorGear; // rychlostni stupen 145 unsigned int8 MotorGear; // rychlostni stupen
146   146  
147   147  
148 void MotorStart(unsigned int8 Delay) 148 void MotorStart(unsigned int8 Delay)
149 // Provede rizeny rozjezd motoru 149 // Provede rizeny rozjezd motoru
150 // Parametrem je prodleva mezi razenim rychlosti v ms 150 // Parametrem je prodleva mezi razenim rychlosti v ms
151 { 151 {
152 disable_interrupts(INT_RTCC); 152 disable_interrupts(INT_RTCC);
153 MotorGear=1; 153 MotorGear=1;
154 MotorDelay=Delay; 154 MotorDelay=Delay;
155 MotorTime=MotorDelay; 155 MotorTime=MotorDelay;
156 enable_interrupts(INT_RTCC); 156 enable_interrupts(INT_RTCC);
157   157  
158 MotorPatternSet(1); 158 MotorPatternSet(1);
159 } 159 }
160   160  
161   161  
162 #INT_TIMER0 162 #INT_TIMER0
163 void IntT0() 163 void IntT0()
164 // Preruseni od casovace cca 1000x za sekundu 164 // Preruseni od casovace cca 1000x za sekundu
165 { 165 {
166 // Odpocitavani casovace 166 // Odpocitavani casovace
167 if (TimeTime) TimeTime--; 167 if (TimeTime) TimeTime--;
168   168  
169 // Obsluha akcelerace 169 // Obsluha akcelerace
170 if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu 170 if (MotorTime) MotorTime--; // dekrementuj casovac rozjezdu
171 if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen 171 if ((MotorGear>0) && (MotorGear<8) && (!MotorTime)) // dalsi rychlostni stupen
172 { 172 {
173 MotorTime=MotorDelay; // znovu nastav casovac 173 MotorTime=MotorDelay; // znovu nastav casovac
174 MotorGear++; // dalsi rychlost 174 MotorGear++; // dalsi rychlost
175 MotorPatternSet(MotorGear); // nastav rychlost 175 MotorPatternSet(MotorGear); // nastav rychlost
176 } 176 }
177 } 177 }
178   178  
179   179  
180 // Cteni dat z AD prevodniku, zadava se cislo kanalu 180 // Cteni dat z AD prevodniku, zadava se cislo kanalu
181 int8 ReadAD(int8 Ch) 181 int8 ReadAD(int8 Ch)
182 { 182 {
183 // Pokud merim Vref zapnu si jeho napajeni 183 // Pokud merim Vref zapnu si jeho napajeni
184 if (Ch==4) output_high(REFPOWER); 184 if (Ch==4) output_high(REFPOWER);
185   185  
186 // Inicializace a cislo kanalu 186 // Inicializace a cislo kanalu
187 ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify 187 ADCON1=0x30; // Vref+-, bez deleni hodin, Left Justify
188 ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu 188 ADCON0=0x41+(Ch<<3); // on, Tosc/8, cislo kanalu
189   189  
190 // Mereni 190 // Mereni
191 delay_us(50); // doba na prepnuti kanalu 191 delay_us(50); // doba na prepnuti kanalu
192 ADCON0 |= 4; // start prevodu 192 ADCON0 |= 4; // start prevodu
193 delay_us(50); // doba na prevod 193 delay_us(50); // doba na prevod
194   194  
195 // Vypnu napajeni Vref (vzdycky) 195 // Vypnu napajeni Vref (vzdycky)
196 output_low(REFPOWER); 196 output_low(REFPOWER);
197   197  
198 // Navrat hodnoty 198 // Navrat hodnoty
199 return ADRESH; 199 return ADRESH;
200 } 200 }
201   201  
202   202  
203 void main() 203 void main()
204 { 204 {
205 unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu) 205 unsigned int8 Debug; // Promenna pro rezim cinnosti (stav prepinacu)
206 unsigned int8 i; 206 unsigned int8 i;
207   207  
208 // Hodiny 208 // Hodiny
209 OSCCON = 0x62; // 4 MHz interni RC oscilator 209 OSCCON = 0x62; // 4 MHz interni RC oscilator
210   210  
211 // Digitalni vystupy 211 // Digitalni vystupy
212 output_low(PWM); // PWM vystup 212 output_low(PWM); // PWM vystup
213 output_low(MOTOR); // Proud do motoru 213 output_low(MOTOR); // Proud do motoru
214 output_low(REFPOWER); // Napajeni Vref 214 output_low(REFPOWER); // Napajeni Vref
215 port_b_pullups(TRUE); // Zbyvajici vyvody portu B 215 port_b_pullups(TRUE); // Zbyvajici vyvody portu B
216   216  
217 // Watch Dog 217 // Watch Dog
218 PSA=0; // preddelic prirazen casovaci 218 PSA=0; // preddelic prirazen casovaci
219 WDTCON=0x0E; // Watch Dog cca 130ms 219 WDTCON=0x0E; // Watch Dog cca 130ms
220   220  
221 // Analogove vstupy 221 // Analogove vstupy
222 ANSEL = 0x1F; // AN0 az AN4 222 ANSEL = 0x1F; // AN0 az AN4
223   223  
224 // nastaveni RS232 224 // nastaveni RS232
225 InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms) 225 InitRS232(); // inicializace HW RS232 (nutno pockat cca 10ms)
226   226  
227 // Pipnuti (a cekani) 227 // Pipnuti (a cekani)
228 for (i=1;i<30;i++) // pocet 1/2 period 228 for (i=1;i<30;i++) // pocet 1/2 period
229 { 229 {
230 int1 beep; // stavova promenna pro pipak 230 int1 beep; // stavova promenna pro pipak
231   231  
232 output_bit(BEEP0,beep); 232 output_bit(BEEP0,beep);
233 beep=~beep; 233 beep=~beep;
234 output_bit(BEEP1,beep); 234 output_bit(BEEP1,beep);
235 delay_us(1000); 235 delay_us(1000);
236 } 236 }
237   237  
238 // Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu) 238 // Rozhodnuti o rezimu cinnosti (cteni stavu prepinacu)
239 Debug=0; 239 Debug=0;
240 if (~input(SW0)) Debug|=1; // precti bit 0 240 if (~input(SW0)) Debug|=1; // precti bit 0
241 if (~input(SW1)) Debug|=2; // precti bit 1 241 if (~input(SW1)) Debug|=2; // precti bit 1
242 output_low(SW0); // nastav L aby se snizila spotreba 242 output_low(SW0); // nastav L aby se snizila spotreba
243 output_low(SW1); // na obou vstupech 243 output_low(SW1); // na obou vstupech
244   244  
245 // Zobrazeni rezimu (na ladici seriovy vystup) 245 // Zobrazeni rezimu (na ladici seriovy vystup)
246 printf(Putc,"\fMode:%d",Debug); 246 printf(Putc,"\fMode:%d",Debug);
247   247  
248 // Inicializace PWM 248 // Inicializace PWM
249 PR2 = 0x1F; // perioda PWM casovace 249 PR2 = 0x1F; // perioda PWM casovace
250 T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu 250 T2CON = 0x04; // povoleni casovace T2 bez preddelicu a postdelicu
251 CCP1CON = 0x0C; // PWM mode, lsb bity nulove 251 CCP1CON = 0x0C; // PWM mode, lsb bity nulove
252 CCPR1L = 0; // na zacatku nulova data 252 CCPR1L = 0; // na zacatku nulova data
253 output_low(PWM); // PWM vystup 253 output_low(PWM); // PWM vystup
254   254  
255 // Inicializace casovace 255 // Inicializace casovace
256 InitT0(); // nastav casovac na cca 1ms 256 InitT0(); // nastav casovac na cca 1ms
257   257  
258 // ALG=1 Test menice PWM a rozjezdoveho PWM 258 // ALG=1 Test menice PWM a rozjezdoveho PWM
259 // ======================================== 259 // ========================================
260 // P1 nastavuje primo stridu hlavniho PWM menice 260 // P1 nastavuje primo stridu hlavniho PWM menice
261 // P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8) 261 // P2 nastavuje rychlostni stupen spinace motoru (rychlostni stupne 0-8)
262 // Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu 262 // Trvale nacita P1 a P2 a nastavuje podle nich akcni hodnoty menicu
263 if (Debug==1) 263 if (Debug==1)
264 { 264 {
265 unsigned int8 Data1; // poteniometr P1 = PWM 265 unsigned int8 Data1; // poteniometr P1 = PWM
266 unsigned int8 Data2; // poteniometr P2 = Rozjezd 266 unsigned int8 Data2; // poteniometr P2 = Rozjezd
267   267  
268 while (1) 268 while (1)
269 { 269 {
270 // watch dog 270 // watch dog
271 restart_wdt(); 271 restart_wdt();
272   272  
273 // mereni vstupu 273 // mereni vstupu
274 Data1=ReadAD(0); // nacti parametr pro PWM 274 Data1=ReadAD(0); // nacti parametr pro PWM
275 Data1>>=2; // redukuj rozsah na 0 az 63 275 Data1>>=2; // redukuj rozsah na 0 az 63
276 Data2=ReadAD(1); // nacti parametr pro rozjezd 276 Data2=ReadAD(1); // nacti parametr pro rozjezd
277 Data2>>=4; // redukuj rozsah na 0 az 15 277 Data2>>=4; // redukuj rozsah na 0 az 15
278   278  
279 // zobrazeni 279 // zobrazeni
280 printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2); 280 printf(Putc,"\nPWM:%03u RUN:%03u",Data1,Data2);
281 delay_ms(20); 281 delay_ms(20);
282   282  
283 // nastaveni parametru PWM 283 // nastaveni parametru PWM
284 CCPR1L = Data1; 284 CCPR1L = Data1;
285   285  
286 // nastaveni parametru RUN 286 // nastaveni parametru RUN
287 MotorSet(Data2); 287 MotorSet(Data2);
288 } 288 }
289 } 289 }
290   290  
291 // ALG=2 Testovani rozjezdu 291 // ALG=2 Testovani rozjezdu
292 // ======================== 292 // ========================
293 // P2 nastavuje cas mezi stupni razeni pro rozjezd v ms 293 // P2 nastavuje cas mezi stupni razeni pro rozjezd v ms
294 // Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor 294 // Po resetu 2 sekundy pocka, 2 sekundy jede a nakonec zastavi motor
295 if (Debug==2) 295 if (Debug==2)
296 { 296 {
297 int8 Data; 297 int8 Data;
298 int8 Start; 298 int8 Start;
299   299  
300 Start=0; // uvodni stav 300 Start=0; // uvodni stav
301 while(1) 301 while(1)
302 { 302 {
303 // Nacti a zobraz parametr 303 // Nacti a zobraz parametr
304 Data=ReadAD(1); // potenciometr P2 = rozjezd 304 Data=ReadAD(1); // potenciometr P2 = rozjezd
305 printf(Putc,"\nRUN:%3ums ",Data); // zobraz 305 printf(Putc,"\nRUN:%3ums ",Data); // zobraz
306 delay_ms(10); // prodleva pro terminal 306 delay_ms(10); // prodleva pro terminal
307   307  
308 // Uvodni pauza 308 // Uvodni pauza
309 if (Start==0) // spousti se 1x na zacatku 309 if (Start==0) // spousti se 1x na zacatku
310 { 310 {
311 Start++; // dalsi stav je cekani 311 Start++; // dalsi stav je cekani
312 TimerSet(2000); // na dokonceni uvodni prodlevy 312 TimerSet(2000); // na dokonceni uvodni prodlevy
313 } 313 }
314   314  
315 // Rozjezd 315 // Rozjezd
316 if ((Start==1) && TimerIf()) 316 if ((Start==1) && TimerIf())
317 { 317 {
318 Start++; 318 Start++;
319 printf(Putc,"R"); 319 printf(Putc,"R");
320 MotorStart(Data); // rozjezd s nastavenim prodlevy 320 MotorStart(Data); // rozjezd s nastavenim prodlevy
321   321  
322 TimerSet(2000); // nastav celkovy cas jizdy 322 TimerSet(2000); // nastav celkovy cas jizdy
323 } 323 }
324   324  
325 // Zastaveni 325 // Zastaveni
326 if ((Start==2) && TimerIf()) 326 if ((Start==2) && TimerIf())
327 { 327 {
328 Start++; 328 Start++;
329 printf(Putc,"S"); 329 printf(Putc,"S");
330 MotorSet(0); // pokud dobehl casovac zastav motor 330 MotorSet(0); // pokud dobehl casovac zastav motor
331 } 331 }
332   332  
333 // watch dog 333 // watch dog
334 restart_wdt(); 334 restart_wdt();
335 } 335 }
336 } 336 }
337   337  
338 // ALG=3 Test nabijeciho algoritmu 338 // ALG=3 Test nabijeciho algoritmu
339 // =============================== 339 // ===============================
340 // P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni) 340 // P1 nastavuje pozadovane napeti na clancich (meri se Vref vuci napajeni)
341 // Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny 341 // Nacitani P1 probiha stale dokola, pro rizeni je pouzit stejny
342 // algoritmus jako pro standardni jizdu 342 // algoritmus jako pro standardni jizdu
343 if (Debug==3) 343 if (Debug==3)
344 { 344 {
345 unsigned int8 PwmOut; // akcni hodnota pro PWM 345 unsigned int8 PwmOut; // akcni hodnota pro PWM
346 unsigned int8 Req; // pozadovana hodnota z P1 346 unsigned int8 Req; // pozadovana hodnota z P1
347 unsigned int8 Vref; // merena hodnota vref 347 unsigned int8 Vref; // merena hodnota vref
348   348  
349 // Inicializace stavove promenne 349 // Inicializace stavove promenne
350 PwmOut=0; 350 PwmOut=0;
351   351  
352 // Hlavni smycka 352 // Hlavni smycka
353 while (1) 353 while (1)
354 { 354 {
355 // watch dog 355 // watch dog
356 restart_wdt(); 356 restart_wdt();
357   357  
358 // pozadovana hodnota (potenciometr P1) 358 // pozadovana hodnota (potenciometr P1)
359 Req=ReadAD(0); 359 Req=ReadAD(0);
360 Req=50+(ReadAD(0)>>1); // 50 az 177 360 Req=50+(ReadAD(0)>>1); // 50 az 177
361   361  
362 // napeti na napajeni (vref) 362 // napeti na napajeni (vref)
363 Vref=ReadAD(4); 363 Vref=ReadAD(4);
364   364  
365 // ricici algoritmus 365 // ricici algoritmus
366 if ((Vref<Req) &&(PwmOut<30)) PwmOut++; 366 if ((Vref<Req) &&(PwmOut<30)) PwmOut++;
367 if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; 367 if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;
368 Vref+=10; 368 Vref+=10;
369 if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu 369 if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu
370   370  
371 // nastaveni parametru PWM 371 // nastaveni parametru PWM
372 if (PwmOut>24) PwmOut=24; // saturace 372 if (PwmOut>24) PwmOut=24; // saturace
373 CCPR1L = PwmOut; // pouziti vystupu 373 CCPR1L = PwmOut; // pouziti vystupu
374   374  
375 // zobrazeni 375 // zobrazeni
376 printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); 376 printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);
377 delay_ms(10); 377 delay_ms(10);
378 } 378 }
379 } 379 }
380   380  
381 // ALG=0 Standardni jizda 381 // ALG=0 Standardni jizda
382 // ====================== 382 // ======================
383 // P1 nastavuje pozadovane napeti na clancich 383 // P1 nastavuje pozadovane napeti na clancich
384 // P2 nastavuje prodlevu razeni pri rozjezdu, nacita se jen 1x na zacatku 384 // P2 nastavuje prodlevu razeni pri rozjezdu, nacita se jen 1x na zacatku
385 // Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede 385 // Po resetu cca 14.5 sekundy akumuluje do kondenzatoru a pak provede
386 // rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku. 386 // rozjezd motoru. Po celou dobu probiha rizeni zateze slunecnich clanku.
387 // Parametry P1 a P2 jsou chapany stejne jako v algoritmech 2 a 3. 387 // Parametry P1 a P2 jsou chapany stejne jako v algoritmech 2 a 3.
388 if (Debug==0) 388 if (Debug==0)
389 { 389 {
390 unsigned int8 PwmOut; // akcni hodnota pro PWM 390 unsigned int8 PwmOut; // akcni hodnota pro PWM
391 unsigned int8 Req; // pozadovana hodnota z P1 391 unsigned int8 Req; // pozadovana hodnota z P1
392 unsigned int8 Vref; // merena hodnota vref 392 unsigned int8 Vref; // merena hodnota vref
393 int8 Delay; // pozadovana honota prodlevy razeni z P2 393 int8 Delay; // pozadovana honota prodlevy razeni z P2
394 int1 Run; 394 int1 Run;
395   395  
396 // Nacti parametr rozjezdu 396 // Nacti parametr rozjezdu
397 Delay=ReadAD(1); // potenciometr P2 = rozjezd 397 Delay=ReadAD(1); // potenciometr P2 = rozjezd
398 printf(Putc," RUN:%3ums ",Delay); // zobraz 398 printf(Putc," RUN:%3ums ",Delay); // zobraz
399 delay_ms(10); // prodleva pro terminal 399 delay_ms(10); // prodleva pro terminal
400   400  
401 // Inicializace stavove promenne 401 // Inicializace stavove promenne
402 PwmOut=0; 402 PwmOut=0;
403 TimerSet(14000); // casovani startu 403 TimerSet(14000); // casovani startu
404 Run=1; 404 Run=1;
405   405  
406 // Hlavni smycka 406 // Hlavni smycka
407 while (1) 407 while (1)
408 { 408 {
409 // watch dog 409 // watch dog
410 restart_wdt(); 410 restart_wdt();
411   411  
412 // pozadovana hodnota (potenciometr P1) 412 // pozadovana hodnota (potenciometr P1)
413 Req=ReadAD(0); 413 Req=ReadAD(0);
414 Req=50+(ReadAD(0)>>1); // 50 az 177 414 Req=50+(ReadAD(0)>>1); // 50 az 177
415   415  
416 // napeti na napajeni (vref) 416 // napeti na napajeni (vref)
417 Vref=ReadAD(4); 417 Vref=ReadAD(4);
418   418  
419 // ricici algoritmus 419 // ricici algoritmus
420 if ((Vref<Req) &&(PwmOut<30)) PwmOut++; 420 if ((Vref<Req) &&(PwmOut<30)) PwmOut++;
421 if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--; 421 if ((Vref>=Req)&&(PwmOut> 0)) PwmOut--;
422 Vref+=10; 422 Vref+=10;
423 if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu 423 if ((Vref<(Req))&&(PwmOut<30)) PwmOut++; // urychleni nabehu
424   424  
425 // nastaveni parametru PWM 425 // nastaveni parametru PWM
426 if (PwmOut>24) PwmOut=24; // saturace 426 if (PwmOut>24) PwmOut=24; // saturace
427 CCPR1L = PwmOut; // pouziti vystupu 427 CCPR1L = PwmOut; // pouziti vystupu
428   428  
429 // zobrazeni 429 // zobrazeni
430 printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut); 430 printf(Putc,"\nALG:%03u %03u %03u",Req,Vref,PwmOut);
431 delay_ms(10); 431 delay_ms(10);
432   432  
433 // rozjezd 433 // rozjezd
434 if (TimerIf()&&Run) 434 if (TimerIf()&&Run)
435 { 435 {
436 Run=0; 436 Run=0;
437 MotorStart(Delay); // prodleva razeni z P2 437 MotorStart(Delay); // prodleva razeni z P2
438 } 438 }
439 } 439 }
440 } 440 }
441 } 441 }