Diseño e implementación de un equipo de prácticas de control automático 7 Resumen de costes PRECIOS CONSULTADOS EN EL DISTRIBUIDOR FARNELL.COM MICROCONTROLADORES…………………………………………………12€ PLACAS PCB………………………………………………………………….20€ CAJA ALUMINIO………………………………………………………….......11€ DISCO DE INERCIA……………………………………………………………6€ PANTALLA GLCD……………………………………………………………..11€ ELEMENTOS PASIVOS (RESISTENCIA, CONDENSADOR, PULSADORES, CONECTORES ETC.)…………………………………….35€ MOTOR MAXON REDUCTOR (ENGRANAJE)……………………………90€ VARIOS………………………………………………………………………...15€ TOTAL…………………………………………………………………………200€ 22/06/2011 Alejandro Quintero García Página 155 de 214 Diseño e implementación de un equipo de prácticas de control automático 8 8.1 Anexos Especificaciones del motor Maxon. 22/06/2011 Alejandro Quintero García Página 156 de 214 Diseño e implementación de un equipo de prácticas de control automático 8.2 Código del microcontrolador principal. //////////////////////////////////////////////////////////////////////////////// //// //// //// FIRMWARE DEL PIC18F4550 PARA LA PLACA PROTOTIPO DEL PFC //// //// //// //// Modificado por Alejandro Quintero García '11 //// //// //// //////////////////////////////////////////////////////////////////////////////// #include <18F4550.h> //////////////////////////////////////////////////////////////////////////////// // HABILITACION DE PRIORIDAD DE INTERRUPCIONES // //////////////////////////////////////////////////////////////////////////////// #DEVICE HIGH_INTS=TRUE #fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,HSPLL,VREGEN #use delay(clock=48M) #use rs232(baud=38000,xmit=pin_c6,rcv=pin_c7) //////////////////////////////////////////////////////////////////////////////// // CONFIGURACION DE LAS LIBRERIAS DINAMICAS DE CCS COMPILER // //////////////////////////////////////////////////////////////////////////////// #define USB_HID_DEVICE #define FALSE USB_EP1_TX_ENABLE // Deshabilitamos el uso de las directivas HID USB_ENABLE_BULK // USB_ENABLE_BULK // HABILITAR EP1(EndPoint1) EN MODO IN PARA OUT PARA TRANSFERENCIAS bulk/interrupt #define USB_EP1_RX_ENABLE HABILITAR EP1(EndPoint1) EN MODO TRANSFERENCIAS bulk/interrupt #define USB_EP1_TX_SIZE 32 // TAMAÑO DEL BUFFER TX endpoint 1 #define USB_EP1_RX_SIZE 32 // TAMAÑO DEL BUFFER RX endpoint 1 //////////////////////////////////////////////////////////////////////////////// // INTRODUCCION DE LAS LIBRERIAS DINAMICAS DE CCS COMPILER // //////////////////////////////////////////////////////////////////////////////// #include "math.h" #include "float.h" #include "stdlib.h" #include "C:\Documents and Settings\yomismo\Escritorio\CODIGO PARA EL PIC\include\configurar_el_usb_2.h" // NOTA:El archivo configurar_el_usb_2.h es la union de las librerias // proporcionadas por CCS para la configuracion de la comunicacion USB 22/06/2011 Alejandro Quintero García Página 157 de 214 Diseño e implementación de un equipo de prácticas de control automático // en los micros PIC.Se las ha unificado eliminando un poco su generalidad // con objeto de simplificar un poco la libreria eliminando ademas las partes // innecesarias. //////////////////////////////////////////////////////////////////////////////// // CREACIÓN DE ALIAS // //////////////////////////////////////////////////////////////////////////////// #define ACTIVAR_FRENO output_high(PIN_D6) #define DESACTIVAR_FRENO output_low(PIN_D6) #define ACTIVAR_DIR_HORARIA output_high(PIN_D7) #define ACTIVAR_DIR_ANTIHORARIA output_low(PIN_D7) #define LIBRE_UC output_high(PIN_B0) #define OCUPADO_UC output_low(PIN_B0) #define ENABLE_CANAL_A output_high(PIN_D3) #define DISABLE_CANAL_A output_low(PIN_D3) #DEFINE LED0 PIN_B0 #DEFINE LED1 PIN_B6 #DEFINE LED2 PIN_B7 #define Enciende Output_High #define Apaga Output_Low #define Conmuta Output_Toggle #define MOTOR set_pwm1_duty #define LISTO 0 //CONTROLADOR ESPERANDO INSTRUCCION #define DAR_TM 1 //ESTABLECE EL FUNCIONAMIENTO EN BA #define SETBC 2 //ESTABLECE EL FUNCIONAMIENTO EN BC #define SETTM 3 //INTRODUCE EL TIEMPO DE MUESTREO #DEFINE SETPIDKC 4 //INTRODUCE EL VALOR KC (BC) #DEFINE SETPIDTI 5 //INTRODUCE EL VALOR TI (BC) #DEFINE SETPIDTD 6 //INTRODUCE EL VALOR TD (BC) #DEFINE LEEPOS 7 //DEVUELVE LA POSICION DEL MOTOR #DEFINE ESCTENSION 8 //INTRODUCE UN VALOR DE PWM (0-150) #DEFINE LEEVEL 9 //DEVUELVE LA VELOCIDAD ACTUAL DEL MOTOR #DEFINE RESETEO_TOTAL 10 //RESETEA TIEMPO Y POSICION #define ESCREF 11 //INTRODUCE EL VALOR DE REFERENCIA (BC) #define AJ_RELOJ 12 //AJUSTA EL TIMER 0 22/06/2011 Alejandro Quintero García Página 158 de 214 Diseño e implementación de un equipo de prácticas de control automático #define STATUS_TIMERS 13 //DEVUELVE TESP Y EL MULTIPLICADOR ENCOD. #define ST_ERR_CONTROL 14 //DEVUELVE EL VALOR DE LOS ERRORES DEL AJUSTE. #define DAR_PWM 15 //DEVUELVE EL VALOR ACTUAL DEL PWM #DEFINE DAR_REF_POS 16 //DEVUELVE EL VALOR ACTUAL DE LA REFERENCIA. #define BUFFER_INIT 17 //INICIALIZA LOS BUFFERES #define AJ_TIMER3 18 //AJUSTA EL TIMER3 DESDE MATLAB #define ERROR_POS 19 //INTRODUCE EL ERROR EN POSICION (BC) #define FRENO 20 //ACTIVA O DESACTIVA EL FRENO. #define AJ_ENCODER 21 //AJUSTA LOS MULTIPLICADORES DEL ENC. #DEFINE CONF_INT_TIMER0 22 //ACTIVA O DESACTIVA LA INT_RTCC #DEFINE BUFFER_INIT_GEN 23 //INICIALIZA EL BUFFER GENERICO #DEFINE CONF_INT_TIMER3 24 //ACTIVA O DESACTIVA LA INT_TIMER3 #DEFINE CONF_INT_CCP2 25 //ACTIVA O DESACTIVA LA INT_CCP2 #DEFINE RESETEO_RELOJ 26 //RESETEA EL RELOJ #DEFINE RESETEO_CONT_POS 27 //RESETEA LA POSICION #DEFINE TM_POR_PUNTO 28 //ESTABLECE LOS TM POR PUNTO ALMACENADO. #define DAR_ERR_POS 29 //DEVUELVE EL VALOR ACTUAL DEL ERROR. #define DAR_ITER_MAX 30 //DEVUELVE EL NUMERO DE ITERACIONES MAXIMAS. #define ACTIVA_INT_GLOBAL 31 //ACTIVA INTERRUPCIONES #DEFINE DESACTIVA_INT_GLOBAL 32 //DESACTIVA INTERRRUPCIONES #DEFINE DAR_RES_ITER 33 //DEVUELVE EL NUMERO DE ITERACIONES DEL ULT.AJUSTE. #define ESTATUS_PID 34 //DEVUELVE LOS VALORES DEL PID #define RECUPERA_M 35 //DEVUELVE UN BLOQUE DE MEMORIA #define EST_CONTROL 36 //DEVUELVE LOS ULT. VALORES DE POS DEL AJUSTE. const int8 Lenbuf = 15; //////////////////////////////////////////////////////////////////////////////// // RAM // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // VARIABLES COMANDO // //////////////////////////////////////////////////////////////////////////////// INT COMANDO; INT COMANDO_S; //////////////////////////////////////////////////////////////////////////////// // VARIABLES DEL ENCODER // //////////////////////////////////////////////////////////////////////////////// UNSIGNED int32 LH; unsigned int16 ENCount1; //contador de posiciones. unsigned int32 ENCount2; //contador de vueltas. 22/06/2011 Alejandro Quintero García Página 159 de 214 Diseño e implementación de un equipo de prácticas de control automático //////////////////////////////////////////////////////////////////////////////// // VARIABLES DE TIEMPO // //////////////////////////////////////////////////////////////////////////////// unsigned int32 time; unsigned int16 valorT3; unsigned int16 valorT0; //////////////////////////////////////////////////////////////////////////////// // VARIABLES DE CONTROL // //////////////////////////////////////////////////////////////////////////////// unsigned int32 REFPOS; unsigned int32 ERRPOS; unsigned long TM; unsigned int iter_max; unsigned int iter_count; unsigned int32 POS1_TM; unsigned int32 POS2_TM; unsigned int32 POSG_TM; unsigned int32 ERRPOS_TM_P; signed int32 ERRPOS_TM_k; signed int32 ERRPOS_TM_k_1; signed int32 ERRPOS_TM_k_2; unsigned int32 REFPOS_TM; unsigned int32 RES_iter; unsigned int32 RES_POS; unsigned int32 RES_ek; unsigned int32 RES_ek_1; unsigned int32 RES_ek_2; unsigned int32 RES_PWM; unsigned int32 RES_iter_max; unsigned int32 KCd; unsigned int32 KCn; unsigned int32 TDd; unsigned int32 TDn; unsigned int32 TId; unsigned int32 TIn; 22/06/2011 Alejandro Quintero García Página 160 de 214 Diseño e implementación de un equipo de prácticas de control automático float q0; float q1; float q2; float uk; float uk_1; //////////////////////////////////////////////////////////////////////////////// // VARIABLES DE ESTADO DEL MOTOR // //////////////////////////////////////////////////////////////////////////////// char MOVING; // A,H,P char MOVING_ANT; unsigned int PWM; //////////////////////////////////////////////////////////////////////////////// // VARIABLES DE ACTIVACION DEL ENCODER // //////////////////////////////////////////////////////////////////////////////// int8 active; int8 active2; int8 CTRL_POS; int8 encoder_mul; unsigned int16 PULSOS_VUELTA; //////////////////////////////////////////////////////////////////////////////// // VARIABLE DEL BUFFER // //////////////////////////////////////////////////////////////////////////////// int i; unsigned int8 envia_pak_GEN; char recbuf[Lenbuf]="000000000000"; int PACKET_ACTIVE; int TMPPA; unsigned int32 MEMORIA[161]; unsigned int BUFFER_GEN[32]; unsigned int32 varG32_1; unsigned int32 varG32_2; unsigned int32 varG32_3; unsigned int32 varG32_4; unsigned int16 varG16_1; unsigned int16 varG16_2; unsigned int8 varG8_1; unsigned int bloque_m; 22/06/2011 Alejandro Quintero García Página 161 de 214 Diseño e implementación de un equipo de prácticas de control automático //////////////////////////////////////////////////////////////////////////////// // INTERRUPCION DEL CAPTURADOR 2 // //////////////////////////////////////////////////////////////////////////////// #int_ccp2 HIGH void isr(){ if (active==1) {LH=LH+1;} else {LH=0;} if (active2==1) {if (MOVING=='H'){ENCount1++; if (ENCount1==PULSOS_VUELTA) {ENCount1=0; ENCount2++;} } if (MOVING=='A'){ENCount1--; if (ENCount1==0) {ENCount1=PULSOS_VUELTA; ENCount2--;} }} } //////////////////////////////////////////////////////////////////////////////// // INTERRUPCION DEL TEMPORIZADOR 0 // //////////////////////////////////////////////////////////////////////////////// #int_rtcc HIGH void clock_isr() { set_rtcc(valorT0);++time; //750 } //////////////////////////////////////////////////////////////////////////////// // RUTINAS DE ALMACENADO DE DATOS EN LOS BUFFERS 1/1.5/2us // //////////////////////////////////////////////////////////////////////////////// void almacena_BUFFER(unsigned int32 dato) { int ocupacion; ocupacion=BUFFER_GEN[2]; if (ocupacion==0) { BUFFER_GEN[4]=dato; dato=dato>>8; BUFFER_GEN[5]=dato; dato=dato>>8; BUFFER_GEN[6]=dato; 22/06/2011 Alejandro Quintero García Página 162 de 214 Diseño e implementación de un equipo de prácticas de control automático dato=dato>>8; BUFFER_GEN[7]=dato; BUFFER_GEN[2]=1; } if (ocupacion==1) { BUFFER_GEN[8]=dato; dato=dato>>8; BUFFER_GEN[9]=dato; dato=dato>>8; BUFFER_GEN[10]=dato; dato=dato>>8; BUFFER_GEN[11]=dato; BUFFER_GEN[2]=2; } if (ocupacion==2) { BUFFER_GEN[12]=dato; dato=dato>>8; BUFFER_GEN[13]=dato; dato=dato>>8; BUFFER_GEN[14]=dato; dato=dato>>8; BUFFER_GEN[15]=dato; BUFFER_GEN[2]=3; } if (ocupacion==3) { BUFFER_GEN[16]=dato; dato=dato>>8; BUFFER_GEN[17]=dato; dato=dato>>8; BUFFER_GEN[18]=dato; dato=dato>>8; BUFFER_GEN[19]=dato; BUFFER_GEN[2]=4; } if (ocupacion==4) { BUFFER_GEN[20]=dato; dato=dato>>8; BUFFER_GEN[21]=dato; dato=dato>>8; BUFFER_GEN[22]=dato; dato=dato>>8; BUFFER_GEN[23]=dato; BUFFER_GEN[2]=5; } if (ocupacion==5) { 22/06/2011 Alejandro Quintero García Página 163 de 214 Diseño e implementación de un equipo de prácticas de control automático BUFFER_GEN[24]=dato; dato=dato>>8; BUFFER_GEN[25]=dato; dato=dato>>8; BUFFER_GEN[26]=dato; dato=dato>>8; BUFFER_GEN[27]=dato; BUFFER_GEN[2]=6; } if (ocupacion==6) { BUFFER_GEN[28]=dato; dato=dato>>8; BUFFER_GEN[29]=dato; dato=dato>>8; BUFFER_GEN[30]=dato; dato=dato>>8; BUFFER_GEN[31]=dato; BUFFER_GEN[2]=7; envia_pak_GEN=1; } } void envia_paquete(int last,int instr) //3us + T.envio USB { if (instr>=1){BUFFER_GEN[0]=4; if (last==1) {BUFFER_GEN[1]=1;} if (last==0) {BUFFER_GEN[1]=0;} BUFFER_GEN[3]=instr; usb_put_packet(1,BUFFER_GEN,32,USB_DTS_TOGGLE); BUFFER_GEN[2]=0; envia_pak_GEN=0;} } void almacena_punto(unsigned int32 dato,int INSTR) { int oc; if (INSTR>1){oc=MEMORIA[0]; oc++; if (oc<=160){MEMORIA[oc]=dato;MEMORIA[0]=oc;}} } 22/06/2011 Alejandro Quintero García Página 164 de 214 Diseño e implementación de un equipo de prácticas de control automático void Reset_MEMORIA() //1us { int x; MEMORIA[0]=0; for (x=1;x<=160;x++){ MEMORIA[x]=0; } } void envia_bloque() { int i; int j; int z; if (bloque_m<23){z=((bloque_m-1)*7)+1; j=z+6; for (i=z;i<=j;i++){almacena_BUFFER(MEMORIA[z]);} envia_paquete(1,COMANDO);} if (bloque_m==23){z=((bloque_m-1)*7)+1; j=z+5; for (i=z;i<=j;i++){almacena_BUFFER(MEMORIA[z]);} envia_paquete(1,COMANDO);} } void inicializa_buffer_gen() { int x; BUFFER_GEN[0]=4; BUFFER_GEN[1]=1; BUFFER_GEN[2]=0; BUFFER_GEN[3]=0; for (x=4;x<=31;x++){ BUFFER_GEN[x]=0; } envia_pak_GEN=0; } //////////////////////////////////////////////////////////////////////////////// // INTERRUPCION DEL TEMPORIZADOR 3 //////////////////////////////////////////////////////////////////////////////// 22/06/2011 Alejandro Quintero García Página 165 de 214 Diseño e implementación de un equipo de prácticas de control automático /*#int_timer3 // Esta interrrupcion no se empleara en principicio. void wave_timer() { set_timer3(valorT3); }*/ //////////////////////////////////////////////////////////////////////////////// // RUTINA DE ESPERA TIEMPO DE MUESTREO //////////////////////////////////////////////////////////////////////////////// void inicializa_vBC(int j) { if (j==1){ RES_iter=0; RES_POS=0; RES_ek=0; RES_ek_1=0; RES_ek_2=0; RES_PWM=0; RES_iter_max=0; } if (j==2){ POSG_TM=0; ERRPOS_TM_P=0; ERRPOS_TM_k=0; ERRPOS_TM_k_1=0; ERRPOS_TM_k_2=0; REFPOS_TM=0; iter_max=0; iter_count=0; } } unsigned int32 esperaTM() { unsigned int32 pulsos; unsigned int32 time1; unsigned int32 time2; time1=time; active=1; time2=time1+TM; 22/06/2011 Alejandro Quintero García Página 166 de 214 Diseño e implementación de un equipo de prácticas de control automático do{ pulsos=LH; }while(time<=time2); active=0; return(pulsos); } void esperaTM_POS(int y) { unsigned int32 time1; unsigned int32 time2; int i; time1=time; time2=time1+TM; i=0; do{ if (i==0){POS1_TM=ENCount1; POS2_TM=ENCount2; POS1_TM=POS1_TM*360; POS1_TM=POS1_TM/PULSOS_VUELTA; POS2_TM=POS2_TM*360; POSG_TM=POS1_TM+POS2_TM; if (y==1){almacena_punto(POSG_TM,COMANDO);} ERRPOS_TM_k_2=ERRPOS_TM_k_1; ERRPOS_TM_k_1=ERRPOS_TM_k; if (REFPOS>POSG_TM){ERRPOS_TM_k =REFPOS_TM-POSG_TM;} uk=uk_1+q0*ERRPOS_TM_k+q1*ERRPOS_TM_k_1+q2*ERRPOS_TM_k_2; uk_1=uk;} i++; if (i==250){i=1;} }while(time<=time2); } //////////////////////////////////////////////////////////////////////////////// // RUTINA DE ESPERA //////////////////////////////////////////////////////////////////////////////// 22/06/2011 Alejandro Quintero García Página 167 de 214 Diseño e implementación de un equipo de prácticas de control automático /*void espera() { unsigned int32 time1; time1=time+TM; do{ }while(time<=time1); } */ //////////////////////////////////////////////////////////////////////////////// // RUTINAS DE CONVERSION //////////////////////////////////////////////////////////////////////////////// int convert(char k) { if (k=='0') {return (0);} if (k=='1') {return (1);} if (k=='2') {return (2);} if (k=='3') {return (3);} if (k=='4') {return (4);} if (k=='5') {return (5);} if (k=='6') {return (6);} if (k=='7') {return (7);} if (k=='8') {return (8);} if (k=='9') {return (9);} } char desconvert(int k) { if (k==0) {return ('0');} if (k==1) {return ('1');} if (k==2) {return ('2');} if (k==3) {return ('3');} if (k==4) {return ('4');} if (k==5) {return ('5');} if (k==6) {return ('6');} if (k==7) {return ('7');} if (k==8) {return ('8');} if (k==9) {return ('9');} } //////////////////////////////////////////////////////////////////////////////// // RUTINAS DEL CALCULO DE VELOCIDAD 22/06/2011 Alejandro Quintero García Página 168 de 214 Diseño e implementación de un equipo de prácticas de control automático //////////////////////////////////////////////////////////////////////////////// long encoder_pulsos_bc() { long RPM; active=1; //esperaTM(); active=0; RPM=LH; return(RPM); } //////////////////////////////////////////////////////////////////////////////// // DESEMPAQUETADO DE LOS DATOS RECIBIDOS //////////////////////////////////////////////////////////////////////////////// void decodificar() { INT dec; INT UNIDAD; unsigned int32 aux; unsigned int32 cant1; unsigned int32 cant2; unsigned int32 cant3; unsigned int32 cant4; unsigned int32 cant5; unsigned int32 cant6; unsigned int32 cant7; unsigned int32 cant8; unsigned int32 cant9; unsigned int32 cant10; UNIDAD=convert(recbuf[2]); DEC=convert(recbuf[1]); COMANDO=DEC*10+UNIDAD; COMANDO_S=convert(recbuf[3]); if (recbuf[0]=='L'){ cant1=convert(recbuf[4]); cant2=convert(recbuf[5]); cant3=convert(recbuf[6]); cant4=convert(recbuf[7]); cant5=convert(recbuf[8]); cant6=convert(recbuf[9]); 22/06/2011 Alejandro Quintero García Página 169 de 214 Diseño e implementación de un equipo de prácticas de control automático cant7=convert(recbuf[10]); cant8=convert(recbuf[11]); cant9=convert(recbuf[12]); cant10=convert(recbuf[13]); aux=(cant1*1000000000)+(cant2*100000000); aux=aux+(cant3*10000000)+(cant4*1000000); aux=aux+(cant5*100000)+(cant6*10000); aux=aux+(cant7*1000)+(cant8*100); aux=aux+(cant9*10)+(cant10); varG32_1=aux; } if (recbuf[0]=='C'){ cant6=convert(recbuf[9]); cant7=convert(recbuf[10]); cant8=convert(recbuf[11]); cant9=convert(recbuf[12]); cant10=convert(recbuf[13]); aux=(cant6*10000)+(cant7*1000)+(cant8*100); aux=aux+(cant9*10)+(cant10); varG16_1=aux; } if (recbuf[0]=='X'){ cant8=convert(recbuf[11]); cant9=convert(recbuf[12]); cant10=convert(recbuf[13]); aux=(cant8*100)+(cant9*10)+(cant10); varG8_1=aux; } if (recbuf[0]=='T'){ cant6=convert(recbuf[9]); cant7=convert(recbuf[10]); cant8=convert(recbuf[11]); cant9=convert(recbuf[12]); cant10=convert(recbuf[13]); aux=(cant6*10000)+(cant7*1000)+(cant8*100); aux=aux+(cant9*10)+(cant10); varG16_1=aux; cant6=convert(recbuf[4]); cant7=convert(recbuf[5]); cant8=convert(recbuf[6]); cant9=convert(recbuf[7]); cant10=convert(recbuf[8]); aux=(cant6*10000)+(cant7*1000)+(cant8*100); aux=aux+(cant9*10)+(cant10); 22/06/2011 Alejandro Quintero García Página 170 de 214 Diseño e implementación de un equipo de prácticas de control automático varG16_2=aux; } } //////////////////////////////////////////////////////////////////////////////// // RUTINA DE DIRECCION //////////////////////////////////////////////////////////////////////////////// void cambia_direccion() { char C; if (MOVING=='A') {C='H';} if (MOVING=='H') {C='A';} switch (C){ case 'A':ACTIVAR_FRENO; ACTIVAR_DIR_ANTIHORARIA; DESACTIVAR_FRENO; MOVING='A'; case 'H':ACTIVAR_FRENO; ACTIVAR_DIR_HORARIA; DESACTIVAR_FRENO; MOVING='H'; } } void direccion(char C) { switch (C){ case 'A':if (C=='A'){if (MOVING=='H'){ACTIVAR_FRENO; ACTIVAR_DIR_ANTIHORARIA; DESACTIVAR_FRENO; MOVING='A';}} case 'H':if (C=='H'){if (MOVING=='A'){ ACTIVAR_FRENO; ACTIVAR_DIR_HORARIA; DESACTIVAR_FRENO; MOVING='H';}} 22/06/2011 Alejandro Quintero García Página 171 de 214 Diseño e implementación de un equipo de prácticas de control automático } } //////////////////////////////////////////////////////////////////////////////// // RUTINAS DE BUCLE CERRADO //////////////////////////////////////////////////////////////////////////////// void euler() { float q_aux; float TDdd; float TDnn; float TIdd; float TInn; float KCdd; float KCnn; float T_aux; float TMm; TMm=TM; TDdd=TDd; TDnn=TDn; TIdd=TId; TInn=TIn; KCdd=KCd; KCnn=KCn; T_aux=TMm/1000; q_aux=TDnn/(TDdd*T_aux); q_aux=q_aux+1; q_aux=KCnn*q_aux; q0=q_aux/KCdd; q_aux=(T_aux*TIdd)/TInn; q_aux=q_aux-2*(TDnn/(TDdd*T_aux)); q_aux=q_aux-1; q1=q_aux*(KCnn/KCdd); q_aux=TDnn/(TDdd*T_aux); q2=q_aux*(KCnn/KCdd); } 22/06/2011 Alejandro Quintero García Página 172 de 214 Diseño e implementación de un equipo de prácticas de control automático void BC_posicion(int u) { unsigned int32 time3; unsigned int32 time4; int b; int fin; int xz; b=0; euler(); if (u==1){Reset_MEMORIA();} xz=TMPPA; uk_1=0; uk=0; RES_iter=0; RES_POS=0; REFPOS_TM=REFPOS; ERRPOS_TM_P=ERRPOS*(REFPOS_TM/100); RES_iter_max=0; RES_ek=0; RES_ek_1=0; RES_ek_2=0; RES_PWM=0; ERRPOS_TM_k_2=0; ERRPOS_TM_k_1=0; ERRPOS_TM_k=0; fin=1; iter_count=0; ENCount1=0; ENCount2=0; time=0; MOTOR(0); time=0; time3=time; time4=time3+TM; do{ if (b==0){ POS1_TM=ENCount1; POS2_TM=ENCount2; POS1_TM=POS1_TM*360; POS1_TM=POS1_TM/PULSOS_VUELTA; POS2_TM=POS2_TM*360; POSG_TM=POS1_TM+POS2_TM; ERRPOS_TM_k_2=ERRPOS_TM_k_1; ERRPOS_TM_k_1=ERRPOS_TM_k; if (REFPOS_TM>POSG_TM){ERRPOS_TM_k=REFPOS_TM-POSG_TM;} 22/06/2011 Alejandro Quintero García Página 173 de 214 Diseño e implementación de un equipo de prácticas de control automático uk=uk_1+q0*ERRPOS_TM_k+q1*ERRPOS_TM_k_1+q2*ERRPOS_TM_k_2; uk_1=uk; PWM=uk; if (uk>150){PWM=150;} MOTOR(PWM); iter_count++; if (u==1) {if (xz==1){almacena_punto(POSG_TM,COMANDO);xz=TMPPA;} if (xz>1){xz--;}}} b++; if (b==250){b=1;} }while(time<=time4); WHILE(fin) { if (ERRPOS_TM_k<ERRPOS_TM_P){ if (ERRPOS_TM_k_1<ERRPOS_TM_P){ if (ERRPOS_TM_k_2<ERRPOS_TM_P){fin=0;}}} if (iter_count==iter_max) {fin=0;} if (fin==1){if (xz==1){esperaTM_POS(1);xz=TMPPA;} if (xz>1){esperaTM_POS(0);xz--;} if (uk<0) {direccion('A'); PWM=-uk; if (uk<-150){PWM=150;} } if (uk>=0) {direccion('H'); PWM=uk; if (uk>150){PWM=150;}} MOTOR(PWM); iter_count++;} } RES_iter=iter_count; RES_POS=POSG_TM; RES_PWM=PWM; RES_iter_max=iter_max; if (ERRPOS_TM_k<0){RES_ek=-ERRPOS_TM_k;} if (ERRPOS_TM_k>=0){RES_ek=ERRPOS_TM_k;} if (ERRPOS_TM_k_1<0){RES_ek_1=-ERRPOS_TM_k_1;} if (ERRPOS_TM_k_1>=0){RES_ek_1=ERRPOS_TM_k_1;} if (ERRPOS_TM_k_2<0){RES_ek_2=-ERRPOS_TM_k_2;} if (ERRPOS_TM_k_2>=0){RES_ek_2=ERRPOS_TM_k_2;} ENCount1=0; ENCount2=0; time=0; 22/06/2011 Alejandro Quintero García Página 174 de 214 Diseño e implementación de un equipo de prácticas de control automático PWM=0; MOTOR(0); } //////////////////////////////////////////////////////////////////////////////// // INTERRUPCION DEL PUERTO SERIE // //////////////////////////////////////////////////////////////////////////////// #INT_RDA void RDA_isr() { apaga(LED0); delay_ms(500); Enciende(LED0); OCUPADO_UC; PWM=20; direccion('H'); COMANDO=ESCTENSION; } //////////////////////////////////////////////////////////////////////////////// // // M A I N // //////////////////////////////////////////////////////////////////////////////// void main(void) { // Mensaje de bienvenida!! // Enviamos el entero 1 al uC2 de tal forma que lo interpreta como un mensaje de // inicio o bienvenida putc(1); delay_ms(2000); int delante; int atras; int stop; int t; //unsigned int valor; int i; output_low(PIN_D6); 22/06/2011 Alejandro Quintero García Página 175 de 214 Diseño e implementación de un equipo de prácticas de control automático OUTPUT_LOW(PIN_D5); TMPPA=1; PACKET_ACTIVE=1; PULSOS_VUELTA=9000; //////////////////////////////////////////////////////////////////////////////// // INICIALIZACION DE VARIABLES DEL BC //////////////////////////////////////////////////////////////////////////////// ERRPOS=0; TM=0; REFPOS=0; iter_max=0; iter_count=0; POSG_TM=0; RES_PWM=0; RES_iter=0; RES_POS=0; RES_ek=0; RES_ek_1=0; RES_ek_2=0; RES_iter_max=0; ERRPOS_TM_P=0; ERRPOS_TM_k=0; ERRPOS_TM_k_1=0; ERRPOS_TM_k_2=0; REFPOS_TM=0; KCd=0; KCn=0; TDd=0; TDn=0; TId=0; TIn=0; //////////////////////////////////////////////////////////////////////////////// // RESTO DE INICIALIZACIONES //////////////////////////////////////////////////////////////////////////////// ENCount1=0; ENCount2=0; MOVING='H'; time=0; stop=0; delante=0; atras=0; 22/06/2011 Alejandro Quintero García Página 176 de 214 Diseño e implementación de un equipo de prácticas de control automático i=0; t=0; //valor=25; PWM=0; bloque_m=0; COMANDO=0; COMANDO_S=0; encoder_mul=1; active2=1; CTRL_POS=0; //////////////////////////////////////////////////////////////////////////////// // INICIALIZACION DE VARIABLES DE TIMER 0 (RTCC) //////////////////////////////////////////////////////////////////////////////// valorT0=64786; //1MS valorT3=64786; //////////////////////////////////////////////////////////////////////////////// // INICIALIZACION DE VARIABLES INTERNAS //////////////////////////////////////////////////////////////////////////////// varG32_1=0; varG32_2=0; varG32_3=0; varG32_4=0; varG16_1=0; varG16_2=0; varG8_1=0; //////////////////////////////////////////////////////////////////////////////// // ACTIVACION DEL CANAL DE CAPTURA (MC3486) Y ENCENDIDO DE LEDS //////////////////////////////////////////////////////////////////////////////// ENABLE_CANAL_A; Apaga(LED0); Apaga(LED1); Enciende(LED2); //////////////////////////////////////////////////////////////////////////////// // INICIALIZACION DEL LOS BUFFERS //////////////////////////////////////////////////////////////////////////////// inicializa_buffer_gen(); Reset_MEMORIA(); 22/06/2011 Alejandro Quintero García Página 177 de 214 Diseño e implementación de un equipo de prácticas de control automático //////////////////////////////////////////////////////////////////////////////// // CONFIGURACION DE LOS TEMPORIZADORES Y LOS CCPs //////////////////////////////////////////////////////////////////////////////// setup_timer_2(T2_DIV_BY_4, 149, 1); setup_timer_1(T1_INTERNAL); setup_counters( RTCC_INTERNAL, RTCC_DIV_16); //setup_timer_3 (T3_INTERNAL | T3_DIV_BY_8); setup_ccp1(CCP_PWM); setup_ccp2(CCP_CAPTURE_RE); set_pwm1_duty(PWM); //////////////////////////////////////////////////////////////////////////////// // INICIALIZACION DEL USB //////////////////////////////////////////////////////////////////////////////// usb_init(); usb_task(); usb_wait_for_enumeration(); //////////////////////////////////////////////////////////////////////////////// // CONFIGURACION DE LAS INTERRUPCIONES //////////////////////////////////////////////////////////////////////////////// enable_interrupts(INT_RTCC); enable_interrupts(INT_CCP2); Enciende(LED1); enable_interrupts(global); //disable_interrupts(INT_TIMER3); //////////////////////////////////////////////////////////////////////////////// // INICIO DEL BUCLE PRINCIPAL DEL CONTROLADOR //////////////////////////////////////////////////////////////////////////////// int flag=0; while (TRUE) { if(usb_enumerated()) { if(flag==0) { // Enviamos un 2 para indicar que el usb ha sido iniciado con éxito! putc(2); Apaga(LED2); 22/06/2011 Alejandro Quintero García Página 178 de 214 Diseño e implementación de un equipo de prácticas de control automático Enciende(LED0); flag=flag+1; } if (usb_kbhit(1)) { usb_get_packet(1, recbuf, Lenbuf); decodificar(); //enable_interrupts(INT_RDA); //enable_interrupts(global); switch (COMANDO){ case LISTO:OCUPADO_UC; //TRE:<1us LIBRE_UC; case DAR_TM:OCUPADO_UC; //TRE:<1us if (COMANDO==1){varG32_1=TM; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case SETBC:OCUPADO_UC; //TRE:<1us if (COMANDO==2){ iter_max=varG16_1; varG16_1=0; BC_posicion(1); } COMANDO=0; COMANDO_S=0; LIBRE_UC; case SETTM:OCUPADO_UC; //TRE:<1us if (COMANDO==3){TM=varG16_1; varG16_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case SETPIDKC:OCUPADO_UC; //TRE:<1us 22/06/2011 Alejandro Quintero García Página 179 de 214 Diseño e implementación de un equipo de prácticas de control automático if (COMANDO==4){KCd=varG16_1; KCn=varG16_2; varG16_1=0; varG16_2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case SETPIDTI:OCUPADO_UC; //TRE:<1us if (COMANDO==5){TId=varG16_1; TIn=varG16_2; varG16_1=0; varG16_2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case SETPIDTD:OCUPADO_UC; //TRE:<1us if (COMANDO==6){TDd=varG16_1; TDn=varG16_2; varG16_1=0; varG16_2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case LEEPOS:OCUPADO_UC; //TRE:7us+Tusb if (COMANDO==7){varG32_1=ENCount1; varG32_2=ENCount2; varG32_3=time; varG32_4=encoder_mul; almacena_BUFFER(varG32_1); almacena_BUFFER(varG32_2); almacena_BUFFER(varG32_3); almacena_BUFFER(varG32_4); envia_paquete(1,COMANDO); varG32_1=0; varG32_2=0; varG32_3=0; varG32_4=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ESCTENSION:OCUPADO_UC; //TRE:<1us 22/06/2011 Alejandro Quintero García Página 180 de 214 Diseño e implementación de un equipo de prácticas de control automático if (COMANDO==8) { PWM=varG8_1; if (COMANDO_S==0){direccion('H');set_pwm1_duty(PWM);} if (COMANDO_S==1){direccion('A');set_pwm1_duty(PWM);} putc(3); delay_us(30); if(varG8_1==0) { varG8_1=200; } putc(varG8_1); } varG8_1=0; COMANDO=0; COMANDO_S=0; LIBRE_UC; case LEEVEL:OCUPADO_UC; //TRE:20us+Tusb+TE if (COMANDO==9){varG32_1=esperaTM(); almacena_BUFFER(varG32_1); varG32_1=encoder_mul; almacena_BUFFER(varG32_1); varG32_1=TM; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case RESETEO_TOTAL:OCUPADO_UC; if (COMANDO==10){TIME=0; ENCount1=0; ENCount2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ESCREF:OCUPADO_UC; //TRE:<1us if (COMANDO==11){if (COMANDO_S==1) {REFPOS=varG32_1; varG32_1=0;}} COMANDO=0; COMANDO_S=0; LIBRE_UC; 22/06/2011 Alejandro Quintero García Página 181 de 214 Diseño e implementación de un equipo de prácticas de control automático case AJ_RELOJ:OCUPADO_UC; //TRE:<1us if (COMANDO==12){valorT0=varG16_1;varG16_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case STATUS_TIMERS:OCUPADO_UC; //TRE:<1us if (COMANDO==13){varG32_1=valorT0; varG32_2=valorT3; almacena_BUFFER(varG32_1); almacena_BUFFER(varG32_2); envia_paquete(1,COMANDO); varG32_1=0; varG32_2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ST_ERR_CONTROL:OCUPADO_UC; if (COMANDO==14){ varG32_1=RES_ek; almacena_BUFFER(varG32_1); varG32_1=RES_ek_1; almacena_BUFFER(varG32_1); varG32_1=RES_ek_2; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DAR_PWM:OCUPADO_UC; if (COMANDO==15){varG32_1=PWM; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DAR_REF_POS:OCUPADO_UC; if (COMANDO==16){varG32_1=REFPOS; almacena_BUFFER(varG32_1); 22/06/2011 Alejandro Quintero García Página 182 de 214 Diseño e implementación de un equipo de prácticas de control automático envia_paquete(1,COMANDO);} COMANDO=0; COMANDO_S=0; LIBRE_UC; case BUFFER_INIT:OCUPADO_UC; if (COMANDO==17){Reset_MEMORIA();} COMANDO=0; COMANDO_S=0; LIBRE_UC; case AJ_TIMER3:OCUPADO_UC; if (COMANDO==18){valorT3=varG16_1;VARg16_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ERROR_POS:OCUPADO_UC; //TRE:<1us if (COMANDO==19){ERRPOS=varG8_1; varG8_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case FRENO:OCUPADO_UC; //TRE:<1us if (COMANDO==20){ if (COMANDO_S==1){ACTIVAR_FRENO;MOVING_ANT=MOVING;MOVING='F';} if (COMANDO_S==2){DESACTIVAR_FRENO;MOVING=MOVING_ANT;}} COMANDO=0; COMANDO_S=0; LIBRE_UC; case AJ_ENCODER:OCUPADO_UC; if (COMANDO==21){ if (COMANDO_S==1) {setup_ccp2(CCP_CAPTURE_RE);PULSOS_VUELTA=9000;encoder_mul=1;} if (COMANDO_S==2) {setup_ccp2(CCP_CAPTURE_RE | {setup_ccp2(CCP_CAPTURE_RE | CCP_CAPTURE_DIV_4);PULSOS_VUELTA=2250;encoder_mul=4;} if (COMANDO_S==3) CCP_CAPTURE_DIV_16);PULSOS_VUELTA=563;encoder_mul=16;}} COMANDO=0; COMANDO_S=0; LIBRE_UC; 22/06/2011 Alejandro Quintero García Página 183 de 214 Diseño e implementación de un equipo de prácticas de control automático case CONF_INT_TIMER0:OCUPADO_UC; //TRE:<1us if (COMANDO==22){ if (COMANDO_S==1){enable_interrupts(INT_RTCC);} if (COMANDO_S==2){disable_interrupts(INT_RTCC);}} COMANDO=0; COMANDO_S=0; LIBRE_UC; case BUFFER_INIT_GEN:OCUPADO_UC; if (COMANDO==23){inicializa_buffer_gen();} COMANDO=0; COMANDO_S=0; LIBRE_UC; case CONF_INT_TIMER3:OCUPADO_UC; //TRE:<1us if (COMANDO==24){ if (COMANDO_S==1){enable_interrupts(INT_TIMER3);} if (COMANDO_S==2){disable_interrupts(INT_TIMER3);}} COMANDO=0; COMANDO_S=0; LIBRE_UC; case CONF_INT_CCP2:OCUPADO_UC; //TRE:<1us if (COMANDO==25){ if (COMANDO_S==1){enable_interrupts(INT_CCP2);Enciende(LED1);} if (COMANDO_S==2){disable_interrupts(INT_CCP2);Apaga(LED1);}} COMANDO=0; COMANDO_S=0; LIBRE_UC; case RESETEO_RELOJ:OCUPADO_UC; if (COMANDO==26){TIME=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case RESETEO_CONT_POS:OCUPADO_UC; if (COMANDO==27){ENCount1=0; ENCount2=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case TM_POR_PUNTO:OCUPADO_UC; //TRE:<1us 22/06/2011 Alejandro Quintero García Página 184 de 214 Diseño e implementación de un equipo de prácticas de control automático if (COMANDO==28){TMPPA=varG8_1;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DAR_ERR_POS:OCUPADO_UC; if (COMANDO==29){varG32_1=ERRPOS; almacena_BUFFER(varG32_1); varG32_1=ERRPOS_TM_P; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DAR_ITER_MAX:OCUPADO_UC; if (COMANDO==30){varG32_1=RES_iter_max; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ACTIVA_INT_GLOBAL:OCUPADO_UC; if (COMANDO==31){ enable_interrupts(INT_RTCC); enable_interrupts(INT_CCP2); enable_interrupts(INT_TIMER3);} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DESACTIVA_INT_GLOBAL:OCUPADO_UC; if (COMANDO==32){ disable_interrupts(INT_RTCC); disable_interrupts(INT_CCP2); disable_interrupts(INT_TIMER3);} COMANDO=0; COMANDO_S=0; LIBRE_UC; case DAR_RES_ITER:OCUPADO_UC; if (COMANDO==33){varG32_1=RES_iter; 22/06/2011 Alejandro Quintero García Página 185 de 214 Diseño e implementación de un equipo de prácticas de control automático almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case ESTATUS_PID:OCUPADO_UC; if (COMANDO==34){varG32_1=KCn; almacena_BUFFER(varG32_1); varG32_1=KCd; almacena_BUFFER(varG32_1); varG32_1=TDn; almacena_BUFFER(varG32_1); varG32_1=TDd; almacena_BUFFER(varG32_1); varG32_1=TIn; almacena_BUFFER(varG32_1); varG32_1=TId; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; LIBRE_UC; case RECUPERA_M:OCUPADO_UC; if (COMANDO==35){bloque_m=varG8_1; envia_bloque(); varG8_1=0; } COMANDO=0; COMANDO_S=0; LIBRE_UC; case EST_CONTROL:OCUPADO_UC; if (COMANDO==36){ varG32_1=RES_POS; almacena_BUFFER(varG32_1); varG32_1=RES_PWM; almacena_BUFFER(varG32_1); envia_paquete(1,COMANDO); varG32_1=0;} COMANDO=0; COMANDO_S=0; 22/06/2011 Alejandro Quintero García Página 186 de 214 Diseño e implementación de un equipo de prácticas de control automático LIBRE_UC; default :LIBRE_UC; } } } else{ Apaga(LED1); Enciende(LED2); } } } 8.3 Código del microcontrolador secundario. //////////////////////////////////////////////////////////////////////////////// //// //// //// FIRMWARE DEL PIC18F4685 PARA LA PLACA PROTOTIPO DEL PFC //// //// //// //// Modificado por Alejandro Quintero García '11 //// //// //// //////////////////////////////////////////////////////////////////////////////// #include <18f4685.h> #DEVICE HIGH_INTS=TRUE #device adc=10 #fuses NOWDT,NOPROTECT,HS,MCLR #use delay(clock=20M) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) #include <ks0108b_mio.c> #include "graphics.c" #include "math.h" #include "float.h" #include "stdlib.h" #include "stdio.h" //////////////////////////////////////////////////////////////////////////////// // Variables Globales // //////////////////////////////////////////////////////////////////////////////// 22/06/2011 Alejandro Quintero García Página 187 de 214 Diseño e implementación de un equipo de prácticas de control automático int32 valor; int32 volt; int condicion; const int8 inicio[64][16] = { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x03 , 0xFF , 0xFF , 0xC0 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF0 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x03 , 0xFF , 0xFF , 0xC0 , 0x0F , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x07 , 0xFF , 0xFF , 0x00 , 0x01 , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x07 , 0xFF , 0xFC , 0x00 , 0x00 , 0x7F , 0xFF , 0xE0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x0F , 0xFF , 0xF8 , 0x00 , 0x00 , 0x3F , 0xFF , 0xE0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x0F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0xFF , 0xF0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0xC0 , 0x03 , 0x00 , 0x0F , 0xFF , 0xF0, 22/06/2011 Alejandro Quintero García Página 188 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0xC0 , 0x1F , 0xF0 , 0x07 , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0x80 , 0x7F , 0xFC , 0x03 , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFF , 0x01 , 0xFF , 0xFE , 0x03 , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFF , 0x03 , 0xFF , 0xFF , 0x01 , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFE , 0x03 , 0xFF , 0xFF , 0x81 , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFE , 0x07 , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFE , 0x0F , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xE0 , 0xFF , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xF8 , 0x00 , 0x07 , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFC , 0x00 , 0x0F , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFE , 0x00 , 0x1F , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0x00 , 0x3F , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0x80 , 0x7F , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xE1 , 0xFF , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xF3 , 0xFF , 0xFE, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFE , 0x07 , 0xFF , 0xFF , 0xFB , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x7F , 0xFE , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFE , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFF , 0x01 , 0xFF , 0xFE , 0x7F , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFF , 0x00 , 0xFF , 0xFC , 0x3F , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0x80 , 0x7F , 0xF8 , 0x1F , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 22/06/2011 Alejandro Quintero García Página 189 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x1F , 0xFF , 0xC0 , 0x1F , 0xE0 , 0x0F , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0xFF , 0xF0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x0F , 0xFF , 0xF0 , 0x00 , 0x00 , 0x3F , 0xFF , 0xF0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x0F , 0xFF , 0xF8 , 0x00 , 0x00 , 0x7F , 0xFF , 0xF0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x07 , 0xFF , 0xFE , 0x00 , 0x01 , 0xFF , 0xFF , 0xE0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x07 , 0xFF , 0xFF , 0x80 , 0x03 , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x03 , 0xFF , 0xFF , 0xF0 , 0x1F , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x07 , 0xFF , 0xFF , 0xE0 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, }; 22/06/2011 Alejandro Quintero García Página 190 de 214 Diseño e implementación de un equipo de prácticas de control automático const int8 stop[64][16] = { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x3F , 0xFF , 0xFF , 0xFC , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00, 0x00 , 0x00 , 0x20 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00, 0x00 , 0x00 , 0x30 , 0x60 , 0x04 , 0x00 , 0x00 , 0x00, 0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x30 , 0x60 , 0x04 , 0x00 , 0x00 , 0x00, 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00, 0x00 , 0x00 , 0x28 , 0xA3 , 0xCF , 0x3C , 0x58 , 0x00, 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80, 0x00 , 0x00 , 0x28 , 0xA4 , 0x24 , 0x42 , 0x60 , 0x00, 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x28 , 0xA4 , 0x24 , 0x42 , 0x40 , 0x00, 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0, 0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00, 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0, 0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00, 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8, 0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00, 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x22 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00, 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x22 , 0x23 , 0xC7 , 0x3C , 0x40 , 0x00, 0x3F , 0x03 , 0xC0 , 0x07 , 0xC0 , 0xFE , 0x00 , 0xFC, 22/06/2011 Alejandro Quintero García Página 191 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3E , 0x01 , 0xC0 , 0x07 , 0x80 , 0x7E , 0x00 , 0x7C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x00 , 0xC0 , 0x07 , 0x00 , 0x3E , 0x00 , 0x3C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x70 , 0xFC , 0x7F , 0x0C , 0x3E , 0x3E , 0x1C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x78 , 0xFC , 0x7F , 0x1E , 0x3E , 0x3F , 0x1C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x7F , 0xFC , 0x7E , 0x1E , 0x1E , 0x3F , 0x1C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x7F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0x1C, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x3F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0x1C, 0x00 , 0x07 , 0xF0 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00, 0x3E , 0x0F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3E , 0x1C, 0x00 , 0x04 , 0x08 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00, 0x3E , 0x07 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0x3C, 0x00 , 0x04 , 0x08 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00, 0x3F , 0x81 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0x7C, 0x00 , 0x04 , 0x08 , 0xF1 , 0x67 , 0x87 , 0x47 , 0x80, 0x3F , 0xE1 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0xFC, 0x00 , 0x04 , 0x09 , 0x09 , 0x88 , 0x48 , 0xC8 , 0x40, 0x3F , 0xF0 , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC, 0x00 , 0x07 , 0xF0 , 0x09 , 0x00 , 0x48 , 0x48 , 0x40, 0x3F , 0xF8 , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC, 0x00 , 0x04 , 0x00 , 0x79 , 0x03 , 0xC8 , 0x48 , 0x40, 0x3F , 0xF8 , 0x7C , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC, 0x00 , 0x04 , 0x00 , 0x89 , 0x04 , 0x48 , 0x48 , 0x40, 0x3F , 0xFC , 0x7C , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC, 0x00 , 0x04 , 0x01 , 0x09 , 0x08 , 0x48 , 0x48 , 0x40, 0x38 , 0xFC , 0x7C , 0x7E , 0x1E , 0x1E , 0x3F , 0xFC, 0x00 , 0x04 , 0x01 , 0x19 , 0x08 , 0xC8 , 0xC8 , 0x40, 0x38 , 0xFC , 0x7C , 0x7F , 0x1E , 0x3E , 0x3F , 0xFC, 0x00 , 0x04 , 0x00 , 0xE9 , 0x07 , 0x47 , 0x47 , 0x80, 0x38 , 0x78 , 0xFC , 0x7F , 0x0C , 0x3E , 0x3F , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3C , 0x00 , 0xFC , 0x7F , 0x00 , 0x3E , 0x3F , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3E , 0x01 , 0xFC , 0x7F , 0x80 , 0x7E , 0x3F , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0x03 , 0xFC , 0x7F , 0xC0 , 0xFE , 0x3F , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 22/06/2011 Alejandro Quintero García Página 192 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x3F , 0xFF , 0xFF , 0xFC , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }; const int8 imagen3[64][16] = { 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF, 22/06/2011 Alejandro Quintero García Página 193 de 214 Diseño e implementación de un equipo de prácticas de control automático 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x00 , 0x00 , 0x1F , 0xE0 , 0x00 , 0x00 , 0x03, 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF9, 0x80 , 0x00 , 0x00 , 0x3F , 0xF8 , 0x00 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0xFF , 0xFC , 0x00 , 0x00 , 0x02, 0xFF , 0x00 , 0x00 , 0x20 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x01 , 0xFF , 0xFE , 0x00 , 0x00 , 0x02, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x01 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02, 0x80 , 0x1D , 0x21 , 0x25 , 0xC3 , 0xC0 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x23 , 0x21 , 0x26 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xFF , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x23 , 0x23 , 0x26 , 0x24 , 0x20 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xFF , 0x1D , 0x1D , 0x25 , 0xC3 , 0xC0 , 0x00 , 0x09, 0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02, 0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x01 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02, 0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0xFF , 0xFE , 0x00 , 0x00 , 0x02, 0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0xFF , 0xFC , 0x00 , 0x00 , 0x02, 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x7F , 0xF8 , 0x00 , 0x00 , 0x02, 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x1F , 0xF0 , 0x00 , 0x00 , 0x02, 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x74 , 0x78 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x8C , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 22/06/2011 Alejandro Quintero García Página 194 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x84 , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x84 , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x8C , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x74 , 0x78 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x80 , 0x00 , 0x40 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xB8 , 0xB3 , 0xC3 , 0xCF , 0x47 , 0x87 , 0x87 , 0x89, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xC4 , 0xC4 , 0x24 , 0x24 , 0x48 , 0x48 , 0x48 , 0x49, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x80 , 0x24 , 0x04 , 0x48 , 0x00 , 0x48 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x81 , 0xE4 , 0x04 , 0x48 , 0x03 , 0xC6 , 0x09, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x82 , 0x24 , 0x04 , 0x48 , 0x04 , 0x41 , 0x89, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x84 , 0x84 , 0x24 , 0x04 , 0x48 , 0x08 , 0x40 , 0x49, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xC4 , 0x84 , 0x64 , 0x24 , 0x48 , 0x48 , 0xC8 , 0x49, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0xB8 , 0x83 , 0xA3 , 0xC7 , 0x47 , 0x87 , 0x47 , 0x89, 0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 22/06/2011 Alejandro Quintero García Página 195 de 214 Diseño e implementación de un equipo de prácticas de control automático 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03, 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF9, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x00 , 0x00 , 0x00 , 0x07 , 0xFF , 0xC0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x87 , 0xE0 , 0x00 , 0x00 , 0x7F , 0xFF , 0xF0 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x87 , 0xF0 , 0x00 , 0x07 , 0xFF , 0xFF , 0xFC , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x87 , 0xF0 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x83 , 0xF8 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFE , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x83 , 0xFF , 0xFF , 0xFF , 0xFF , 0xF1 , 0xFF , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x81 , 0xFF , 0xFF , 0xFF , 0xFC , 0x00 , 0x7F , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x81 , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00 , 0x3F , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x7F , 0xFF , 0xFC , 0x00 , 0x00 , 0x3F , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x3F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0x80, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x03 , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01, 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF, 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE }; //////////////////////////////////////////////////////////////////////////////// // Funciones auxiliares // //////////////////////////////////////////////////////////////////////////////// void glcd_inicio() 22/06/2011 Alejandro Quintero García Página 196 de 214 Diseño e implementación de un equipo de prácticas de control automático { char i,j; signed char k; for( i = 0 ; i < 64 ; i ++ ) { for( j = 0 ; j < 16 ; j ++) { for(k=7;k>-1;k--) { if( bit_test(inicio[i][j] ,7-k )) glcd_pixel( j*8+k,i, ON ); } } } glcd_update(); } void glcd_imagen() { char i,j; signed char k; for( i = 0 ; i < 64 ; i ++ ) { for( j = 0 ; j < 16 ; j ++) { for(k=7;k>-1;k--) { if( bit_test(imagen3[i][j] ,7-k )) glcd_pixel( j*8+k,i, ON ); } } } glcd_update(); } void glcd_imagen2() { char i,j; signed char k; for( i = 0 ; i < 64 ; i ++ ) { for( j = 0 ; j < 16 ; j ++) { 22/06/2011 Alejandro Quintero García Página 197 de 214 Diseño e implementación de un equipo de prácticas de control automático for(k=7;k>-1;k--) { if( bit_test(stop[i][j] ,7-k )) glcd_pixel( j*8+k,i, ON ); } } } glcd_update(); } void glcd_imagen_N() { char i,j; signed char k; for( i = 0 ; i < 64 ; i ++ ) { for( j = 0 ; j < 16 ; j ++) { for(k=7;k>-1;k--) { if( bit_test(~imagen3[i][j] ,7-k )) glcd_pixel( j*8+k,i, ON ); } } } glcd_update(); } //////////////////////////////////////////////////////////////////////////////// // Interrupciones // //////////////////////////////////////////////////////////////////////////////// #INT_RDA void RDA_isr() { output_toggle(PIN_E1); valor=GETC(); delay_us(40); volt=0; condicion=1; if(valor==3) { 22/06/2011 Alejandro Quintero García Página 198 de 214 Diseño e implementación de un equipo de prácticas de control automático condicion=0; disable_interrupts(INT_RDA); while(volt<1) //while(kbhit()) {volt=GETC();} delay_us(40); if(volt==200){valor=90;} enable_interrupts(INT_RDA); } output_toggle(PIN_E1); // led } //////////////////////////////////////////////////////////////////////////////// // Funcion Principal // //////////////////////////////////////////////////////////////////////////////// void main() { //////////////////////////////////////////////////////////////////////////////// // Inicialización parámetros del micro // //////////////////////////////////////////////////////////////////////////////// // setup_adc_ports(sAN0|VSS_VDD); setup_adc_ports(AN0|VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); char dato1[10]; char dato4[]="USB OK!"; float val; int32 lectura; float ADC; char datoadc[20]; glcd_init(ON); //Iniciamos la lcd glcd_fillScreen(0); //LIMPIAMOS LA PANTALLA glcd_update(); output_toggle(PIN_E1); glcd_imagen(); 22/06/2011 Alejandro Quintero García Página 199 de 214 Diseño e implementación de un equipo de prácticas de control automático glcd_update(); delay_ms(2000); output_toggle(PIN_E1); while(1) { switch (valor) { case 90:glcd_fillScreen(0); glcd_update(); glcd_imagen2(); glcd_update(); output_toggle(PIN_E1); valor = 99 ; break; case 1:glcd_fillScreen(0); glcd_update(); glcd_imagen(); valor = 99; break; case 2:glcd_fillScreen(0); glcd_text57(20,117, dato4, 1, 1); glcd_imagen(); glcd_update(); output_toggle(PIN_E1); delay_ms(500); output_toggle(PIN_E1); delay_ms(500); output_toggle(PIN_E1); delay_ms(500); output_toggle(PIN_E1); delay_ms(2000); putc(1); valor = 99; break; case 3:glcd_fillScreen(0); glcd_inicio(); 22/06/2011 Alejandro Quintero García Página 200 de 214 Diseño e implementación de un equipo de prácticas de control automático glcd_update(); while(condicion=1) { if(val==32) { break; } val=volt*0.16; sprintf(dato1,"IN %fV",val); // glcd_text57(2,2, dato1, 1, 1); // glcd_update(); // Leemos el ADC set_adc_channel(0); delay_us(50); lectura=read_adc(); ADC=(float)lectura; ADC=ADC/1023*5; ADC=ADC*24/3.73; sprintf(datoadc,"OUT %fV",ADC); glcd_bar(64, 1, 127, 1, 80, 0); glcd_text57(66,10, dato1, 1,1); glcd_text57(66,30, datoadc, 1, 1); if(val!=32)glcd_update(); output_toggle(PIN_E1); delay_ms(150); } valor=99; if(val==32)valor=90; volt=0; val=0; break; } } } 22/06/2011 Alejandro Quintero García Página 201 de 214 Diseño e implementación de un equipo de prácticas de control automático 8.4 Librería GLCD. ///////////////////////////////////////////////////////////////////////// // Conexiones de pines del GLCD (Con chipset K0108) // // 1: CS1 <-> B1 // 2: CS1 <-> B0 // 6: R/S <-> B2 // 7: R/W // 8: E // // // // // // // <-> B3 // <-> B4 // 9..16: D0..D7 <-> D0..D7 // 17: Reset <-> B5 // // // // Los valores pueden cambiarse con los DEFINE que están más abajo // //---------------------------------------------------------------------// // > GLCD_limpiar(color) // // "Borra" la pantala, llenando la del color seleccionado. // // color = 0 : puntos apagados // // color = 1 : puntos encendidos // // // // > GLCD_RAM2LCD() // // Vuelca el contenido de la RAM a la pantalla. // // solo funciona si FAST_GLCD está definido. // //---------------------------------------------------------------------// // > GLCD_inicializa(modo) // // Inicializa el GLCD, y debe llamarse ANTES de cualquier otra. // modo = 0 : GLCD en ON // // modo = 1 : GLCD en OFF // // // // // EN LAS SIGUIENTES FUNCIONES, SIEMPRE SE RESPETA QUE: // color = 0 : puntos apagados // // color = 1 : puntos encendidos // // // // > GLCD_punto(x,y,color) // // Dibuja un punto en x,y. 0,0 es la esquina superior izquierda. // // // Dibuja una linea desde (x1,y1) a (x2,y2) // // // >GLCD_rectangulo (x1,y1,x2,y2,color) // // Dibuja un rectangulo con esquinas en (x1,y1) y (x2,y2) // // >GLCD_caja (x1,y1,x2,y2,color) // // // > GLCD_linea(x1,y1,x2,y2,color) // // // // // 22/06/2011 Alejandro Quintero García Página 202 de 214 Diseño e implementación de un equipo de prácticas de control automático // Dibuja un rectangulo pintado con esquinas en (x1,y1) y (x2,y2) // // // // >GLCD_circulo (x1,y1,r,color) // // Dibuja un circulo con centro en (x1,y1) y radio R // // // ///////////////////////////////////////////////////////////////////////// //Pines a usar #define GLCD_CS1 PIN_E2 #define GLCD_CS2 PIN_E1 #define GLCD_DI #define GLCD_RW #define GLCD_E PIN_C3 PIN_C2 PIN_C1 #define GLCD_RESET PIN_E0 //Lados del GLCD #define GLCD_lado_CS1 0 #define GLCD_lado_CS2 1 BYTE GLCD_leeBYTE(int1 lado); //----------------------------------------------------------------------//Escribe un byte en una de las mitades de la pantalla (lado=0:izq Lado=1:der) //----------------------------------------------------------------------void GLCD_enviaBYTE(int1 lado, BYTE dato) { if(lado) output_high(GLCD_CS2); // Selecciono la mitad correspondiente else output_high(GLCD_CS1); output_low(GLCD_RW); output_d(dato); delay_us(1); // Coloco el dato en el puerto y... // ...espero. output_high(GLCD_E); delay_us(2); // Modo escritura // Pongo el bit Enable en alto y... // ...espero. output_low(GLCD_E); // Pongo el bit Enable en bajo. output_low(GLCD_CS1); // Libero la linea CS1 y... output_low(GLCD_CS2); // CS2. } //----------------------------------------------------------------------// Lee un byte de una de las dos mitades de la pantalla 22/06/2011 Alejandro Quintero García Página 203 de 214 Diseño e implementación de un equipo de prácticas de control automático //----------------------------------------------------------------------BYTE GLCD_leeBYTE(int1 lado) { BYTE dato; set_tris_d(0xFF); // Puerto D como entrada output_high(GLCD_RW); // GLCD en Modo lectura // Selecciono la mitad del display a leer. if(lado) output_high(GLCD_CS2); else output_high(GLCD_CS1); delay_us(1); // Espero... output_high(GLCD_E); delay_us(2); // Pongo en alto el pin enable y... // ...espero. dato = input_d(); // Guardo en "dato" el valor devuelto y... output_low(GLCD_E); // ...pongo en bajo el pin enable. // Vuelvo a poner en bajo las lineas CS1 y CS2. output_low(GLCD_CS1); output_low(GLCD_CS2); return dato; } //----------------------------------------------------------------------// Limpia el GLCD (pinta toda la pantalla de un color) //----------------------------------------------------------------------void GLCD_limpiar(int1 color) { int8 i, j; // Recorre las 8 paginas (vertical) for(i = 0; i < 8; ++i) { output_low(GLCD_DI); // Modo instruccion //Comienzo, en cada página, desde la dirección 0 GLCD_enviaBYTE(GLCD_lado_CS1, 0b01000000); GLCD_enviaBYTE(GLCD_lado_CS2, 0b01000000); //Selecciono la direccion dentro de la pagina GLCD_enviaBYTE(GLCD_lado_CS1, i | 0b10111000); GLCD_enviaBYTE(GLCD_lado_CS2, i | 0b10111000); 22/06/2011 Alejandro Quintero García Página 204 de 214 Diseño e implementación de un equipo de prácticas de control automático output_high(GLCD_DI); // Modo datos // Recorre las dos mitades (horizontales) for(j = 0; j < 64; ++j) { GLCD_enviaBYTE(GLCD_lado_CS1, 0xFF * color); // Enciende/apaga pixeles GLCD_enviaBYTE(GLCD_lado_CS2, 0xFF * color); // Enciende/apaga pixeles } } } //----------------------------------------------------------------------//Esta funcion inicializa el LCD. //----------------------------------------------------------------------void GLCD_inicializa(int1 modo) { // Pone los pines de control en el estado correcto. output_high(GLCD_RESET); output_low(GLCD_E); output_low(GLCD_CS1); output_low(GLCD_CS2); output_low(GLCD_DI); // Modo instruccion // Envio datos de inicialización ----------------------GLCD_enviaBYTE(GLCD_lado_CS1, 0xC0); GLCD_enviaBYTE(GLCD_lado_CS2, 0xC0); GLCD_enviaBYTE(GLCD_lado_CS1, 0x40); GLCD_enviaBYTE(GLCD_lado_CS2, 0x40); GLCD_enviaBYTE(GLCD_lado_CS1, 0xB8); GLCD_enviaBYTE(GLCD_lado_CS2, 0xB8); // Si modo = 1 inicializa encendido. Sino, apagado. if(modo == 1) { GLCD_enviaBYTE(GLCD_lado_CS1, 0x3F); // Enciendo el GLCD GLCD_enviaBYTE(GLCD_lado_CS2, 0x3F); } else { GLCD_enviaBYTE(GLCD_lado_CS1, 0x3E); // Apago el GLCD GLCD_enviaBYTE(GLCD_lado_CS2, 0x3E); } // Borro la pantalla GLCD_limpiar(0); } 22/06/2011 Alejandro Quintero García Página 205 de 214 Diseño e implementación de un equipo de prácticas de control automático //----------------------------------------------------------------------// Dibuja un pixel //----------------------------------------------------------------------void GLCD_punto(int8 x, int8 y, int1 color) { BYTE dato; int1 lado = GLCD_lado_CS1; // Lado en que voy a dibujar. if(x > 63) // Veo si cae del otro lado { x -= 64; lado = GLCD_lado_CS2;} output_low(GLCD_DI); // Modo instruccion bit_clear(x,7); // Limpio bit MSB... bit_set(x,6); // ...y pongo el bit 6 en 1 GLCD_enviaBYTE(lado, x); //Envio la dirección de la coordenada X // Calculo en que pagina de las 8 cae... GLCD_enviaBYTE(lado, (y/8 & 0xBF) | 0xB8); output_high(GLCD_DI); // ...y paso a Modo datos //Se necesitan dos lecturas para que devuelva el dato en la nueva direccion GLCD_leeBYTE(lado); dato = GLCD_leeBYTE(lado); //De acuerdo al valor de color... if(color == 1) bit_set(dato, y%8); else // Enciendo el pixel bit_clear(dato, y%8); // apago el pixel output_low(GLCD_DI); GLCD_enviaBYTE(lado, x); output_high(GLCD_DI); // Modo instruccion // Fijo el lado a escribir, // pongo en Modo Datos y.... GLCD_enviaBYTE(lado, dato); // dibujo el pixel } //----------------------------------------------------------------------// Dibuja una linea desde (x1,y1) a (x2,y2) de color (0 o 1) //----------------------------------------------------------------------void GLCD_linea(int x1, int y1, int x2, int y2, int1 color) { //Declaro variables------------------signed int x, y, incremento_x, incremento_y, distancia_x, distancia_y; signed long P; 22/06/2011 Alejandro Quintero García Página 206 de 214 Diseño e implementación de un equipo de prácticas de control automático int i; //Calculo las diferencias entre las coordenadas de origen y destino distancia_x = abs((signed int)(x2 - x1)); distancia_y = abs((signed int)(y2 - y1)); //Inicializo x e y con las coordenadas de origen x = x1; y = y1; //Calculo el sentido de los incrementos (positivos o negativos) //en funcion de la posicion del origen y el destino if(x1 > x2) incremento_x = -1; else incremento_x = 1; if(y1 > y2) incremento_y = -1; else incremento_y = 1; //Si la distancia horizontal es mayor a la vertical... if(distancia_x >= distancia_y) { P = 2 * distancia_y - distancia_x; for(i=0; i<=distancia_x; ++i) { GLCD_punto(x, y, color); if(P < 0) { P += 2 * distancia_y; x += incremento_x; } else { P += 2*distancia_y - 2*distancia_x; x += incremento_x; y += incremento_y;} } } //Si la distancia vertical es mayor a la horizontal... else { P = 2 * distancia_x - distancia_y; for(i=0; i<=distancia_y; ++i) { GLCD_punto(x, y, color); if(P < 0) { P += 2 * distancia_x; y += incremento_y; } else { P += 2 * distancia_x - 2 * distancia_y; x += incremento_x; y += incremento_y; } 22/06/2011 Alejandro Quintero García Página 207 de 214 Diseño e implementación de un equipo de prácticas de control automático } } } //----------------------------------------------------------------------- //----------------------------------------------------------------------// Dibuja un rectángulo desde (x1,y1) a (x2,y2) de color (0 o 1) //----------------------------------------------------------------------void GLCD_rectangulo(int x1, int y1, int x2, int y2, int1 color) { GLCD_linea(x1,y1,x2,y1,color); GLCD_linea(x1,y1,x1,y2,color); GLCD_linea(x1,y2,x2,y2,color); GLCD_linea(x2,y1,x2,y2,color); } //----------------------------------------------------------------------- //----------------------------------------------------------------------// Dibuja un rectángulo PINTADO desde (x1,y1) a (x2,y2) de color (0 o 1) //----------------------------------------------------------------------void GLCD_caja(int x1, int y1, int x2, int y2, int1 color) { //Declaro variables------------------int i; for(i=y1;i<=y2;i++) { GLCD_linea(x1,i,x2,i,color); } } //----------------------------------------------------------------------- //----------------------------------------------------------------------// Dibuja un circulo con centro en (x1,y1), radio y color (0 o 1) //----------------------------------------------------------------------void GLCD_circulo(int x1, int y1, int radio, int1 color) { signed int d, x, y; //Inicializo las variables. d = 1 - radio; x = 0; y = radio; 22/06/2011 Alejandro Quintero García Página 208 de 214 Diseño e implementación de un equipo de prácticas de control automático //Dibujo los cuatro pixeles que "caen" sobre los ejes cartesianos. GLCD_punto(x1, y1 + radio, color); GLCD_punto(x1, y1 - radio, color); GLCD_punto(x1 + radio, y1, color); GLCD_punto(x1 - radio, y1, color); //Este es el bucle que pinta los octavos de la circunferencia. while(x < y) { if(d < 0) {d = d + 2 * x + 3;} else {d = d + 2 * (x - y ) + 5; y = y - 1 ;} x = x + 1; //Pone el punto en cada uno de los "octantes". GLCD_punto(x1 + x, y1 + y, color); GLCD_punto(x1 - x, y1 + y, color); GLCD_punto(x1 + x, y1 - y, color); GLCD_punto(x1 - x, y1 - y, color); GLCD_punto(x1 + y, y1 + x, color); GLCD_punto(x1 - y, y1 + x, color); GLCD_punto(x1 + y, y1 - x, color); GLCD_punto(x1 - y, y1 - x, color); } } 22/06/2011 Alejandro Quintero García Página 209 de 214 Diseño e implementación de un equipo de prácticas de control automático 8.5 Función de transferencia de la planta. Apoyándonos en la herramienta de indentificación “ident” de Matlab se ha procedido a realizar varios ensayos con entrada en escalón,a partir de los cuales Matlab nos ofrece una función de transferencia en bucle abierto aproximada. Para distintas entradas escalón conseguimos una función de transferencia bastante aproximada y coherente con la planta, es decir, con dos polos: Una vez obtenida la función de transferencia aproximada podemos buscar un controlador también aproximado con la herramienta sisotool de Matlab: 22/06/2011 Alejandro Quintero García Página 210 de 214 Diseño e implementación de un equipo de prácticas de control automático 8.6 Imágenes del prototipo. 22/06/2011 Alejandro Quintero García Página 211 de 214 Diseño e implementación de un equipo de prácticas de control automático 22/06/2011 Alejandro Quintero García Página 212 de 214 Diseño e implementación de un equipo de prácticas de control automático 22/06/2011 Alejandro Quintero García Página 213 de 214 Diseño e implementación de un equipo de prácticas de control automático 8.7 Bibliografía. • Gran parte de la informacion se ha tomado de distintos datasheets correspondiente a los distintos dispositivos que conforman la placas desarrrolladas. • Pagina de Farnell. (http://es.farnell.com). • Manuales de ayuda de Matlab. • Manual de referencia del CCS compiler. 22/06/2011 Alejandro Quintero García Página 214 de 214