TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hqv en 17 de Mayo de 2004, 16:12:00
-
Hola:
Soy nuevo en programación en c y tengo que solucionar los siguiente:
tengo que recibir con un pic 16f877 comandos at que provienen de un celular, guardarlos y poder interpretarlos para asi ejecutar una accion determinada.
Como soy novato no se como guartarlos, donde quedan, que tipo de variable son.
muchas gracias de antemano
hqv
-
La usart, tiene dos bytes de buffer...
Que tienes que ir leyendo cada vez que se produzca una interrupcion por usart...
En c, no te pued ayudar, porque aún no he hecho nada... Pero para hacerte una idea, pasaté por el subforo de picbasic, y tengo un post llamado hserin hserout, que al menos puede aclararte algo de la filosofía de trabajo de la usart....
Luego solo tendrás que codificar en C a tu gusto....
-
RDA_isr()
{
while(kbhit()) //te aseguras de vaciar el buffer entero, aunque no es necesario si la rutina siguiente en demasiado larga te puede llegar otro dato mientras la ejecutas...
{
dato=getc();
}
}
saludos
-
gracias a los dos por contestarme
cualquier otra ayuda no vendría mal
hqv
-
Yo lo que he hecho, es crearme un buffer paralelo fifo de 30bytes, en el que cada vez que encuentro interrupción, lo voy llenando y luego en el programa principal, lo voy interpretando y vaciando a mi antojo...
Pero muy rápido que si la comunicación es suelta, se llena rápido...
-
Pienso que no hay mejor ejemplo que los que da el PCW..

Los encuentras en la carp. examples del PICC
este es para recibir un dato.. los datos los almacena en el arreglo BUFFER_SIZE.. y cada vez que va leyendo con la funcion bgetc() lo va desocupando
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
#int_rda
void serial_isr() {
int t;
buffer[next_in]=getc();
t=next_in;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t; // Buffer full !!
}
#define bkbhit (next_in!=next_out)
BYTE bgetc() {
BYTE c;
while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;
return(c);
}
void main() {
enable_interrupts(global);
enable_interrupts(int_rda);
printf("
Running...
"
;
// The program will delay for 10 seconds and then display
// any data that came in during the 10 second delay
do {
delay_ms(10000);
printf("
Buffered data => "
;
while(bkbhit)
putc( bgetc() );
} while (TRUE);
}
Espero sea de utilidad.
Adios
-
gracias odukec por el ejemplo.
hqv
-
odukec ¿cual es el nombre del ejemplo?
-
Hola..
es EX_SISR.C 
Adios
-
creo recordar que implemente ese buffer en el pic-sms que esta en la web
para modbus no lo use ya que al tener mas interrupciones en el programa corria el riesgo de sobrepasar el tiempo de espera del maestro al tratar los dats en el bucle principal.
la verdad es que en muchas aplicaciones de puerto serie este buffer va de maravilla
saludos
-
Pic-SMS???
Ese proyecto no lo conocía yo...
No quiero entrar en offtopic, pero donde le puedo hechar un ojo???
Tnks Pacala