Autor Tema: [XC8] - 16F883 - SPI - Interrupcion  (Leído 1512 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
[XC8] - 16F883 - SPI - Interrupcion
« en: 20 de Junio de 2013, 22:51:38 »
Hola, estoy debugeando mi código para entender los tiempos del SPI en modo master solo transmitiendo datos. Necesito enviar 5 bytes lo más rápido posible, por lo que estoy tratando de hacerlo con interrupciones.
Mi codigo de interrupcion es el siguiente:

Código: [Seleccionar]
void interrupt interrupciones (void) {
    //Verifico que interrupcion se disparó
    if (TMR0IE && TMR0IF){      // se verifica si la interrupcion es por TMR0
        TMR0IF = 0;             // Pongo en 0 el Flag de interrupcion del TMR0
    }
    if (SSPIE && SSPIF){        // se verifica si la interrupcion es por SPI
        if(++cntRegDes == 5){   // Primero lleno los 5 Registros
            PORTCbits.RC2 = 1;  // Luego mando la señal de latch
            PORTCbits.RC2 = 0;  //Sin delay, no hace falta
            cntRegDes = 0;
        }
        else{
            SSPBUF = nextData;
        }
        SSPIF = 0;     //Borro el flag de interrupcion de SPI
    }

}

Como se ve, llevo la cuenta de las interrupciones por envío, cuando llega a 5 mando la señal de LATCH a los registros de desplazamiento (los receptores del SPI) y reinicio el contador. Si no llevo 5 interrupciones entonces escrivo denuevo el Buffer del SPI. Lo pongo acá porque considero que es el mejor lugar para escrivir el buffer tan pronto como es posible.

El codigo del main es este:

Código: [Seleccionar]
    int i;
    do{
        for(i = 0; i<255; i++){
            nextData = i;
            SSPBUF = i;
            __delay_ms(200);
        }
    }while(1);

Lo que hago es enviar los numeros del 0 al 255. Ese delay es el que me garantiza que ya se han enviado los 5 bytes.

El tema es que cuando hago el debug con proteus obtengo lo siguiente:


El reloj esta configgurado a 8MHz y el SPI a Fosc/4

Como se ve el tiempo para enviar 1 byte ronda los 4useg, pero lo que no entiendo es porque tarda aproximadamente 29mseg en enviar el siguiente byte?????

Ideas?

Saludos y gracias!

-
Leonardo Garberoglio