Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

05/04/2012 #1


Definir 3 bits como variable, CCS PIC
Hola:
Estoy utilizando un 18f2455, y quiero asignar los bits de los flags de las interrupciones a una variable para poder borrarlos todos a la vez. Me explico:

Del registro INTCON (0xFF2), quiero que los bits 0, 1 y 2, estén asignados a una variable, por ejemplo llamada FLAGS, y que con hacer FLAGS=0, se me pongan estos bits a cero.

¿Cómo se pueden asignar bits sueltos a una variable en CCS?
Gracias y un saludo.
05/04/2012 #2

Avatar de chclau

Una manera de hacer eso es realizar AND al registro, con una palabra constante que tiene los bits en esas posiciones en cero, y el resto en 1.
05/04/2012 #3


Si, eso es hacer la operación, que puedo hacerla como una función, pero estaría bien saberlo para otras aplicaciones, si se pueden definir solo 3 bits como una variable.
Gracias
05/04/2012 #4

Avatar de Eduardo

Entiendo que lo que querés usar es variables de 1,2,...bits , eso se declara en un struct.
struct VarBits {
int flag:3 ; // 3bits
int b:3 ; // cualquier cosa 3bits
int c:2 ; // cualquier cosa 2bits
} bits ;
Si querés que la variable apunte a INTCON, después del struct declarás
#byte bits = 0xFF2 // INTCON
Después las usás normalmente
bits.flag = 4 ;
bits.c = 1 ;
bits.b = bits.flag | bits.c ;
O si no querías usar el '.' y llamarla por 'flags' sin nada más , le metés al comienzo un #define y listo.
#define flags bits.flag
Y la llamás como querías:
flags = 0
05/04/2012 #5


Muchas gracias, hasta ahí funciona correctamente.
Para rizar más el rizo:
¿Se puede agrupar dentro de la variable "flags", los bits 0,1 y 2 del INTCON, y el bit 0 del INTCON2?

O también, solo el bit 0 y 2 del INTCON por ejemplo.
05/04/2012 #6

Avatar de Meta

Hola:

No se si en PIC se hará, en PC de guarda en un buffer, arreglo, array, vectores, como quieras llamarlo.

flags[0, 1, 2] = INTCON;

Lo de arriba es un ejemplo conceptual, no real.

Un saludo.
05/04/2012 #7


Lo del compañero EDUARDO funciona, que lo he probado, así que es real. Pero ¿se podría hacer el otro caso?
05/04/2012 #8

Avatar de Meta

Me refiero a mi lo de no real,

Estoy investigando la mejor manera de hacerlo.

Por lo que te entiendo. Quieres de una sola pasada, borrar la variable de una interrupción, sólo los bits 0, 1 y 2.

¿Cierto?

Hay qu eleer bien el PIC18F2450.

INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

Sólo quieres cambiar a 0 de golpe los tres últimos bits de menor peso en una llamada de una sóla variable. Si no he entendido bien, me lo confirma.


One moment, please...
05/04/2012 #9


si, me has entendido bien, y yo no te habia entendido bien, jejejej

Lo de borrar los 3 bits de los flags del INTCON funciona con lo del compañero EDUARDO, pero además, hay más flags en el bit 0 y 1 del INTCON3

INTCON3 INT2IP INT1IP -- INT2IE INT1IE -- INT2IF INT1IF

¿Se podrían borrar los del INTCON y los del INTCON3 de una pasada?
05/04/2012 #10

Avatar de Meta

En ASM se puede crear una MACRO o un CALL. Con ello creas una series de instrucciones para que haga de una pasada lo que buscas con una sola instrucción.

Por ejemplo: CALL Flags // Borra los tres últimos bits a 0.

Lo mismo para el INTCON2 y el INTCON3. Creas unas series de instrucciones, lo pones en un archivo externo a parte o simplemente en el mismo archivo como un bloque de código.
05/04/2012 #11


Claro, así es como lo hacía hasta ahora, pero quería saber si se puede hacer de otra forma con una sola variable, y si es posible, ahorrando ciclos.
05/04/2012 #12

Avatar de Meta

Hola:

Si se pueden borrar INTCON y INTCON3 de una pasada.

Ahora de los ciclos, si usas C, no creo que sea muy importante para ti en estos ejemplos.

Lo puedes hacer en C con constructores o procesos.

Código:
void flags (); // Proceso borra toda las variables de golpe.
{

/* Aquí pones los bits de INTCON y INTCON3 a 0. ¿Sabes ahcerlo en C?
También puedes incrustar código en ensamblador dentro de C. */

// Código ASM incrustado en C de CCS. Borra los INTCON y INTCON3 de una pasada de los bit elegidos.
#ASM
    bcf    INTCON, TMR0IF
    bcf    INTCON, INT0IF
    bcf    INTCON,    RBIF
    bcf    INTCON3, INT2IF
    bcf    INTCON3, INT1IF
#ENDASM

}
Cada ves que quieras borrar todo de golpe, llamas el archivo creado, en este ejemplo conceptual se llama flags;

Lo puedes conseguir en una sola instrucción, en este caso llamado flags. No olvides que en ASM, hay que dejar claro en que banco de memorias trabaja, aunque no lo haya puesto, si decides usar el código como te digo, te escribo los bancos porque te hace falta.

Saludo.
05/04/2012 #13


Vale, gracias, en C se hacerlo
Ahora vamos a darle otra vuelta. Si en vez de ponerlo a cero quiero ponerlo a 1, ya no valdría esta misma función, y tendría que crear otra.
Lo interesante sería lo que planteaba al principio, poder definir una variable con diferentes bits, y hacer por ejemplo:

flags=0 para borrar
y
flags=1 para ponerlos todos a 1 por ejemplo

gracias y un saludo
05/04/2012 #14

Avatar de Meta

Hola:

Si lo puedes hacer con constructores, al menos en PC me deja.

byte flags = 0; // Aquí un 0 o un 1.

funcion(byte flags);
{

if (flags = 0)
{
// Código necesario para el borrado completo.
}

else
{
// Código necesario para ponerlo todos a 1, por ejemplo.
}
}


Luego encuentra el código que se llama eneste caso funcion (sin tilde en la o) y dentro de ella, el código. Usa parámetros del constructor para conseguir tal fin.

Con una sola variabel, quieres el control del borrado o ponerlo a 1 por ejemplo.

¿Entiendes el concepto?

Saludo.
05/04/2012 #15


Entendido!!
Muchas gracias. No hay duda que tiene que funcionar también en PIC
De esta forma además, se pude dar distintos valores, no solo poner a 1 o a 0, utilizando "switch" en vez de "if"
Gracias por la ayuda
05/04/2012 #16

Avatar de Meta

Por supeusto.

Si vas a usar más de dos valores es mejor que uses el switch.

No hay problemo.

Mucha suerte campeón.
05/04/2012 #17

Avatar de Eduardo

rachelies dijo: Ver Mensaje
...
Lo interesante sería lo que planteaba al principio, poder definir una variable con diferentes bits, y hacer por ejemplo:

flags=0 para borrar
y
flags=1 para ponerlos todos a 1 por ejemplo
De las tantas formas de setear o resetear grupos de bits que están en diferentes registros y que pueden ser no consecutivos, la más apropiada es por medio de máscaras y funciones lógicas.

Cuando querés resetear un grupo de bits en un registro, es simplemente un AND con la máscara, y para setear un OR con la máscara (pero otra)
#byte intcon = 0xFF2
#byte intcon3 = 0xFF0

.............................

intcon &= 0xF8 ; // Resetea los 3 primeros bits de INTCON
intcon3 &= 0xFC ; // Resetea los 2 primeros bits de INTCON3

..............................

intcon |= 0x7 ; // Setea los 3 primeros bits de INTCON
intcon3 |= 0x3 ; // Setea los 2 primeros bits de INTCON3

Pero cuando estas instrucciones se repiten o se busca mayor legilibilidad del código --> Pues para eso existen los Macros.
// Defino las mascaras y los macros
#define msk0 0b00000111 // solo interesan los 3 primeros bits
#define msk3 0b00000011 // solo interesan los 2 primeros bits
#define Reset_Intcon {intcon &= ~msk0 ;intcon3 &= ~msk3 ;}
#define Set_Intcon {intcon |= msk0 ;intcon3 |= msk3 ;}

.......................................

Reset_Intcon
Set_Intcon // Hasta si quiero sin el punto y coma final porque
// esta incluida en el macro

06/04/2012 #18


Esta es la solución que buscaba!! Muchas gracias.
Las otras soluciones también son válidas, y me las apunto para el futuro, que siempre pueden ser útiles, jejejje
Muchas gracias!!

Cuando tenga tiempo analizaré cuantos ciclos utiliza una y otra forma, porque aunque en C no importen mucho los ciclos, hay programas en los que ciertas funciones "hechas" no me pueden ocupar muchas intrucciones para no crear retardos innecesarios.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.