Desarrollo de habilidades en C para progtamar las entradas de un control PID sencillo con un display 16x2. Elaboración conjunta con el usuario jmcallef.
main.cpp@0:1c380ef8d6fb, 2013-10-25 (annotated)
- Committer:
- cmorab
- Date:
- Fri Oct 25 16:29:00 2013 +0000
- Revision:
- 0:1c380ef8d6fb
Habilidades en C para programar un control PID sencillo con un display 16x2. Programaci?n conjunta con el usuario: jmcallf.; ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cmorab | 0:1c380ef8d6fb | 1 | /*TAREA DOS: Aumento con gradientes de los parámetros Sp, Kp, Ki y Kd de un Control PID simple. |
cmorab | 0:1c380ef8d6fb | 2 | Con tarjeta FREESCALE KL25Z*/ |
cmorab | 0:1c380ef8d6fb | 3 | |
cmorab | 0:1c380ef8d6fb | 4 | #include "mbed.h" |
cmorab | 0:1c380ef8d6fb | 5 | #include "DebouncedIn.h" |
cmorab | 0:1c380ef8d6fb | 6 | #include "TextLCD.h" |
cmorab | 0:1c380ef8d6fb | 7 | |
cmorab | 0:1c380ef8d6fb | 8 | AnalogIn Vin(PTC2); |
cmorab | 0:1c380ef8d6fb | 9 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
cmorab | 0:1c380ef8d6fb | 10 | |
cmorab | 0:1c380ef8d6fb | 11 | DigitalOut led1(LED1); |
cmorab | 0:1c380ef8d6fb | 12 | DigitalOut led2(LED2); |
cmorab | 0:1c380ef8d6fb | 13 | DigitalOut led3(LED3); |
cmorab | 0:1c380ef8d6fb | 14 | DigitalOut led4(LED4); |
cmorab | 0:1c380ef8d6fb | 15 | DebouncedIn button1(PTC12); // Aumento |
cmorab | 0:1c380ef8d6fb | 16 | DebouncedIn button2(PTC13); // Disminución |
cmorab | 0:1c380ef8d6fb | 17 | DebouncedIn button3(PTC16); // Cambio de variable |
cmorab | 0:1c380ef8d6fb | 18 | DebouncedIn button4(PTC17); // Reset |
cmorab | 0:1c380ef8d6fb | 19 | |
cmorab | 0:1c380ef8d6fb | 20 | int C1=0x0E; // solo muestra el curzor. |
cmorab | 0:1c380ef8d6fb | 21 | int C2=0x18; // desplaza izquierda. |
cmorab | 0:1c380ef8d6fb | 22 | int C3=0x1A; // desplaza derecha. |
cmorab | 0:1c380ef8d6fb | 23 | int C4=0x0C; // quito cursor bajo. |
cmorab | 0:1c380ef8d6fb | 24 | |
cmorab | 0:1c380ef8d6fb | 25 | int i; // Indice de la variable. |
cmorab | 0:1c380ef8d6fb | 26 | int j; // Controla cambio de posición. |
cmorab | 0:1c380ef8d6fb | 27 | int kp, ki, kd, sp, cont; |
cmorab | 0:1c380ef8d6fb | 28 | |
cmorab | 0:1c380ef8d6fb | 29 | int main(){ |
cmorab | 0:1c380ef8d6fb | 30 | lcd.writeCommand(C1); // Escribimos un comando segun el manual del modulo LCD |
cmorab | 0:1c380ef8d6fb | 31 | lcd.cls(); // Borro toda la pantalla |
cmorab | 0:1c380ef8d6fb | 32 | lcd.locate(0,0); // Localizo donde se escribirá el siguiente comando. |
cmorab | 0:1c380ef8d6fb | 33 | lcd.printf("Sp %d",sp); // Escribe Sp (aparecen desde el punto (0,0) |
cmorab | 0:1c380ef8d6fb | 34 | lcd.locate(8,0); // Localizo donde se escribirá el siguiente comando. |
cmorab | 0:1c380ef8d6fb | 35 | lcd.printf("Kp %d",kp); // Escribe Kp (aparecen desde el punto (8,0) |
cmorab | 0:1c380ef8d6fb | 36 | lcd.locate(0,1); |
cmorab | 0:1c380ef8d6fb | 37 | lcd.printf("Ki %d",ki); |
cmorab | 0:1c380ef8d6fb | 38 | lcd.locate(8,1); |
cmorab | 0:1c380ef8d6fb | 39 | lcd.printf("Kd %d",kd); |
cmorab | 0:1c380ef8d6fb | 40 | |
cmorab | 0:1c380ef8d6fb | 41 | |
cmorab | 0:1c380ef8d6fb | 42 | while(1){ |
cmorab | 0:1c380ef8d6fb | 43 | led3 =1; |
cmorab | 0:1c380ef8d6fb | 44 | if (button3.falling()){ |
cmorab | 0:1c380ef8d6fb | 45 | led3 =!led3; // Prendo el LED color rojo cada vez que pulso el boton 3 ya que pasa a valer 0 (encendido). |
cmorab | 0:1c380ef8d6fb | 46 | ++j; |
cmorab | 0:1c380ef8d6fb | 47 | } // INCREMENTA POSICION DEL MENU CON BOTON 3 |
cmorab | 0:1c380ef8d6fb | 48 | if (j==0){ |
cmorab | 0:1c380ef8d6fb | 49 | lcd.locate(3,0); |
cmorab | 0:1c380ef8d6fb | 50 | lcd.printf("%d",sp); |
cmorab | 0:1c380ef8d6fb | 51 | |
cmorab | 0:1c380ef8d6fb | 52 | wait(0.2); |
cmorab | 0:1c380ef8d6fb | 53 | |
cmorab | 0:1c380ef8d6fb | 54 | led1 = 1; |
cmorab | 0:1c380ef8d6fb | 55 | |
cmorab | 0:1c380ef8d6fb | 56 | if(button1.falling()) { |
cmorab | 0:1c380ef8d6fb | 57 | led1 =!led1; // Prendo el LED color azul cada vez que pulso el boton 1 ya que pasa a valer 0 (encendido). |
cmorab | 0:1c380ef8d6fb | 58 | //++sp; // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental. |
cmorab | 0:1c380ef8d6fb | 59 | |
cmorab | 0:1c380ef8d6fb | 60 | |
cmorab | 0:1c380ef8d6fb | 61 | // Ahora comienza el incremental. |
cmorab | 0:1c380ef8d6fb | 62 | |
cmorab | 0:1c380ef8d6fb | 63 | if (!button1) { |
cmorab | 0:1c380ef8d6fb | 64 | cont=0; |
cmorab | 0:1c380ef8d6fb | 65 | wait(0.2); |
cmorab | 0:1c380ef8d6fb | 66 | |
cmorab | 0:1c380ef8d6fb | 67 | while(cont<20){ |
cmorab | 0:1c380ef8d6fb | 68 | cont = cont + 1; |
cmorab | 0:1c380ef8d6fb | 69 | sp=sp+1; |
cmorab | 0:1c380ef8d6fb | 70 | if (sp>1000){ // Ponemos un tope incremental en 10.000 |
cmorab | 0:1c380ef8d6fb | 71 | sp=1000; |
cmorab | 0:1c380ef8d6fb | 72 | } |
cmorab | 0:1c380ef8d6fb | 73 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 74 | lcd.printf("Sp %d",sp); |
cmorab | 0:1c380ef8d6fb | 75 | |
cmorab | 0:1c380ef8d6fb | 76 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 77 | if(button1){ |
cmorab | 0:1c380ef8d6fb | 78 | break; |
cmorab | 0:1c380ef8d6fb | 79 | } |
cmorab | 0:1c380ef8d6fb | 80 | while(cont>=20){ |
cmorab | 0:1c380ef8d6fb | 81 | cont=cont+1; |
cmorab | 0:1c380ef8d6fb | 82 | sp=sp+10; |
cmorab | 0:1c380ef8d6fb | 83 | if (sp>1000){ // Ponemos un tope incremental en 10.000 |
cmorab | 0:1c380ef8d6fb | 84 | sp=1000; |
cmorab | 0:1c380ef8d6fb | 85 | } |
cmorab | 0:1c380ef8d6fb | 86 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 87 | lcd.printf("Sp %d",sp); |
cmorab | 0:1c380ef8d6fb | 88 | |
cmorab | 0:1c380ef8d6fb | 89 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 90 | if(button1){ |
cmorab | 0:1c380ef8d6fb | 91 | break; |
cmorab | 0:1c380ef8d6fb | 92 | } |
cmorab | 0:1c380ef8d6fb | 93 | |
cmorab | 0:1c380ef8d6fb | 94 | while(cont>40){ |
cmorab | 0:1c380ef8d6fb | 95 | cont = cont + 1; |
cmorab | 0:1c380ef8d6fb | 96 | sp=sp+100; |
cmorab | 0:1c380ef8d6fb | 97 | if (sp>1000){ // Ponemos un tope incremental en 10.000 |
cmorab | 0:1c380ef8d6fb | 98 | sp=1000; |
cmorab | 0:1c380ef8d6fb | 99 | } |
cmorab | 0:1c380ef8d6fb | 100 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 101 | lcd.printf("Sp %d",sp); |
cmorab | 0:1c380ef8d6fb | 102 | |
cmorab | 0:1c380ef8d6fb | 103 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 104 | if(button1){ |
cmorab | 0:1c380ef8d6fb | 105 | break; |
cmorab | 0:1c380ef8d6fb | 106 | } |
cmorab | 0:1c380ef8d6fb | 107 | } |
cmorab | 0:1c380ef8d6fb | 108 | } |
cmorab | 0:1c380ef8d6fb | 109 | } |
cmorab | 0:1c380ef8d6fb | 110 | } |
cmorab | 0:1c380ef8d6fb | 111 | |
cmorab | 0:1c380ef8d6fb | 112 | // Aqui termina el incremental. |
cmorab | 0:1c380ef8d6fb | 113 | } |
cmorab | 0:1c380ef8d6fb | 114 | |
cmorab | 0:1c380ef8d6fb | 115 | |
cmorab | 0:1c380ef8d6fb | 116 | led2 =1; |
cmorab | 0:1c380ef8d6fb | 117 | if (button2.falling()) { |
cmorab | 0:1c380ef8d6fb | 118 | led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido). |
cmorab | 0:1c380ef8d6fb | 119 | |
cmorab | 0:1c380ef8d6fb | 120 | //--sp; // Reduce el valor al pulsar el botón. |
cmorab | 0:1c380ef8d6fb | 121 | } |
cmorab | 0:1c380ef8d6fb | 122 | |
cmorab | 0:1c380ef8d6fb | 123 | |
cmorab | 0:1c380ef8d6fb | 124 | // Ahora comienza el decremental. |
cmorab | 0:1c380ef8d6fb | 125 | |
cmorab | 0:1c380ef8d6fb | 126 | if (!button2) { |
cmorab | 0:1c380ef8d6fb | 127 | cont=0; |
cmorab | 0:1c380ef8d6fb | 128 | wait(0.2); |
cmorab | 0:1c380ef8d6fb | 129 | |
cmorab | 0:1c380ef8d6fb | 130 | while(cont<20){ |
cmorab | 0:1c380ef8d6fb | 131 | cont = cont + 1; |
cmorab | 0:1c380ef8d6fb | 132 | sp=sp-1; |
cmorab | 0:1c380ef8d6fb | 133 | |
cmorab | 0:1c380ef8d6fb | 134 | lcd.locate(3,0); |
cmorab | 0:1c380ef8d6fb | 135 | lcd.printf(" "); |
cmorab | 0:1c380ef8d6fb | 136 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 137 | lcd.printf("Sp %d",sp); |
cmorab | 0:1c380ef8d6fb | 138 | |
cmorab | 0:1c380ef8d6fb | 139 | if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0. |
cmorab | 0:1c380ef8d6fb | 140 | sp=0; |
cmorab | 0:1c380ef8d6fb | 141 | } |
cmorab | 0:1c380ef8d6fb | 142 | |
cmorab | 0:1c380ef8d6fb | 143 | |
cmorab | 0:1c380ef8d6fb | 144 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 145 | if(button2){ |
cmorab | 0:1c380ef8d6fb | 146 | break; |
cmorab | 0:1c380ef8d6fb | 147 | } |
cmorab | 0:1c380ef8d6fb | 148 | |
cmorab | 0:1c380ef8d6fb | 149 | while(cont>=20){ |
cmorab | 0:1c380ef8d6fb | 150 | cont=cont+1; |
cmorab | 0:1c380ef8d6fb | 151 | sp=sp-10; |
cmorab | 0:1c380ef8d6fb | 152 | if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0. |
cmorab | 0:1c380ef8d6fb | 153 | sp=0; |
cmorab | 0:1c380ef8d6fb | 154 | } |
cmorab | 0:1c380ef8d6fb | 155 | |
cmorab | 0:1c380ef8d6fb | 156 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 157 | lcd.printf("Sp %d ",sp); |
cmorab | 0:1c380ef8d6fb | 158 | |
cmorab | 0:1c380ef8d6fb | 159 | |
cmorab | 0:1c380ef8d6fb | 160 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 161 | if(button2){ |
cmorab | 0:1c380ef8d6fb | 162 | break; |
cmorab | 0:1c380ef8d6fb | 163 | } |
cmorab | 0:1c380ef8d6fb | 164 | |
cmorab | 0:1c380ef8d6fb | 165 | while(cont>40){ |
cmorab | 0:1c380ef8d6fb | 166 | cont = cont + 1; |
cmorab | 0:1c380ef8d6fb | 167 | sp=sp-100; |
cmorab | 0:1c380ef8d6fb | 168 | |
cmorab | 0:1c380ef8d6fb | 169 | if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0. |
cmorab | 0:1c380ef8d6fb | 170 | sp=0; |
cmorab | 0:1c380ef8d6fb | 171 | } |
cmorab | 0:1c380ef8d6fb | 172 | |
cmorab | 0:1c380ef8d6fb | 173 | lcd.locate(0,0); |
cmorab | 0:1c380ef8d6fb | 174 | lcd.printf("Sp %d ",sp); |
cmorab | 0:1c380ef8d6fb | 175 | |
cmorab | 0:1c380ef8d6fb | 176 | |
cmorab | 0:1c380ef8d6fb | 177 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 178 | if(button2){ |
cmorab | 0:1c380ef8d6fb | 179 | break; |
cmorab | 0:1c380ef8d6fb | 180 | } |
cmorab | 0:1c380ef8d6fb | 181 | } |
cmorab | 0:1c380ef8d6fb | 182 | } |
cmorab | 0:1c380ef8d6fb | 183 | } |
cmorab | 0:1c380ef8d6fb | 184 | } |
cmorab | 0:1c380ef8d6fb | 185 | |
cmorab | 0:1c380ef8d6fb | 186 | // Aqui termina el decremental. |
cmorab | 0:1c380ef8d6fb | 187 | |
cmorab | 0:1c380ef8d6fb | 188 | |
cmorab | 0:1c380ef8d6fb | 189 | |
cmorab | 0:1c380ef8d6fb | 190 | |
cmorab | 0:1c380ef8d6fb | 191 | |
cmorab | 0:1c380ef8d6fb | 192 | |
cmorab | 0:1c380ef8d6fb | 193 | |
cmorab | 0:1c380ef8d6fb | 194 | } |
cmorab | 0:1c380ef8d6fb | 195 | if (j==1){ |
cmorab | 0:1c380ef8d6fb | 196 | lcd.locate(11,0); |
cmorab | 0:1c380ef8d6fb | 197 | lcd.printf("%d",kp); |
cmorab | 0:1c380ef8d6fb | 198 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 199 | led1 =1; |
cmorab | 0:1c380ef8d6fb | 200 | if (button1.falling()) { |
cmorab | 0:1c380ef8d6fb | 201 | led1 =!led1; |
cmorab | 0:1c380ef8d6fb | 202 | ++kp; |
cmorab | 0:1c380ef8d6fb | 203 | } |
cmorab | 0:1c380ef8d6fb | 204 | led2 =1; |
cmorab | 0:1c380ef8d6fb | 205 | if (button2.falling()) { |
cmorab | 0:1c380ef8d6fb | 206 | lcd.locate(11,0); |
cmorab | 0:1c380ef8d6fb | 207 | lcd.printf("%d "); |
cmorab | 0:1c380ef8d6fb | 208 | led2 =!led2; |
cmorab | 0:1c380ef8d6fb | 209 | --kp; |
cmorab | 0:1c380ef8d6fb | 210 | } |
cmorab | 0:1c380ef8d6fb | 211 | if (kp>10000){ |
cmorab | 0:1c380ef8d6fb | 212 | kp=10000; |
cmorab | 0:1c380ef8d6fb | 213 | lcd.locate(11,0); |
cmorab | 0:1c380ef8d6fb | 214 | lcd.printf("%d",kp); |
cmorab | 0:1c380ef8d6fb | 215 | } |
cmorab | 0:1c380ef8d6fb | 216 | |
cmorab | 0:1c380ef8d6fb | 217 | if (kp<0){ |
cmorab | 0:1c380ef8d6fb | 218 | kp=0; |
cmorab | 0:1c380ef8d6fb | 219 | lcd.locate(11,0); |
cmorab | 0:1c380ef8d6fb | 220 | lcd.printf("%d",kp); |
cmorab | 0:1c380ef8d6fb | 221 | } |
cmorab | 0:1c380ef8d6fb | 222 | } |
cmorab | 0:1c380ef8d6fb | 223 | if (j==2){ |
cmorab | 0:1c380ef8d6fb | 224 | lcd.locate(3,1); |
cmorab | 0:1c380ef8d6fb | 225 | lcd.printf("%d",ki); |
cmorab | 0:1c380ef8d6fb | 226 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 227 | led1 =1; |
cmorab | 0:1c380ef8d6fb | 228 | if (button1.falling()){ |
cmorab | 0:1c380ef8d6fb | 229 | led1 =!led1; |
cmorab | 0:1c380ef8d6fb | 230 | ++ki; |
cmorab | 0:1c380ef8d6fb | 231 | } |
cmorab | 0:1c380ef8d6fb | 232 | led2 =1; |
cmorab | 0:1c380ef8d6fb | 233 | if (button2.falling()){ |
cmorab | 0:1c380ef8d6fb | 234 | lcd.locate(3,1); |
cmorab | 0:1c380ef8d6fb | 235 | lcd.printf("%d "); |
cmorab | 0:1c380ef8d6fb | 236 | led2 =!led2; |
cmorab | 0:1c380ef8d6fb | 237 | --ki; |
cmorab | 0:1c380ef8d6fb | 238 | } |
cmorab | 0:1c380ef8d6fb | 239 | if (ki>10000){ |
cmorab | 0:1c380ef8d6fb | 240 | ki=10000; |
cmorab | 0:1c380ef8d6fb | 241 | lcd.locate(3,1); |
cmorab | 0:1c380ef8d6fb | 242 | lcd.printf("%d",ki); |
cmorab | 0:1c380ef8d6fb | 243 | } |
cmorab | 0:1c380ef8d6fb | 244 | |
cmorab | 0:1c380ef8d6fb | 245 | if (ki<0){ |
cmorab | 0:1c380ef8d6fb | 246 | ki=0; |
cmorab | 0:1c380ef8d6fb | 247 | lcd.locate(3,1); |
cmorab | 0:1c380ef8d6fb | 248 | lcd.printf("%d",ki); |
cmorab | 0:1c380ef8d6fb | 249 | } |
cmorab | 0:1c380ef8d6fb | 250 | } |
cmorab | 0:1c380ef8d6fb | 251 | |
cmorab | 0:1c380ef8d6fb | 252 | if (j==3){ |
cmorab | 0:1c380ef8d6fb | 253 | lcd.locate(11,1); |
cmorab | 0:1c380ef8d6fb | 254 | lcd.printf("%d",kd); |
cmorab | 0:1c380ef8d6fb | 255 | wait(0.3); |
cmorab | 0:1c380ef8d6fb | 256 | led1 =1; |
cmorab | 0:1c380ef8d6fb | 257 | if (button1.falling()){ |
cmorab | 0:1c380ef8d6fb | 258 | led1 =!led1; |
cmorab | 0:1c380ef8d6fb | 259 | ++kd; |
cmorab | 0:1c380ef8d6fb | 260 | } |
cmorab | 0:1c380ef8d6fb | 261 | led2 =1; |
cmorab | 0:1c380ef8d6fb | 262 | if (button2.falling()){ |
cmorab | 0:1c380ef8d6fb | 263 | lcd.locate(11,1); |
cmorab | 0:1c380ef8d6fb | 264 | lcd.printf("%d "); |
cmorab | 0:1c380ef8d6fb | 265 | led2 =!led2; |
cmorab | 0:1c380ef8d6fb | 266 | --kd; |
cmorab | 0:1c380ef8d6fb | 267 | |
cmorab | 0:1c380ef8d6fb | 268 | |
cmorab | 0:1c380ef8d6fb | 269 | } |
cmorab | 0:1c380ef8d6fb | 270 | if (kd>10000){ |
cmorab | 0:1c380ef8d6fb | 271 | kd=10000; |
cmorab | 0:1c380ef8d6fb | 272 | lcd.locate(11,1); |
cmorab | 0:1c380ef8d6fb | 273 | lcd.printf("%d",kd); |
cmorab | 0:1c380ef8d6fb | 274 | } |
cmorab | 0:1c380ef8d6fb | 275 | |
cmorab | 0:1c380ef8d6fb | 276 | if (kd<0){ |
cmorab | 0:1c380ef8d6fb | 277 | kd=0; |
cmorab | 0:1c380ef8d6fb | 278 | lcd.locate(11,1); |
cmorab | 0:1c380ef8d6fb | 279 | lcd.printf("%d",kd); |
cmorab | 0:1c380ef8d6fb | 280 | } |
cmorab | 0:1c380ef8d6fb | 281 | } |
cmorab | 0:1c380ef8d6fb | 282 | |
cmorab | 0:1c380ef8d6fb | 283 | if (j==4){ |
cmorab | 0:1c380ef8d6fb | 284 | j=0; |
cmorab | 0:1c380ef8d6fb | 285 | } |
cmorab | 0:1c380ef8d6fb | 286 | |
cmorab | 0:1c380ef8d6fb | 287 | if (button4.falling()){ |
cmorab | 0:1c380ef8d6fb | 288 | sp=0; |
cmorab | 0:1c380ef8d6fb | 289 | kp=0; |
cmorab | 0:1c380ef8d6fb | 290 | ki=0; |
cmorab | 0:1c380ef8d6fb | 291 | kd=0; |
cmorab | 0:1c380ef8d6fb | 292 | lcd.locate(11,1); |
cmorab | 0:1c380ef8d6fb | 293 | lcd.printf("%d ",kd); |
cmorab | 0:1c380ef8d6fb | 294 | lcd.locate(3,1); |
cmorab | 0:1c380ef8d6fb | 295 | lcd.printf("%d ",ki); |
cmorab | 0:1c380ef8d6fb | 296 | lcd.locate(11,0); |
cmorab | 0:1c380ef8d6fb | 297 | lcd.printf("%d ",kp); |
cmorab | 0:1c380ef8d6fb | 298 | lcd.locate(3,0); |
cmorab | 0:1c380ef8d6fb | 299 | lcd.printf("%d ",sp); |
cmorab | 0:1c380ef8d6fb | 300 | } |
cmorab | 0:1c380ef8d6fb | 301 | } |
cmorab | 0:1c380ef8d6fb | 302 | } |
cmorab | 0:1c380ef8d6fb | 303 |