Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
2 kaklik 1
#include ".\menic.h"
2
 
3
#define RAZENI    50   // 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
 
53
   setup_adc_ports(ADC_CLOCK_INTERNAL|sAN4|VSS_VDD);
54
   setup_adc(ADC_CLOCK_INTERNAL);
55
   setup_spi(FALSE);
56
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
57
   setup_timer_1(T1_DISABLED);
58
   setup_comparator(NC_NC_NC_NC);
59
   setup_vref(FALSE);
60
 
61
   output_low(MENIC);      // Vsechno zastav
62
   output_low(MOTOR);
63
   output_low(REFPWR);
64
   output_high(LED);
65
   output_high(PIEZO);
66
 
67
   set_adc_channel(4);     // Vyber AD kanal pro pomerne mereni napeti
68
   set_pwm1_duty(0);       // Spust PWM, ale zatim s trvalou 0 na vystupu
69
   setup_ccp1(CCP_PWM);             // PWM pro zatizeni clanku v seru
70
   setup_timer_2(T2_DIV_BY_1,100,1); // perioda
71
 
72
   setup_oscillator(OSC_4MHZ|OSC_INTRC); // rozjed PIC (zvysi se odber)
73
 
74
 
75
// jsme v depu?
76
   set_pwm1_duty(2);          // PWM pro zatizeni clanku pri malem osvetleni
77
   n=0;
78
   do
79
   {
80
      output_low(REFPWR);
81
      delay_ms(100);
82
      if (4==n++) {cvak(); n=0;};
83
      output_high(REFPWR);          // zapni napajeni napetove reference
84
      delay_ms(1);
85
   } while (read_adc()>REFSTART); // Odkryl starter clanky?
86
   output_low(REFPWR);
87
 
88
   pip();                  // potvrzeni odstartovani
89
 
90
// regulace
91
   perioda=100;          // nastav optimalni periodu pri jedne 500W zarovce
92
   for(n=0;n<=7;n++)
93
   {
94
      set_pwm1_duty(0);
95
      setup_timer_2(T2_DIV_BY_1,perioda,1);  // perioda
96
      set_pwm1_duty(19);                     // delka sepnuti
97
      delay_ms(100);
98
      output_high(REFPWR);          // zapni napajeni napetove reference
99
      delay_ms(1);
100
      if (read_adc()<REFNOM) perioda--;  // zvyseni zatizeni menice
101
      output_low(REFPWR);            // konec mereni, odpoj napajeni reference
102
   };
103
 
104
// nabíjíme
105
   delay_ms(14000);
106
 
107
// rozjezd
108
   SSPSTAT = 0;
109
   SSPCON1 = 0x22;               // SPI OSC/64
110
   MotorPattern=0x02;            // prvni data pro vyslani
111
   SSPBUF=MotorPattern;          // data pro vyslani
112
   enable_interrupts(global);
113
   enable_interrupts(INT_SSP);   // az budou vyslana, prijde interrupt od SSP
114
 
115
   for(n=0; n<=7; n++)     // razeni osmi rychlostnich stupnu
116
   {
117
      MotorPattern=Pattern[n];
118
      delay_ms(RAZENI);             // Pockej na dalsi razeni
119
   };
120
   SSPSTAT = 0;
121
   SSPCON1 = 0;                     // SPI stop
122
   disable_interrupts(INT_SSP);     // zastav preruseni od SSP
123
 
124
// jedem co to da
125
   output_high(MOTOR);
126
   delay_ms(1000);
127
   output_low(MOTOR);
128
   set_pwm1_duty(0);                // zastav menic
129
 
130
// vybiti kondenzatoru pro ucely mereni
131
   pip();
132
   delay_ms(2000);
133
   pip();
134
   output_high(MOTOR);
135
 
136
   while(true)
137
   {
138
      output_high(LED);
139
      output_low(PIEZO);
140
      delay_ms(300);
141
      output_low(LED);
142
      output_high(PIEZO);
143
      delay_ms(300);
144
   }
145
// priprava na dalsi jizdu
146
   delay_ms(5000);
147
   reset_cpu();
148
}