Página 2 de 2

Re: 16F883 - SPI - Interrupcion

NotaPublicado: Vie Jun 21, 2013 7:25 pm
por Switchxxi
Código: Seleccionar todo
clrf byte                ; Byte = 0
movf byte, w
movwf SSPBUFF    ; Apenas se carga el registro SSPBUFF la transmisión comienza automáticamente.

;(movf byte, w) Acá se podría cargar el siguiente byte a W para ganar tiempo ya que el micro de todas formas estará
; aun ocupado enviando por SPI.

L1
btfss SSPSTAT, 0   ; Espero a que termine de enviar los datos.
goto L1
movf SSPBUFF, w  ; Leo el buffer para borrar la bandera SSPSTAT bit 0 (no se si se puede hacer un bcf SSPSTAT, 0 por software
                            ; de todas maneras tardaría lo mismo, lo malo es que me mata lo que cargue antes para ganar tiempo xD.
                            ; Habría que probar ambas opciones.


Repetir el pedazo de código 5 veces.

Lo malo es que ASM es mas lindo de pulir cuando ya se tiene algo andando. Ahí se ve, con un poco de imaginación, si se puede usar alguna u otra aproximación para ganar toda milésima de segundo que se pueda =).
Como se ve en ASM seria mucho mas rápido por lo siguiente: (no se si lo hará así, solo son mis conjeturas)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
movf byte, w
movwf SSPBUFF
; Apenas se carga el registro SSPBUFF la transmisión comienza automáticamente.

En C debería llegar a algo muy similar, así que acá mucho no se gana.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
L1
btfss SSPSTAT, 0
goto L1
movf SSPBUFF, w


Acá es donde debe flaquear el C ya que imagino que hará lo siguiente:

L1
movlw 0x01
andwf SSPSTAT, w
btfsc STATUS, Z ; Si "C" es lo suficientemente inteligente como para hacer esto
goto L1
movf SSPBUFF, w

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Habría que ver como se incrusta ASM en "C", en el compilador HI-TECH C es:

#asm
rutina 1
rutina 2
Etiqueta: // Usar dos puntos al final ":"
#endasm


si el dato que se usa en c es de 8 bits:

unsigned char Dato;

se puede incrustar dentro de la parte de asm así

#asm

movf _dato, w

#endasm


Igual yo primero estructuraría todo el programa aun sabiendo que quizás me quede corto con todo. A partir de ahí se comenzaría a ir afinando cada parte hasta llegar al mejor resultado, ya que una vez se ve cada cosa uno termina diciendo "ahhh, mira, esto si lo hago así tengo esta ventaja". De otra forma lo que en un principio parecía ser la mejor opción puede terminar empeorándola en algunos casos xD.

Saludos.