Subversion Repositories svnkaklik

Rev

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

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