Autor Tema: Cambiar un bit de una variable en c18 sin recurrir a ASM?  (Leído 3897 veces)

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

Desconectado redep

  • PIC12
  • **
  • Mensajes: 75
Cambiar un bit de una variable en c18 sin recurrir a ASM?
« 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

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #1 en: 10 de Noviembre de 2008, 10:33:13 »
hola, yo tenía el mismo problema, mira aquí

http://www.todopic.com.ar/foros/index.php?topic=21278.0

la cuarta respuesta solucionó mi problema. A ver si a ti también.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #2 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
  1. unsigned char MyVar = 0xFF;
  2.  
  3. /* Poner en 0 el bit 3 */
  4. MyVar &= 0xF7;
  5.  
  6. /* Poner en 1 el bit 4 */
  7. 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:

Código: C
  1. /* Reset bit mask */
  2. #define CLEARFLAG( Flag, Mask ) (( Flag ) &= ( 0xFF - (( unsigned char )( Mask ))))


Saludos !

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #3 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #4 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 !

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #5 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.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #6 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
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #7 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 ).

Código: C
  1. #define CLEARFLAG( Flag, Mask ) ( Flag &= ( 0xFF - Mask ))
  2.  
  3. #define SETFLAG( Flag, Mask ) ( Flag |=  Mask )
  4.  
  5. #define ISFLAGSET( Flag, Mask ) (( Flag & Mask ) != 0 )

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 !


Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #8 en: 10 de Noviembre de 2008, 19:48:26 »
Perdon! no me di cuenta que estabamos hablando de c18  :oops:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #9 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
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #10 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 !

Desconectado redep

  • PIC12
  • **
  • Mensajes: 75
Re: Cambiar un bit de una variable en c18 sin recurrir a ASM?
« Respuesta #11 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.