Hola soy nuevito en este mundo
Tengo problemas con el programa para recibir datos, por el puerto rs232 a través de las interrupciones para recibir datos. Yo tengo que hacer una aplicación por visual BASIC .que envía al micro un comando, además envía un valor de dirección y una variable a guardar en la memoria entre 0 a 255 .por ejemplo si envió el comando “\w”, donde le dice al micro que debe esperar valores para escribir en la memoria. Los valores que espera y que debe recibir por el mismo puerto rs232, una dirección y un valor a guardar.y tambien el micro debe enviar valores si le manda por ejemplo"\l" donde el micro debe esperar el comando a leer y luego de recivir el valor de la direcion a leer el pic envia al programa de visual basic los valores guardados.
como sabemos El programa VB envía cadenas al micro, por tal razón estoy tratando de usar un buffer para poder usar valores de 0 a 255 direciones de la eeprom. Pero he tenido puros problemas.
Además cuando envió un dato por VB. La interrupción para recibir del micro. Me funciona una vez y deja de funcionar. Para que vuelva a funcionar debo poner reset y además cuando pongo las condiciones del la sub programa procesar_comando, de la condiciones “if” aparece un error en el compilador, el erro que lanza en “ccs” es“ lable =scr 2178”.
Estoy usando el Proteus, para poder simular el programa. Uso el “COMPIN” para poder enviar de Proteus hacia VB.
Para simular los puertos virtuales rs232, uso el programa VSPD.
Aquí les dejo código que pretendo usar y foto del programa.
Gracias por la antemanos
.
http://s4.subirimagenes.com/otros/previo/thump_3316790ventana.jpghttp://s4.subirimagenes.com/otros/previo/thump_3316797proteus.jpghttp://s4.subirimagenes.com/otros/previo/thump_3316806error.jpghttp://s4.subirimagenes.com/otros/previo/thump_3316807error2.jpghttp://s4.subirimagenes.com/otros/previo/thump_3316814error3.jpg// _232_buffered.c
#include <16f876a.h> // Definiciones del PIC 16F876A
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=4000000) // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=32; // Longitud de buffer, Ajustar
// a lo que desees (o te sea posible)
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último caracter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
// Declaración de Funciones ///////////////////////////////////////////////////
void inicbuff(void); // Borra buffer
void addcbuff(char c); // añade caracter recibido al buffer
void echos(char c); // Eco selectivo sobre RS232
void procesa_comando(void); // Procesa comando
#include <stdlib.h>
// INTERRUPCIONES /////////////////////////////////////////////////////////////
#int_rda
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
echos(rcvchar); // hago eco (si procede).
}
}
// Desarrollo de Funciones ////////////////////////////////////////////////////
void echos(char c){ // Echo selectivo ----------------------
switch(c){
case 0x0D: printf(" [Ent] " ); // Si he pulsado la tecla [Intro]
break;
case 0x08: printf(" [Del] " ); // Si he pulsado la tecla [Retroceso]
break;
case 0x1B: printf(" [Esc] " ); // Si he pulsado la tecla [Escape]
break;
default: putc(rcvchar); // Echo de cualquier otro caracter
}
}
void inicbuff(void){ // Inicia a cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
cbuff[ i ]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
void addcbuff(char c){ // Añade a cbuff -----------------------
switch(c){
case 0x0D: // Enter -> Habilita Flag para procesar
flagcommand=1; // Comando en Main
break;
case 0x08: // Del -> Borra último caracter del Buffer
if(xbuff>0) cbuff[--xbuff]=0x00;
break;
case 0x01B: // Esc -> Borra el Buffer completamente
inicbuff();
break;
default:
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
}
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
inicbuff(); // Borra buffer al inicio
printf("** RS232 Buffered **" ); // Presenta menú
printf("[Enter] Procesa comando" );
printf("[Escape] Borra todo el buffer" );
printf("[Delete] Borra último carácter del buffer" );
printf("[\w] Comando Escribe" );
printf("[\r] Comando Lee" );
printf("" );
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand) procesa_comando(); // Si hay comando pendiente
// de procesar ... lo procesa.
} while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////
void procesa_comando(void){
int i,xv;
char arg[lenbuff]; // Argumento de comando (si lo tiene)
flagcommand=0; // Desactivo flag de comando pendiente.
printf("Procesando ... " ); // Monitorizo procesando ...
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
arg[ i ]=0x00; // caracteres en el argumento
}
if(cbuff[0]=="\"&&cbuff[1]=="r")
{ // Comparo inicio del buffer con comando ""
printf("Leyendo ... " ); // Aqui lo que deseemos hacer con comando ""
}
if(cbuff[0]=="\"&&cbuff[ 1 ]=="w")
{ // Comparo inicio del buffer con comando "w"
i=2;
do
{ // Extraemos argumento del buffer
arg[i-2]=cbuff; // a partir del 3er byte y hasta .
}while(cbuff[++i ]!=0x00);
xv = atoi(arg);
printf("Escribiendo %s %u... ",arg,xv ) ;// Aqui lo que deseemos hacer con comando "w"
// Monitorizamos el argunmento.
}
inicbuff(); // Borro buffer.
printf("Procesado." ); // Monitorizo procesado.
}
[\code]