TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx en 12 de Abril de 2007, 20:13:00
-
Amigos : estoy tratando de concluir con un programa que controla la comunicacion serial entre la pc y un cartucho de memoria con un pic 18f452 y 7 fram de 32k
el asunto de escritura y lectura lo tengo solucionado ya que al hacer un for de escritura y un for con print de lectura , hace lo correcto inclusive cambiando el chip select.
Mi problema es que ese cartucho debe recibir informacion desde el puerto serie , y trabajando con el monitor del puerto serie con el macro manager , no puedo
lograr que el getc () tome de a un byte a la vez , lo procese y requiera el siguiente.
si le doy una orden de un byte repetidamente , lo procesa , pero yo necesito que administre la llegada de miles de bytes y lo guarde en memoria hasta que reciba fin de archivo.
pd : lei el articulo de redpic hasta en el baño , pero no le encuentro la vuelta ...
-
aca incluyo el archivo...
#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 )
{
domi = 0 ; chip = 0 ; u = 0 ; // inicializo las variables por las dudas...
for ( chip = 0 ; chip < 7 ; chip++ ) // para las 7 memorias
{
for ( domi = 0 ; domi < 32000 ; domi++ ) // que recorra los domicilios de la memoria
{
u = getc ( ) ; // recibe caracter del rs232
fm25256_wr_en ( chip ); // maniobra para la escritura ( opcode etc)
fm25256_wr_data ( chip , domi , u ) ; // escribo en el chip , memoria y dato ( u )
if ( u == 0xf8 ) goto aqui ; // si coincide con fin de archivo....
}
}
aqui:
///////////////////////// recorro y hago el print de la lectura//////////////////////////////////
domi = 0 ; chip = 0 ; u = 0 ;
for ( chip = 0 ; chip < 7 ; chip++ )
{
for ( domi = 0 ; domi < 32000 ; domi++ )
{
u = fm25256_rd_data ( chip , domi ) ;
printf ( "leo en chip:%u memoria:%lu dato:%0x\r\n" , chip , domi , u ) ;
if ( u == 0xf8 ) goto fin ;
}
}
fin:;
}
}
-
prueba colocando la función kbhit así:
if(kbhit()) {
u = getc();
...
-
gracias por contestar!
una pregunta : si yo le mando a traves de la terminal serie una cadena de caracteres ( varios bytes juntos ) , la funcion kbhit ( ) es capaz de hacerle tomar un solo caracter a getc() y despues parar la transmision hasta el proximo ?
-
ajá, si lees en la página 155 del ccs_manual.pdf (http://www.ccsinfo.com/downloads/ccs_c_manual.pdf) veras que getc retorna un carácter (1 byte) y para evitar lecturas erroneas, debes esperar a que el buffer de entrada contenga el dato que llega, y esto se hace con kbhit (ver página 173)
-
gracias por el dato!! no conocia ese manual