Index: trunk/abscontrol/source/Control_Module/.cproject =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/.cproject b/trunk/abscontrol/source/Control_Module/.cproject new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/.cproject (revision 17) @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: trunk/abscontrol/source/Control_Module/.project =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/.project b/trunk/abscontrol/source/Control_Module/.project new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/.project (revision 17) @@ -0,0 +1,81 @@ + + + Control_Module + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/Control_Module/Release} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.cnature + + Index: trunk/abscontrol/source/Control_Module/src/AT91gpio_Funciones.c =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/AT91gpio_Funciones.c b/trunk/abscontrol/source/Control_Module/src/AT91gpio_Funciones.c new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/AT91gpio_Funciones.c (revision 17) @@ -0,0 +1,102 @@ +/* + * This programmer uses AT91' GPIO lines + * + * 2006 by Carlos Camargo + * 2007.May.10 Andres Calderon + * 2009.Aug.26 Jose Francisco Quenta + */ + +#include +#include +#include +#include + + +#include +#include +#include +#include + +#include "./Librerias/AT91gpio_Funciones.h" + +void pio_out(AT91S_PIO * pio, int mask, unsigned long val, int opcion) +{ + if (opcion == 1) + pio->PIO_SODR = mask & val; + else + pio->PIO_CODR = mask & val; +} + + +int pio_in(AT91S_PIO * pio, int mask) +{ + return (pio->PIO_PDSR & mask); +} + + +AT91S_PIO *pio_map(unsigned int piobase) +{ + int fd; + void *base; + + AT91S_PIO *pio; + + off_t addr = piobase; + + if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { + fprintf(stderr, "Cannot open /dev/mem.\n"); + exit(EXIT_FAILURE); + } + + fprintf(stderr, "/dev/mem opened.\n"); + + base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~MAP_MASK); + + if (base == (void *) -1) { + fprintf(stderr, "Cannot open /dev/mem.\n"); + exit(EXIT_FAILURE); + } + + fprintf(stderr, "Memory mapped at address %p.\n", base); + + pio = base + (addr & MAP_MASK); + + return pio; +} + + +void pio_enable(AT91S_PIO * pio, int mask) +{ + pio->PIO_PER = mask; /* Enable PIO */ +} + +void pio_output_enable(AT91S_PIO * pio, int mask) +{ + pio->PIO_OER = mask; /* Set TDI, TMS and TCK as outputs */ +} + +void pio_input_enable(AT91S_PIO * pio, int mask) +{ + pio->PIO_ODR = mask; /* Set TDO as input */ + pio->PIO_IFER = mask; /* Enable Input Filter */ +} + +void pio_disable_irq(AT91S_PIO * pio, int mask) +{ + pio->PIO_IDR = mask; /* Disable pin interrupts */ +} + +void pio_disable_multiple_driver(AT91S_PIO * pio, int mask) +{ + pio->PIO_MDDR = mask; /* Disable Multiple Diver */ +} + +void pio_disable_pull_ups(AT91S_PIO * pio, int mask) +{ + pio->PIO_PUDR = mask; /* Disable Pull-Ups */ +} + +void pio_synchronous_data_output(AT91S_PIO * pio, int mask) +{ + pio->PIO_OWDR = mask; /* Synchronous Data Output Write in PIO_ */ +} Index: trunk/abscontrol/source/Control_Module/src/Librerias/AT91gpio_Funciones.h =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/Librerias/AT91gpio_Funciones.h b/trunk/abscontrol/source/Control_Module/src/Librerias/AT91gpio_Funciones.h new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/Librerias/AT91gpio_Funciones.h (revision 17) @@ -0,0 +1,131 @@ +/* + * This programmer uses AT91' GPIO lines + * + * 2006 by Carlos Camargo + * 2007.May.10 Andres Calderon + * 2009.Aug.26 Jose Francisco Quenta + */ + +#ifndef ECB_AT91_H +#define ECB_AT91_H + + +#define MAP_SIZE 4096Ul +#define MAP_MASK (MAP_SIZE - 1) + +#define PIOA_BASE 0xFFFFF400 +#define PIOB_BASE 0xFFFFF600 +#define PIOC_BASE 0xFFFFF800 +#define PIOD_BASE 0xFFFFFA00 + +#define PB0 (1 << 0) +#define PB1 (1 << 1) +#define PB2 (1 << 2) +#define PB3 (1 << 3) +#define PB8 (1 << 8) +#define PB9 (1 << 9) +#define PB10 (1 << 10) +#define PB11 (1 << 11) +#define PB16 (1 << 16) +#define PB17 (1 << 17) +#define PB18 (1 << 18) +#define PB19 (1 << 19) +#define PB20 (1 << 20) +#define PB21 (1 << 21) +#define PB22 (1 << 22) +#define PB23 (1 << 23) +#define PB24 (1 << 24) +#define PB25 (1 << 25) +#define PB30 (1 << 30) +#define PB31 (1 << 31) + +#define PC0 (1 << 0) +#define PC1 (1 << 1) +#define PC4 (1 << 4) +#define PC5 (1 << 5) +#define PC6 (1 << 6) +#define PC7 (1 << 7) +#define PC8 (1 << 8) +#define PC9 (1 << 9) +#define PC10 (1 << 10) +#define PC11 (1 << 11) +#define PC16 (1 << 16) +#define PC17 (1 << 17) +#define PC18 (1 << 18) +#define PC19 (1 << 19) +#define PC20 (1 << 20) +#define PC21 (1 << 21) +#define PC22 (1 << 22) +#define PC23 (1 << 23) +#define PC24 (1 << 24) +#define PC25 (1 << 25) +#define PC26 (1 << 26) +#define PC27 (1 << 27) +#define PC28 (1 << 28) +#define PC29 (1 << 29) +#define PC30 (1 << 30) +#define PC31 (1 << 31) + + +typedef volatile unsigned int AT91_REG; +/* Hardware register definition */ + +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; /* PIO Enable Register */ + AT91_REG PIO_PDR; /* PIO Disable Register */ + AT91_REG PIO_PSR; /* PIO Status Register */ + AT91_REG Reserved0[1]; + AT91_REG PIO_OER; /* Output Enable Register */ + AT91_REG PIO_ODR; /* Output Disable Registerr */ + AT91_REG PIO_OSR; /* Output Status Register */ + AT91_REG Reserved1[1]; + AT91_REG PIO_IFER; /* Input Filter Enable Register */ + AT91_REG PIO_IFDR; /* Input Filter Disable Register */ + AT91_REG PIO_IFSR; /* Input Filter Status Register */ + AT91_REG Reserved2[1]; + AT91_REG PIO_SODR; /* Set Output Data Register */ + AT91_REG PIO_CODR; /* Clear Output Data Register */ + AT91_REG PIO_ODSR; /* Output Data Status Register */ + AT91_REG PIO_PDSR; /* Pin Data Status Register */ + AT91_REG PIO_IER; /* Interrupt Enable Register */ + AT91_REG PIO_IDR; /* Interrupt Disable Register */ + AT91_REG PIO_IMR; /* Interrupt Mask Register */ + AT91_REG PIO_ISR; /* Interrupt Status Register */ + AT91_REG PIO_MDER; /* Multi-driver Enable Register */ + AT91_REG PIO_MDDR; /* Multi-driver Disable Register */ + AT91_REG PIO_MDSR; /* Multi-driver Status Register */ + AT91_REG Reserved3[1]; + AT91_REG PIO_PUDR; /* Pull-up Disable Register */ + AT91_REG PIO_PUER; /* Pull-up Enable Register */ + AT91_REG PIO_PUSR; /* Pad Pull-up Status Register */ + AT91_REG Reserved4[1]; + AT91_REG PIO_ASR; /* Select A Register */ + AT91_REG PIO_BSR; /* Select B Register */ + AT91_REG PIO_ABSR; /* AB Select Status Register */ + AT91_REG Reserved5[9]; + AT91_REG PIO_OWER; /* Output Write Enable Register */ + AT91_REG PIO_OWDR; /* Output Write Disable Register */ + AT91_REG PIO_OWSR; /* Output Write Status Register */ +} AT91S_PIO, *AT91PS_PIO; + +void pio_out(AT91S_PIO * pio, int mask, unsigned long val, int opcion); + +int pio_in(AT91S_PIO * pio, int mask); + +AT91S_PIO *pio_map(unsigned int piobase); + +void pio_enable(AT91S_PIO * pio, int mask); + +void pio_output_enable(AT91S_PIO * pio, int mask); + +void pio_input_enable(AT91S_PIO * pio, int mask); + +void pio_disable_irq(AT91S_PIO * pio, int mask); + +void pio_disable_multiple_driver(AT91S_PIO * pio, int mask); + +void pio_disable_pull_ups(AT91S_PIO * pio, int mask); + +void pio_synchronous_data_output(AT91S_PIO * pio, int mask); + +#endif Index: trunk/abscontrol/source/Control_Module/src/Librerias/Funciones_ControlER.h =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/Librerias/Funciones_ControlER.h b/trunk/abscontrol/source/Control_Module/src/Librerias/Funciones_ControlER.h new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/Librerias/Funciones_ControlER.h (revision 17) @@ -0,0 +1,19 @@ +/* + * Funciones_ControlERs.h + * + * Created on: Jan 14, 2010 + * Author: redes + */ + +#ifndef FUNCIONES_CONTROLERS_H_ +#define FUNCIONES_CONTROLERS_H_ + +int estado_ERemota(char dir_red[],int dir_inicio,int dir_fin); + +int envia_experimento(char valor[], int base); + +int trae_monitoreo(char valor[], int base); + +int ClienteUDP(char *opcion, char *valor); + +#endif /* FUNCIONES_CONTROLERS_H_ */ Index: trunk/abscontrol/source/Control_Module/src/Librerias/Mensajes.h =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/Librerias/Mensajes.h b/trunk/abscontrol/source/Control_Module/src/Librerias/Mensajes.h new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/Librerias/Mensajes.h (revision 17) @@ -0,0 +1,17 @@ +/* + * Mensajes.h + * + * Created on: Nov 12, 2009 + * Author: redes + */ + +#ifndef MENSAJES_H_ +#define MENSAJES_H_ + +void LOG_SERVIDOR(char *mensaje); +void LOG_CLIENTE(char *mensaje); +void ERROR_FATAL(char *mensaje); +void ERROR(char *mensaje); + + +#endif /* MENSAJES_H_ */ Index: trunk/abscontrol/source/Control_Module/src/Mensajes.c =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/Mensajes.c b/trunk/abscontrol/source/Control_Module/src/Mensajes.c new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/Mensajes.c (revision 17) @@ -0,0 +1,39 @@ +/* + * Mensajes.c + * + * Created on: Nov 12, 2009 + * Author: Jose Francisco Quenta + */ + +#include +#include + +/* + * Imprime mensajes del servidor + */ +void LOG_SERVIDOR(char *mensaje){ + printf("SERVIDOR: %s\n",mensaje); +} + +/* + * Imprime mensajes del cliente + */ +void LOG_CLIENTE(char *mensaje){ + printf("CLIENTE: %s\n",mensaje); +} + +/* + * Error no fatal, permite la continuación del programa + */ +void ERROR(char *mensaje){ + fprintf(stderr, "ERROR. %s\n", mensaje); +} + +/* + * Error fatal, aborta la ejecución del programa con código de salida de error + */ +void ERROR_FATAL(char *mensaje){ + fprintf(stderr, "ERROR FATAL. %s\n", mensaje); + exit(EXIT_FAILURE); +} + Index: trunk/abscontrol/source/Control_Module/src/ServidorUDP.c =================================================================== diff --git a/trunk/abscontrol/source/Control_Module/src/ServidorUDP.c b/trunk/abscontrol/source/Control_Module/src/ServidorUDP.c new file mode 10644 --- /dev/null (revision 0) +++ b/trunk/abscontrol/source/Control_Module/src/ServidorUDP.c (revision 17) @@ -0,0 +1,301 @@ +/* + * Servidor.c + * + * Created on: Nov 3, 2009 + * Author: Jose Francisco Quenta + * + * Se implementa: + * -Carga en memoria los apuntes contenidos en un archivo de experimentos: apunte0 -> GPIO + * -Cambio de apunte. + * -Lectura del estado actual del apunte y grabado del mismo en un archivo + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "./Librerias/AT91gpio_Funciones.h" +#include "./Librerias/Mensajes.h" + +#define PUERTO_SERVIDOR 5500 +#define TAM_BUFFER 100 + +#define maskc_out PC30+PC28+PC26+PC24+PC22+PC20 //MSB-UP-LSB MSB-DOWN-LSB //APUNTE + +#define maskb_in PB16+PB18+PB20+PB30+PB24+PB22 //MSB-UP-LSB MSB-DOWN-LSB //VERIFICACION + +#define bit_up_2 0x00010000 //Mascara de cada bit a revisar: bit_up_2 es MSB +#define bit_up_1 0x00040000 +#define bit_up_0 0x00100000 +#define bit_dow_2 0x40000000 +#define bit_dow_1 0x01000000 +#define bit_dow_0 0x00400000 + +#define MyID 11 + +char *buff_experimento= NULL; + +AT91S_PIO *pioc; +AT91S_PIO *piob; + +/* + * Zona de declaracion de cabeceras. + */ +void inicializa_gpio(); +void procesa_peticion(char *buff_peticion); +void cambia_apuntamiento(char *puntero_char); +int carga_experimento(char *nombre_archivo); +void chequeo_sistema(char *numero_muestras); + +/* + * + */ +int main(){ + + int conexion_servidorFd; + struct sockaddr_in inf_servidor; + struct sockaddr_storage inf_cliente; + int resultado; + int numbytes_recibidos; + + char *buff_peticion = (char *) malloc(TAM_BUFFER); + + size_t addr_len; + + memset(&inf_servidor, 0, sizeof(inf_servidor)); + inf_servidor.sin_family= AF_INET; + inf_servidor.sin_port= htons(PUERTO_SERVIDOR); + inf_servidor.sin_addr.s_addr= INADDR_ANY; + + /* Se establece el socket */ + conexion_servidorFd = socket(AF_INET,SOCK_DGRAM,0); + if (conexion_servidorFd == -1){ + ERROR_FATAL("No se establecio correctamente el socket: socket()"); + } + + /* Se asocia el socket a un puerto y una IP */ + resultado = bind(conexion_servidorFd,(struct sockaddr *)&inf_servidor,sizeof(inf_servidor)); + if (resultado== -1){ + ERROR_FATAL("No se establecio correctamente el socket: bind()"); + } + + /* Inicializamos el puerto GPIO del sistema embebido GSBC-9260S */ + inicializa_gpio(); + + while(1){ + LOG_SERVIDOR("Esperando solicitud de cliente...\n"); + + /* Se espera hasta que un cliente se conecte */ + addr_len = sizeof(inf_cliente); + numbytes_recibidos = recvfrom(conexion_servidorFd, buff_peticion, TAM_BUFFER-1, 0, (struct sockaddr *)&inf_cliente, &addr_len); + if (numbytes_recibidos == -1){ + ERROR_FATAL("Error en la recepcion de datos: recvfrom()"); + } + + /* Se procede a procesar los datos recibidos */ + buff_peticion[numbytes_recibidos]= '\0'; + + /* procesamiento de la peticion */ + procesa_peticion(buff_peticion); + } +} + +/* + * Esta funcion incializa el puerto GPIO + */ +void inicializa_gpio(){ + +// Configuracion de los pines de APUNTE + pioc = pio_map(PIOC_BASE); + pio_enable(pioc, maskc_out); + pio_disable_irq(pioc, maskc_out); + pio_disable_multiple_driver(pioc, maskc_out); + pio_disable_pull_ups(pioc, maskc_out); + pio_synchronous_data_output(pioc, maskc_out); + pio_output_enable(pioc, maskc_out); + +// Configuracion de los pines de VERIFICACION + piob = pio_map(PIOB_BASE); + pio_enable(piob, maskb_in); + pio_disable_irq(piob, maskb_in); + pio_disable_multiple_driver(piob, maskb_in); + pio_disable_pull_ups(piob, maskb_in); + pio_input_enable(piob, maskb_in); + +} + +/* + * Esta funcion procesa el mensaje de peticion y genera respuesta + */ +void procesa_peticion(char *buff_peticion){ + + char *comando = strtok(buff_peticion, ":"); + char *valor = strtok(NULL, ":"); + + if ((comando == NULL) || (valor == NULL)){ + ERROR("procesarPeticion: formato de mensaje incorrecto"); + }else{ + if(strcmp(comando,"CARGA") == 0){ + carga_experimento(valor); + }else if(strcmp(comando,"CAMBIA") == 0){ + cambia_apuntamiento(valor); + }else if(strcmp(comando,"CHEQUEO") == 0){ + chequeo_sistema(valor); + }else{ + ERROR("procesa_peticion: comando no reconocido"); + } + } +} + + +/* + * Esta funcion carga un archivo en un buffer que esta ubicado en memoria, luego + * este buffer es usado en la funcion "cambia_apuntamiento" para obtener el dato + * que sera usado en el cambio de apuntamiento. + */ +int carga_experimento(char *nombre_archivo){ + + FILE *Archivo_Fd; + + char *cadena = (char *) malloc(25); + + int longitud_cadena; + int num_bytes= 0; + int num_filas= 0; + + char ruta_archivo[50]; // Se crea la ruta para abrir el archivo + strcpy(ruta_archivo,"/mnt/sd/archivos/"); + strcat(ruta_archivo,nombre_archivo); + + Archivo_Fd = fopen(ruta_archivo,"r"); // Se procede a abrir el archivo, segun la ruta especificada + if(!Archivo_Fd){ + ERROR("carga_archivo: No se pudo abrir el archivo!!! --> fopen()\n"); + return -1; + }else{ + + while(!feof(Archivo_Fd)){ // Se procede a calcular la longitud del archivo para separar memoria + fgets(cadena,20,Archivo_Fd); + longitud_cadena= strlen(cadena); + cadena[longitud_cadena-1] = '\0'; + num_bytes = num_bytes + longitud_cadena; + num_filas++; + } + + rewind(Archivo_Fd); // Se reinicia el puntero del archivo + + char *buffer_temporal = (char *) malloc(num_bytes+1); // Se separa espacio de memoria segun + // la longitud del archivo + fread(buffer_temporal, sizeof(char), num_bytes, Archivo_Fd); + + char *puntero= strstr(buffer_temporal,".abs"); // Se procede a eliminar la cabecera del archivo + puntero= puntero + 12; + + buff_experimento = (char *) malloc(7*(num_filas-3)); // num_bytes_fila*(num_filas-3); + strncpy(buff_experimento,puntero,7*(num_filas-3)); // Se carga en memoria la informacion del archivo + + fclose(Archivo_Fd); + + cambia_apuntamiento("0"); // Se apunta a la direccion 0 + + return 0; + } +} + +/* + * Esta funcion recibe un numero en formato char, el dato se transforma a su equivalente en + * un numero entero, que sera usado para sacar un dato del buffer "buff_experimento", esta + * dato es el valor que se enviara al sistema de conmutacion RF para el cambio de apunte a + * traves del puerto GPIO. + */ +void cambia_apuntamiento(char *puntero_char){ + + /*MSB-UP-LSB MSB-DOWN-LSB*/ + int desplazamiento[6]={30,28,26,24,22,20}; // Defino los dezplazamientos que se aplicara + // al dato que ingresa para formar el número + // entero que se le pasara al puerto GPIO + // Estos números son los pines del puerto GPIO + // que se estan usando para el control + + int puntero= atoi(puntero_char); // Se convierte a entero la direccion del puntero + + int base= 7*puntero; // base= cantidad_bytes del dato x puntero + // cantidad de bytes es el numero de bytes que + printf("%i\n",puntero); // contiene cada dato, para este caso es 7 + // porque es 6 bits de datos + 1 bit del cambio + // de linea. + char valor_char; + unsigned long valor; + unsigned long acumulado_ceros=0; + unsigned long acumulado_unos=0; + + int offset; // Defino offset para el desplazamiento a traves + for(offset=0;offset<6;offset++){ // de cada dato que se obtiene del "buff_experimento" + + valor_char= buff_experimento[base+offset]; // Obtengo el dato + + if (valor_char == '0'){ // Obtengo el número acumulado segun sea un cero o un uno + valor= 0; + acumulado_ceros= acumulado_ceros + (1 << desplazamiento[offset]); + }else{ + valor= 1; + acumulado_unos= acumulado_unos + (1 << desplazamiento[offset]); + } + + } + + pio_out(pioc, maskc_out, acumulado_unos, 1); + pio_out(pioc, maskc_out, acumulado_ceros, 0); + +} + +/* + * Esta funcion lee "n" veces el estado del APUNTE actual y lo guarda en el + * archivo Verificacion. + */ + +void chequeo_sistema(char *numero_muestras){ + +char valor[7]; +int i,cnt; +unsigned int entradac= 0; +FILE *fd; +fd=fopen("/mnt/sd/archivos/Verificacion","w"); +fprintf(fd,"%s\n","Verificacion"); +fprintf(fd,"%s\n","------------"); +cnt=0; +do +{ + //Inicializando arreglo + for(i=0;i<6;i++) + valor[i]='0'; + valor[6]='\0'; + //Lectura de puerto + entradac= pio_in(piob,maskb_in); + //Dandole formato al dato + if (!(entradac & bit_up_2)) + valor[0] = '1'; + if (!(entradac & bit_up_1)) + valor[1] = '1'; + if (!(entradac & bit_up_0)) + valor[2] = '1'; + if (!(entradac & bit_dow_2)) + valor[3] = '1'; + if (!(entradac & bit_dow_1)) + valor[4] = '1'; + if (!(entradac & bit_dow_0)) + valor[5] = '1'; + //Escribiendo en archivo + fprintf(fd,"%s\n",valor); + cnt=cnt+1; + usleep(1*1000*1000); +}while(cnt < atoi(numero_muestras)); +fclose(fd); +}