Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: redep en 10 de Noviembre de 2008, 09:23:07
Título: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: redep en 10 de Noviembre de 2008, 09:23:07
Hola queria saber si existe alguna forma que no sea recurriendo a ensamblador en la que se pueda cambiar un bit de una variable al igual que se hace con la instruccion PORTDbits.RD2=0 pero con variables. Ya que en el programa que estoy aciendo queda muy engorroso si lo hago de mitad asm mitad c18.
gracias
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: cucu en 10 de Noviembre de 2008, 10:33:13
la cuarta respuesta solucionó mi problema. A ver si a ti también.
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: RICHI777 en 10 de Noviembre de 2008, 10:35:45
Hola, en "C" para poner un bit en 0 debes usar la operacion & y para subir un bit el operador |
Código: C
unsignedchar MyVar =0xFF;
/* Poner en 0 el bit 3 */
MyVar &=0xF7;
/* Poner en 1 el bit 4 */
MyVar |=0x10;
Un buen estilo de programacion es definir macros que trabajen de forma generica con cualquier bit, es decir la macro recibe como parametro el bit a manipular y opera en consecuencia. Un ejemplo para resetar un bit:
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: Marttyn en 10 de Noviembre de 2008, 13:11:53
Tambien puedes usar la directiva #locate:
Citar
#LOCATE works like #BYTE however in addition it prevents C from using the area.
// This will locate the float variable at 50-53 // and C will not use this memory for other // variables automatically located.
float x; #locate x=0x50
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: RICHI777 en 10 de Noviembre de 2008, 13:17:32
Hola Marttyn, me parece que eso es otra cosa, si no entiendo mal, LOCATE es una directiva para alocar en forma absoluta una variable, y aca lo que se plantea es como bajar, subir o testear bits.
Saludos !
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: Marttyn en 10 de Noviembre de 2008, 13:25:21
una vez que tienes la direccion de la variable puedes trabajar con ella como cuando lees o escribes sobre un puerto DIRECTAMENTE, por ejemplo PORTA.1 = 0 sino tambien se puede usar "bit_set" y "bit_clear" sobre una variable cualquiera. esto es mas facil y directo.
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: MLO__ en 10 de Noviembre de 2008, 15:04:35
Hola.
Creo que bit_set y bit_clear son validas solo para el CCS y no para el C18.
Saludos
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: RICHI777 en 10 de Noviembre de 2008, 16:47:55
Hola, desconozco el CCS y tambien el C18, pero estas macros son usadas y deberian correr en cualquier compilador, al definirse como macros hacemos que el compilador genere el código en el mismo lugar donde son invocadas y no tienendo que llamar a una función con todo el overhead que eso implica. Extiendo la definicion anterior y pongo las tres que se normalmente se usan ( SET, CLEAR, TEST ) las mismas deben ser usadas para tipo de datos unsigne char o tambien para los varios typedefs que existen ( byte, int8, etc ).
Donde Flag es la variable a modificar/testear y Mask puede tomar un valor entre los sgtes. 0x01,0x02,0x04, 0x08, 0x10, 0x20, 0x40, 0x80 que representa a todas las posibles mascaras que entran en un byte.
Saludos !
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: Marttyn en 10 de Noviembre de 2008, 19:48:26
Perdon! no me di cuenta que estabamos hablando de c18 :oops:
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: MLO__ en 10 de Noviembre de 2008, 22:51:49
Hola.
Gracias por compartirlas Richi, voy a probarlas en el CCS (el problema con el compilador PCWH es que no es ansi C, pero el C18 si lo es).
Saludos
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: RICHI777 en 11 de Noviembre de 2008, 11:29:44
Hola, el problema con la solución que describi antes, aunque es la mas portable no siempre es la mas eficiente, porque depende exclusivamente del compilador, la propuesta que menciona cucu ( si se lee el correspondiente post ) es el uso de bits fields donde algunos compiladores para embebidos hacen uso de instrucciones especificas para el manejo de bits ( BitSet y BitClear por ejemplo ) pero lamentablemente los bits fields son una de las partes mas oscuras del standart ANSI, son muy plataformas dependiente, asi que en estos casos se debe tomar una decision, o gano performance o gano portabilidad.
Saludos !
Título: Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
Publicado por: redep en 11 de Noviembre de 2008, 21:30:59
Lo de crear una mascara lo habia pensado y operar con funciones logicas pero lo veo engorroso, probare lo del link que puso richy en el post aber que tal va.