saludos, espero logren ayudarme, pues he visto en el foro y en el manual y no he logrado entender lo que hace esa función, pasa que quiero capturar datos del puerto serial y para ello me base en el codigo de Nocturno de los led's RGB por PWM con un timer, según su codigo hace esto:
char buffer[13];
int8 CaracteresRecibidos = 0;
int1 ComandoRecibido;
#INT_RDA
void serial_isr()
{
char c;
c=getc();
putchar(c);
buffer[CaracteresRecibidos] = c;
if (c==13)
ComandoRecibido=true;
else
CaracteresRecibidos = (CaracteresRecibidos+1)
% sizeof(buffer);
}
que hace esa funcion sizeof? y el %, es el residuo de la div entre caracteres+1 y sizeof?
es necesario ello?? osea podria estar solo CaracteresRecibidos++;?
y si mi buffer fuera de 8 caracteres como máximo? en realidad 9 mas en ENTER, solo con cambiar a esos valores no me funciona bien me sale este warning "
Interrupts disabled during call to prevent re-entrancy: (@DIV88)" osea coloco 9 en los lugares que esta 13 y salta ese warning, pero si coloco valores menores no aparece el warnig pero no funciona
estoy usando un 16f88 y este seria mi codigo:
#include <16F88.h> // libreria de definiciones del pic qeu se usa
#device adc=8 // el adc convertirá a 8 bits
#fuses INTRC_IO,MCLR,NOWDT,PUT,NOPROTECT,NOLVP,NOCPD,NOBROWNOUT//,NODEBUG,NOSTVREN,IESO,FCMEN,NOWRT,NOWRTD,NOWRTC,NOEBTR,NOEBTRB,NOCPB,NOWRTB // fuses necesarios
#use delay(internal=8000000) // valor del oscilador interno
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2, parity=N, bits=8) // definicion de uso del puerto serie
// en transmision asíncrona, 9600bps y pines necesarios para tx y rx, sin paridad, 8 bits para datos y 1 bit de parada
#byte port_a=0x05 // direccion en memoria del puerto a
#byte port_b=0x06 // direccion en memoria del puerto b
#use fast_io(a) // el puerto a, debes ser definido con tris_a
#use fast_io(b) // el puerto b, debes ser definido con tris_b
#define der_A PIN_B1 // definicion del pin B1 que representara al motor A, que sea alimentado para ir a derecha
#define izq_A PIN_B3 // definicion del pin B3 que representa al motor A, que sea alimentado para ir a izquierda
#define der_B PIN_B4 // definicion del pin B4 que representara al motor B, que sea alimentado para ir a derecha
#define izq_B PIN_B7 // definicion del pin B7 que representa al motor B, que sea alimentado para ir a izquierda
int count=0,CaracteresRecibidos=0,value,MotorA,MotorB;
char c,Buffer[9];
int1 ComandoRecibido;
#INT_RDA
void serial_isr()
{
c=getc();
putchar(c);
Buffer[CaracteresRecibidos]=c;
if (c==9)
ComandoRecibido=true;
else
CaracteresRecibidos=(CaracteresRecibidos+1)%sizeof(buffer);
}
void Demo()
{
}
void Procesa()
{
int8 i=0;
int1 CambiandoA,CambiandoB;
CambiandoA=false;
CambiandoB=false;
while(i<CaracteresRecibidos)
{
if((Buffer[i]=='a') || (Buffer[i]=='A'))
{
CambiandoA=true;
CambiandoB=false;
}
if((Buffer[i]=='b') || (Buffer[i]=='B'))
{
CambiandoB=true;
CambiandoA=false;
}
if((Buffer[i]>='0') && (Buffer[i]<='9'))
{
if(CambiandoA)
MotorA=MotorA*10+Buffer[i]-48;
if(CambiandoB)
MotorB=MotorB*10+Buffer[i]-48;
}
if((Buffer[i]=='d') || (Buffer[i]=='D'))
Demo();
i++;
}
printf("Grados establecidos: Motor A = %u, Motor B = %u \n\r\n\r",MotorA,MotorB);
CaracteresRecibidos=0;
ComandoRecibido=false;
}
void main()
{
setup_oscillator(OSC_8MHZ);
set_tris_b(0b01000101);
set_tris_a(0b11111111);
output_b(0);
output_a(0);
printf ("Control Motores\n\r\n\r");
printf ("Introduce la cantidad deseada de grados a girar formato AxxxBxxx\n\r");
printf ("Puedes modificar solo un motor con (A/B)xxx\n\r");
printf ("Si escribes DEMO veras una secuencia de giros\n\r");
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(sAN0|sAN1|VREF_VREF);
SET_ADC_CHANNEL(0);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
if(ComandoRecibido)
Procesa();
}
}
no esta entrando en mi rutina de procesa() a pesar de que le doy los datos correctos osea axxxbxxx
ya sea si pongo 8 o 9 en mi bufer
que es mi error?
un saludo y disculpas las molestias