.
No se entiende muy bien lo que quieres hacer.
Si te llegan varios bytes, ve guardándolos en una matriz, y pon un breakpoint en una sesión de debug para ver el contenido de la matriz cuando hayas recibido el bloque completo de datos.
Lo que dices del byte "check", no tiene sentido, un byte son 8 bits, por lo tanto no puede haber un noveno bit en ese byte. Tampoco se entiende lo de los datos de 9 bits, con un byte tienes 255 opciones, y todos están en la tabla de códigos ASCII.
No existen bytes de 9 bits, por definición un byte son SIEMPRE 8 bits.
No tengo mucha idea de CCS (de hecho no me gusta nada) pero me da a mí que el problema no es de programación sino de configuración del PIC. ¿Qué PIC utilizas?, Doy por hecho que uno de 8bit(PIC16,PIC18,etc). Si trabajas con 9bit tiene que haber un bit de configuración para esto, la interrupción de la que hablas y dos registros para enviar (1+8) y dos para recibir(1+8). Mirate la documentación del PIC y busca cuales son esos registros.
Por eso no me gusta CCS, me parece como programar Arduino: todo lleno de funciones pre-compiladas que se supone que son mágicas y lo hacen todo por ellas solas.... luego cuando surge un problema llega la histeria!. Nunca entenderé que la gente utilice microcontroladores sin querer entender lo que hay dentro de ellos (no digo que sea tu caso jkcobain): para eso mejor comprar una placa con linux de 20$....
Saludos!
Bueno como te dijeron no se exactamente como se puede obtener el 9no bit en CCS con alguna funcion, mas que definir el bit y listo es decir usar la directiva #BIT.
El principal problema es ... si es necesario guardar ese bit.. Tal ves ese bit solo sirva para dar paridad. Si es asi CCS ya te lo realiza de por si solo, cuando en la directiva seleccionas PARITY=E o PARITY=O..
¿Como almacenarlo?
Si es una paridad no hace falta, ya que se controla antes y si la paridad no es correcta simplemente se descartaria el dato ( todo por software obviamente ).
Si es otra cosa ese 9no bit entonces deberias tener al menos una variable de 16bits o en su defecto una estructura de 8bits + 1 bit. Luego haces un array de esa estructura.
Rogando que eso no ocupe lo mismo que los 16bits, sino seria complicarla sin sentido.
Pero estoy mas que seguro que ese CHECK tiene que ser algo de paridad, revisa el protocolo bien.
Bien. es decir que el 9no bit te marca el final de los datos, es como si fuera un bit de control nada mas. Mientras que los 8 son datos en si.
Esto seria demasiado FACIL en otro compilador ya que los registros estan definidos, pero elegiste CCS y en esa parte tiene algunas directivas especiales. Asi que tendrias que hacer:Código: C
#bit CHK = 0x42.2
Siendo 0x42 la direccion de memoria del registro donde se almacena el 9no bit y el 2 la posicion del bit.
Como no nombraste cual PIC estas usando no te podria poner exactamente la direccion que es. Pero si miras el datasheet te vas a dar cuenta. Entonces lo unico que te queda en la parte de la interrupcion es:Código: C
if ( !CHK ) { //Aca guardo mi dato } else { //Calculo cheksum aca, si es correcto activo flag dato_completo = 1; }
Luego para mostrarlo o "visualizarlo" depende que tengas.. pero lo mas seguro es que debas pasar los datos que estan en hexa a ascii si es un LCD, y de esa forma poder verlos facilmente.
Si lo estas simulando entonces podrias simplemente poner algo que reciba el UART ademas del PIC.
#USE RS232(baud=9600, parity=N, bits=9, uart1, long_data, stream=rs485) //Esto es la configuración que tengo del #use rs232
//aquí viene donde nombro los bits para la recepción
#bit rcv=0x18.0 //Este es el 9no bit, de acuerdo a la hoja de datos del pic
#bit rcven=0x18.6//Este es el bit para habilitar la recepción de 9 bits
#INT_RDA
inte(){
led=1;
if(rcv==0){
led2=0;
}
if(rcv==1){
led2=1;
}
//envío al pic en cuestión el dato siguiente
putchar(0x100);
//o el siguiente
putchar(0x000);
//En el pic en cuestión, tenía algo así
#INT_RDA
inte(){
char=getc();
if(char==0x100){
led=1;
}
if(char==0x000){
led=0;
}
}
Que tal jkcobain,
De hecho lo que tienes incorecto es la transmisión. Ya que putchar(0x100); siempre enviará 0x00, esta funcion es para enviar un dato de 8 bits, asi que esa no es la forma correcta de hacerlo. Como te mencione anteriormente tienes que habilitar la transmisión de 9 bits y entonces colocar el 9no bit en 0 o 1.
Esto se encuentra en el registro TXSTA. En el bit 6 de ese registro se habilita la transmision de 9 bits y el bit 0 de ese registro contiene el 9no bit que deseas enviar. Ahora bien el datasheet dice que primero tienes que colocar el valor de ese 9no bit en el bit 0 del registro TXSTA y luego enviar el dato (usando el putchar).
Espero que haya sido claro.
Saludos.
Elreypic.