TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hqv en 01 de Junio de 2004, 21:24:00
-
hola amigos:
le mando este mail debido a que he tenido problemas con la instrucción GETS().
estoy recibiendo datos desde el puerto serial, lo común que mellgue es de este fomato:
0d0aring0d0a
hice una rutina que reconoce el primer 0d y luego viene la instruccion GEtS(variable) que supuestamente debería guardar todo hasta encontrar un 0d(retorno de carro) lo cual no ocurre y se queda pegao ahí, esto lo compruebo ya que tengo n led antes y después de la instrucción y este se enciende pero no se apaga.
no se si me faltará algo que habilitar para utiliarla.
otra consultaes acerca de los timer es como hacer para que duren 3 segundos y yo poder ver si se desbordo o no, cual es el flag que se origina al desbordarse que lo quiero poner en una condición.
gracias
-
Hola
Pon el programa y alguien te ayudará..
Bueno respecto a lo del temporizador.. si es el TMR0 el bit T0IF se pone a uno cuando el TMR0 pasa de FF a 00 este queda en el registro INTCON y es el bit 2, seria algo asi
#bit T0IF = 0x0b.2
if(TOIF){
.....
}
Espero te sirva
-
Pon el programa y explicalo un poquillo.
Respecto a los timers, si usas un micro de la serie 87x, tienen 3 timers, el TMR0, el TMR1 y el TMR2.
El TMR0 y el TMR2 son de 8 bits y el TMR1 de 16 bits.
Si quieres usar temporizaciones elevadas, del orden de segundos solo con un timer no vas a poder, entonces necesitas cargar un determinado timer con un número, por ejemplo 50ms y ver cuando se desborda consultando su bandera correspondiente. Cuando se desborde incrementas (o decrementas una variable) y otra vez a temporizar los 50ms. Por ejemplo si quisieras 1s la variable la tendrías que precargar con 20 y decrementarla (o incrementarla y ver cuando llega a 20).
Un saludo
-
aqui esta el programa para que lo puedan ver y ayudar.
#include "16f877.h"
#include "string.h"
#org 0x1F00, 0x1FFF void loader16F876(void) {} //protect bootloader code for the 8k 16F876/7
#use delay(clock=4000000)
//#fuses XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#zero_ram
#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8
#byte port_e=9
short timeout_error;
char timed_getc();
#int_rda
void datos_entrantes();
main()
{
//SET_TRIS_A(0xFE);
SET_TRIS_D(0X00);//SALIDAS RD0,RD1
//printf("online
"
;
enable_interrupts(int_rda);
enable_interrupts(global);
bit_clear(port_d,0);
bit_clear(port_d,1);
//bit_clear(port_a,0);
//disable_interrupts(global);
//printf("ATD93192792
"
;
//delay_ms(2000);
//enable_interrupts(global);
while(1)
{
bit_set(port_a,0);
delay_ms(1000);
bit_clear(port_a,0);
delay_ms(1000);
}// fin while(1)
}// fin de programa
#int_rda
void datos_entrantes()
{
char string_buffer[20];
if (timed_getc() == 0x0D)
{
bit_set(port_d,1);
gets(string_buffer);
bit_clear(port_d,1);
bit_set(port_d,0);
printf("%S",string_buffer); printf("%S",string_buffer);
bit_clear(port_d,0);
}
}// fin datos_entrantes
char timed_getc() {
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit()&&(++timeout<50000)) // 1/2 second
delay_us(10);
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
}
}
el problema lo tengo dentro de la interrupcion por RDA,
entro al if y se queda pegado en el gets(string_buffer), eso lo detecto ya que tengo un led antes y se debe apagar cuando termina la instrucción , lo cual no ocurre.
gracias por la ayuda anterior
-
Te lo he probado y funciona bien.
- El LED del porta RA0 está parpadeando 1s (activa el tris en el programa para que esto suceda).
- Al recibir un CR se enciende el led de RD1 y deja de parpadear RA0.
- Escribimos con el teclado la cadena y pulsamos CR, entonces se apaga el LED de RD1 y retransmite al terminal la cadena 2 veces, además RA0 comienza de nuevo el parpadeo.
Un saludo
-
gracias pocher, pero lo que me pasa es que yo recibo desde un telefono celular el sonido del RING el cul viene de la siguiente manera
0d0aring0d0a y es aqui donde no me funciona el programa
en todo caso el ring se recibe más de una vez por lo tanto llegan mas de un 0d que deberian hacer que la instruccion gets dejara de recibir datos.
gracias por la ayuda
-
Hola..
Es solo una opinion
.. porque si no te funciona la funcion gets, implementas una parecida..
Algo asi
char Buffer- ;
void recibe(void){
int i;
do{
Buffer[i++]=getc();
}while(Buffer!="/0");