Estoy intentando enviar datos a una tarjeta SD desde un PIC18f4580, pero el PIC no está enviando lo que debería ser.
variables globales relacionadas:
unsigned char TXBuffer[128]; //tx buffer
unsigned char TXCurrentPos = 0x00; //tracks the next byte to be sent
unsigned char TXEndPos = 0x00; //tracks where new data should be put into the array
Estoy agregando datos a un búfer usando la siguiente función:
void addToBuffer(char data){
TXBuffer[TXEndPos] = data;
TXEndPos++;
}
Y poniendo los datos del TXBuffer en TXREG con la siguiente interrupción:
else if (PIR1bits.TXIF == 1){
if((TXEndPos - TXCurrentPos) > 0){ // if there is data in the buffer
TXREG = TXBuffer[TXCurrentPos]; // send next byte
TXCurrentPos++; // update to the new position
}
Utilizando un osciloscopio puedo ver que el PIC está enviando 0x98, independientemente de lo que coloque en el búfer. De hecho, nunca puse 0x98 en el búfer.
Sin embargo, si sustituyo
TXREG = TXBuffer[TXCurrentPos];
con
TXREG = 0x55;
o
TXREG = TXCurrentPos;
luego obtengo los resultados esperados, es decir, el PIC enviará 0x55 repetidamente o contará desde 0 respectivamente.
Entonces, ¿por qué el PIC tiene problemas para enviar datos desde la matriz, pero en cualquier otro momento está bien? Enfatizaré que la transferencia se maneja en una interrupción, porque siento que esa es la raíz de mi problema.
EDITAR: Es un búfer circular en el sentido de que TXEndPos y TXCurrentPos vuelven a 0 cuando llegan a 127. También deshabilito la interrupción de transmisión cuando TXEndPos - TXCurrentPos == 0, y lo vuelvo a habilitar cuando se agregan datos al búfer. Realmente, mi código funciona completamente como se esperaba, ya que si agrego 13 caracteres a TXBuffer en main, mi PIC transmitirá 13 caracteres y luego se detendrá. El problema es que siempre tienen el mismo carácter (incorrecto): 0x98.
EDIT2: hay funciones más completas aquí: enlace
EDIT3: cambiando nuestro script de vinculador y usando pragmas de manera adecuada, podemos obtener algunos de nuestros datos en nuestro búfer. Ubicamos de forma estática variables relacionadas con el búfer en el mismo banco de memoria, y eso ciertamente ha ayudado, pero no todos nuestros datos están ingresando a nuestro búfer. Lo más extraño de todo es que ejecutar el programa varias veces produce datos diferentes en el búfer, aunque todos los datos que se colocarán en el búfer están definidos en nuestro código. Además, obtenemos resultados drásticamente diferentes cuando la imagen se ejecuta automáticamente después de la programación, cuando cortamos la alimentación y reiniciamos la alimentación con el pickit3 aún conectado, y cuando restablecemos la alimentación con el pickit3 desconectado. Además, la simulación en MPLAB hace que el búfer se llene a la perfección, sin embargo, cuando se ejecuta el código en el PIC y se ve en la memoria, no lo es.
Nuestro código a partir de 5:38 9/22/10 está aquí: enlace
Nuestro archivo de enlace modificado está aquí: enlace