Subversion Repositories svnkaklik

Rev

Go to most recent revision | Details | Last modification | View Log

Rev Author Line No. Line
2 kaklik 1
#include ".\menic.h"
2
 
3
#define RAZENI    60   // Po kolika ms se bude menit rychlost pro rozjizdeni
4
#define REFNOM    107   // Hodnota odpovidajici 1,2V pri nominalnim zatizeni
5
#define REFSTART  80    // Hodnota odpovidajici 1,2V pri nezatizenych clancich
6
 
7
#define PIEZO  PIN_A6   // Jeden pol piezo reproduktoru
8
#define LED    PIN_A7   // LED
9
#define MENIC  PIN_B3   // Spinani tranzistoru menice
10
#define REFPWR PIN_B1   // Napajeni zdroje referencniho napeti
11
#define MOTOR  PIN_B2   // Spinani tranzistoru motoru
12
 
13
#byte SSPBUF         = 0x13   // Registry jednotky SSP
14
#byte SSPCON1        = 0x14
15
#byte SSPSTAT        = 0x94
16
 
17
// Vzorky pro generovani PWM pomoci SSP
18
unsigned int8 const Pattern[8] = {0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0xff};
19
unsigned int8 MotorPattern;
20
 
21
#INT_SSP
22
void IntSSP()
23
{
24
   SSPBUF=MotorPattern;             // znovu vysli stejnou hodnotu
25
}
26
 
27
void pip()     // pipnuti a bliknuti
28
{
29
   int1 beep;
30
   int i;
31
 
32
   for(i=0; i<250; i++)
33
   {
34
      output_bit(PIEZO, beep);
35
      beep=~beep;
36
      output_bit(LED, beep);
37
      delay_us(100);
38
   };
39
   output_high(PIEZO);
40
   output_high(LED);
41
}
42
 
43
void cvak()    // pouze cvaknuti piezoelementem bez bliknuti
44
{
45
   output_bit(PIEZO,~input(PIEZO));
46
}
47
 
48
void main()
49
{
50
   int8 n;
51
   int8 perioda;
52
   int8 cekej;
53
 
54
   setup_adc_ports(ADC_CLOCK_INTERNAL|sAN4|VSS_VDD);
55
   setup_adc(ADC_CLOCK_INTERNAL);
56
   setup_spi(FALSE);
57
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
58
   setup_timer_1(T1_DISABLED);
59
   setup_comparator(NC_NC_NC_NC);
60
   setup_vref(FALSE);
61
 
62
   output_low(MENIC);      // Vsechno zastav
63
   output_low(MOTOR);
64
   output_low(REFPWR);
65
   output_high(LED);
66
   output_high(PIEZO);
67
 
68
   set_adc_channel(4);     // Vyber AD kanal pro pomerne mereni napeti
69
   set_pwm1_duty(0);       // Spust PWM, ale zatim s trvalou 0 na vystupu
70
   setup_ccp1(CCP_PWM);             // PWM pro zatizeni clanku v seru
71
   setup_timer_2(T2_DIV_BY_1,100,1); // perioda
72
 
73
   setup_oscillator(OSC_4MHZ|OSC_INTRC); // rozjed PIC (zvysi se odber)
74
 
75
 
76
// jsme v depu?
77
   set_pwm1_duty(2);          // PWM pro zatizeni clanku pri malem osvetleni
78
   n=0;
79
   do
80
   {
81
      output_low(REFPWR);
82
      delay_ms(100);
83
      if (4==n++) {cvak(); n=0;};
84
      output_high(REFPWR);          // zapni napajeni napetove reference
85
      delay_ms(1);
86
   } while (read_adc()>REFSTART); // Odkryl starter clanky?
87
   output_low(REFPWR);
88
 
89
   pip();                  // potvrzeni odstartovani
90
 
91
// regulace
92
   perioda=100;          // nastav optimalni periodu pri jedne 500W zarovce
93
   for(n=0;n<=7;n++)
94
   {
95
      set_pwm1_duty(0);
96
      setup_timer_2(T2_DIV_BY_1,perioda,1);  // perioda
97
      set_pwm1_duty(19);                     // delka sepnuti
98
      delay_ms(100);
99
      output_high(REFPWR);          // zapni napajeni napetove reference
100
      delay_ms(1);
101
      if (read_adc()<REFNOM) perioda--;  // zvyseni zatizeni menice
102
      output_low(REFPWR);            // konec mereni, odpoj napajeni reference
103
   };
104
 
105
// nabíjíme
106
   delay_ms(14000);
107
 
108
// rozjezd
109
   SSPSTAT = 0;
110
   SSPCON1 = 0x22;               // SPI OSC/64
111
   MotorPattern=0x02;            // prvni data pro vyslani
112
   SSPBUF=MotorPattern;          // data pro vyslani
113
   enable_interrupts(global);
114
   enable_interrupts(INT_SSP);   // az budou vyslana, prijde interrupt od SSP
115
 
116
   cekej=RAZENI;
117
   for(n=0; n<=7; n++)     // razeni osmi rychlostnich stupnu
118
   {
119
      MotorPattern=Pattern[n];
120
      delay_ms(RAZENI);             // Pockej na dalsi razeni
121
//      cekej-=10;
122
   };
123
   SSPSTAT = 0;
124
   SSPCON1 = 0;                     // SPI stop
125
   disable_interrupts(INT_SSP);     // zastav preruseni od SSP
126
 
127
// jedem co to da
128
   output_high(MOTOR);
129
   delay_ms(1000);
130
   output_low(MOTOR);
131
   set_pwm1_duty(0);                // zastav menic
132
 
133
// vybiti kondenzatoru pro ucely mereni
134
   pip();
135
   delay_ms(2000);
136
   pip();
137
   output_high(MOTOR);
138
 
139
   while(true)
140
   {
141
      output_high(LED);
142
      output_low(PIEZO);
143
      delay_ms(300);
144
      output_low(LED);
145
      output_high(PIEZO);
146
      delay_ms(300);
147
   }
148
// priprava na dalsi jizdu
149
   delay_ms(5000);
150
   reset_cpu();
151
}