Autor Tema: Manejo de Registros Generales.  (Leído 2179 veces)

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

Desconectado jm.garciaf

  • PIC10
  • *
  • Mensajes: 7
Manejo de Registros Generales.
« en: 27 de Abril de 2015, 16:30:08 »
Buenas tardes!
Les hago una consulta, por ahí es simple, por ahí no.

Yo programa en assambler.
¿Se pueden usar las directivas BCF, BSF, BTFSS, BTFSC con un bit de un REGISTRO GENERAL?

Por ejemplo
REG_GEN_1        equ         0x20

btfss      REG_GEN_1, 5             ;Chequeo bit 5 del registro de propósito general.
bcf         REG_GEN_1,5             ;Si es 0, lo pongo a 1.
goto       OTRA COSA                 ;Sigue programa

Mi consulta viene porque quiero tener un grupo de 16 pulsadores en el bus I2C (con PCF8574) y 16 leds multiplexadas, también en el bus I2C (con otro PCF8574).
Si se presiona un pulsador, por ejemplo el numero 11, se debe encender el Led 11.
y si se vuelve a presionar el pulsador 11, se debe apagar el Led 11.
Ademas se tienen que mantener el estado de los otros leds como están.

Por eso pensaba, que leo el byte correspondiente a los pulsadores, determino que pulsador fue presionado (viendo columnas y filas como en un teclado matricial).
Luego leo el estado de los leds, y chequeo si el led que corresponde al pulsador que fue presionado esta encendida o apagada (chequeando fila y columna correspondiente), y hago la operación contraria, pero modificando solo el bit correspondiente, para no alterar el estado de los demás leds.
Osea que cuando obtengo el byte provenientes de los leds, modifico el bit que enciende o apaga el led correspondiente. y devuelvo el byte modificado por el bus otra vez.
De ahí es que viene la pregunta inicial.

Espero haberme explicado bien.
Por ahi estoy muy equivocado en la logica que estoy pensando, tal vez hay una forma mas simple de hacerlo.
De por si cualquier ayuda, correccion, critica, sugerencia es agradecida. Estoy aprendiendo.

Trabajo con un PIC16F877A
Los pulsadores son momentaneos, Normally Open.

MUCHAS GRACIAS!
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Manejo de Registros Generales.
« Respuesta #1 en: 27 de Abril de 2015, 21:52:29 »
Si se puede, incluso por ahi una practica es en las interrupciones activar un FLAG para asi hacer algo en el programa principal y que de la interrupcion salga rapido.

ese FLAG, no es mas que un bit de algun registro creado por nosotros, tal cual pusiste en tu ejemplo

Desconectado jm.garciaf

  • PIC10
  • *
  • Mensajes: 7
Re: Manejo de Registros Generales.
« Respuesta #2 en: 28 de Abril de 2015, 15:09:33 »
Otra duda que me surgio KILLERJC.

Si tengo una matriz de leds de 4x4 digamos, en el bus i2c, con pCF8574, y que cada led corresponda a un pulsador, como hago para poder encender dos o mas a la vez sin que se enciendan las q corresponden?
Me explico mejor... La matriz seria la siguiente:

       |01|02|03|04|
       |05|06|07|08|
       |09|10|11|12|
       |13|14|15|16|
Suponiendo que a las filas esten conectados los ánodos de los leds, y las columnas los cátodos, por ejemplo para encender el LED 01, se enviaría B'11100001'
Siendo el nibble alto las columnas, y el nibble bajo las filas.
Pero si quiero encender el Led 01 y el 06 simultáneamente, se enviaría B'11000011', pero eso también me encendería el Led 02 y el Led 05 ¿verdad?

¿Hay alguna técnica de multiplexacion para leds que me evite este problema?
El proyecto tiene 40 pulsadores y 40 leds. 8 pulsadores y 8 leds van en el pic. y tendria 2 matrices de 4x4 para pulsadores, y 2 matrices 4x4 de leds, todas en el bus i2c.

Si tenes alguna idea para darme, te agradezco

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Manejo de Registros Generales.
« Respuesta #3 en: 28 de Abril de 2015, 22:33:17 »
De la forma que me lo planteas y con esa conexion la unica alternativa que veo es multiplexandolo.

Es decir encender Led 01 un tiempo, apagar y encender Led 06 otro tiempo, lo que si, si son varios podes hacerlo por filas o columnas

Ej: querer enecender 01,02,08,11,12,16

Si lo haces por fila

Enecendes 01 y 02 con b'11000001'
Luego 08
Luego 11 y 12
Luego 16

Es la unica que se me ocurre de la forma que tenes planteada la conexion


 

anything