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