H261 decoder

Dependencies:   SDL_lib2 SX1276Lib mbed

Files at this revision

API Documentation at this revision

Comitter:
miruga27
Date:
Wed Jan 11 20:18:38 2017 +0000
Parent:
0:5bd441b8ab2d
Commit message:
JPEG Compressor and SX1276 transmitter

Changed in this revision

functions_dec.h Show annotated file Show diff for this revision Revisions of this file
lora.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 5bd441b8ab2d -r 1ed97958d0f3 functions_dec.h
--- a/functions_dec.h	Thu Sep 22 00:04:30 2016 +0000
+++ b/functions_dec.h	Wed Jan 11 20:18:38 2017 +0000
@@ -25,6 +25,16 @@
 #define RAIZ2 1.414214
 #define PI16 0.19635
 
+const float coeff[8][8]={
+        {1.000, 0.980658, 0.923381, 0.830384, 0.705265, 0.552863, 0.379075, 0.190623},
+        {1.000000, 0.830384, 0.379075, -0.200829, -0.712605, -0.982642, -0.919336, -0.544161},
+        {1.000000, 0.552863, -0.388685, -0.982642, -0.697848, 0.211013, 0.931171, 0.818607},
+        {1.000000, 0.190623, -0.927326, -0.544161, 0.719867, 0.818607, -0.407777, -0.974070},
+        {1.000000, -0.200829, -0.919336, 0.570086, 0.690356, -0.847373, -0.350003, 0.987954},
+        {1.000000, -0.561505, -0.369424, 0.976372, -0.727052, -0.159885, 0.906605, -0.858241},
+        {1.000000, -0.836138, 0.398253, 0.170150, -0.682790, 0.971663, -0.942098, 0.603785},
+        {1.000000, -0.982642, 0.931171, -0.847373, 0.734158, -0.595456, 0.436082, -0.261569} };
+
 void IDCT(int matrix[8][8][3],short int f[HEIGHT][WIDTH][3],int p_fil,int p_col){
     int i=0,j=0,u,v;
     float cu=1,cv=1;
@@ -45,7 +55,8 @@
             float dato=0.0;
             float dato2=0.0;
             float dato3=0.0;
-
+            
+            float acum0=0.0,acum1=0.0,acum2=0.0;
 
             for(u=0;u<8;u++){
 
@@ -59,26 +70,28 @@
 
                     }
                     else cv=1.0;
-                    dato=(float)(cos((float)((((+j-p_col)<<1)+1)*v*PI16)));
-                    dato2=(float)(cos((float)((((i-p_fil)<<1)+1)*u*PI16)));
+                    /*dato=(float)(cos((float)((((j-p_col)*2)+1)*v*PI16)));
+                    dato2=(float)(cos((float)((((i-p_fil)*2)+1)*u*PI16)));*/
+                    dato=coeff[j-p_col][v];//(float)(cos((float)((((j-p_col)*2)+1)*v*PI16)));
+                    dato2=coeff[i-p_fil][u];//(float)(cos((float)((((i-p_fil)*2)+1)*u*PI16)));
                     dato3=(float)((cu*cv)/4);
 
-                    f[i][j][0]+=(short int)(dato*dato2*(matrix[u][v][0]))*dato3;//crominancia
-                    f[i][j][1]+=(short int)(dato*dato2*(matrix[u][v][1]))*dato3;//crominancia
-                    f[i][j][2]+=(short int)(dato*dato2*(matrix[u][v][2]))*dato3;//luminancia
+                    acum0+=(float)(dato*dato2*(matrix[u][v][0]))*dato3;//crominancia
+                    acum1+=(float)(dato*dato2*(matrix[u][v][1]))*dato3;//crominancia
+                    acum2+=(float)(dato*dato2*(matrix[u][v][2]))*dato3;//luminancia
 
                 }
             }
-
-
-
+            
+            f[i][j][0]=(short int)acum0;
+            f[i][j][1]=(short int)acum1;
+            f[i][j][2]=(short int)acum2;
 
         }
 
 
     }
 
-
 }
 
 void yuv_to_rgb(short int f[HEIGHT][WIDTH][3]){
@@ -87,7 +100,7 @@
     int i=0,j=0;
 
     float r=0.0,g=0.0,b=0.0;
-    char cad[180];
+   
 
     int cont;
   
@@ -96,16 +109,16 @@
 
 
 
-            b=(f[i][j][2]-16)*1.164+(f[i][j][1]-128)*2.017;
-            g=(f[i][j][2]-16)*1.164-(f[i][j][0]-128)*0.813-(f[i][j][1]-128)*0.392;
-            r=((f[i][j][2])-16)*1.164+((f[i][j][0])-128)*1.596;
+            b=(f[i][j][0])+(f[i][j][1]-128)*1.765;
+            g=(f[i][j][0])-(f[i][j][2]-128)*0.711-(f[i][j][1]-128)*0.343;
+            r=((f[i][j][0]))+((f[i][j][2])-128)*1.400;
 
         /*  r=(*(pixel+2)-16)*1.164+(*(pixel)-128)*1.793;
             g=(*(pixel+2)-16)*1.164-(*(pixel+1)-128)*0.213-(*(pixel)-128)*0.533;
             b=(*(pixel+2)-16)*1.164+((*(pixel+1))-128)*2.112;*/
-            if(r>255) r=255;
+            if(b>255) r=255;
             if(g>255) g=255;
-            if(b>255) b=255;
+            if(r>255) b=255;
 
             if(r<0) r=0;
             if(g<0) g=0;
@@ -189,9 +202,9 @@
         for(j=0;j<WIDTH;j+=8)
         for(x_block=i; x_block<i+8 ;x_block++){
             for(y_block=j; y_block<j+8 ;y_block++){
-                mat[x_block][y_block][2]*=luma[x_block-i][y_block-j];
+                mat[x_block][y_block][0]*=luma[x_block-i][y_block-j];
                 mat[x_block][y_block][1]*=croma[x_block-i][y_block-j];
-                mat[x_block][y_block][0]*=croma[x_block-i][y_block-j];
+                mat[x_block][y_block][2]*=croma[x_block-i][y_block-j];
             }
         }
     }
diff -r 5bd441b8ab2d -r 1ed97958d0f3 lora.h
--- a/lora.h	Thu Sep 22 00:04:30 2016 +0000
+++ b/lora.h	Wed Jan 11 20:18:38 2017 +0000
@@ -1,30 +1,25 @@
-//Author: Miguel Ruiz García
-//Company: University of Cantabria. 2016
-//mail: mrg47@alumnos.unican.es
-//code for TX & RX
 #include "mbed.h"
 #include "lora2.h"
 #include "sx1276-hal.h"
 #include "debug.h"
-//#include "functions.h"
+ 
 /* Set this flag to '1' to display debug messages on the console */
-#define DEBUG_MESSAGE   1
-
-
+#define DEBUG_MESSAGE   0
+ 
 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
 #define USE_MODEM_LORA  1
 #define USE_MODEM_FSK   !USE_MODEM_LORA
-
-#define RF_FREQUENCY                                    869000000 // Hz
-#define TX_OUTPUT_POWER                                 14        // 14 dBm
-
+ 
+#define RF_FREQUENCY                                    868000000 // Hz
+#define TX_OUTPUT_POWER                                 20        // 14 dBm
+ 
 #if USE_MODEM_LORA == 1
-
-    #define LORA_BANDWIDTH                              1         // [0: 125 kHz,
+ 
+    #define LORA_BANDWIDTH                              2         // [0: 125 kHz,
                                                                   //  1: 250 kHz,
                                                                   //  2: 500 kHz,
                                                                   //  3: Reserved]
-    #define LORA_SPREADING_FACTOR                       10         // [SF7..SF12]
+    #define LORA_SPREADING_FACTOR                       7       // [SF7..SF12]
     #define LORA_CODINGRATE                             1         // [1: 4/5,
                                                                   //  2: 4/6,
                                                                   //  3: 4/7,
@@ -32,13 +27,13 @@
     #define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
     #define LORA_SYMBOL_TIMEOUT                         5         // Symbols
     #define LORA_FIX_LENGTH_PAYLOAD_ON                  false
-    #define LORA_FHSS_ENABLED                           true  
+    #define LORA_FHSS_ENABLED                           false  
     #define LORA_NB_SYMB_HOP                            4     
     #define LORA_IQ_INVERSION_ON                        false
     #define LORA_CRC_ENABLED                            true
     
 #elif USE_MODEM_FSK == 1
-
+ 
     #define FSK_FDEV                                    25000     // Hz
     #define FSK_DATARATE                                19200     // bps
     #define FSK_BANDWIDTH                               50000     // Hz
@@ -50,19 +45,18 @@
 #else
     #error "Please define a modem in the compiler options."
 #endif
-
-#define RX_TIMEOUT_VALUE                                3500000   // in us
-#define BUFFER_SIZE                                     255        // Define the payload size here [min:1 max:255]
-
+ 
+#define RX_TIMEOUT_VALUE                                9500000   // in us
+#define BUFFER_SIZE                                     32        // Define the payload size here
+ 
 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
 DigitalOut led(LED2);
 #else
 DigitalOut led(LED1);
 #endif
-
-
+ 
 /*
- *  Global variables declarations
+ *  Global variables declarations 
  */
 typedef enum
 {
@@ -79,82 +73,80 @@
     CAD,
     CAD_DONE
 }AppStates_t;
-
+ 
 volatile AppStates_t State = LOWPOWER;
-
+ 
 /*!
  * Radio events function pointer
  */
 static RadioEvents_t RadioEvents;
-
+ 
 /*
  *  Global variables declarations
  */
 SX1276MB1xAS Radio( NULL );
-
+ 
 const uint8_t PingMsg[] = "PING";
 const uint8_t PongMsg[] = "PONG";
+ 
+
 const uint8_t AckMsg[] = "ACK";
 const uint8_t EOPMsg[] = "EOP";
 const uint8_t RfSMsg[] = "RfS";
+const uint8_t InitMsg[] = "INIT";
+const uint8_t PaqMsg[] = "\t\n";
+
 int py=0,pu=0,pv=0,py2=0,pu2=0,pv2=0;
 int py_ant=0,pu_ant=0,pv_ant=0;
 int flag_y=0,flag_u=0,flag_v=0;
+short int length_y=0,length_u=0,length_v=0;
 uint16_t BufferSize = BUFFER_SIZE;
 uint8_t Buffer[BUFFER_SIZE];
 //uint8_t Buffer2[4];
-
+int init=0;
 int16_t RssiValue = 0.0;
 int8_t SnrValue = 0.0;
-
+short int init_packet=0;
+int start=0;
 bool first_y=true,first_u=true,first_v=true;
-void lora(short int *temp1,short int index1,short int *temp2,short int index2,short int *temp3,short int index3) 
+ 
+void lora(short int *temp1,short int index1,short int *temp2,short int index2,short int *temp3,short int index3,short int acumulador[3])
 {
-    //index1=300;index2=300;index3=300;
     uint8_t i;
-    bool isMaster = false;//MASTER (TX) OR SLAVE(RX) ?
+    bool isMaster = false;
     
-    //pc.baud(BPS);
-    //pc.format (BITS,SerialBase::None, STOP_BITS) ;
-   
-
-    
-    //debug( "\n\n\r     SX1276 Ping Pong Demo Application \n\n\r" );
-    //pc.printf("\n\n\r     SX1276 Image transfer Application \n\n\r");
-
+    //debug( "\n\n\r     SX1276 JPEG Compressor Application \n\n\r" );
+ 
     // Initialize Radio driver
     RadioEvents.TxDone = OnTxDone;
     RadioEvents.RxDone = OnRxDone;
     RadioEvents.RxError = OnRxError;
     RadioEvents.TxTimeout = OnTxTimeout;
     RadioEvents.RxTimeout = OnRxTimeout;
-    RadioEvents.FhssChangeChannel = OnFhssChangeChannel;
     Radio.Init( &RadioEvents );
     
     // verify the connection with the board
-    goto start;
     while( Radio.Read( REG_VERSION ) == 0x00  )
     {
-        //debug( "Radio could not be detected!\n\r", NULL );
-        //pc.printf( "Radio could not be detected!\n\r", NULL );
+        debug( "Radio could not be detected!\n\r", NULL );
         wait( 1 );
     }
-    start:        
+            
     //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > Board Type: SX1276MB1LAS < \n\r" );
     //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > Board Type: SX1276MB1MAS < \n\r" );
     
-    Radio.SetChannel( HoppingFrequencies[0] ); 
-
+    Radio.SetChannel( RF_FREQUENCY ); 
+ 
 #if USE_MODEM_LORA == 1
     
     //debug_if( LORA_FHSS_ENABLED, "\n\n\r             > LORA FHSS Mode < \n\n\r");
     //debug_if( !LORA_FHSS_ENABLED, "\n\n\r             > LORA Mode < \n\n\r");
-
+ 
     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                          LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                          LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                          LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
-                         LORA_IQ_INVERSION_ON, 4000000 );
+                         LORA_IQ_INVERSION_ON, 2000000 );
     
     Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                          LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
@@ -163,12 +155,12 @@
                          LORA_IQ_INVERSION_ON, true );
                          
 #elif USE_MODEM_FSK == 1
-
-    debug("\n\n\r              > FSK Mode < \n\n\r");
+ 
+    //debug("\n\n\r              > FSK Mode < \n\n\r");
     Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
                          FSK_DATARATE, 0,
                          FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
-                         FSK_CRC_ENABLED, 0, 0, 0, 3000000 );
+                         FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
     
     Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
                          0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
@@ -176,18 +168,19 @@
                          0, 0, false, true );
                          
 #else
-
+ 
 #error "Please define a modem in the compiler options."
-
+ 
 #endif
-    
+     
     //debug_if( DEBUG_MESSAGE, "Starting image transmission loop\r\n" ); 
-    //pc.printf("Starting image transmission loop\r\n");
         
     led = 0;
-   
+    flag_y=0,flag_u=0,flag_v=0;
+    int finish=0;
+    first_y=true,first_u=true,first_v=true;
     Radio.Rx( RX_TIMEOUT_VALUE );
-    State=RX;//Estado inicial para el receptor
+    
     while( 1 )
     {
         switch( State )
@@ -195,34 +188,118 @@
         case RX:
             if( isMaster == true )
             {
-                //debug( "waiting for response....\r\n" );
                 if( BufferSize > 0 )
                 {
-                    
-                    if( strncmp( ( const char* )Buffer, ( const char* )AckMsg, 3 ) != 0 )
+                    if( strncmp( ( const char* )Buffer, ( const char* )AckMsg, 3 ) == 0 )
                     {
                         led = !led;
-                        //debug( "Packet acknoledged....\r\n" );
-      //                  pc.printf( "Packet acknoledged....\r\n" );
-                        // Send the next  frame            
-                        State = TX;
-                    }
+                        //debug( "...Ack RX\r\n" );
+
+                        Buffer[0]='\t';
+                        Buffer[1]='\n';
+                        //index1=20;index2=20;index3=20;
+                        int pointer=0;
+                        for(pointer=2;pointer<BufferSize;pointer+=2){
                     
-                    else if( strncmp( ( const char* )Buffer, ( const char* )RfSMsg, 3 ) == 0 ){
+                            if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
+                                if(first_y == true) {//en primer lugar se manda la longitud de la componente y u v 
+                                    Buffer[pointer]=index1&0xff;//Se carga la parte baja del short int y en el siguiente byte se carga la parte alta.
+                                    Buffer[pointer+1]=(index1>>8)&0xff;
+      //                              debug("%c %c \r\n",Buffer[pointer],Buffer[pointer+1]);
+                                    first_y = false;
+                                    
+                                     //debug( "transmitting y length...\r\n" );
+                                }
+                                 else{
+                                    Buffer[pointer]=*(temp1+py) & 0x00ff;
+                                    Buffer[pointer+1]=(*(temp1+py)>>8) & 0x00ff;
+                                    py++;
+                                    //debug( "transmitting y data..\r\n" );
+                                    if(py >= index1) {
+                                    
+                                        flag_y=1;
+                                        break;
+                                        //Buffer[pointer+2]='\t';
+                                        //pointer+=2;
+                                    }
+                                }
+                            }
+                            else if(flag_u==0){
+                                if(first_u == true) {
+                                    Buffer[pointer]=index2&0xff;
+                                    Buffer[pointer+1]=(index2>>8)&0xff;
+                                    first_u = false;
+                                    //debug( "transmitting u length...\r\n" );
+                                }
+                                else{
+                                
+                                    Buffer[pointer]=*(temp2+pu) & 0x00ff;
+                                    Buffer[pointer+1]=(*(temp2+pu)>>8) & 0x00ff;
+                                    pu++;
+                                    //debug( "transmitting u data...\r\n" );
+                                    if(pu>= index2) {
+                                        flag_u=1;
+                                        //Buffer[pointer+2]='\t';
+                                        //pointer+=2;
+                                        break;
+                                    }
+                                }
+                            }
                         
-                            led = !led;
-                            debug( "Retransmit packet....\r\n" );
-        //                    pc.printf( "Retransmit packet....\r\n" );
-                            // Send the next  frame            
-                            State = TX;
-                            py=py_ant; pu=pu_ant; pv=pv_ant;//Si hay que reenviar el paquete se reestablecen los valores de punteros.
-                    }                        
+                            else{
+                                if(first_v == true) {
+                                    Buffer[pointer]=index3&0xff;
+                                    Buffer[pointer+1]=(index3>>8)&0xff;
+                                    first_v = false;
+                                    //debug( "transmitting v length...\r\n" );
+                                }
+                                else{
+                                    Buffer[pointer]=*(temp3+pv) & 0x00ff;
+                                    Buffer[pointer+1]=(*(temp3+pv)>>8) & 0x00ff;
+                                    pv++;
+                                    //debug( "transmitting v data ...\r\n" );
+                                    if(pv >= index3) {
+                                        flag_v=1;
+                                        //Buffer[pointer+2]='\n';//salto de línea es EOT  
+                                        //pointer+=2;
+                                        break;
+                                    }
+                                }
+                            }
+                        
+                        
+                        }
                     
-                    else // valid reception but neither a  message
+                    //debug( "end of cycle..\r\n" );
+                    int finish=0;
+                    if(flag_y==1 && flag_u==1 && flag_v==1){
+                        //Buffer[pointer]='\n';//salto de línea es EOT  
+                        flag_y=0;flag_u=0;flag_v=0;
+                        //debug( "finished transmission ...\r\n" );
+                        first_y=true;first_u=true;first_v=true;
+                        finish=1;
+                        
+
+                    }
+                    else{
+                        for( i = pointer; i < BufferSize; i++ )
+                        {
+                            Buffer[i] = i - 4;
+                        }
+                        
+                    }
+
+                
+
+                    wait_ms( 10 );                
+                    //debug( "Sending packet...\r\n" );
+                    Radio.Send( Buffer, BufferSize );
+                    if(finish==1) goto end;
+                    }
+
+                    else // valid reception but neither a PING or a PONG message
                     {    // Set device as master ans start again
-                      debug( "no message received...\r\n" );
-          //          pc.printf( "hola...\r\n" );
-                        isMaster = true;//this intruction is DANGEROUS!!!!!!
+                        isMaster = true;
                         Radio.Rx( RX_TIMEOUT_VALUE );
                     }    
                 }
@@ -231,85 +308,139 @@
             {
                 if( BufferSize > 0 )
                 {
-                    
+                    if( strncmp( ( const char* )Buffer, ( const char* )InitMsg, 4 ) == 0 )
+                    {
                         led = !led;
-                        debug( "Reading... \r\n" );
-            //            pc.printf( "Reading... \r\n" );
+    //                    debug( "...Init received gfd\r\n" );
+                                    short int num=0;
+                                    num=0xff & Buffer[5];
+                                    num=num<<8;
+                                    num=num | (Buffer[4] & 0xff);
+  //                                  debug( "py = %i\r\n",num );
+                                    
+                                    py=num;
+                                    
+                                    num=0;
+                                    num=0xff & Buffer[7];
+                                    num=num<<8;
+                                    num=num | (Buffer[6] & 0xff);
+  //                                  debug( "pu = %i\r\n",num );
+                                    pu=num;
+                        num=0;
+                                    num=0xff & Buffer[9];
+                                    num=num<<8;
+                                    num=num | (Buffer[8] & 0xff);
+  //                                  debug( "pv = %i\r\n",num );
+                                    
+                                    pv=num;
+                                    //py=py_ant;pu=pu_ant;pv=pv_ant;
+                                    
+                                    if(pv<=0) {
+                                       flag_v=0;
+                                       first_v=true;
+                                       pv=0;
+                                    }
+                                    if(pu<=0) {
+                                       flag_u=0;
+                                       first_v=true;
+                                       pu=0;
+                                    }
+                                    if(py<=0) {
+                                       flag_y=0;
+                                       first_v=true;
+                                       py=0;
+                                    }
+                                    
                         
-                    int pointer=0;
-                    int length_y=0,length_v=0,length_u=0;
-                    for(pointer=0;pointer<254;pointer+=4){
+                        // Send the reply to the PING string
+                        strcpy( ( char* )Buffer, ( char* )AckMsg );
+                        // We fill the buffer with numbers for the payload 
+                        for( i = 3; i < BufferSize; i++ )
+                        {
+                            Buffer[i] = i - 4;
+                        }
+                        wait_ms( 10 );  
+                        Radio.Send( Buffer, BufferSize );
+                    }
+                    else if( strncmp( ( const char* )Buffer, ( const char* )PaqMsg, 2 ) == 0 )
+                    { // A master already exists then become a slave
+                        
+  //                      debug( "...Receiving data TX \r\n" );
+                        led = !led;
+                         int pointer=0;
+                            py_ant=py;
+                            pu_ant=pu;
+                            pv_ant=pv;
+                                               
+                        
+                        for(pointer=2;pointer<BufferSize;pointer+=2){
                         if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
                             if(first_y == true) {//EL PRIMER DATO ES LA LONGITUD
                                 length_y=0xff & Buffer[pointer+1];
                                 length_y=length_y<<8;
-                                length_y=length_y | Buffer[pointer];
+                                length_y=length_y | (Buffer[pointer] & 0xff);
                                 first_y = false;
-                                temp1=(short int *)malloc(sizeof(short int)*length_y);
-                                pointer-=2;//this is to avoid lose the first byte of the component
-                                //in the cycle 'pointer+=4' but in the first package of the component there´s no a pair [length,value]
-                                
+
+                                acumulador[0]=length_y;
+  //                              debug("length_y = %i \r\n",length_y);
                             }
                             else{
-                                if(Buffer[pointer]!='\t'){//VERIFY the character is not EOC (end of component y u v)
+                                //if(Buffer[pointer]!='\t'){//VERIFY the character is not EOC (end of component y u v)
                         
                                     short int num=0;
                                     num=0xff & Buffer[pointer+1];
                                     num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp1+py2)=num;
-                                    py2++;
-                                    
-                                    if (py2 > length_y) {flag_y=1;}
+                                    num=num | (Buffer[pointer] & 0xff);
+                                    *(temp1+py)=num;
+                                    py++;
                                     
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp1+py2)=num;
-                                     py2++;
+  //                                  debug("valor py = %i \r\n",py);
+  //                                  debug("num = %i \r\n",num);
+                                    if (py >= length_y) {
+                                        flag_y=1;
+                                        //acumulador[0]=py;
+  //                                      debug("valor py = %i \r\n",py);
+                                        break;
+                                    }
+                                    
+
                                      
-                                     if (py2 > length_y) {flag_y=1;}//if all bytes of the component are read, indicator is raised
+                                    //if all bytes of the component are read -> flag raised
                                      //originally designed with goto.
-                                }
-                                else {
-                                    flag_y=1;
-                                }
-                            }
+
+                           }
                         }
                             
-                        
+                       
                         else if(flag_u==0){
                             if(first_u == true) {
                                 length_u=0xff & Buffer[pointer+1];
                                 length_u=length_u<<8;
-                                length_u=length_u | Buffer[pointer];
+                                length_u=length_u | (Buffer[pointer] & 0xff);
+                                acumulador[1]=length_u;
                                 first_u = false;
-                                temp2=(short int *)malloc(sizeof(short int)*length_u);
-                                pointer-=2;
+                                
+  //                              debug("length_u = %i \r\n",length_u);
                             }
                             else{
-                                if(Buffer[pointer]!='\t'){//VERIFY the character is not "end of component"
+                                
                         
                                     short int num=0;
                                     num=0xff & Buffer[pointer+1];
                                     num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp2+pu2)=num;
-                                    pu2++;
-                                    
-                                    if (pu2 > length_u) {flag_u=1;}
+                                    num=num | (Buffer[pointer] & 0xff);
+                                    *(temp2+pu)=num;
+                                    pu++;
+  //                                  debug("valor pu = %i \r\n",pu);
+  //                                  debug("num = %i \r\n",num);
+                                    if (pu >= length_u) {
+                                        flag_u=1;
+                                         //acumulador[1]=pu;
+                                        break;
+                                    }
                                     
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp2+pu2)=num;
-                                     pu2++;
-                                     
-                                     if (pu2 > length_u) {flag_u=1;}
-                                }
-                                else {
-                                    flag_u=1;
-                                }
+
+
                             }
                         }
                         
@@ -317,245 +448,190 @@
                             if(first_v == true) {
                                 length_v=0xff & Buffer[pointer+1];
                                 length_v=length_v<<8;
-                                length_v=length_v | Buffer[pointer];
+                                length_v=length_v | (Buffer[pointer] & 0xff);
+                                acumulador[2]=length_v;
                                 first_v = false;
-                                temp3=(short int *)malloc(sizeof(short int)*length_v);
-                                pointer-=2;
+                               
+  //                              debug("length_v = %i \r\n",length_v);
+                                
+                                
                             }
                             else{
-                                if(Buffer[pointer]!='\n'){//VERIFY the character is not EOT
+                                //if(Buffer[pointer]!='\n'){//VERIFY the character is not EOT
                         
                                     short int num=0;
                                     num=0xff & Buffer[pointer+1];
                                     num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp3+pv2)=num;
-                                    py2++;
-                                    
-                                    if (pv2 > length_v) {flag_v=1;}
+                                    num=num | (Buffer[pointer] & 0xff);
+                                    *(temp3+pv)=num;
+                                    pv++;
+  //                                  debug("valor pv = %i \r\n",pv);
+  //                                  debug("num = %i \r\n",num);
+                                    if (pv >= length_v) {
+                                        flag_v=1;
+                                        //acumulador[2]=pv;
+                                        break;}
                                     
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp3+pv2)=num;
-                                     pv2++;
-                                     
-                                     if (pv2 > length_v) {flag_v=1;}
-                                }
-                                else {
-                                    flag_v=1;
-                                    break;
-                                }
+
+
                             }
                         }
          
                         
                     }
                     if(flag_y==1 && flag_u==1 && flag_v ==1){ 
+                        py=0;pu=0;pv=0;
+                        //py_ant=0;pu_ant=0;pv_ant=0;
+                        //flag_y=0;flag_u=0;flag_v=0;
+                        //first_y=true;first_u=true;first_v=true;
+                        
+  //                      debug( "Packet received (final de imagen)\r\n" );
+
+                        State = LOWPOWER;
+                        //goto end;
+                        finish=1;       
+                                     
+                       
+                    }
+                        
                         strcpy( ( char* )Buffer, ( char* )AckMsg );
                         // We fill the buffer with numbers for the payload 
-                            for( i = 4; i < BufferSize; i++ )
+                            for( i = 4; i < 32; i++ )
                             {
                             Buffer[i] = i - 4;
                             }
                         wait_ms( 10 );  
+
+  //                      debug( "Packet received \r\n" );
+                        Radio.Send( Buffer, BufferSize );
+                        if(finish==1) {
+                            py_ant=0;pu_ant=0;pv_ant=0;
+                            flag_y=0;flag_u=0;flag_v=0;
+                            first_y=true;first_u=true;first_v=true;
+                            goto end;
+                        }
+                    }
+                    else // valid reception but not a PAQ or init as expected (Request for send)
+                    {    // Set device as master and start again
+                        //isMaster = true;
+
+                        strcpy( ( char* )Buffer, ( char* )AckMsg );
+                        // We fill the buffer with numbers for the payload 
+                            for( i = 4; i < 32; i++ )
+                            {
+                            Buffer[i] = i - 4;
+                            }
+                        wait_ms( 10 );  
+
+  //                      debug( "RfS received \r\n" );
                         Radio.Send( Buffer, BufferSize );
                         
-                        first_y=true;first_u=true;first_v=true;
+                    }   
+                                    
                         
-                       // debug( "Packet received \r\n" );
-              //          pc.printf( "Packet received \r\n" );
-                        State = LOWPOWER;
-                        goto end;
-                       
-                    }
-                    
-                    State=TX;
+
                 }
             }
-            
+            State = LOWPOWER;
             break;
         case TX:    
             led = !led; 
             if( isMaster == true )  
             {
-                //debug( "transmission of packet (320x8)...\r\n" );
-                //pc.printf( "transmission of packet (320x8)...\r\n" );
-                int pointer=0;
                 
-                
-                    py_ant=py;pu_ant=pu;pv_ant=pv;
-                    for(pointer=0;pointer<254;pointer+=2){
-                    
-                        if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
-                            if(first_y == true) {//en primer lugar se manda la longitud de la componente y u v despues del rlc
-                                Buffer[pointer]=index1&0xff;
-                                Buffer[pointer+1]=(index1>>8)&0xff;
-                                first_y = false;
-                                 //debug( "transmitting y length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp1+py) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp1+py)>>8) & 0x00ff;
-                                py++;
-                                // debug( "transmitting y data..\r\n" );
-                                if(py >= index1) {
-                                    flag_y=1;
-                                    Buffer[pointer+2]='\t';
-                                    pointer+=2;
-                                }
-                            }
-                        }
-                        else if(flag_u==0){
-                            if(first_u == true) {
-                                Buffer[pointer]=index2&0xff;
-                                Buffer[pointer+1]=(index2>>8)&0xff;
-                                first_u = false;
-                                //debug( "transmitting u length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp2+pu) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp2+pu)>>8) & 0x00ff;
-                                pu++;
-                                //debug( "transmitting u data...\r\n" );
-                                if(pu>= index2) {
-                                    flag_u=1;
-                                    Buffer[pointer+2]='\t';
-                                    pointer+=2;
-                                }
-                            }
-                        }
-                        
-                        else{
-                            if(first_v == true) {
-                                Buffer[pointer]=index2&0xff;
-                                Buffer[pointer+1]=(index2>>8)&0xff;
-                                first_v = false;
-                                //debug( "transmitting v length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp3+pv) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp3+pv)>>8) & 0x00ff;
-                                pv++;
-                                //debug( "transmitting v data ...\r\n" );
-                                if(pv >= index3) {
-                                    flag_v=1;
-                                    Buffer[pointer+2]='\n';//salto de línea es EOT  
-                                    pointer+=2;
-                                    break;
-                                }
-                            }
-                        }
-                        
-                        
-                    }
-                    
-                    if(flag_y==1 && flag_u==1 && flag_v==1){
-                        Buffer[pointer]='\n';//salto de línea es EOT  
-                        flag_y=0;flag_u=0;flag_v=0;
-                        //debug( "finished transmission ...\r\n" );
-                        first_y=true;first_u=true;first_v=true;
-                        goto end;
-                        for( i = Buffer[pointer]; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                    }
-                    else{
-                        for( i = Buffer[pointer]; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                    }
-
-                
-
-                wait_ms( 10 ); 
-                //debug( "Sending packet...\r\n" );
-                Radio.Send( Buffer, BufferSize );
-                
-               // pc.printf( "Sending packet...\r\n" );
+                //debug( "Iransmitting packet TX...\r\n" );
             }
-                
             else
             {
-                //debug( "hola...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )AckMsg );
+  //              debug( "ACK RX...\r\n" );
+                
+            }
+            Radio.Rx( RX_TIMEOUT_VALUE );
+            State = LOWPOWER;
+            break;
+        case RX_TIMEOUT:
+            if( isMaster == true )
+            {
+                
+                strcpy( ( char* )Buffer, ( char* )InitMsg );
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
                 wait_ms( 10 ); 
                 Radio.Send( Buffer, BufferSize );
-                Radio.Rx( RX_TIMEOUT_VALUE );  
-            }  
-            
-            State = RX;
-            break;
-        case RX_TIMEOUT:
-            if( isMaster == true )
-            {
-                //debug( "hola rx_timeout...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                // Send the next PING frame
-                strcpy( ( char* )Buffer, ( char* )RfSMsg );
-                for( i = 4; i < BufferSize; i++ )
-                {
-                    Buffer[i] = i - 4;
-                }
-                wait_ms( 10 ); 
-                Radio.Send( Buffer, BufferSize );
+                //debug("start!\r\n");//empezamos aqui
             }
             else
             {
-                //debug( "hola...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )RfSMsg );
+  //              debug("RX_TIMEOUT... \r\n");
+                wait(3);
+                /*strcpy( ( char* )Buffer, ( char* )AckMsg );
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
                 wait_ms( 10 ); 
-                Radio.Send( Buffer, BufferSize );
-                Radio.Rx( RX_TIMEOUT_VALUE );  
+                Radio.Send( Buffer, BufferSize );  */
+                Radio.Rx( RX_TIMEOUT_VALUE );
             }             
             State = LOWPOWER;
             break;
-
         case RX_ERROR:
-            // We have received a Packet with a CRC error, request packet again.
+            // We have received a Packet with a CRC error, send reply as if packet was correct
             if( isMaster == true )
             {
-                
-                //debug( "hola rx_error...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )RfSMsg);
+                // Send the next PING frame
+                strcpy( ( char* )Buffer, ( char* )InitMsg );
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
-                
                 wait_ms( 10 );  
                 Radio.Send( Buffer, BufferSize );
-                State = LOWPOWER;
             }
             else
             {
-                //debug( "hola ...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                // Send the RfS again
-                strcpy( ( char* )Buffer, ( char* )RfSMsg);
+                // Send the next PONG frame
+  //              debug("CRC ERROR... \r\n");
+                //wait(3);
+
+
+                /*while(1){
+                    led=!led;
+                    wait(1);
+                }*/
+                const uint8_t RfSY[] = "RfSy";
+                const uint8_t RfSU[] = "RfSu";
+                const uint8_t RfSV[] = "RfSv";
+                
+                        if(py < acumulador[0]) {
+ //                           debug("sent RFSY message \r\n");
+                            strcpy( ( char* )Buffer, ( char* )RfSY );
+
+                                       
+                        }
+                        else if(pu < acumulador[1]) {
+ //                           debug("sent RFSu message \r\n");
+                            strcpy( ( char* )Buffer, ( char* )RfSU );
+
+                                       
+                        }
+                        else {
+ //                           debug("sent RFSV message \r\n");
+                            strcpy( ( char* )Buffer, ( char* )RfSV );
+                            
+
+                                       
+                        }
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
-                py=py_ant;pu=pu_ant;pv=pv_ant;
                 wait_ms( 10 );  
                 Radio.Send( Buffer, BufferSize );
-                State = LOWPOWER;
             }
-            //State = LOWPOWER;
+            State = LOWPOWER;
             break;
         case TX_TIMEOUT:
             Radio.Rx( RX_TIMEOUT_VALUE );
@@ -571,18 +647,16 @@
     end:
     int a;
 }
-
+ 
 void OnTxDone( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = TX;
     debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
 }
-
+ 
 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     BufferSize = size;
     memcpy( Buffer, payload, BufferSize );
@@ -591,34 +665,26 @@
     State = RX;
     debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
 }
-
+ 
 void OnTxTimeout( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = TX_TIMEOUT;
-    //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
+    debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
 }
-
+ 
 void OnRxTimeout( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     Buffer[ BufferSize ] = 0;
     State = RX_TIMEOUT;
-    //debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
+    debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
 }
-
+ 
 void OnRxError( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = RX_ERROR;
     debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
 }
 
-void OnFhssChangeChannel( uint8_t channelIndex )
-{
-    Radio.SetChannel( HoppingFrequencies[channelIndex] );
-    debug_if( DEBUG_MESSAGE, "F%d-", channelIndex);
-}
diff -r 5bd441b8ab2d -r 1ed97958d0f3 main.cpp
--- a/main.cpp	Thu Sep 22 00:04:30 2016 +0000
+++ b/main.cpp	Wed Jan 11 20:18:38 2017 +0000
@@ -1,3 +1,4 @@
+
 
 
 /*
@@ -15,11 +16,12 @@
 #include "mbed.h"
 #include "functions_dec.h"
 #include "lora.h"
+//#include "debug.h"
 #define BPS 128000
 #define BITS 8
 #define STOP_BITS 1
  
-
+//DigitalOut myled(LED1);
 
 int main(int argc, char *argv[]){
     Serial pc(USBTX, USBRX);
@@ -27,50 +29,98 @@
     pc.format (BITS,SerialBase::None, STOP_BITS) ;
 
     int i=0,j=0,p_x=0,p_y=0,k=0;
-
+    //myled=1;
     short int m[HEIGHT][WIDTH][3];
     short int *matriz=(short int *)malloc(sizeof(short int)*WIDTH*HEIGHT*3);
-    
+    short int index1,index2,index3;
     short int acumulador[3]={0,0,0};
+int veces=0;
+
+for(veces=0; veces < 30;veces++){
     short int *temp1,*temp2,*temp3;//these are vectors. Memory allocations are done at lora function.
-    lora(temp1,acumulador[0],temp2,acumulador[1],temp3,acumulador[2]);//acumulador tells the length of the respective vector(acumulador[0] -> temp1,...)
+    temp3=(short int *)malloc(sizeof(short int)*380);
+    temp2=(short int *)malloc(sizeof(short int)*300);
+    temp1=(short int *)malloc(sizeof(short int)*300);
+//debug("lora\r\n");
+    lora(temp1,index1,temp2,index2,temp3,index3,acumulador);//acumulador tells the length of the respective vector(acumulador[0] -> temp1,...)
     int indice=0;
-    
+  //  debug("paquete numero %i\r\n",veces+1);
     //We must "unroll" the vectors after being processed with the RLC (in the encoder)
-    for(i=0;i<acumulador[0]>>1;i++){
-        for(j=k;j<*(temp1+indice)+k;j++){
-            *(matriz+j*3)=*(temp1+indice+1);
+
+/*    debug("return from lora function...\r\n");
+    debug("acumulador[0]= %i\r\n",acumulador[0]);
+    debug("acumulador[0]= %i\r\n",acumulador[1]);
+    debug("acumulador[0]= %i\r\n",acumulador[2]);
+    debug("Paquete numero %i\r\n",veces+1);*/
+    k=0;
+    short int acc1=0,acc2=0,acc3=0;
+  for(i=0;i<acumulador[0]/2;i++){//Se divide entre 2 poque se cuentan por pares (longitud,valor).
+        for(j=k;j<(*(temp1+indice)*3+k);j+=3){
+        
+            *(matriz+j)=*(temp1+indice+1);
+            acc1++;
+            if(j>HEIGHT*WIDTH*3) break;
+            //debug("iteracion\r\n");
+        }
+        k=j;
+        indice+=2;
+         
+    }
+    for(i=(acc1-1)*3;i<HEIGHT*WIDTH*3;i++){
+        *(matriz+i)=0;
+        
+    }
+   
+//debug("*(temp1+indice)= %i\r\n",*(temp1+0));
+    indice=0;
+    k=0;
+    for(i=0;i<acumulador[1]/2;i++){
+
+        for(j=k;j<(*(temp2+indice)*3+k);j+=3){
+        
+            *(matriz+j+1)=*(temp2+indice+1);
+            acc2++;
+            if(j>HEIGHT*WIDTH*3) break;
         }
         k=j;
         indice+=2;
     }
+    for(i=(acc2-1)*3;i<HEIGHT*WIDTH*3;i++){
+        *(matriz+i+1)=0;
+    }
+    
+//debug("*(temp2+indice)= %i\r\n",*(temp2+indice));
     indice=0;
     k=0;
-    for(i=0;i<acumulador[1]>>1;i++){
-        for(j=k;j<*(temp2+indice)+k;j++){
-            *(matriz+j*3+1)=*(temp2+indice+1);
+    for(i=0;i<acumulador[2]/2;i++){
+        for(j=k;j<(*(temp3+indice)*3+k);j+=3){
+       
+            *(matriz+j+2)=*(temp3+indice+1);
+            acc3++;
+            if(j>HEIGHT*WIDTH*3) break;
         }
         k=j;
         indice+=2;
     }
     
-    indice=0;
-    k=0;
-    for(i=0;i<acumulador[2]>>1;i++){
-        for(j=k;j<*(temp3+indice)+k;j++){
-            *(matriz+j*3+2)=*(temp3+indice+1);
-        }
-        k=j;
-        indice+=2;
+    for(i=(acc3-1)*3;i<HEIGHT*WIDTH*3;i++){
+        *(matriz+i+2)=0;
     }
     
-    
-    
+
+
+    free(temp1);
+    free(temp2);
+    free(temp3);
+    //debug("zig-zag\r\n");
+
     zig_zag_dec(m,matriz);
+    //debug("acumulador\r\n");
 
     cuantizador_dec(m);
+    
 
-
+    //debug("idct\r\n");
     int matrix[8][8][3];
     for(i=0;i<HEIGHT;i+=8){
         for(j=0;j<WIDTH;j+=8){
@@ -97,7 +147,7 @@
 
     int bpp=3;
 
-    for(i=0;i<HEIGHT;i++){
+/*    for(i=0;i<HEIGHT;i++){
         for(j=0;j<WIDTH;j++){
                
                 if(m[i][j][0]>235) m[i][j][0]=235;
@@ -108,22 +158,131 @@
                 if(m[i][j][1]<16) m[i][j][1]=16;
                 if(m[i][j][2]<16) m[i][j][2]=16;
         }
+    }*/
+//debug("yuv\r\n");
+    yuv_to_rgb(m);
+    unsigned char var;
+/*    for(i=0;i<HEIGHT;i++){
+    for(j=0;j<WIDTH;j++){
+         while(!pc.writeable());
+         pc.printf("%c",(char)m[i][j][0]);
     }
-
-    yuv_to_rgb(m);
+}*/
 
     for(i=0;i<8;i++){
        for(j=0;j<320;j++){
+
+               var=0xff & m[i][j][0];
+                if(j>311){
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j-8][0]);
                 
-                while(!pc.writeable());
-                pc.printf("%u",(unsigned char)m[i][j][0]);
-                    
-                while(!pc.writeable());
-                pc.printf("%u",(unsigned char)m[i][j][1]);
-                while(!pc.writeable());
-                pc.printf("%u",(unsigned char)m[i][j][2]);
+                
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j-8][1]);
+                
+                
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j-8][2]);
+                }
+                else{
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j][0]);
+                
+                
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j][1]);
+                
+                
+                    while(!pc.writeable());
+                    pc.printf("%c",(char)m[i][j][2]);
+                }
+                
+                //var=255;
+
         
         }
     }
+    
+    while(!pc.writeable());
+    pc.printf("2");//OJO con ponerlo aqui arriba
+    
+ 
+    char h;
+    h=acc1&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acc1>>8) & 0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+
+
+
+    h=acc2&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acc2>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    
+    h=acc3&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acc3>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+ /*   char h;
+    h=acumulador[0]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[0]>>8) & 0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+
+
+
+    h=acumulador[1]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[1]>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    
+    h=acumulador[2]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[2]>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);*/
+}
+
+    DigitalOut led(LED1);
+    while(1){
+        
+        led=1;
+        wait(0.5);
+        led=0;
+        wait(0.5);
+    }
 return 0;
 }