TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx en 13 de Abril de 2007, 20:35:44
-
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!!
-
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:
-
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.
-
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!!!!