Rev 3320 Rev 3321
1 #include ".\main.h" 1 #include ".\main.h"
2   2  
3 #define LED1 PIN_C6 //CHANGE PIN_XX TO YOUR LED PIN NUMBER 3 #define LED1 PIN_C6 //CHANGE PIN_XX TO YOUR LED PIN NUMBER
4 #define LED2 PIN_C5 //CHANGE PIN_XX TO YOUR LED PIN NUMBER 4 #define LED2 PIN_C5 //CHANGE PIN_XX TO YOUR LED PIN NUMBER
5 #define LED3 PIN_C4 //CHANGE PIN_XX TO YOUR LED PIN NUMBER 5 #define LED3 PIN_C4 //CHANGE PIN_XX TO YOUR LED PIN NUMBER
6 #define LED4 PIN_D3 //CHANGE PIN_XX TO YOUR LED PIN NUMBER 6 #define LED4 PIN_D3 //CHANGE PIN_XX TO YOUR LED PIN NUMBER
7   7  
8 #define S1 PIN_B0 //Raw up 8 #define S1 PIN_B0 //Raw up
9 #define S2 PIN_B1 //Raw down 9 #define S2 PIN_B1 //Raw down
10 #define S3 PIN_D0 //Fine up 10 #define S3 PIN_D0 //Fine up
11 #define S4 PIN_D1 //Fine down 11 #define S4 PIN_D1 //Fine down
12   12  
13 #define BEEP PIN_D2 //piezo beeper 13 #define BEEP PIN_D2 //piezo beeper
14   14  
15 #define LCD_ENABLE_PIN PIN_E0 //// 15 #define LCD_ENABLE_PIN PIN_E0 ////
16 #define LCD_RS_PIN PIN_E1 //// 16 #define LCD_RS_PIN PIN_E1 ////
17 #define LCD_RW_PIN PIN_E2 //// 17 #define LCD_RW_PIN PIN_E2 ////
18 #define LCD_DATA4 PIN_D4 //// 18 #define LCD_DATA4 PIN_D4 ////
19 #define LCD_DATA5 PIN_D5 //// 19 #define LCD_DATA5 PIN_D5 ////
20 #define LCD_DATA6 PIN_D6 //// 20 #define LCD_DATA6 PIN_D6 ////
21 #define LCD_DATA7 PIN_D7 21 #define LCD_DATA7 PIN_D7
22 #include <lcd.c> 22 #include <lcd.c>
23   23  
24 #define OUTPUT_ENABLE PIN_B5 24 #define OUTPUT_ENABLE PIN_B5
25   25  
26   26  
27 //#define MAXDUTY (int16)160 // 50 kHz 27 //#define MAXDUTY (int16)160 // 50 kHz
28 #define MAXDUTY (int16)400 // 20 kHz 28 #define MAXDUTY (int16)400 // 20 kHz
29 //#define MAXDUTY (int16)800 // 10 kHz 29 //#define MAXDUTY (int16)800 // 10 kHz
30 #define HALFDUTY (int16)MAXDUTY/2 30 #define HALFDUTY (int16)MAXDUTY/2
31 //#define DIVISOR 199 // 10 kHz 31 //#define DIVISOR 199 // 10 kHz
32 #define DIVISOR 99 // 20 kHz 32 #define DIVISOR 99 // 20 kHz
33 //#define DIVISOR 39 // 50 kHz 33 //#define DIVISOR 39 // 50 kHz
34   34  
35 #define MAX_OUTPUT 530 35 #define MAX_OUTPUT 530
36 #define MIN_OUTPUT 220 36 #define MIN_OUTPUT 220
37 #define raw_step 50 37 #define raw_step 50
38 #define fine_step 5 38 #define fine_step 5
39   39  
40   40  
41   41  
42 /// Linear interpolation parameters 42 /// Linear interpolation parameters
43 // 43 //
44   44  
45 #define k 0.333961 45 #define k 0.333961
46 #define q 206.952 46 #define q 206.952
47   47  
48   48  
49 unsigned int16 setpoint=43; 49 unsigned int16 setpoint;
50 unsigned int16 adc_value; 50 unsigned int16 adc_value;
51 int1 output_permit=FALSE; 51 int1 output_permit=FALSE;
52   52  
53 #INT_AD 53 #INT_AD
54 void adc_handler() { 54 void adc_handler() {
55   55  
56 adc_value = read_adc(ADC_READ_ONLY); 56 adc_value = read_adc(ADC_READ_ONLY);
57 if(output_permit == TRUE) 57 if(output_permit == TRUE)
58 { 58 {
59 if (adc_value <= setpoint) 59 if (adc_value <= setpoint)
60 { 60 {
61 set_pwm2_duty((int16)255); // zapnuti menice 61 set_pwm2_duty((int16)255); // zapnuti menice
62 output_low(LED2); 62 output_low(LED2);
63 } 63 }
64 else // vypnuti menice 64 else // vypnuti menice
65 { 65 {
66 set_pwm2_duty((int16)MAXDUTY); 66 set_pwm2_duty((int16)MAXDUTY);
67 output_high(LED2); 67 output_high(LED2);
68 } 68 }
69   69  
70 } 70 }
71 else 71 else
72 { 72 {
73 set_pwm2_duty((int16)MAXDUTY); 73 set_pwm2_duty((int16)MAXDUTY);
74 output_high(LED2); 74 output_high(LED2);
75 } 75 }
76 read_adc(ADC_START_ONLY); 76 read_adc(ADC_START_ONLY);
77 } 77 }
78   78  
79 void sound_beep( unsigned int lenght, int16 frequency) 79 void sound_beep( unsigned int lenght, int16 frequency)
80 { 80 {
81 unsigned int i; 81 unsigned int i;
82 82
83 for(i=0;i<=lenght;i++) 83 for(i=0;i<=lenght;i++)
84 { 84 {
85 output_toggle(BEEP); 85 output_toggle(BEEP);
86 delay_us(1/frequency); 86 delay_us(1/frequency);
87 } 87 }
88 } 88 }
89   89  
90 void main() 90 void main()
91 { 91 {
92 unsigned int1 button_press; // semafor pro cteni tlacitek 92 unsigned int1 button_press; // semafor pro cteni tlacitek
93 float output_voltage; 93 float output_voltage;
94 float voltage_setpoint = 300; 94 float voltage_setpoint = 300;
95   95  
96 setup_adc_ports(sAN0|VSS_VREF); 96 setup_adc_ports(sAN0|VSS_VREF);
97 setup_adc(ADC_CLOCK_DIV_32); 97 setup_adc(ADC_CLOCK_DIV_32);
98 setup_spi(SPI_SS_DISABLED); 98 setup_spi(SPI_SS_DISABLED);
99 setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1); 99 setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
100 setup_timer_1(T1_DISABLED); 100 setup_timer_1(T1_DISABLED);
101 setup_timer_2(T2_DIV_BY_1,DIVISOR,1); 101 setup_timer_2(T2_DIV_BY_1,DIVISOR,1);
102 setup_ccp1(CCP_PWM); 102 setup_ccp1(CCP_PWM);
103 setup_ccp2(CCP_PWM); 103 setup_ccp2(CCP_PWM);
104 set_pwm1_duty(HALFDUTY); 104 set_pwm1_duty(HALFDUTY);
105 set_pwm2_duty(MAXDUTY); 105 set_pwm2_duty(MAXDUTY);
106 setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard 106 setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
107 setup_oscillator(OSC_8MHZ); 107 setup_oscillator(OSC_8MHZ);
108   108  
109 enable_interrupts(INT_AD); 109 enable_interrupts(INT_AD);
110 enable_interrupts(GLOBAL); 110 enable_interrupts(GLOBAL);
111   111  
112 output_high(LED1); 112 output_high(LED1);
113 output_high(LED2); 113 output_high(LED2);
114 output_high(LED3); 114 output_high(LED3);
115 output_high(LED4); 115 output_high(LED4);
116 output_low(BEEP); 116 output_low(BEEP);
117   117  
118 set_pwm2_duty((int16)MAXDUTY); 118 set_pwm2_duty((int16)MAXDUTY);
119   119  
120 lcd_init(); 120 lcd_init();
121 set_adc_channel(0); 121 set_adc_channel(0);
122 122
-   123 setpoint =(int16) ((voltage_setpoint - q) / k);
-   124  
123 lcd_gotoxy(1,1); 125 lcd_gotoxy(1,1);
124 lcd_putc("HVPS01A"); 126 lcd_putc("HVPS01A");
125 lcd_gotoxy(1,2); 127 lcd_gotoxy(1,2);
126 lcd_putc(" MLAB.cz"); 128 lcd_putc(" MLAB.cz");
127 Delay_ms(1000); 129 Delay_ms(1000);
128 130
129 lcd_putc("\f"); 131 lcd_putc("\f");
130   132  
131 read_adc(ADC_START_ONLY); 133 read_adc(ADC_START_ONLY);
132 134
133 while(true) 135 while(true)
134 { 136 {
135 if(input(OUTPUT_ENABLE)) output_permit=TRUE; 137 if(input(OUTPUT_ENABLE)) output_permit=TRUE;
136 else output_permit=FALSE; 138 else output_permit=FALSE;
137   139  
138 output_voltage = adc_value * k + q; 140 output_voltage = adc_value * k + q;
139   141  
140 lcd_gotoxy(1,1); // output voltage out of range 142 lcd_gotoxy(1,1); // output voltage out of range
141 if (output_voltage > 215) printf(lcd_putc,"%3.0f",output_voltage); 143 if (output_voltage > 215) printf(lcd_putc,"%3.0f",output_voltage);
142 else printf(lcd_putc,"---"); 144 else printf(lcd_putc,"---");
143 145
144   146  
145 lcd_gotoxy(1,2); 147 lcd_gotoxy(1,2);
146 voltage_setpoint = setpoint * k + q; 148 voltage_setpoint = setpoint * k + q;
147   -  
148 if(input(OUTPUT_ENABLE))printf(lcd_putc,"Set:%3.0f ", voltage_setpoint); // setpoint print 149 if(input(OUTPUT_ENABLE))printf(lcd_putc,"Set:%3.0f ", voltage_setpoint); // setpoint print
149 else printf(lcd_putc,"DISABLED"); 150 else printf(lcd_putc,"DISABLED");
150   151  
151 if(button_press==false ) // tlacitka se ctou znovu pouze pokud v redchozim cyklu nebyla zmacknuta. 152 if(button_press==false ) // tlacitka se ctou znovu pouze pokud v redchozim cyklu nebyla zmacknuta.
152 { 153 {
153   154  
154 if(!input(S1)) 155 if(!input(S1))
155 { 156 {
156 delay_ms(20); 157 delay_ms(20);
157 if(!input(S1)) 158 if(!input(S1))
158 { 159 {
159 button_press=true; 160 button_press=true;
160 sound_beep(100,700); 161 sound_beep(100,700);
161 if(voltage_setpoint < (MAX_OUTPUT - raw_step) ) voltage_setpoint += raw_step; 162 if(voltage_setpoint < (MAX_OUTPUT - raw_step) ) voltage_setpoint += raw_step;
162 else voltage_setpoint = MAX_OUTPUT; 163 else voltage_setpoint = MAX_OUTPUT;
163 } 164 }
164 } 165 }
165   166  
166 if(!input(S2)) 167 if(!input(S2))
167 { 168 {
168 delay_ms(20); 169 delay_ms(20);
169 if(!input(S2)) 170 if(!input(S2))
170 { 171 {
171 button_press=true; 172 button_press=true;
172 sound_beep(100,600); 173 sound_beep(100,600);
173 if(voltage_setpoint > (raw_step + MIN_OUTPUT) ) voltage_setpoint -= raw_step; 174 if(voltage_setpoint > (raw_step + MIN_OUTPUT) ) voltage_setpoint -= raw_step;
174 else voltage_setpoint = MIN_OUTPUT; 175 else voltage_setpoint = MIN_OUTPUT;
175 } 176 }
176 } 177 }
177   178  
178 if(!input(S3)) 179 if(!input(S3))
179 { 180 {
180 delay_ms(20); 181 delay_ms(20);
181 if(!input(S3)) 182 if(!input(S3))
182 { 183 {
183 button_press=true; 184 button_press=true;
184 sound_beep(100,500); 185 sound_beep(100,500);
185 if(voltage_setpoint < MAX_OUTPUT - fine_step )voltage_setpoint += fine_step ; 186 if(voltage_setpoint < MAX_OUTPUT - fine_step )voltage_setpoint += fine_step ;
186 else voltage_setpoint = MAX_OUTPUT; 187 else voltage_setpoint = MAX_OUTPUT;
187 } 188 }
188 } 189 }
189   190  
190 if(!input(S4)) 191 if(!input(S4))
191 { 192 {
192 delay_ms(20); 193 delay_ms(20);
193 if(!input(S4)) 194 if(!input(S4))
194 { 195 {
195 button_press=true; 196 button_press=true;
196 sound_beep(100,400); 197 sound_beep(100,400);
197 if(voltage_setpoint > (fine_step + MIN_OUTPUT) ) voltage_setpoint -= fine_step; 198 if(voltage_setpoint > (fine_step + MIN_OUTPUT) ) voltage_setpoint -= fine_step;
198 else voltage_setpoint = MIN_OUTPUT; 199 else voltage_setpoint = MIN_OUTPUT;
199 } 200 }
200 } 201 }
201   202  
202 setpoint =(int16) ((voltage_setpoint - q) / k); 203 setpoint =(int16) ((voltage_setpoint - q) / k);
203 } 204 }
204 205
205 if ( input(S1) && input(S2) && input(S3) && input(S4) ) button_press=false; 206 if ( input(S1) && input(S2) && input(S3) && input(S4) ) button_press=false;
206 output_toggle(LED1); 207 output_toggle(LED1);
207 } 208 }
208   -  
209 } 209 }