Hola de nuevo,
Traigo novedades, he comprobado que no fallan ni las interrupciones ni la transmisión, por lo que el error debe de estar en la recepción de la UART software sin mas remedio.
He hecho esto:
probando[0]='A';
probando[1]='T';
probando[2]='+';
probando[3]='C';
probando[4]='P';
probando[5]='I';
probando[6]='N';
probando[7]='?';
probando[8]=0x0D;
for(i=0;i<=indice;i++){
while(TRMT==0);
TXREG=probando[i];
}
Justo antes de enviar le he añadido yo lo que quería y funciona correctamente, además, entra en las interrupciones bien porque el valor de indice va en la interrupción, y envía el numero correcto de carácteres, por lo que sino me equivoco no queda otra que problemas en la recepción, pero es que es muy extraño porque en el simulador el tiempo esta correcto, además ahora he hecho lo que había dicho antes, de coger los datos en el centro de cada dato, por lo que tengo un margen bastante grande para recoger el dato :S.
¿Alguna idea de que puede ser el problema? Pongo la funcion de recepción aquí de nuevo:
if(INTF==1){
__delay_us(130);
for(i=0;i<8;i++){
recibido=recibido>>1;
if(RB0==1){
recibido = recibido | 0x80;
}
if(RB0==0){
__delay_us(3);
}
if(i!=7)__delay_us(83);
}
probando[indice]=recibido;
control_uart=1;
indice++;
CLRWDT();
Es a 9600 baudios, por lo que es un bit cada 104us, he colocado un retardo de 130 al principio para coger el dato en el medio, que serían los 104us + 26us añadidos por mí + retardo por la interrupción + retardo por las instrucciones = aproximadamente 156 diría yo.
EDITO: He hecho otra prueba, he recogido los datos por la UART software, pero le he metido un retardo de 8 segundos antes de enviar para que me diera tiempo a cambiar el cable RS232 en la placa
para ver exactamente que estoy enviando, y efectivamente, recoge los datos erroneos, y de 8 caracteres que he enviado 7 erán el caracter 253 en ascii, que es este "²", el superindice 2 ese, en binario "11111101", casi todo unos, cuando yo he enviado "atatatat", donde la 'a' es "11111101" y la t "1110100".
No comprendo que puede estar pasando... ¿que retardo puede haber en la generación de la interrupción?¿Y al despertarse del sleep? Bueno eso suponiendo que sea problema de la recepción en la UART software, que yo creo que con esto ha quedado claro que si.
Un saludo!
EDITO 2:
He visto en esta página
http://www.cursomicros.com/avr/proteus/configuracion-propiedades-pic.html lo siguiente:
¿Eso es cierto? ¿Al despertar el pic hay un retardo de 1024 ciclos de reloj?