Autor Tema: Como utilizar código ASM como función en XC8  (Leído 3281 veces)

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

Desconectado Isaakavo

  • PIC10
  • *
  • Mensajes: 3
Como utilizar código ASM como función en XC8
« en: 21 de Octubre de 2019, 11:52:43 »
Hola a todos, es la primera vez que posteo algo en un foro, por lo que espero darme a entender de buena manera.
Estoy realizando un proyecto con el PIC12F1840 (CPU a 32MHz) para el control de tiras de leds NeoPixel (concretamente con el chip WS2812b) todo esto hasta el momento usando únicamente ensamblador. Me dí cuenta que la tarea es demasiado tediosa para realizarse únicamente en ensamblador, ya que el plan inicial es poder controlar el color y las animaciones de los leds mediante una aplicación en android (planeo usar los conocidos módulos ESP8266 para poder hacer una red y poder controlar los leds desde Internet).
Debido a esto decidí intentar usar XC8 para poder realizar las animaciones, el problema es que el chip WS2812b pide tiempos específicos de estado alto y bajo para poder reconocer los bits que se quieren enviar. Con el CPU a 32MHz es difícil implementar esos tiempos ya que el tiempo total de envío de cada bit debe ser de 1.25uS.
Investigando al respecto encontré que es posible usar el compilador XC8 con código embebido en asm, lo que quiero hacer entonces es implementar la rutina de envío de bits ya que en asm se consiguen los tiempos exactos.
Leí al respecto en el manual del compilador pero no logro hacer que funcione, siempre al momento de compilar me tirar muchos errores y hay varios conceptos que no entiendo.
Adjunto el código que quiero implementar (espero que también le sirva a alguien que quiera usar PIC para controlar estas tiras de leds) esperando que alguien me pueda dar una pista de si es posible o no que esto funcione.

Código: ASM
  1. ==============================================================================
  2.  
  3. ;Variables usadas para enviar los bits RGB.
  4. ;==============================================================================
  5.    
  6.    
  7.     CBLOCK
  8.         ByteR
  9.         ByteG
  10.         ByteB
  11.     ENDC
  12.    
  13. ;===============================================================================
  14. ;   Rutina para generar los bits necesarios para la comunicación del integrado
  15. ;   WS2812B.
  16. ;   La documentación pide un tiempo de 1.25uS +/- 600nS en total para el envío
  17. ;   del bit .
  18. ;   Para el bit 0 se requiere un tiempo alto de 0.4 uS +/- 150nS y para el timepo
  19. ;   bajo 0.85uS +/- 150 ns
  20. ;   Para el bit 1 se requiere un tiempo alto de 0.8 uS +/- 150 ns y para el tiempo
  21. ;   bajo 0.45 uS +/- 150nS
  22. ;   El WS2812B requiere de un tiempo de reset en bajo cuando se ha terminado de
  23. ;   enviar los 24 bits, tiene que ser al menos de 50uS. Esta rutina se incluye
  24. ;   en el programa principal.
  25. ;================================================================================
  26. NeoBit1
  27.                         ;2 ciclos del call
  28.     bsf    LATA,RA2     ;1 ciclo
  29.     nop                 ;1 ciclo
  30.     nop                 ;1 ciclo
  31.     nop                 ;1 ciclo
  32.     nop                 ;1 ciclo
  33.     nop                 ;1 ciclo
  34.     nop                 ;1 ciclo
  35.     nop                 ;1 ciclo
  36.     nop                 ;1 ciclo
  37.                         ;Tiempo en alto de 750nS
  38.     bcf     LATA,RA2    ;1 ciclo
  39.     return              ;2 ciclos
  40.                         ;Tiempo bajo de 250nS, hay que tener en cuenta que al
  41.                         ;salir de la rutina se ejecutan otras instrucciones que
  42.                         ;toman tiempo en realizarse, por lo que consumen tiempo
  43.                         ;de la señal en bajo
  44.                         ;Tiempo total de la rutina 1.166667uS
  45. NeoBit0
  46.                         ;2 ciclos del call
  47.     bsf     LATA,RA2    ;1 ciclo
  48.     nop                 ;1 ciclo
  49.     nop                 ;1 ciclo
  50.     nop                 ;1 ciclo
  51.                         ;Tiempo en alto de 333.3nS
  52.     bcf     LATA,RA2    ;1 ciclo
  53.     nop                 ;1 ciclo
  54.     nop                 ;1 ciclo
  55.     nop                 ;1 ciclo
  56.     nop                 ;1 ciclo
  57.     return              ;2 ciclos
  58.                         ;Tiempo en bajo de 583.31 nS
  59.                         ;Tiempo total de la rutina 1.083333uS
  60.    
  61. ;===============================================================================
  62. ;   Subrutina para el envio de los bits.
  63. ;   Se envían individualmente los bits por medio de la rutina que pide el WS2812B
  64. ;   se evalua cada bit del byte previamente cargado, es importante notar que
  65. ;   cada goto consume tiempo bajo de la rutina, por ese motivo se redujeron los
  66. ;   ciclos de la rutina.
  67. ;===============================================================================
  68. Enviar_Bits
  69. Enviar_Bit23
  70.     btfsc   ByteG, 7
  71.     goto    Enviar_Bit23_1
  72. Enviar_Bit23_0
  73.     call    NeoBit0
  74.     goto    Enviar_Bit22
  75.  
  76. Enviar_Bit23_1
  77.     call    NeoBit1
  78.    
  79. Enviar_Bit22
  80.     btfsc   ByteG, 6
  81.     goto    Enviar_Bit22_1
  82. Enviar_Bit22_0
  83.     call    NeoBit0
  84.     goto    Enviar_Bit21
  85.  
  86. Enviar_Bit22_1
  87.     call    NeoBit1
  88.    
  89. Enviar_Bit21
  90.     btfsc   ByteG,5
  91.     goto    Enviar_Bit21_1
  92. Enviar_Bit21_0
  93.     call    NeoBit0
  94.     goto    Enviar_Bit20
  95. Enviar_Bit21_1
  96.     call    NeoBit1
  97.    
  98. Enviar_Bit20
  99.     btfsc   ByteG,4
  100.     goto    Enviar_Bit20_1
  101. Enviar_Bit20_0
  102.     call    NeoBit0
  103.     goto    Enviar_Bit19
  104. Enviar_Bit20_1
  105.     call    NeoBit1
  106.    
  107. Enviar_Bit19
  108.     btfsc   ByteG,3
  109.     goto    Enviar_Bit19_1
  110. Enviar_Bit19_0
  111.     call    NeoBit0
  112.     goto    Enviar_Bit18
  113. Enviar_Bit19_1
  114.     call    NeoBit1
  115.    
  116. Enviar_Bit18
  117.     btfsc   ByteG,2
  118.     goto    Enviar_Bit18_1
  119. Enviar_Bit18_0
  120.     call    NeoBit0
  121.     goto    Enviar_Bit17
  122. Enviar_Bit18_1
  123.     call    NeoBit1
  124.    
  125. Enviar_Bit17
  126.     btfsc   ByteG,1
  127.     goto    Enviar_Bit17_1
  128. Enviar_Bit17_0
  129.     call    NeoBit0
  130.     goto    Enviar_Bit16
  131. Enviar_Bit17_1
  132.     call    NeoBit1
  133.    
  134. Enviar_Bit16
  135.     btfsc   ByteG,0
  136.     goto    Enviar_Bit16_1
  137. Enviar_Bit16_0
  138.     call    NeoBit0
  139.     goto    Enviar_Bit15
  140. Enviar_Bit16_1
  141.     call    NeoBit1
  142.    
  143. Enviar_Bit15
  144.     btfsc   ByteR,7
  145.     goto    Enviar_Bit15_1
  146. Enviar_Bit15_0
  147.     call    NeoBit0
  148.     goto    Enviar_Bit14
  149. Enviar_Bit15_1
  150.     call    NeoBit1
  151.    
  152. Enviar_Bit14
  153.     btfsc   ByteR,6
  154.     goto    Enviar_Bit14_1
  155. Enviar_Bit14_0
  156.     call    NeoBit0
  157.     goto    Enviar_Bit13
  158. Enviar_Bit14_1
  159.     call    NeoBit1
  160.    
  161. Enviar_Bit13
  162.     btfsc   ByteR,5
  163.     goto    Enviar_Bit13_1
  164. Enviar_Bit13_0
  165.     call    NeoBit0
  166.     goto    Enviar_Bit12
  167. Enviar_Bit13_1
  168.     call    NeoBit1
  169.    
  170. Enviar_Bit12
  171.     btfsc   ByteR,4
  172.     goto    Enviar_Bit12_1
  173. Enviar_Bit12_0
  174.     call    NeoBit0
  175.     goto    Enviar_Bit11
  176. Enviar_Bit12_1
  177.     call    NeoBit1
  178.    
  179. Enviar_Bit11
  180.     btfsc   ByteR,3
  181.     goto    Enviar_Bit11_1
  182. Enviar_Bit11_0
  183.     call    NeoBit0
  184.     goto    Enviar_Bit10
  185. Enviar_Bit11_1
  186.     call    NeoBit1
  187.    
  188. Enviar_Bit10
  189.     btfsc   ByteR,2
  190.     goto    Enviar_Bit10_1
  191. Enviar_Bit10_0
  192.     call    NeoBit0
  193.     goto    Enviar_Bit9
  194. Enviar_Bit10_1
  195.     call    NeoBit1
  196.    
  197. Enviar_Bit9
  198.     btfsc   ByteR,1
  199.     goto    Enviar_Bit9_1
  200. Enviar_Bit9_0
  201.     call    NeoBit0
  202.     goto    Enviar_Bit8
  203. Enviar_Bit9_1
  204.     call    NeoBit1
  205.    
  206. Enviar_Bit8
  207.     btfsc   ByteR,0
  208.     goto    Enviar_Bit8_1
  209. Enviar_Bit8_0
  210.     call    NeoBit0
  211.     goto    Enviar_Bit7
  212. Enviar_Bit8_1
  213.     call    NeoBit1
  214.    
  215. Enviar_Bit7
  216.     btfsc   ByteB,7
  217.     goto    Enviar_Bit7_1
  218. Enviar_Bit7_0
  219.     call    NeoBit0
  220.     goto    Enviar_Bit6
  221. Enviar_Bit7_1
  222.     call    NeoBit1
  223.    
  224. Enviar_Bit6
  225.     btfsc   ByteB,6
  226.     goto    Enviar_Bit6_1
  227. Enviar_Bit6_0
  228.     call    NeoBit0
  229.     goto    Enviar_Bit5
  230. Enviar_Bit6_1
  231.     call    NeoBit1
  232.    
  233. Enviar_Bit5
  234.     btfsc   ByteB,5
  235.     goto    Enviar_Bit5_1
  236. Enviar_Bit5_0
  237.     call    NeoBit0
  238.     goto    Enviar_Bit4
  239. Enviar_Bit5_1
  240.     call    NeoBit1
  241.    
  242. Enviar_Bit4
  243.     btfsc   ByteB,4
  244.     goto    Enviar_Bit4_1
  245. Enviar_Bit4_0
  246.     call    NeoBit0
  247.     goto    Enviar_Bit3
  248. Enviar_Bit4_1
  249.     call    NeoBit1
  250.    
  251. Enviar_Bit3
  252.     btfsc   ByteB,3
  253.     goto    Enviar_Bit3_1
  254. Enviar_Bit3_0
  255.     call    NeoBit0
  256.     goto    Enviar_Bit2
  257. Enviar_Bit3_1
  258.     call    NeoBit1
  259.    
  260. Enviar_Bit2
  261.     btfsc   ByteB,2
  262.     goto    Enviar_Bit2_1
  263. Enviar_Bit2_0
  264.     call    NeoBit0
  265.     goto    Enviar_Bit1
  266. Enviar_Bit2_1
  267.     call    NeoBit1
  268.    
  269. Enviar_Bit1
  270.     btfsc   ByteB,1
  271.     goto    Enviar_Bit1_1
  272. Enviar_Bit1_0
  273.     call    NeoBit0
  274.     goto    Enviar_Bit0
  275. Enviar_Bit1_1
  276.     call    NeoBit1
  277.    
  278. Enviar_Bit0
  279.     btfsc   ByteB,0
  280.     goto    Enviar_Bit0_1
  281. Enviar_Bit0_0
  282.     call    NeoBit0
  283.     return
  284. Enviar_Bit0_1
  285.     call    NeoBit1
  286.     return
Muchas gracias por la ayuda!

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Como utilizar código ASM como función en XC8
« Respuesta #1 en: 22 de Octubre de 2019, 15:43:23 »
Fichero en c  main.c:
Código: C
  1. #include <xc.h>
  2.  
  3. extern void Enviar_Bits(void);
  4.  
  5. unsigned char ByteR, ByteG, ByteB;
  6.  
  7. void main(void) {
  8.    ByteR = 100;
  9.    ByteG = 200;
  10.    ByteB = 100;
  11.    Enviar_Bits();
  12. }


Fichero en ensamblador sendbits.asm:

Código: ASM
  1. #include <xc.inc>    
  2.  
  3.    
  4.     GLOBAL  _ByteR
  5.     GLOBAL  _ByteG
  6.     GLOBAL  _ByteB
  7.    
  8.     GLOBAL  _Enviar_Bits
  9.  
  10.     PSECT myspace, local, class = CODE, reloc = 2
  11.  
  12.  
  13. _Enviar_Bits:
  14. Enviar_Bit23:
  15.     btfsc   _ByteG, 7
  16.     goto    Enviar_Bit23_1
  17. Enviar_Bit23_0:
  18.     call    NeoBit0
  19.     goto    Enviar_Bit22
  20.  
  21. Enviar_Bit23_1:
  22.     call    NeoBit1
  23.    
  24. Enviar_Bit22:
  25.     btfsc   _ByteG, 6
  26.     goto    Enviar_Bit22_1
  27. Enviar_Bit22_0:
  28.     call    NeoBit0
  29.     goto    Enviar_Bit21
  30.  
  31. Enviar_Bit22_1:
  32.     call    NeoBit1
  33.    
  34. Enviar_Bit21:
  35.     btfsc   _ByteG,5
  36.     goto    Enviar_Bit21_1
  37. Enviar_Bit21_0:
  38.     call    NeoBit0
  39.     goto    Enviar_Bit20
  40. Enviar_Bit21_1:
  41.     call    NeoBit1
  42.    
  43. Enviar_Bit20:
  44.     btfsc   _ByteG,4
  45.     goto    Enviar_Bit20_1
  46. Enviar_Bit20_0:
  47.     call    NeoBit0
  48.     goto    Enviar_Bit19
  49. Enviar_Bit20_1:
  50.     call    NeoBit1
  51.    
  52. Enviar_Bit19:
  53.     btfsc   _ByteG,3
  54.     goto    Enviar_Bit19_1
  55. Enviar_Bit19_0:
  56.     call    NeoBit0
  57.     goto    Enviar_Bit18
  58. Enviar_Bit19_1:
  59.     call    NeoBit1
  60.    
  61. Enviar_Bit18:
  62.     btfsc   _ByteG,2
  63.     goto    Enviar_Bit18_1
  64. Enviar_Bit18_0:
  65.     call    NeoBit0
  66.     goto    Enviar_Bit17
  67. Enviar_Bit18_1:
  68.     call    NeoBit1
  69.    
  70. Enviar_Bit17:
  71.     btfsc   _ByteG,1
  72.     goto    Enviar_Bit17_1
  73. Enviar_Bit17_0:
  74.     call    NeoBit0
  75.     goto    Enviar_Bit16
  76. Enviar_Bit17_1:
  77.     call    NeoBit1
  78.    
  79. Enviar_Bit16:
  80.     btfsc   _ByteG,0
  81.     goto    Enviar_Bit16_1
  82. Enviar_Bit16_0:
  83.     call    NeoBit0
  84.     goto    Enviar_Bit15
  85. Enviar_Bit16_1:
  86.     call    NeoBit1
  87.    
  88. Enviar_Bit15:
  89.     btfsc   _ByteR,7
  90.     goto    Enviar_Bit15_1
  91. Enviar_Bit15_0:
  92.     call    NeoBit0
  93.     goto    Enviar_Bit14
  94. Enviar_Bit15_1:
  95.     call    NeoBit1
  96.    
  97. Enviar_Bit14:
  98.     btfsc   _ByteR,6
  99.     goto    Enviar_Bit14_1
  100. Enviar_Bit14_0:
  101.     call    NeoBit0
  102.     goto    Enviar_Bit13
  103. Enviar_Bit14_1:
  104.     call    NeoBit1
  105.    
  106. Enviar_Bit13:
  107.     btfsc   _ByteR,5
  108.     goto    Enviar_Bit13_1
  109. Enviar_Bit13_0:
  110.     call    NeoBit0
  111.     goto    Enviar_Bit12
  112. Enviar_Bit13_1:
  113.     call    NeoBit1
  114.    
  115. Enviar_Bit12:
  116.     btfsc   _ByteR,4
  117.     goto    Enviar_Bit12_1
  118. Enviar_Bit12_0:
  119.     call    NeoBit0
  120.     goto    Enviar_Bit11
  121. Enviar_Bit12_1:
  122.     call    NeoBit1
  123.    
  124. Enviar_Bit11:
  125.     btfsc   _ByteR,3
  126.     goto    Enviar_Bit11_1
  127. Enviar_Bit11_0:
  128.     call    NeoBit0
  129.     goto    Enviar_Bit10
  130. Enviar_Bit11_1:
  131.     call    NeoBit1
  132.    
  133. Enviar_Bit10:
  134.     btfsc   _ByteR,2
  135.     goto    Enviar_Bit10_1
  136. Enviar_Bit10_0:
  137.     call    NeoBit0
  138.     goto    Enviar_Bit9
  139. Enviar_Bit10_1:
  140.     call    NeoBit1
  141.    
  142. Enviar_Bit9:
  143.     btfsc   _ByteR,1
  144.     goto    Enviar_Bit9_1
  145. Enviar_Bit9_0:
  146.     call    NeoBit0
  147.     goto    Enviar_Bit8
  148. Enviar_Bit9_1:
  149.     call    NeoBit1
  150.    
  151. Enviar_Bit8:
  152.     btfsc   _ByteR,0
  153.     goto    Enviar_Bit8_1
  154. Enviar_Bit8_0:
  155.     call    NeoBit0
  156.     goto    Enviar_Bit7
  157. Enviar_Bit8_1:
  158.     call    NeoBit1
  159.    
  160. Enviar_Bit7:
  161.     btfsc   _ByteB,7
  162.     goto    Enviar_Bit7_1
  163. Enviar_Bit7_0:
  164.     call    NeoBit0
  165.     goto    Enviar_Bit6
  166. Enviar_Bit7_1:
  167.     call    NeoBit1
  168.    
  169. Enviar_Bit6:
  170.     btfsc   _ByteB,6
  171.     goto    Enviar_Bit6_1
  172. Enviar_Bit6_0:
  173.     call    NeoBit0
  174.     goto    Enviar_Bit5
  175. Enviar_Bit6_1:
  176.     call    NeoBit1
  177.    
  178. Enviar_Bit5:
  179.     btfsc   _ByteB,5
  180.     goto    Enviar_Bit5_1
  181. Enviar_Bit5_0:
  182.     call    NeoBit0
  183.     goto    Enviar_Bit4
  184. Enviar_Bit5_1:
  185.     call    NeoBit1
  186.    
  187. Enviar_Bit4:
  188.     btfsc   _ByteB,4
  189.     goto    Enviar_Bit4_1
  190. Enviar_Bit4_0:
  191.     call    NeoBit0
  192.     goto    Enviar_Bit3
  193. Enviar_Bit4_1:
  194.     call    NeoBit1
  195.    
  196. Enviar_Bit3:
  197.     btfsc   _ByteB,3
  198.     goto    Enviar_Bit3_1
  199. Enviar_Bit3_0:
  200.     call    NeoBit0
  201.     goto    Enviar_Bit2
  202. Enviar_Bit3_1:
  203.     call    NeoBit1
  204.    
  205. Enviar_Bit2:
  206.     btfsc   _ByteB,2
  207.     goto    Enviar_Bit2_1
  208. Enviar_Bit2_0:
  209.     call    NeoBit0
  210.     goto    Enviar_Bit1
  211. Enviar_Bit2_1:
  212.     call    NeoBit1
  213.    
  214. Enviar_Bit1:
  215.     btfsc   _ByteB,1
  216.     goto    Enviar_Bit1_1
  217. Enviar_Bit1_0:
  218.     call    NeoBit0
  219.     goto    Enviar_Bit0
  220. Enviar_Bit1_1:
  221.     call    NeoBit1
  222.    
  223. Enviar_Bit0:
  224.     btfsc   _ByteB,0
  225.     goto    Enviar_Bit0_1
  226. Enviar_Bit0_0:
  227.     call    NeoBit0
  228.     return
  229. Enviar_Bit0_1:
  230.     call    NeoBit1
  231.     return
  232.    
  233. ;===============================================================================
  234. ;   Rutina para generar los bits necesarios para la comunicación del integrado
  235. ;   WS2812B.
  236. ;   La documentación pide un tiempo de 1.25uS +/- 600nS en total para el envío
  237. ;   del bit .
  238. ;   Para el bit 0 se requiere un tiempo alto de 0.4 uS +/- 150nS y para el timepo
  239. ;   bajo 0.85uS +/- 150 ns
  240. ;   Para el bit 1 se requiere un tiempo alto de 0.8 uS +/- 150 ns y para el tiempo
  241. ;   bajo 0.45 uS +/- 150nS
  242. ;   El WS2812B requiere de un tiempo de reset en bajo cuando se ha terminado de
  243. ;   enviar los 24 bits, tiene que ser al menos de 50uS. Esta rutina se incluye
  244. ;   en el programa principal.
  245. ;================================================================================
  246. NeoBit1:
  247.                         ;2 ciclos del call
  248.     bsf    LATA,2       ;1 ciclo
  249.     nop                 ;1 ciclo
  250.     nop                 ;1 ciclo
  251.     nop                 ;1 ciclo
  252.     nop                 ;1 ciclo
  253.     nop                 ;1 ciclo
  254.     nop                 ;1 ciclo
  255.     nop                 ;1 ciclo
  256.     nop                 ;1 ciclo
  257.                         ;Tiempo en alto de 750nS
  258.     bcf     LATA,2      ;1 ciclo
  259.     return              ;2 ciclos
  260.                         ;Tiempo bajo de 250nS, hay que tener en cuenta que al
  261.                         ;salir de la rutina se ejecutan otras instrucciones que
  262.                         ;toman tiempo en realizarse, por lo que consumen tiempo
  263.                         ;de la señal en bajo
  264.                         ;Tiempo total de la rutina 1.166667uS
  265. NeoBit0:
  266.                         ;2 ciclos del call
  267.     bsf     LATA,2      ;1 ciclo
  268.     nop                 ;1 ciclo
  269.     nop                 ;1 ciclo
  270.     nop                 ;1 ciclo
  271.                         ;Tiempo en alto de 333.3nS
  272.     bcf     LATA,2      ;1 ciclo
  273.     nop                 ;1 ciclo
  274.     nop                 ;1 ciclo
  275.     nop                 ;1 ciclo
  276.     nop                 ;1 ciclo
  277.     return              ;2 ciclos
  278.                         ;Tiempo en bajo de 583.31 nS
  279.                         ;Tiempo total de la rutina 1.083333uS

Adjunto proyecto

Desconectado Isaakavo

  • PIC10
  • *
  • Mensajes: 3
Re:Como utilizar código ASM como función en XC8
« Respuesta #2 en: 22 de Octubre de 2019, 22:05:45 »
Fichero en c  main.c:
Código: C
  1. #include <xc.h>
  2.  
  3. extern void Enviar_Bits(void);
  4.  
  5. unsigned char ByteR, ByteG, ByteB;
  6.  
  7. void main(void) {
  8.    ByteR = 100;
  9.    ByteG = 200;
  10.    ByteB = 100;
  11.    Enviar_Bits();
  12. }


Fichero en ensamblador sendbits.asm:

Código: ASM
  1. #include <xc.inc>    
  2.  
  3.    
  4.     GLOBAL  _ByteR
  5.     GLOBAL  _ByteG
  6.     GLOBAL  _ByteB
  7.    
  8.     GLOBAL  _Enviar_Bits
  9.  
  10.     PSECT myspace, local, class = CODE, reloc = 2
  11.  
  12.  
  13. _Enviar_Bits:
  14. Enviar_Bit23:
  15.     btfsc   _ByteG, 7
  16.     goto    Enviar_Bit23_1
  17. Enviar_Bit23_0:
  18.     call    NeoBit0
  19.     goto    Enviar_Bit22
  20.  
  21. Enviar_Bit23_1:
  22.     call    NeoBit1
  23.    
  24. Enviar_Bit22:
  25.     btfsc   _ByteG, 6
  26.     goto    Enviar_Bit22_1
  27. Enviar_Bit22_0:
  28.     call    NeoBit0
  29.     goto    Enviar_Bit21
  30.  
  31. Enviar_Bit22_1:
  32.     call    NeoBit1
  33.    
  34. Enviar_Bit21:
  35.     btfsc   _ByteG,5
  36.     goto    Enviar_Bit21_1
  37. Enviar_Bit21_0:
  38.     call    NeoBit0
  39.     goto    Enviar_Bit20
  40. Enviar_Bit21_1:
  41.     call    NeoBit1
  42.    
  43. Enviar_Bit20:
  44.     btfsc   _ByteG,4
  45.     goto    Enviar_Bit20_1
  46. Enviar_Bit20_0:
  47.     call    NeoBit0
  48.     goto    Enviar_Bit19
  49. Enviar_Bit20_1:
  50.     call    NeoBit1
  51.    
  52. Enviar_Bit19:
  53.     btfsc   _ByteG,3
  54.     goto    Enviar_Bit19_1
  55. Enviar_Bit19_0:
  56.     call    NeoBit0
  57.     goto    Enviar_Bit18
  58. Enviar_Bit19_1:
  59.     call    NeoBit1
  60.    
  61. Enviar_Bit18:
  62.     btfsc   _ByteG,2
  63.     goto    Enviar_Bit18_1
  64. Enviar_Bit18_0:
  65.     call    NeoBit0
  66.     goto    Enviar_Bit17
  67. Enviar_Bit18_1:
  68.     call    NeoBit1
  69.    
  70. Enviar_Bit17:
  71.     btfsc   _ByteG,1
  72.     goto    Enviar_Bit17_1
  73. Enviar_Bit17_0:
  74.     call    NeoBit0
  75.     goto    Enviar_Bit16
  76. Enviar_Bit17_1:
  77.     call    NeoBit1
  78.    
  79. Enviar_Bit16:
  80.     btfsc   _ByteG,0
  81.     goto    Enviar_Bit16_1
  82. Enviar_Bit16_0:
  83.     call    NeoBit0
  84.     goto    Enviar_Bit15
  85. Enviar_Bit16_1:
  86.     call    NeoBit1
  87.    
  88. Enviar_Bit15:
  89.     btfsc   _ByteR,7
  90.     goto    Enviar_Bit15_1
  91. Enviar_Bit15_0:
  92.     call    NeoBit0
  93.     goto    Enviar_Bit14
  94. Enviar_Bit15_1:
  95.     call    NeoBit1
  96.    
  97. Enviar_Bit14:
  98.     btfsc   _ByteR,6
  99.     goto    Enviar_Bit14_1
  100. Enviar_Bit14_0:
  101.     call    NeoBit0
  102.     goto    Enviar_Bit13
  103. Enviar_Bit14_1:
  104.     call    NeoBit1
  105.    
  106. Enviar_Bit13:
  107.     btfsc   _ByteR,5
  108.     goto    Enviar_Bit13_1
  109. Enviar_Bit13_0:
  110.     call    NeoBit0
  111.     goto    Enviar_Bit12
  112. Enviar_Bit13_1:
  113.     call    NeoBit1
  114.    
  115. Enviar_Bit12:
  116.     btfsc   _ByteR,4
  117.     goto    Enviar_Bit12_1
  118. Enviar_Bit12_0:
  119.     call    NeoBit0
  120.     goto    Enviar_Bit11
  121. Enviar_Bit12_1:
  122.     call    NeoBit1
  123.    
  124. Enviar_Bit11:
  125.     btfsc   _ByteR,3
  126.     goto    Enviar_Bit11_1
  127. Enviar_Bit11_0:
  128.     call    NeoBit0
  129.     goto    Enviar_Bit10
  130. Enviar_Bit11_1:
  131.     call    NeoBit1
  132.    
  133. Enviar_Bit10:
  134.     btfsc   _ByteR,2
  135.     goto    Enviar_Bit10_1
  136. Enviar_Bit10_0:
  137.     call    NeoBit0
  138.     goto    Enviar_Bit9
  139. Enviar_Bit10_1:
  140.     call    NeoBit1
  141.    
  142. Enviar_Bit9:
  143.     btfsc   _ByteR,1
  144.     goto    Enviar_Bit9_1
  145. Enviar_Bit9_0:
  146.     call    NeoBit0
  147.     goto    Enviar_Bit8
  148. Enviar_Bit9_1:
  149.     call    NeoBit1
  150.    
  151. Enviar_Bit8:
  152.     btfsc   _ByteR,0
  153.     goto    Enviar_Bit8_1
  154. Enviar_Bit8_0:
  155.     call    NeoBit0
  156.     goto    Enviar_Bit7
  157. Enviar_Bit8_1:
  158.     call    NeoBit1
  159.    
  160. Enviar_Bit7:
  161.     btfsc   _ByteB,7
  162.     goto    Enviar_Bit7_1
  163. Enviar_Bit7_0:
  164.     call    NeoBit0
  165.     goto    Enviar_Bit6
  166. Enviar_Bit7_1:
  167.     call    NeoBit1
  168.    
  169. Enviar_Bit6:
  170.     btfsc   _ByteB,6
  171.     goto    Enviar_Bit6_1
  172. Enviar_Bit6_0:
  173.     call    NeoBit0
  174.     goto    Enviar_Bit5
  175. Enviar_Bit6_1:
  176.     call    NeoBit1
  177.    
  178. Enviar_Bit5:
  179.     btfsc   _ByteB,5
  180.     goto    Enviar_Bit5_1
  181. Enviar_Bit5_0:
  182.     call    NeoBit0
  183.     goto    Enviar_Bit4
  184. Enviar_Bit5_1:
  185.     call    NeoBit1
  186.    
  187. Enviar_Bit4:
  188.     btfsc   _ByteB,4
  189.     goto    Enviar_Bit4_1
  190. Enviar_Bit4_0:
  191.     call    NeoBit0
  192.     goto    Enviar_Bit3
  193. Enviar_Bit4_1:
  194.     call    NeoBit1
  195.    
  196. Enviar_Bit3:
  197.     btfsc   _ByteB,3
  198.     goto    Enviar_Bit3_1
  199. Enviar_Bit3_0:
  200.     call    NeoBit0
  201.     goto    Enviar_Bit2
  202. Enviar_Bit3_1:
  203.     call    NeoBit1
  204.    
  205. Enviar_Bit2:
  206.     btfsc   _ByteB,2
  207.     goto    Enviar_Bit2_1
  208. Enviar_Bit2_0:
  209.     call    NeoBit0
  210.     goto    Enviar_Bit1
  211. Enviar_Bit2_1:
  212.     call    NeoBit1
  213.    
  214. Enviar_Bit1:
  215.     btfsc   _ByteB,1
  216.     goto    Enviar_Bit1_1
  217. Enviar_Bit1_0:
  218.     call    NeoBit0
  219.     goto    Enviar_Bit0
  220. Enviar_Bit1_1:
  221.     call    NeoBit1
  222.    
  223. Enviar_Bit0:
  224.     btfsc   _ByteB,0
  225.     goto    Enviar_Bit0_1
  226. Enviar_Bit0_0:
  227.     call    NeoBit0
  228.     return
  229. Enviar_Bit0_1:
  230.     call    NeoBit1
  231.     return
  232.    
  233. ;===============================================================================
  234. ;   Rutina para generar los bits necesarios para la comunicación del integrado
  235. ;   WS2812B.
  236. ;   La documentación pide un tiempo de 1.25uS +/- 600nS en total para el envío
  237. ;   del bit .
  238. ;   Para el bit 0 se requiere un tiempo alto de 0.4 uS +/- 150nS y para el timepo
  239. ;   bajo 0.85uS +/- 150 ns
  240. ;   Para el bit 1 se requiere un tiempo alto de 0.8 uS +/- 150 ns y para el tiempo
  241. ;   bajo 0.45 uS +/- 150nS
  242. ;   El WS2812B requiere de un tiempo de reset en bajo cuando se ha terminado de
  243. ;   enviar los 24 bits, tiene que ser al menos de 50uS. Esta rutina se incluye
  244. ;   en el programa principal.
  245. ;================================================================================
  246. NeoBit1:
  247.                         ;2 ciclos del call
  248.     bsf    LATA,2       ;1 ciclo
  249.     nop                 ;1 ciclo
  250.     nop                 ;1 ciclo
  251.     nop                 ;1 ciclo
  252.     nop                 ;1 ciclo
  253.     nop                 ;1 ciclo
  254.     nop                 ;1 ciclo
  255.     nop                 ;1 ciclo
  256.     nop                 ;1 ciclo
  257.                         ;Tiempo en alto de 750nS
  258.     bcf     LATA,2      ;1 ciclo
  259.     return              ;2 ciclos
  260.                         ;Tiempo bajo de 250nS, hay que tener en cuenta que al
  261.                         ;salir de la rutina se ejecutan otras instrucciones que
  262.                         ;toman tiempo en realizarse, por lo que consumen tiempo
  263.                         ;de la señal en bajo
  264.                         ;Tiempo total de la rutina 1.166667uS
  265. NeoBit0:
  266.                         ;2 ciclos del call
  267.     bsf     LATA,2      ;1 ciclo
  268.     nop                 ;1 ciclo
  269.     nop                 ;1 ciclo
  270.     nop                 ;1 ciclo
  271.                         ;Tiempo en alto de 333.3nS
  272.     bcf     LATA,2      ;1 ciclo
  273.     nop                 ;1 ciclo
  274.     nop                 ;1 ciclo
  275.     nop                 ;1 ciclo
  276.     nop                 ;1 ciclo
  277.     return              ;2 ciclos
  278.                         ;Tiempo en bajo de 583.31 nS
  279.                         ;Tiempo total de la rutina 1.083333uS

Adjunto proyecto

Funciona de maravilla!
Muchas gracias, me has ahorrado muchos dolores de cabeza.