46849434-Pic-xbee-c

15
C:\Users\Berny\Desktop\Programación\Microprograma\Pic xbee.c 1 ///////////////////////////////////////////////////////////////////////////// 2 // 3 // Descripción del programa 4 // 5 // 6 // 7 // 8 // 9 ///////////////////////////////////////////////////////////////////////////// 10 11 ///////////////////////////////////////////////////////////////////////////// 12 // 13 // Configuración y declaraciones globales 14 // 15 ///////////////////////////////////////////////////////////////////////////// 16 17 #include < 18 F2550 . h > //selección del dispositivo 18 #include "Pic xbee.h" //prototipos de las funciones del programa 19 20 // Fuses utilizados: 21 /* 22 HSPLL: se usa un cristal HS de alta velocidad, en conjunto con el PLL para generar 48Mhz. 23 NOWDT: No se utiliza perro guardían. 24 NOPROTECT: Se desactiva la protección de código. 25 NOLVP: Se desactiva la programación a bajo voltaje. 26 NODEBUG: Modo debug desactivado. 27 USBDIV: El relog del usb se toma del PLL/2 = 96Mhz/2 = 48Mhz. 28 PLL2: El PLL prescaler divide en 2 la frecuencia del cristal. 29 CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ. 30 VREGEN: habilita el regulador de 3.3 v que usa el módulo USB 31 */ 32 33 #define TX PIN_C6 34 #define RX PIN_C7 35 36 #fuses HSPLL , NOWDT , NOPROTECT , NOLVP , NODEBUG , USBDIV , PLL2 , CPUDIV1 , VREGEN , PUT , MCLR 37 #use delay ( clock = 48000000 ) 38 #use rs232 ( baud = 9600 , xmit = TX , rcv = RX , parity = N , bits = 8 , stop = 1 , errors ) //configuracion puerto serie 39 #priority RDA , TIMER0 //recepción del puerto serie prioritario a la ante el desbordamiento del timer0 40 41 #define USB_HID_DEVICE FALSE //Deshabilita HID 42 #define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Habilita EP1(EndPoint1) para transferencias IN bulk/interrupt 43 #define USB_EP1_RX_ENABLE USB_ENABLE_BULK //Habilita EP1(EndPoint1) para transferencias OUT bulk/interrupt 44 #define USB_EP1_TX_SIZE 12 //tamaño para la cola del punto final de transmisión 12 45 #define USB_EP1_RX_SIZE 8 //tamaño para la cola del punto final de recepcion 8 46 47 #define tamaTx 12 48 #define tamaRx 8 49 50 #include < pic18_usb . h > //Manejador PIC USB para CCS de la Capa Fisica Microchip PIC18Fxx5x 51 #include "usb_desc_scope.h" //Configuracion USB y descriptores del dispositivo 52 #include < usb . c > //Se encarga de manejar la configuracion usb y recibir informacion 53 54 #define ledR PIN_B0 55 #define ledV PIN_B1 56 #define apaga output_low 57 #define enciende output_high 58 59 60 //Lista de envio y recepcion 61 BYTE datosSalientes [ 12 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; //se envian 8 datos 62 BYTE datosEntrantes [ 8 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; //se recibe 8 datos 63 64 BYTE auxEntrantes [ 8 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; 65 66 67 #define comando datosSalientes [ 0 ] 1

Transcript of 46849434-Pic-xbee-c

Page 1: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

1 /////////////////////////////////////////////////// //////////////////////////2 //3 // Descripción del programa4 //5 //6 //7 //8 //9 /////////////////////////////////////////////////// //////////////////////////1011 /////////////////////////////////////////////////// //////////////////////////12 //13 // Configuración y declaraciones globales14 //15 /////////////////////////////////////////////////// //////////////////////////1617 #include <18F2550 . h> //selección del dispositivo18 #include "Pic xbee.h" //prototipos de las funciones del programa1920 // Fuses utilizados:21 /*22 HSPLL: se usa un cristal HS de alta velocidad, en c onjunto con el PLL para generar 48Mhz.23 NOWDT: No se utiliza perro guardían.24 NOPROTECT: Se desactiva la protección de código.25 NOLVP: Se desactiva la programación a bajo voltaje.26 NODEBUG: Modo debug desactivado.27 USBDIV: El relog del usb se toma del PLL/2 = 96Mhz/ 2 = 48Mhz.28 PLL2: El PLL prescaler divide en 2 la frecuencia de l cristal. 29 CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de

96MHZ. 30 VREGEN: habilita el regulador de 3.3 v que usa el m ódulo USB31 */3233 #define TX PIN_C634 #define RX PIN_C73536 #fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN, PUT, MCLR 37 #use delay ( clock =48000000 )38 #use rs232 ( baud =9600 , xmit =TX, rcv =RX, parity =N, bits =8, stop =1, errors ) //configuracion puerto

serie 39 #priority RDA, TIMER0 //recepción del puerto serie prioritario a la ante el desbordamiento

del timer04041 #define USB_HID_DEVICE FALSE //Deshabilita HID42 #define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Habilita EP1(EndPoint1) para transferencias

IN bulk/interrupt43 #define USB_EP1_RX_ENABLE USB_ENABLE_BULK //Habilita EP1(EndPoint1) para transferencias

OUT bulk/interrupt44 #define USB_EP1_TX_SIZE 12 //tamaño para la cola del punto final de

transmisión 1245 #define USB_EP1_RX_SIZE 8 //tamaño para la cola del punto final de

recepcion 8 4647 #define tamaTx 1248 #define tamaRx 84950 #include <pic18_usb . h> //Manejador PIC USB para CCS de la Capa Fisica Micr ochip

PIC18Fxx5x 51 #include "usb_desc_scope.h" //Configuracion USB y descriptores del dispositivo52 #include <usb . c> //Se encarga de manejar la configuracion usb y reci bir

informacion 5354 #define ledR PIN_B0 55 #define ledV PIN_B1 56 #define apaga output_low 57 #define enciende output_high585960 //Lista de envio y recepcion61 BYTE datosSalientes [ 12] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ; //se envian 8 datos62 BYTE datosEntrantes [ 8] ={ 0, 0, 0, 0, 0, 0, 0, 0} ; //se recibe 8 datos6364 BYTE auxEntrantes [ 8] ={ 0, 0, 0, 0, 0, 0, 0, 0} ; 656667 #define comando datosSalientes [ 0]

1

Page 2: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

68 #define numDispositivo datosSalientes [ 1]69 #define D0 datosSalientes [ 2]70 #define D1 datosSalientes [ 3]71 #define D2 datosSalientes [ 4]72 #define D3 datosSalientes [ 5]73 #define D4 datosSalientes [ 6]74 #define D5 datosSalientes [ 7]75 #define Analog0 datosSalientes [ 8]76 #define Analog1 datosSalientes [ 9]77 #define Analog2 datosSalientes [ 10]78 #define Analog3 datosSalientes [ 11]7980 #define comandoRx datosEntrantes [ 0]81 #define numDispositivoRx datosEntrantes [ 1]82 #define D0Rx datosEntrantes [ 2]83 #define D1Rx datosEntrantes [ 3]84 #define D2Rx datosEntrantes [ 4]85 #define D3Rx datosEntrantes [ 5]86 #define D4Rx datosEntrantes [ 6]87 #define D5Rx datosEntrantes [ 7]888990 BYTE numeroDeDispositivos =0; //inicialmente no hay dispositivos conectados91 BYTE dispositivos =0; //apunta al dispositivo correspondiente92 short correcto =FALSE; //indica resultado de la suma de control93 BYTE recepcionXbee [ 50] ; //almacenamiento de las recepciones94 BYTE auxRecepXbee [ 100 ] ; //auxiliar para el almacenamiento de las recepcione s95 BYTE sumaDeControl =0; //resultado de la suma de control9697 #define comandoCambioConfig 0xBE98 #define comandoCambioSalida 0xF599 #define comandoActualizaValores 0xFA100 #define comandoActualizaRed 0xAF101102 /*Comandos empleados para la sincronización PC Pic103 Sincroniza es la sincronización inicial del program a104 SincNdisp sincroniza el número de dispositivos105 SincCdisp sincroniza la configuracion de los dispos itivos106 SincDdisp sincroniza los datos de los dispositivos* /107 #define comandoSincroniza 0xFE108 #define comandoSincNdisp 0xF0 109 #define comandoSincCdisp 0xFF 110 #define comandoSincDdisp 0xAA111112 //definiciones para tramas API113 #define delimitador 0x7E 114 #define remotoAT 0x17115 #define reconocimiento 0x01116 #define dir16A 0xFF117 #define dir16B 0xFE118 #define aplicarcambio 0x02119 #define sinconfig 0x00120 #define eAnalogica 0x02121 #define eDigital 0x03122 #define Dbajo 0x04123 #define Dalto 0x05124 #define tamaPin 0x10125 #define tamaConfig 0x0F126 #define tamaND 0x04127 #define comandoAT 0x08128 #define atN 0x4E129 #define atD 0x44130 #define atW 0x57131 #define atR 0x52132 #define scND 0x64133 #define atI 0x49134 #define atS 0x53 135 #define idConfig 0x05136137 BYTE direcciones [ 55] [ 8] ; //lista de direcciones posibles138 BYTE datos [ 55] [ 10] ; //lista de datos posibles139 BYTE configuraciones [ 55] [ 6] ; //lista de configuraciones posibles140141 BYTE prx =0;142 BYTE pin =0;143 BYTE i =0;

2

Page 3: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

144 BYTE cuenta =0;145 BYTE desbordaT1 =0;146 long intentos =0;147 BYTE intentosB =0;148 short comprobado =FALSE;149 short tiempoAgotado =FALSE;150151 #define intentosMAX 0x0A //numero máximo de intentos para ejecutar comando A PI152 #define APICorrecto 0x00153 #define APIERROR 0x01154 #define APIComandoInvalido 0x02155 #define APIParamtrInvalodo 0x03156 #define APIFalloTransmision 0x04157 BYTE error [ 8] ={ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ; //almacena error158159 long veces =0;160 BYTE auxrx =- 1;161 int digitales [ 6] = { - 1, - 1, - 1, - 1, - 1, - 1} ;162 short algunaDigital =FALSE;163 BYTE analogicas [ 8] ={ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1} ;164 BYTE pinAnalogico [ 4] ={ - 1, - 1, - 1, - 1} ;165 short configCambiada =FALSE; 166167168169170 /////////////////////////////////////////////////// //////////////////////////171 //172 // Subprogramas173 //174 /////////////////////////////////////////////////// //////////////////////////175176 /////////////////////////////////////////////////// //////////////////////////177 //178 // Rutinas XBee179 //180 /////////////////////////////////////////////////// //////////////////////////181182 /////////////////////////////////////////////////// //////////////////////////183 //184 // Red XBee 185 //186 // Comprueba cuantos dispositivos hay en la red y a ctualiza numero_de_dispositivos187 // requiere enviar al coordinador el comando ND Nod e Discovery, 188 // por cada dispositivo se aumenta la variable nume ro_de_dispositovo189 // además se debe guardar su dirección para posteri or comunicación 190 // 191 // La trama de un comando ND es la siguiente:192 // 0x7E 0x00 0x04 0x08 0x01 0x4E 0x44 0x64 193 // 0x0004 = tamaño 194 // 0x08 = Comando AT195 // 0x01 = Identificador (reconocimiento)196 // 0x4E44 = AT ('ND')197 // 0x64 = Suma de control198 // Suma de control [0xFF - (0x08 + 0x01 + 0x4E + 0x 44)] 199 // hay que enviar la trama y esperar el tiempo NO, esperar recibir 0x7E200 // a partir del byte 11 y hasta el 18 obtiene DH y DL 4 bytes cada uno201 // una vez comprobado la suma de control incrementa número de dispositivos202 /////////////////////////////////////////////////// //////////////////////////203 void redXBee ( ) 204 {205 enable_interrupts ( global ) ; disable_interrupts ( INT_USB) ;206 numeroDeDispositivos =0;207 intentos =0; //variable empleada en para depuracion208 comprobado =FALSE;209210 do211 {212 i =0;213 limpiarAuxRecep ( ) ;214 disable_interrupts ( INT_RDA) ;215 tiempoAgotado =FALSE;216 setup_timer_1 ( T1_INTERNAL| T1_DIV_BY_8 ) ; 217 set_timer1 ( 0) ; 218 cuenta =96; 219 enable_interrupts ( INT_TIMER1 ) ;

3

Page 4: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

220 putc ( delimitador ) ; putc ( 0x00 ) ; putc ( tamaND) ; putc ( comandoAT) ;221 putc ( reconocimiento ) ; putc ( atN ) ; putc ( atD ) ; putc ( scND) ; //envía comando ND 222223 while( ! tiempoAgotado ) 224 {225 if( kbhit ( ) )226 { 227 auxRecepXbee [ i ] =getc ( ) ;228 i ++;229 }230 if ( ( i >0) &&( auxRecepXbee [ 0] != 0x7E) )231 {232 intentosB ++;233 limpiarAuxRecep ( ) ; 234 break;235 }236237 } 238 desbordaT1 =0;239 disable_interrupts ( INT_TIMER1 ) ;240 manejoND( ) ;241 if ( comprobado ) { intentos ++; }242 } while( ! comprobado &&intentos <intentosMAX ) ;243 enable_interrupts ( INT_USB) ;244 }245246 /////////////////////////////////////////////////// //////////////////////////247 //248 // Manejo ND 249 //250 // se encarga de comprobar que lo recibido tras el comando ND son tramas 251 // validas de los dispositivos de la red y almacena la dirección de estos252 // Se almacena esta configuracion que será enviada en la subrutina 253 // envio_numero_dispositivo() 254 /////////////////////////////////////////////////// //////////////////////////255 void manejoND( )256 {257 int x;258 int h;259 int k;260 int l ;261 short resultado ;262 h=0; k=0; resultado =false ; comprobado =false ; //inicia las variables263 limpiarRecepcion ( ) ;264265 for ( h=0; h<auxRecepXbee [ 2] +4; h++) { recepcionXbee [ h] =auxRecepXbee [ h] ; } //se copia una trama

completa266 resultado =comprobacion ( ) ;267268 if ( resultado )269 {270 numeroDeDispositivos ++;271 x = recepcionXbee [ 19] - 0x30 ;272 for ( k=0; k<8; k++) { direcciones [ x] [ k] =recepcionXbee [ 10+k] ; } //se almacena la direccion

en auxiliar273 l =h;274 while( auxRecepXbee [ l ] != 0) //si siguen habiendo tramas275 {276 x=0;277 k=h;278 l =k;279 limpiarRecepcion ( ) ;280 for ( h=0; h<auxRecepXbee [ k+2] +4; h++)281 {282 recepcionXbee [ h] =auxRecepXbee [ l ] ; //se copia la siguiente trama completa283 l ++; 284 }285 resultado =false ;286 resultado =comprobacion ( ) ;287 if ( resultado )288 {289 numeroDeDispositivos ++; 290 x = recepcionXbee [ 19] - 0x30 ;291 for ( k=0; k<8; k++) { direcciones [ x] [ k] =recepcionXbee [ 10+k] ; } //se almacena la

direccion en auxiliar292 }

4

Page 5: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

293 }294 comprobado =TRUE;295 }296 else comprobado =FALSE; //si comprobado=FALSE no hay dispositivos en la red o existen

errores en recepción297298 }299 /////////////////////////////////////////////////// //////////////////////////300 //301 // Configuracion Xbee 302 //303 // Se pregunta por la configuracion de las patillas D0-D5 de todos los 304 // dispositivos que forman la red.305 // Se almacena esta configuracion que será enviada en la subrutina 306 // envio_conofiguracion_dispositivo() 307 /////////////////////////////////////////////////// //////////////////////////308 void configuracionXbee ( )309 {310 enable_interrupts ( global ) ; disable_interrupts ( INT_USB) ;311 dispositivos =numeroDeDispositivos ; 312 if( usb_enumerated ( ) )313 { comprobado =FALSE; }314 while( dispositivos != 0) 315 {316 317 intentos =0; //variable empleada en modo depuracion318 intentosB =0; //variable empleada en modo depuracion319 tiempoAgotado =FALSE; 320 comprobado =FALSE;321 pin =0; prx =0; desbordaT1 =0;322 setup_timer_0 ( RTCC_DIV_128) ;323 set_timer1 ( 0) ; //se desborda cada 43,69ms 324 cuenta =45; //se da un marjen de unos 2segundos en la espera de recepción325 enable_interrupts ( INT_TIMER1 ) ;326 do327 {328 do329 {330 limpiarRecepcion ( ) ;331 enable_interrupts ( INT_RDA) ;332 set_timer0 ( 0) ; 333 tiempoAgotado =FALSE;334 preguntaConfig ( direcciones [ dispositivos ] , pin ) ;335 while( ! tiempoAgotado && prx <3+recepcionXbee [ 2] +1) 336 {337 if ( ( prx >0) &&( recepcionXbee [ 0] != 0x7E) ) 338 {339 intentosB ++;340 limpiarRecepcion ( ) ; 341 break;342 }343 }344345 if ( prx >=recepcionXbee [ 2] +1) { comprobado =comprobacion ( ) ; }346 if ( ! comprobado ) { intentos ++; }347348 disable_interrupts ( INT_TIMER0 ) ; disable_interrupts ( INT_RDA) ;349350 } while( ! comprobado &&intentos <intentosMAX ) ;351 comprobado =FALSE; //se pone a 0 para ver si existe error352353 /*recepcionXbee[recepcionXbee[2]+1] estado recepcio n354 recepcionXbee[recepcionXbee[2]+2] respuesta*/355 if ( recepcionXbee [ recepcionXbee [ 2] +1] ==APICorrecto )356 {357 configuraciones [ dispositivos ] [ pin ] =recepcionXbee [ recepcionXbee [ 2] +2] ;358 comprobado =TRUE;359 intentos =0;360 intentosB =0;361 pin ++;362 }363 prx =0;364 } while( pin <=5|| ! comprobado ) ;365366 dispositivos -- ;367

5

Page 6: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

368 } //fin del bucle while dispositivos 369370 desbordaT1 =0;371 disable_interrupts ( INT_TIMER1 ) ;372 enable_interrupts ( INT_USB) ;373 }374375 /////////////////////////////////////////////////// //////////////////////////376 //377 // Datos Xbee 378 //379 // se encarga de comprobar el estado de las señale s analógicas y digitales380 // de los módulos que forman la red. 381 // Se almacena esta configuracion que será enviada en la subrutina 382 // envio_datos_dispositivo() 383 /////////////////////////////////////////////////// //////////////////////////384 void datosXBee ( )385 {386 int j =0;387 int desplazamiento =0;388 enable_interrupts ( global ) ; disable_interrupts ( INT_USB) ;389 dispositivos =numeroDeDispositivos ; 390 while( dispositivos != 0)391 { 392 intentos =0;393 intentosB =0;394 prx =0;395 tiempoAgotado =FALSE; 396 comprobado =FALSE;397 limpiarRecepcion ( ) ;398 setup_timer_0 ( RTCC_DIV_128) ;399 algunaDigital =FALSE;400 for ( j =0; j <6; j ++) { digitales [ j ] =- 1; }401 for ( j =0; j <8; j ++) { analogicas [ j ] =- 1; }402 for ( j =0; j <4; j ++) { pinAnalogico [ j ] =- 1; }403 set_timer1 ( 0) ; 404 cuenta =25; 405 enable_interrupts ( INT_TIMER1 ) ;406 while ( ! comprobado )407 {408 do409 {410 limpiarRecepcion ( ) ;411 enable_interrupts ( INT_RDA) ;412 set_timer0 ( 0) ; // 5ms413 tiempoAgotado =FALSE;414 enviaATremoto ( direcciones [ dispositivos ] , atI , atS ) ; 415 while( ! tiempoAgotado &&prx <3+recepcionXbee [ 2] +1) //416 {417 enable_interrupts ( INT_RDA) ;418 if ( ( prx >0) &&( recepcionXbee [ 0] != 0x7E) ) 419 {420 intentosB ++;421 limpiarRecepcion ( ) ; 422 break;423 }424 }425426 disable_interrupts ( INT_TIMER0 ) ; disable_interrupts ( INT_RDA) ;427 428 if ( prx >=recepcionXbee [ 2] +1) { comprobado =comprobacion ( ) ; }429 if ( ! comprobado ) { intentos ++; }430431 } while( ! comprobado &&intentos <intentosMAX ) ; 432433 comprobado =FALSE; //se pone a 0 para ver si existe error434 if ( recepcionXbee [ 17] ==APICorrecto ) //&&prx!=0435 {436 comprobado =TRUE;437 intentos =0;438 intentosB =0;439 prx =0;440 /*recepcion [17] estado comando, [18] nº de muestra s, [19] [20] señales digitales, 441 [21] señales analogicas. [22] [23] estados digitale s,recepcion[2]+3 suma de control*/442443 //comprobacion de señales digitales

6

Page 7: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

444 for( j =0; j < 6; j ++) //se comprueban las 6 posibilidades 445 { 446 if( ( recepcionXbee [ 20] & 1) == 1) //se enmascara el último bit447 { 448 digitales [ j ] = 0; // 0 activado, de lo contrario -1449 algunaDigital =TRUE;450 }451 recepcionXbee [ 20] = recepcionXbee [ 20] >> 1; //prepara el siguiente bit452 } //una vez comprobado cuales están activas se pasa a ver su valor.453454 //procesado de datos digitales455 if ( algunaDigital ) 456 {457 output_toggle ( ledV ) ; 458 delay_ms ( 500) ;459 output_toggle ( ledV ) ;460 for ( j = 0; j < 6; j ++) 461 {462 if ( digitales [ j ] == 0) //se ignoran los desactivados463 { digitales [ j ] = recepcionXbee [ 23] & 1; } //el resultado es el valor de la entrada464 recepcionXbee [ 23] = recepcionXbee [ 23] >> 1;465 }466 }467468 //actualizar valores del dispositivo469 do{ if ( digitales [ -- j ] != - 1) { datos [ dispositivos ] [ j ] =digitales [ j ] ; } } while( j >0) ;470471 //comprobacion de señales analogicas472 if ( recepcionXbee [ 21] >0)473 {474 for( j =0; j < 4; j ++) //se comprueban las 4 posibilidades, i debe aumenta r dos

posiciones 475 { 476 if( ( recepcionXbee [ 21] & 1) == 1) //se enmascara el último bit477 { 478 pinAnalogico [ j ] =1; //el pin i está activado como analogico479 analogicas [ j ] = recepcionXbee [ 24+desplazamiento ] ; 480 analogicas [ j +4] =recepcionXbee [ 25+desplazamiento ] ;481 desplazamiento =desplazamiento +2; 482 }483 recepcionXbee [ 21] = recepcionXbee [ 21] >> 1;484 }485 j =0; 486 //procesado de datos analógicos487 do488 {489 if ( pinAnalogico [ j ] ==1)490 {491 datos [ dispositivos ] [ j ] =analogicas [ j ] ;492 datos [ dispositivos ] [ 6+j ] =analogicas [ j +4] ;493 }494 j ++;495 } while( j <4) ;496 }497 } //if (recepcionXbee[17]==APICorrecto)498 prx =0; 499 } //while (!comprobado)500501 dispositivos -- ;502 desbordaT1 =0;503 intentos =0;504 disable_interrupts ( INT_TIMER1 ) ;505 } //fin del bucle while dispositivos 506 enable_interrupts ( INT_USB) ;507 }508509510 /////////////////////////////////////////////////// //////////////////////////511 //512 // enviaConfig 513 //514 // Función encargada de configurar la patilla del d ispositivo515 // recibe la dirección, la patilla D y la opción qu e se quiere configurar516 /////////////////////////////////////////////////// //////////////////////////517 void enviaConfig ( BYTE * dir , BYTE D, byte opcion )518 {

7

Page 8: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

519 520 D+=0x30 ; //para pasar a ASCII521 sumaDeControl =0; //Calcula la suma de control522 sumaDeControl = ( remotoAT +reconocimiento +* dir +* ( dir +1) +* ( dir +2) +* ( dir +3) +* ( dir +4) +* ( dir +5) ;523 sumaDeControl =sumaDeControl +* ( dir +6) +* ( dir +7) +dir16A +dir16B +aplicarcambio +atD +D+opcion ) ;524 sumaDeControl = 0xFF- sumaDeControl ;525 putc ( delimitador ) ; putc ( 0x00 ) ; putc ( tamaPin ) ; putc ( remotoAT ) ; putc ( reconocimiento ) ;526 putc ( * dir ) ; putc ( * ( dir +1) ) ; putc ( * ( dir +2) ) ; putc ( * ( dir +3) ) ;527 putc ( * ( dir +4) ) ; putc ( * ( dir +5) ) ; putc ( * ( dir +6) ) ; putc ( * ( dir +7) ) ;528 putc ( dir16A ) ; putc ( dir16B ) ; putc ( aplicarcambio ) ;529 putc ( atD ) ; putc ( D) ; putc ( opcion ) ;530 putc ( sumaDeControl ) ;531 532 }533534 /////////////////////////////////////////////////// //////////////////////////535 //536 // preguntaConfig537 //538 // Función encargada de comprobar la configuracion de la patilla D 539 /////////////////////////////////////////////////// //////////////////////////540 void preguntaConfig ( BYTE * dir , BYTE D)541 {542 543 D+=0x30 ; //para pasar a ASCII544 sumaDeControl =0; //Calcula la suma de control545 sumaDeControl = ( remotoAT +idConfig +* dir +* ( dir +1) +* ( dir +2) +* ( dir +3) +* ( dir +4) +* ( dir +5) ;

546 sumaDeControl =sumaDeControl +* ( dir +6) +* ( dir +7) +dir16A +dir16B +aplicarcambio +atD +D) ;547 sumaDeControl = 0xFF- sumaDeControl ;548 putc ( delimitador ) ; putc ( 0x00 ) ; putc ( tamaConfig ) ; putc ( remotoAT ) ; putc ( idConfig ) ;549 putc ( * dir ) ; putc ( * ( dir +1) ) ; putc ( * ( dir +2) ) ; putc ( * ( dir +3) ) ;550 putc ( * ( dir +4) ) ; putc ( * ( dir +5) ) ; putc ( * ( dir +6) ) ; putc ( * ( dir +7) ) ;551 putc ( dir16A ) ; putc ( dir16B ) ; putc ( aplicarcambio ) ;552 putc ( atD ) ; putc ( D) ;553 putc ( sumaDeControl ) ;554555 }556557 /////////////////////////////////////////////////// //////////////////////////558 //559 // enviaATremoto560 //561 // Función encargada de enviar comando remoto ATXX a la direccion *dir 64bits562 /////////////////////////////////////////////////// //////////////////////////563 void enviaATremoto ( BYTE * dir , BYTE at1 , BYTE at2 )564 {565 566 sumaDeControl =0; //Calcula la suma de control567 sumaDeControl = ( remotoAT +0x82 +* dir +* ( dir +1) +* ( dir +2) +* ( dir +3) +* ( dir +4) +* ( dir +5) ;568 sumaDeControl =sumaDeControl +* ( dir +6) +* ( dir +7) +dir16A +dir16B +aplicarcambio +at1 +at2 ) ;569 sumaDeControl = 0xFF- sumaDeControl ;570 putc ( delimitador ) ; putc ( 0x00 ) ; putc ( tamaConfig ) ; putc ( remotoAT ) ; putc ( 0x82 ) ;571 putc ( * dir ) ; putc ( * ( dir +1) ) ; putc ( * ( dir +2) ) ; putc ( * ( dir +3) ) ;572 putc ( * ( dir +4) ) ; putc ( * ( dir +5) ) ; putc ( * ( dir +6) ) ; putc ( * ( dir +7) ) ;573 putc ( dir16A ) ; putc ( dir16B ) ; putc ( aplicarcambio ) ;574 putc ( at1 ) ; putc ( at2 ) ;575 putc ( sumaDeControl ) ;576577 }578579580581 /////////////////////////////////////////////////// //////////////////////////582 //583 // rutinas envio datos a PC584 //585 /////////////////////////////////////////////////// //////////////////////////586587 /////////////////////////////////////////////////// //////////////////////////588 //589 // envioNumeroDispositivos590 //591 // indica al programa del pc el número de dispositi vos que forman la red592 /////////////////////////////////////////////////// //////////////////////////593 void envioNumeroDispositivos ( )

8

Page 9: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

594 {595 comando=0xF0 ; 596 numDispositivo =numeroDeDispositivos ;597 while ( comandoRx!= comandoSincNdisp ) //se mantiene enviando hasta recibir sincronización598 {599 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; 600 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; }601 } 602 comando=0;603 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ;604605606 }607608 /////////////////////////////////////////////////// //////////////////////////609 //610 // envioConofiguracionDispositivo611 //612 // indica al pc la configuración de las patillas de los dispositivos613 /////////////////////////////////////////////////// //////////////////////////614 void envioConofiguracionDispositivo ( )615 {616 dispositivos =numeroDeDispositivos ; 617 comando=0xFF; 618 while( dispositivos != 0)619 {620 numDispositivo = dispositivos ;621 D0=configuraciones [ dispositivos ] [ 0] ;622 D1=configuraciones [ dispositivos ] [ 1] ; 623 D2=configuraciones [ dispositivos ] [ 2] ;624 D3=configuraciones [ dispositivos ] [ 3] ; 625 D4=configuraciones [ dispositivos ] [ 4] ; 626 D5=configuraciones [ dispositivos ] [ 5] ;627 comandoRx=0;628 while ( comandoRx!= comandoSincCdisp ) //se mantiene enviando hasta recibir sincronización629 {630 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; 631 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; }632 } 633 dispositivos -- ;634 }635636 comando=0;637 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ;638 numDispositivo =0; //valores a 0639 D0=0;640 D1=0; 641 D2=0;642 D3=0; 643 D4=0; 644 D5=0;645 }646647648 /////////////////////////////////////////////////// //////////////////////////649 //650 // envioDatosDispositivos651 //652 // indica al programa del pc los valor de las patil las del dispositivo653 /////////////////////////////////////////////////// //////////////////////////654 void envioDatosDispositivos ( )655 {656657 dispositivos =numeroDeDispositivos ; 658 comando=0xAA;659 while( dispositivos != 0)660 {661 numDispositivo =dispositivos ;662 D0=datos [ dispositivos ] [ 0] ;663 D1=datos [ dispositivos ] [ 1] ; 664 D2=datos [ dispositivos ] [ 2] ;665 D3=datos [ dispositivos ] [ 3] ; 666 D4=datos [ dispositivos ] [ 4] ; 667 D5=datos [ dispositivos ] [ 5] ; 668 Analog0 =datos [ dispositivos ] [ 6] ;669 Analog1 =datos [ dispositivos ] [ 7] ;

9

Page 10: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

670 Analog2 =datos [ dispositivos ] [ 8] ;671 Analog3 =datos [ dispositivos ] [ 9] ;672 comandoRx=0;673 while ( comandoRx!= comandoSincDdisp ) //se mantiene enviando hasta recibir sincronización674 {675 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; 676 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; }677 } 678 dispositivos -- ;679 }680 comando=0;681 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ;682 numDispositivo =0; //valores a 0683 D0=0;684 D1=0; 685 D2=0;686 D3=0; 687 D4=0; 688 D5=0;689 Analog0 =0;690 Analog1 =0;691 Analog2 =0;692 Analog3 =0;693 }694695696 /////////////////////////////////////////////////// //////////////////////////697 //698 // rutinas recepción datos699 //700 // según el contenido de datos_entrantes se realiza la acción asociada701 // lo primero es ver a que dispositivo va dirigido el mensaje702 // y se envia al dispositivo la configuración solic itada703 /////////////////////////////////////////////////// //////////////////////////704 void rutinasRecepcionDatos ( ) //void rutinasRecepcionDatos(BYTE *recepcion) 705 {706707 switch ( comandoRx) 708 {709710 case comandoCambioConfig : //configura dispositivo 711 //si se ha cambiado la configuración se envia el co mando con la configuración nueva 712 configCambiada =FALSE; //se activa si se ha realizado algún cambio en la c onfiguración713 if( configuraciones [ numDispositivoRx ] [ 0] != D0Rx)714 {715 enviaConfig ( direcciones [ numDispositivoRx ] , 0, D0Rx) ;716 configuraciones [ numDispositivoRx ] [ 0] =D0Rx;717 configCambiada =TRUE;718 }719 if( configuraciones [ numDispositivoRx ] [ 1] != D1Rx)720 {721 enviaConfig ( direcciones [ numDispositivoRx ] , 1, D1Rx) ;722 configuraciones [ numDispositivoRx ] [ 1] =D1Rx;723 configCambiada =TRUE;724 }725 if( configuraciones [ numDispositivoRx ] [ 2] != D2Rx)726 {727 enviaConfig ( direcciones [ numDispositivoRx ] , 2, D2Rx) ;728 configuraciones [ numDispositivoRx ] [ 2] =D2Rx;729 configCambiada =TRUE;730 }731 if( configuraciones [ numDispositivoRx ] [ 3] != D3Rx)732 {733 enviaConfig ( direcciones [ numDispositivoRx ] , 3, D3Rx) ;734 configuraciones [ numDispositivoRx ] [ 3] =D3Rx;735 configCambiada =TRUE;736 }737 if( configuraciones [ numDispositivoRx ] [ 4] != D4Rx)738 {739 enviaConfig ( direcciones [ numDispositivoRx ] , 4, D4Rx) ;740 configuraciones [ numDispositivoRx ] [ 4] =D4Rx;741 configCambiada =TRUE; 742 }743 if( configuraciones [ numDispositivoRx ] [ 5] != D5Rx)744 {745 enviaConfig ( direcciones [ numDispositivoRx ] , 5, D5Rx) ;

10

Page 11: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

746 configuraciones [ numDispositivoRx ] [ 5] =D5Rx;747 configCambiada =TRUE;748 }749 //si hay cambios se manda el comando remoto WR que salva en memoria no volatil la

configuración750 if( configCambiada )751 {752 enviaATremoto ( direcciones [ numDispositivoRx ] , atW, atR ) ;753 envioConofiguracionDispositivo ( ) ;754 }755756 break;757758 case comandoCambioSalida : 759 /* se ha realizado un cambio en el valor de alguna salida, se comprueba cual es y se actua

sobre ella.760 se comprueba si se ha cambiado la configuración par a evitar transferencias innecesarias */

761 762 if( configuraciones [ numDispositivoRx ] [ 0] ==4|| configuraciones [ numDispositivoRx ] [ 0] ==5)763 {764 if( D0Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 0, Dbajo ) ; } //si se cumple se ha

pulsado765 if( D0Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 0, Dalto ) ; } 766 }767 if( configuraciones [ numDispositivoRx ] [ 1] ==4|| configuraciones [ numDispositivoRx ] [ 1] ==5)768 {769 if( D1Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 1, Dbajo ) ; }770 if( D1Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 1, Dalto ) ; } 771 }772 if( configuraciones [ numDispositivoRx ] [ 2] ==4|| configuraciones [ numDispositivoRx ] [ 2] ==5)773 {774 if( D2Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 2, Dbajo ) ; } 775 if( D2Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 2, Dalto ) ; } 776 }777 if( configuraciones [ numDispositivoRx ] [ 3] ==4|| configuraciones [ numDispositivoRx ] [ 3] ==5)778 {779 if( D3Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 3, Dbajo ) ; } 780 if( D3Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 3, Dalto ) ; }781 } 782 if( configuraciones [ numDispositivoRx ] [ 4] ==4|| configuraciones [ numDispositivoRx ] [ 4] ==5)783 {784 if( D4Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 4, Dbajo ) ; } 785 if( D4Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 4, Dalto ) ; }786 }787 if( configuraciones [ numDispositivoRx ] [ 5] ==4|| configuraciones [ numDispositivoRx ] [ 5] ==5)788 {789 if( D5Rx==0) { enviaConfig ( direcciones [ numDispositivoRx ] , 5, Dbajo ) ; } 790 if( D5Rx==1) { enviaConfig ( direcciones [ numDispositivoRx ] , 5, Dalto ) ; } 791 } 792 comando=numDispositivoRx ; 793 while ( comandoRx!= numDispositivoRx ) 794 {795 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; 796 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; }797 } 798 comando=0;799 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ;800 break;801802 case comandoActualizaValores : //se comprueban los valores de los dispositivos803 datosXBee ( ) ;804 envioDatosDispositivos ( ) ;805 break;806807 case comandoActualizaRed : //Se realiza un chequeo de la red 808809 redXBee ( ) ; //se hace un chequeo inicial para ver si hay dispos itivos en la red810 envioNumeroDispositivos ( ) ; //se le manda al PC el numero de dispositivos 811 datosXBee ( ) ; //y los datos de cada dispositivo812 envioDatosDispositivos ( ) ; 813 configuracionXbee ( ) ; //se comprueba la configuración de los distintos di spositivos814 envioConofiguracionDispositivo ( ) ; 815 break;816817

11

Page 12: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

818 default: break; //cualquier otra trama recibida819 }820 }821822 /////////////////////////////////////////////////// //////////////////////////823 //824 // comprobacion825 //826 // subrutina encargada de comprobar la suma de cont rol de una recepcion827 // cuando sumaDeControl=sumaDeControl+recepcionXbee [3+j] la suma es correcta828 // en caso afirmativo devuelve TRUE, de lo contrari o devuelve FALSE 829 /////////////////////////////////////////////////// //////////////////////////830 short comprobacion ( )831 {832 int j =0;833834 sumaDeControl =0x00 ;835 correcto =FALSE;836 for ( j =0; j <recepcionXbee [ 2] ; j ++) { sumaDeControl =sumaDeControl +recepcionXbee [ 3+j ] ; }837838 sumaDeControl =0xFF- sumaDeControl ;839840 if ( sumaDeControl ==recepcionXbee [ recepcionXbee [ 2] +3] ) 841 {842 correcto =TRUE;843 return ( correcto ) ;844 }845 else 846 {847 correcto =FALSE;848 return ( correcto ) ;849 }850851 }852853 /////////////////////////////////////////////////// //////////////////////////854 //855 // Funciones encargadas de iniciar arrays a 0 856 //857 /////////////////////////////////////////////////// //////////////////////////858859 /////////////////////////////////////////////////// //////////////////////////860 //861 // limpiarRecepcion862 //863 // se emplea para poner a 0 todos los elementos del array recepcionXbee864 /////////////////////////////////////////////////// //////////////////////////865 void limpiarRecepcion ( )866 { 867 int t =0;868 do { recepcionXbee [ t ++] =0; } while( t <=49) ;869 prx =0;870 }871872 /////////////////////////////////////////////////// //////////////////////////873 //874 // limpiarAuxRecep875 //876 // se emplea para poner a 0 todos los elementos del array auxRecepXbee877 /////////////////////////////////////////////////// //////////////////////////878 void limpiarAuxRecep ( )879 { 880 int t =0;881 do{ auxRecepXbee [ t ++] =0; } while( t <=99) ; 882 }883884 /////////////////////////////////////////////////// //////////////////////////885 //886 // limpiarDirecciones887 //888 // se emplea para poner a 0 todos los elementos del array direcciones889 /////////////////////////////////////////////////// //////////////////////////890 void limpiarDirecciones ( )891 {892 int t =0; 893 int y=0;

12

Page 13: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

894 for ( t = 0 ; t < 45 ; t ++) 895 for ( y = 0 ; y < 8 ; y++) { direcciones [ t ] [ y] =0; }896 }897898 /////////////////////////////////////////////////// //////////////////////////899 //900 // limpiarDatos901 //902 // se emplea para poner a 0 todos los elementos del array datos903 /////////////////////////////////////////////////// //////////////////////////904 void limpiarDatos ( )905 {906 int t =0; 907 int y=0;908 for ( t = 0 ; t < 45 ; t ++) 909 for ( y = 0 ; y < 10 ; y++) { datos [ t ] [ y] =0; }910 }911912 /////////////////////////////////////////////////// //////////////////////////913 //914 // limpiarConfigs915 //916 // se emplea para poner a 0 todos los elementos del array Configuraciones917 /////////////////////////////////////////////////// //////////////////////////918 void limpiarConfigs ( )919 {920 int t =0; 921 int y=0;922 for ( t = 0 ; t < 45 ; t ++) 923 for ( y = 0 ; y < 6 ; y++) { configuraciones [ t ] [ y] =0; }924 }925926927 /////////////////////////////////////////////////// //////////////////////////928 //929 // Programa Principal930 // 931 // Al alimentar el microcontrolador, antes de activ ar la comunicación usb se932 // realiza un chequeo de la red para establecer el número de nodos que la 933 // forman.nicaciones usb y espera recibir datos934 // desde el PC actuando según el comando recibido, byte 1 del array de entrada.935 // 936 // Estas actuaciones se detallan en el subprograma rutinas_recepcion_datos937 /////////////////////////////////////////////////// //////////////////////////938 void main ( )939 { 940 enciende ( ledR ) ; 941 apaga ( ledV ) ;942 usb_init_cs ( ) ; //permite hacer otros procesos aunque no se conecte a USB943 enable_interrupts ( global ) ;944 limpiarDirecciones ( ) ;945 limpiarConfigs ( ) ;946 limpiarDatos ( ) ;947948 redXBee ( ) ; //se hace un chequeo inicial para ver si hay dispos itivos en la red949 configuracionXbee ( ) ; //se comprueba la configuración de los distintos di spositivos950 datosXBee ( ) ;951 952 enable_interrupts ( int_usb ) ; //activa la interrupción USB953954 while ( TRUE) 955 {956 usb_task ( ) ; //Configura el puerto USB957 958 if( usb_enumerated ( ) ) //Si el puerto es enumerado y configurado por el PC959 {960 enciende ( ledV ) ; 961 while ( comandoRx!= comandoSincroniza ) //se mantiene enviando FE hasta recibir

comandoSincroniza962 {963 comando=comandoSincroniza ;964 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; //se envia la trama

completa y se recibe un valor965 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; } //para coordinarse

con el programa del pc 966

13

Page 14: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

967 } ; //PC y microcontrolador están ahora coordinados968 comando=0;969 comandoRx=0;970 envioDatosDispositivos ( ) ;971 envioConofiguracionDispositivo ( ) ;972 envioNumeroDispositivos ( ) ;973 974 while ( usb_enumerated ( ) ) 975 {976977 if ( usb_kbhit ( 1) ) { usb_get_packet ( 1, datosEntrantes , tamaRx ) ; }978 979 if ( comandoRx!= 0) 980 {981 for( i =0; i <8; i ++) { auxEntrantes [ i ] =datosEntrantes [ i ] ; }982 rutinasRecepcionDatos ( ) ;983 if ( auxrx ==comandoRx) { veces ++; }984 auxrx =comandoRx;985 // output_toggle(PIN_B0); 986 }987 comando=0;988 comandoRx=0;989 usb_put_packet ( 1, datosSalientes , tamaTx , USB_DTS_TOGGLE) ; 990 } 991 }992 }993 }994995 996 /////////////////////////////////////////////////// //////////////////////////997 //998 // Programa Interrupciones999 //1000 /////////////////////////////////////////////////// //////////////////////////10011002 /////////////////////////////////////////////////// //////////////////////////1003 //1004 // Interrupción TIMER 01005 //1006 // Activa la variable tiempo agotado para evitar bl oqueos en la espera 1007 // de recepciones enviadas por el coordinador al mi crocontrolador1008 /////////////////////////////////////////////////// //////////////////////////1009 #INT_TIMER 0 1010 void isr_timer0 ( void) 1011 { 1012 tiempoAgotado =TRUE;1013 }10141015 /////////////////////////////////////////////////// //////////////////////////1016 //1017 // Interrupción TIMER 11018 //1019 // Incrementa la variable desbordaT1 y la compara c on la variable cuenta1020 // activando tiempoAgotado cuando se llega a la int errupción cuenta veces1021 /////////////////////////////////////////////////// //////////////////////////1022 #INT_TIMER 1 1023 void isr_timer1 ( void) 1024 { 1025 desbordaT1 ++;1026 if ( desbordaT1 >cuenta ) { tiempoAgotado =TRUE; }1027 }10281029 /////////////////////////////////////////////////// //////////////////////////1030 //1031 // Interrupción Recepción serie1032 //1033 // Se activa cuando hay datos presentes en la recep ción del microcontrolador1034 // almacena el caracter e inicia el timer0 a la vez que lo habilita haciendo1035 // que si no vuelve a recibir otro dato en el tiemp o de desborde del timer,1036 // que tiene un margen de seguridad suficiente para evitar la pérdida de 1037 // datos recibidos, se termine con la recepción1038 /////////////////////////////////////////////////// //////////////////////////1039 #INT_RDA1040 void recepcionSerie ( void)1041 {1042

14

Page 15: 46849434-Pic-xbee-c

C:\Users\Berny\Desktop\Programación\Microprograma\P ic xbee.c

1043 while( kbhit ( ) )1044 { 1045 recepcionXbee [ prx ] =getc ( ) ;1046 prx ++;1047 }1048 set_timer0 ( 0) ; //el timer se rinicia cada vez que se recibe un car acter1049 enable_interrupts ( INT_TIMER0 ) ;1050 }1051 1052

15