Autor Tema: cosa rara : una variable int16 se comporta como un int8(SOLUCIONADO)  (Leído 1982 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Amigos :estoy peleando con el cartucho de memoria que graba datos desde el serial y los pone en unas fram

cuando intento mandar desde el macro manager del siow ( terminal de puerto serie de windows) una cadena de caracteres formado por 254 bytes , lo hace correctamente , mas cuando le pongo un byte mas ( 255 ) , se come todos e imprime el ultimo , si coloco 257 , imprime solamente los 2 ultimos , tipico comportamiento de una variable int8 sin embargo , la variable dom del for que voy a colocar a continuacion es de 16 :shock:

la variable int16 dom esta en el cart.h
#include "cart.h"


void main( )
{
 

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);

   setup_spi ( SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H |SPI_CLK_DIV_64 |SPI_SAMPLE_AT_END);

   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  // enable_interrupts(INT_RDA);
   //enable_interrupts(GLOBAL);
   setup_oscillator(False);

   porta = 0b00000000 ; trisa = 0b00000100 ;
   portb = 0b00111111 ; trisb = 0b00000000 ;
   portc = 0b00000000 ; trisc = 0b11010000 ;
   portd = 0b11111111 ; trisd = 0b00000000 ;
   porte = 0b00000000 ; trise = 0b00000000 ; 

   delay_ms ( 40 ) ;
   fm25256_reset ( ) ;
   delay_ms ( 40 ) ;

   printf ( "Hola\r\n" ) ;
   
   while ( true )
   {         
      dom  = 0 ; chip = 0 ; dato = 0 ;               // inicializo las variables por las dudas...

         for ( chip = 0 ; chip < 7 ; chip++ )      // para las 7 memorias
         {         
                       
            for ( dom = 0 ; dom < 32000  ; dom++  ) // que recorra los domicilios de la memoria     ****ESTE SE COMPORTA COMO DE INT8****
            {                   
               dsr = 1 ;                                 // habilito el puerto                           
               while ( ~ kbhit ( ) ) { } ;               // si kbhit no tiene nada que se quede ahi 
               {                                         // si entro un caracter...
                   dato = getc ( ) ;                     // lo descargo ...
                   dsr  = 0 ;         // detengo el tx del puerto
                 
                   fm25256_wr_en ( chip );               // proceso de escritura de la fram
                   fm25256_wr_data ( chip , dom , dato ) ; // grabo el chip , pos de memoria y dato       
                   if ( dato == 0xf8 )                      // si el dato es fin de archivo ( 0xf8 )...
                   {
                     led = 1 ;                           // prendo el led
                     goto aqui ;                         // va a leer la memoria
                   }
                   dato = 0 ;                               // pongo a cero dato por las dudas
               }
            }
         } 
 
   aqui: dsr = 1 ;                                       // activacion tx del puerto       PARA PODER HACER EL PRINTF
   
   dom  = 0 ; chip = 0 ; dato = 0 ;
 
          for ( chip = 0 ; chip < 7 ; chip++ )
          {
             for ( dom = 0 ; dom < 32000  ; dom++  )
             {               
               dato = fm25256_rd_data ( chip , dom ) ;                                                            //proceso de lectura
               printf ( "leo en chip:%u  memoria:%lu  dato:%0x\r\n" , chip , dom , dato ) ;               
               if ( dato == 0xf8  )
               {
                 led = 0 ;
                 goto fin ;
               }
             }   
          }
fin:;     
   }
}

desde ya gracias!!
« Última modificación: 14 de Abril de 2007, 16:02:38 por fastyx »

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: cosa rara : una variable int16 se comporta como un int8
« Respuesta #1 en: 13 de Abril de 2007, 21:28:32 »
les cuento que modifique todo lo relacionado con la transmision ( los anule)  y puse a rodar el for y los dom corrieron bien

debe ser algo del puerto que limita a 255 la transmision de los bytes  :shock:

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: cosa rara : una variable int16 se comporta como un int8
« Respuesta #2 en: 14 de Abril de 2007, 12:48:40 »
una pregunta fastyx ¿has realizado pruebas de transferencia de datos sin la memoria? es decir, solo el pic y el hyperterminal. Creo que deberias primero asegurarte que está bien esa parte y depués le insertas la siguiente etapa.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: cosa rara : una variable int16 se comporta como un int8
« Respuesta #3 en: 14 de Abril de 2007, 15:43:30 »
ya lo solucione : mas raro todavia

                        corriendo el for con el incremento del domicilio pero sin la transmision por el puerto , coloque datos fijos para que corra el for y lo hizo
perfecto.(con esto me garantizaba en forma artificial que la escritura lectura de las fram daban bien)

descarte entonces que la variable dom estuviera jodiendo.
segui buscando y encontre que en la funcion de la escritura y lectura de la f-ram decia:

void fm25256_wr_data ( int8 cs_ , int16 dom , int8 data )
{
   if      ( cs_ == 0 ) cs0_ = 0 ;
   else if ( cs_ == 1 ) cs1_ = 0 ;
   else if ( cs_ == 2 ) cs2_ = 0 ;
   else if ( cs_ == 3 ) cs3_ = 0 ;
   else if ( cs_ == 4 ) cs4_ = 0 ;
   else if ( cs_ == 5 ) cs5_ = 0 ;
   else if ( cs_ == 6 ) cs6_ = 0 ;                        // estos son los chip select ya que tengo 7
   delay_us ( 20 ) ;
   spi_write ( FM_WR_DATA ) ;
   spi_write ( (int16)dom >> 8 ) ;                     //*******ACA DECIA SPI_WRITE (( INT8)DOM>>8 ) ; Y LO CAMBIE POR INT16
   spi_write ( (int16)dom ) ;                             //*******ACA DECIA SPI_WRITE (( INT8)DOM>>8 ) ; Y LO CAMBIE POR INT16
   spi_write ( data ) ;
   delay_us ( 20 ) ;
   fm25256_reset ( ) ;
}






int8 fm25256_rd_data ( int8 cs_ , int16 dom )
{
   int8 x ;
   
   if      ( cs_ == 0 ) cs0_ = 0 ;
   else if ( cs_ == 1 ) cs1_ = 0 ;
   else if ( cs_ == 2 ) cs2_ = 0 ;
   else if ( cs_ == 3 ) cs3_ = 0 ;
   else if ( cs_ == 4 ) cs4_ = 0 ;
   else if ( cs_ == 5 ) cs5_ = 0 ;
   else if ( cs_ == 6 ) cs6_ = 0 ;
 
   delay_us ( 20 ) ;
   spi_write ( FM_RD_DATA ) ;
   spi_write ( (int16)dom >> 8 ) ;                             //*******ACA DECIA SPI_WRITE (( INT8)DOM>>8 ) ; Y LO CAMBIE POR INT16
   spi_write ( (int16)dom ) ;                                     //*******ACA DECIA SPI_WRITE (( INT8)DOM>>8 ) ; Y LO CAMBIE POR INT16
   x = spi_read ( 0 ) ;
   delay_us ( 20 ) ;
   fm25256_reset ( ) ;
   return ( x ) ;
}

 Y COMENZO A grabar y leer  CON LA TRANSMISION !!!
Si me preguntas porque con el barrido del for artificial andaba , y con la transmision no , no tengo la menor idea!!!!