Autor Tema: Problema con las interrupciones al utilizar las librerías de la tarjeta SD...  (Leído 1551 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alejos

  • PIC10
  • *
  • Mensajes: 4
Hola a todos,

Tengo un problema con las librerías para tarjetas SD de Microchip. Estoy usando el PIC18F67J50 y comunico con la tarjeta via SPI. Utilizo una frecuencia de reloj de 20MHz.

Mi problema consiste en que cuando incluyo en mi proyecto las librerías y las configuro tal y como se explica en el libro  "SD Card Projects Using the PIC Microcontroller" (una versión actualizada del texto de la nota de aplicación AN1045b), tras compilar el proyecto, la función main() funciona perfectamente excepto la rutina de interrupciones (ISR) que sólo se ejecuta la primera vez que se recibe una interrupción. Después de esta primera vez ya no se vuelve a ejecutar aunque la función main sigue funcionando.

Utilizo algunos periféricos como la USART en la ISR pero he comprobado que desde la función main(), la USART funciona bien también con lo que creo que el problema no es debido a un cambio accidental de la frecuenciad de reloj que se pueda producir en las librerías de la tarjeta SD de Microchip.

Básicamente, mi proyecto consiste en un datalogger. Accedo a la tarjeta SD via SPI. Mi programa funciona recibiendo datos desde un PC (via UART) y almacenando en la tarjeta esos mismos datos.

Estoy utilizando mi propia placa (no es ninguna placa comercial de Microchip). Hasta el momento tan sólo he desarrollado un código muy simple para ir probando funcionalidades. No he conectado aún con la tarjeta Sd ya que la ISR es donde debería ir el código para escribir en la tarjeta, pero no consigo que se ejecuten las interrupciones. A continuación os muestro una parte de mi código (es muy simple):


//Configure Interruptions
RCONbits.IPEN = 1; // Interrupt Priority Enable bit
//PIE1bits.TXIE=1; // EUSART Transmit Interruption Enable bit
IPR1bits.RC1IP=1; // EUSART Receive Interruption Priority bit
PIE1bits.RC1IE=1; // EUSART Receive Interruption Enable bit
PIR1bits.RC1IF=0; // EUSART1 Receive Interrupt Flag bit
INTCONbits.GIE=1; // Global Interruption Enable bit
INTCONbits.PEIE=0; // Peripheral Interruption Enable bit

//ISR code:

#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{


//************* USART1 interruption

if (PIR1bits.RC1IF == 1)
{

buffer= getc1USART();
while(Busy1USART());


//COMMAND: P
if (buffer[0] == 'P')
{

putc1USART('#'); //aquí iría el código para escribir en la memoria SD
Write1USART(PORTB);
}

i=0;
PIR1bits.RC1IF =0;

}

} //This return will be a "retfie fast", since this is in a #pragma interrupt section


Cuando el código recibe una carácter 'P' por la UART, mando de vuelta por la UART el valor del puerto B (cuando solucione mi problema será cuando lo mande por SPI a la memoria SD). La rutina de interrupción se ejecuta sólo una vez en mi código. Quiero decir que recibo el valor del puerto B sólo la primera vez que mando desde el PC el carácter 'P'. Despues, ya no recibo nada. Si no incluyo las librerías de la tarjeta SD, este código funciona perfectamente (recibo el valor del puerto cada vez que mando el caracter), pero en cuanto incluyo los archivos de las librerías y los configuro, me encuentro con el problema.

Estoy totalemente atascado en este problema y necesito encontrar una solución... ¿Qué consejos me podéis dar?... La solución será bienvenida también. ( :D)

Si necesitáis alguna información más no dudéis en pedírmela.

Muchas gracias por adelantado por vuestra ayuda.


Saludos
Alejos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con las interrupciones al utilizar las librerías de la tarjeta SD...
« Respuesta #1 en: 17 de Diciembre de 2010, 10:04:43 »
Un recomendación, las rutinas de interrupción lo más cortas posibles. Setea una bandera de que ha ocurrido y tratala en el main, Si sigue el inconveniente podes hacer un debug y ver si en alguna rutina de la SD Card des-habilita las interrupciones  :?


Saludos!
No contesto mensajes privados, las consultas en el foro