TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: radioelf en 20 de Septiembre de 2009, 11:29:32
-
Hola, tengo la duda de que diferencias hay entre las siguientes opciones del compilador CCS, si no estoy equivocado todas ellas poner el pint RB3 a 1, pero el código generado por el compilador es muy distinto.
#bit LED = PORTB.3
LED =1; //opción 1
output_high (LED); //opción 2
output_high (PIN_B3); //opción 3
-
Hola.
Pues si las tres ponen a 1 el pin, la diferencia solo es de gestión de recursos para hacerlo no?
La función built-in output_high del CCS depende tambien, en su forma de trabajar, de la directiva #use *_IO. Habría que verificar las combinaciones a ver que sucede.
Saludos
-
OK gracias, si miro el código generado para cada una de ellas es el siguiente:
443: LED =1; //opción 1
0AFD 1586 BSF 0x6, 0x3
444:
445: output_high (LED); //opción 2
0AFE 3000 MOVLW 0
0AFF 1986 BTFSC 0x6, 0x3
0B00 3001 MOVLW 0x1
0B01 00B1 MOVWF 0x31
0B02 00B2 MOVWF 0x32
0B03 3001 MOVLW 0x1
0B04 00B3 MOVWF 0x33
0B05 01B5 CLRF 0x35
0B06 01B4 CLRF 0x34
0B07 118A BCF 0xa, 0x3
0B08 258F CALL 0x58f
0B09 158A BSF 0xa, 0x3
0B0A 0831 MOVF 0x31, W
0B0B 00B2 MOVWF 0x32
0B0C 01B3 CLRF 0x33
0B0D 01B5 CLRF 0x35
0B0E 3080 MOVLW 0x80
0B0F 00B4 MOVWF 0x34
0B10 118A BCF 0xa, 0x3
0B11 258F CALL 0x58f
0B12 158A BSF 0xa, 0x3
446:
447: output_high (PIN_B3); //opción 3
0B13 1683 BSF 0x3, 0x5
0B14 1186 BCF 0x6, 0x3
0B15 1283 BCF 0x3, 0x5
0B16 1586 BSF 0x6, 0x3
-
Evidentemente la opción LED =1 es la más simple y directa, pone el valor 1 en el registro correspondiente y listo...
La última opción output_high (PIN_B3);
BSF 0x3, 0x5 (pasa al banco 1)
BCF 0x6, 0x3 (pone a 0 el TRISB)
BCF 0x3, 0x5 (pasa al banco 0)
BSF 0x6, 0x3 (pone a 1 el PORTB)
En este caso estás trabajando en un modo tal que cada vez que escribes o lees un pin lo configuras como entrada o salida previamente y segun corresponda... Creo que es el modo standard_io, pero si usas el modo fast_io para el puerto en cuestión sospecho que el código de ambas opciones será el mismo: BSF 0x6, 0x3 (pone a 1 el PORTB) en este caso!
La función built-in output_high del CCS depende tambien, en su forma de trabajar, de la directiva #use *_IO. Habría que verificar las combinaciones a ver que sucede.
100% deacuerdo
Sobre la segunda opción, no entiendo lo que hace... pero con todo ese código dudo que convenga usarlo... habría que saber bien que hace, estimo... pero muy de intuición, que hace un direccionamiento indirecto del puerto que tampoco sé en qué o cuáles condiciones puede llegar a ser útil o necesario...
Me parece que la mejor opción es la 3, ya que respeta la configuración de modo del puerto y la opción 1 se puede usar para alguna excepción, por ejemplo:
Quiero usar el puerto B normalmente como un bus bidireccional ==> usar standar_io pero en una rutina de interrupción voy a necesitar usar el puerto B para enviar muchos datos a un periferico, en esa subrutina, el puerto siempre es salida, por lo tanto configurar el tris es redundante y me genera un código 4 veces más extenso!!! entonces ahí usaría el modo 1...
Saludos y Feliz Primavera!!!
-
Me fue de gran utilidad sus explicaciones. Gracias :-/