El paso debe ser del mismo tamaño que el acumulador, es decir en este caso 24bits.
A ver, sin saber mucho del PIC (posible errores en el código), traducionedo mí código bajás a 10 ciclos:
De alguna manera tenés que pasarle los datos de:
- PASO_BYTE_1,2 y 3
- DIR_BUFF_ALTA, será la parte alta del puntero donde se encuentren los datos de la señal. Es importante que la parte baje de dicho puntero sea 0, de esa forma podés direccionar 256 elementos.
Las direcciones que impuse a la variables fue lo que se me ocurrió, habría que ver si son válidas.
Creo que se asimila bastante a tú código.
Ahora, el problema que tienen los PICs (por lo poco que leí), es que solo tienen un registro de trabajo, el resto es trabajar todo sobre la RAM, a diferencia de los AVR que tienen 32 registros, es un proceso muy tedioso y lento .
De esos de 10 ciclos x 4 (según decís) te dan 40clk's (la verdad que bastante), dandote un fsampling de 1,2MHz un poco menos de los 1,7MHz que obtuve con el AVR (replanteate a futuro el hecho de cambiarte de familia de uC, más allá de PIC o AVR, sino algo distinto a PIC).
Y todavía en ese código no tuve en cuenta un flag para preguntar si saltó una interrupción externa para salir de la rutina.
Sobre las soluciones en hard, estoy muy óxidado con lógica convencional, el que te puede dar una mano por ese lado es Mr. Carlos. Tal vez otra opción siguiendo con lógica convencional es usar FPGA.
A ver, sin saber mucho del PIC (posible errores en el código), traducionedo mí código bajás a 10 ciclos:
Código:
ACUMULADOR_INF EQU 10h
ACUMULADOR_SUP EQU 11h
PASO_BYTE_1 EQU 12h
PASO_BYTE_2 EQU 13h
PASO_BYTE_3 EQU 14h
DIR_BUFF_ALTA EQU 15h
PORT_SALIDA EQU PORTB
funcion_assembler:
CLRF FSR0L ;Limpio la parte baja del puntero que apuntará al buffer de datos
MOVF DIR_BUFF_ALTA,W ;Copio a WREG la parte alta del puntero donde apuntará al buffer de datos
MOVWF FSR0H ;Paso de WREG a FSR0H la parte alta del puntero donde apuntará al buffer de datos
CLRF ACUMULADOR_INF
CLRF ACUMULADOR_SUP
loop_principal:
MOVF PASO_BYTE_1,W ;Copio el Paso byte 1 en WREG
ADDWF ACUMULADOR_INF,F ;Sumo el Paso byte 1 en el Acumulador INF
MOVF PASO_BYTE_2,W ;Copio el Paso byte 2 en WREG - El carry no se toca!
ADDWFC ACUMULADOR_SUP,F ;Sumo el Paso byte 2 en el Acumulador SUP teniendo en cuenta el carry
MOVF PASO_BYTE_3,W ;Copio el Paso byte 3 en WREG - El carry no se toca!
ADDWFC FSR0L,F ;Sumo la parte baja del puntero con el Paso byte 3 del buffer y lo almaceno en FSR0L
MOVF INDF0,W ;Copia el contenido del puntero del Buffer en WREG
MOVF PORT_SALIDA,F ;Manda al puerto el contenido del puntero del Buffer
GOTO loop_principal ;Empieza el ciclo de nuevo
;8 ciclos + 2 ciclos del GOTO = 10 ciclos.
De alguna manera tenés que pasarle los datos de:
- PASO_BYTE_1,2 y 3
- DIR_BUFF_ALTA, será la parte alta del puntero donde se encuentren los datos de la señal. Es importante que la parte baje de dicho puntero sea 0, de esa forma podés direccionar 256 elementos.
Las direcciones que impuse a la variables fue lo que se me ocurrió, habría que ver si son válidas.
Creo que se asimila bastante a tú código.
Ahora, el problema que tienen los PICs (por lo poco que leí), es que solo tienen un registro de trabajo, el resto es trabajar todo sobre la RAM, a diferencia de los AVR que tienen 32 registros, es un proceso muy tedioso y lento .
De esos de 10 ciclos x 4 (según decís) te dan 40clk's (la verdad que bastante), dandote un fsampling de 1,2MHz un poco menos de los 1,7MHz que obtuve con el AVR (replanteate a futuro el hecho de cambiarte de familia de uC, más allá de PIC o AVR, sino algo distinto a PIC).
Y todavía en ese código no tuve en cuenta un flag para preguntar si saltó una interrupción externa para salir de la rutina.
Sobre las soluciones en hard, estoy muy óxidado con lógica convencional, el que te puede dar una mano por ese lado es Mr. Carlos. Tal vez otra opción siguiendo con lógica convencional es usar FPGA.