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