Autor Tema: Ampliación de entradas mediante cd4014  (Leído 4104 veces)

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

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Ampliación de entradas mediante cd4014
« en: 18 de Noviembre de 2014, 13:21:35 »
Hola buenas.
http://heli.xbot.es/wp-content/Antiguo/ampliacion/ampliacion.htm
Basándome en el artículo de dicha página he adaptado el código a pic simulator.
Con sólo tres pines conseguimos 8 entradas
Código: [Seleccionar]

'16F88 PRUEBA FUNCIONAMIENTO CD4014
'ra5 entrada, oscilador exterior a 8mhz

Define CONF_WORD = 0x3f0a
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
ANSEL = 0x00  'todos los pines digitales
CMCON = 0x07
'Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion

'#######################################################################################################
'definición de puertos falta definir los puertos
TRISA = %00100000
TRISB = %00001000
Symbol led4 = RA1
Symbol led1 = RA2
Symbol led2 = RA3
Symbol led3 = RB1
Symbol data_cd4014 = RB3
Symbol load_cd4014 = RB6
Symbol clk_cd4014 = RB7
'######################################################################################################
Dim entrada As Byte
entrada = %00000000
Hseropen 4800

main:
led1 = 0
led2 = 0
led3 = 0
led4 = 0


Gosub cd4014

'If entrada.0 = 1 Then led1 = 1
'If entrada.1 = 1 Then led2 = 1

'If entrada.2 = 1 Then led3 = 1
'If entrada.3 = 1 Then led4 = 1

If entrada.4 = 1 Then led1 = 1
If entrada.5 = 1 Then led2 = 1

If entrada.6 = 1 Then led3 = 1
If entrada.7 = 1 Then led4 = 1



Hserout #entrada
WaitMs 1000

Goto main
End                                               



cd4014:

load_cd4014 = 1
clk_cd4014 = 1
clk_cd4014 = 0
load_cd4014 = 0
WaitMs 2
entrada.7 = data_cd4014

WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.6 = data_cd4014

WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.5 = data_cd4014

WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.4 = data_cd4014


WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.3 = data_cd4014

WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.2 = data_cd4014


WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.1 = data_cd4014


WaitMs 2
clk_cd4014 = 1
clk_cd4014 = 0
entrada.0 = data_cd4014

Return                                     


La simulación en proteus funciona. Me gustaría que alguien le echara un vistazo por si hay algún error o se puede mejorar.
En el rar va la simulación
Un saludo
También la simulación en proteus

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ampliación de entradas mediante cd4014
« Respuesta #1 en: 18 de Noviembre de 2014, 13:59:08 »
mejorar ? podrias usar el SPI, obviamente perderias tu pin de salida.

Pero tu CS (SS) como le llame microchip seria tu serie/paralelo, siempre y cuando se pueda mantener en bajo o alto todo el tiempo de lectura
Tu SDI la entrada
SCLK el reloj.
SDO lo perdes por que no estarias escribiendo nada. ( es decir 0x00 escribirias ) o lo conectas a la entrada del ultimo cd4014

Y solo escribirias 3 ciclos ( 3 por que hay 3 cd4014 en el diagrama ) de 8 bits, asi el reloj funciona para esos bits. Y los vas recibiendo en byte por byte.
Manejado por hardware, interrupcion cuando llegue cada byte ( nada de delays ). Y utilizarias 4 pines (1mas). Seleccionas los baudios para recibir al ritmo que desees sin tener que agregar esos delays.


En basic no se como pero es una idea.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ampliación de entradas mediante cd4014
« Respuesta #2 en: 18 de Noviembre de 2014, 21:55:58 »
No se si funcionara pero con una función podria ser así (esto puede que no haga el codigo más corto pero si más transportable):


Código: [Seleccionar]
'16F88 PRUEBA FUNCIONAMIENTO CD4014
'RA5 entrada, oscilador exterior a 8mhz
Define CONF_WORD = 0x3f0a
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
ANSEL = 0x00  'todos los pines digitales
CMCON = 0x07
'Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion
'#######################################################################################################
'Definición de puertos falta definir los puertos
TRISA = %00100000
TRISB = %00001000
Symbol led4 = RA1
Symbol led1 = RA2
Symbol led2 = RA3
Symbol led3 = RB1
Symbol data_cd4014 = RB3
Symbol load_cd4014 = RB6
Symbol clk_cd4014 = RB7
'######################################################################################################
Dim entrada As Byte
entrada = %00000000
Hseropen 4800
main:
led1 = 0
led2 = 0
led3 = 0
led4 = 0
entrada = _read_cd4014(2000)
'If entrada.0 = 1 Then led1 = 1
'If entrada.1 = 1 Then led2 = 1

'If entrada.2 = 1 Then led3 = 1
'If entrada.3 = 1 Then led4 = 1

If entrada.4 = 1 Then led1 = 1
If entrada.5 = 1 Then led2 = 1

If entrada.6 = 1 Then led3 = 1
If entrada.7 = 1 Then led4 = 1

Hserout #entrada
WaitMs 1000

Goto main
End                                              
Function _read_cd4014(_delay_us As Word) As Byte
Symbol _data_cd4014 = RB3
Symbol _load_cd4014 = RB6
Symbol _clk_cd4014 = RB7
Dim _n As Byte
_load_cd4014 = 1
_clk_cd4014 = 1
_clk_cd4014 = 0
_load_cd4014 = 0
For _n = 7 To 0 Step -1
WaitUs _delay_us
_read_cd4014._n = _data_cd4014
_clk_cd4014 = 1
_clk_cd4014 = 0
Next _n
End Function

Y si quieres seguir con el mismo metodo podria quedar así:

cd4014:
   Dim n As Byte
   load_cd4014 = 1
   clk_cd4014 = 1
   clk_cd4014 = 0
   load_cd4014 = 0
   For _n = 7 To 0
      WaitMs 2
      entrada.n = data_cd4014
      clk_cd4014 = 1
      clk_cd4014 = 0
   Next n
Return                

Y como te dicen con interrupciones aprovecharías mejor el tiempo de procesado.
« Última modificación: 18 de Noviembre de 2014, 22:08:03 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Ampliación de entradas mediante cd4014
« Respuesta #3 en: 19 de Noviembre de 2014, 15:57:12 »
Muchas gracias por vuestras respuestas.
O algo hago mal o la expresión entrada.n no la permite la versión 6.91 que tengo del compilador
un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ampliación de entradas mediante cd4014
« Respuesta #4 en: 19 de Noviembre de 2014, 23:45:59 »
Puede ser, es relativamente nueva.
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Ampliación de entradas mediante cd4014
« Respuesta #5 en: 23 de Diciembre de 2014, 17:54:01 »
Sigo dando vueltas con el circuito de ampliación de entradas.
Al conectar botones a los cd4014 lo que se produce son rebotes.
He intentado varias cosas y hasta ahora no he conseguido nada efectivo
Es rutina es la que mejor me ha funcionado, pero tampoco es 100% .
Lo que hace es leer una entrada del cd4014 y entra en un bucle aumentando un contador. Cuando este contador llega a un valor determinado permite que siga el programa haciendo que la variable ant_rebote sea uno.

anti_rebote:
If n_desvio <> 0 Then
n1 = n1 + 1
Endif
If n1 = 5 Then
ant_rebote = 1
n1 = 0
Endif
Return         

No sé si se os ocurre algo que funcione mejor que ésto.
Un saludo               

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ampliación de entradas mediante cd4014
« Respuesta #6 en: 23 de Diciembre de 2014, 22:31:41 »
No lo he probado y no tengo tiempo por el momento, te dejo esto para que investigues:

Código: [Seleccionar]
Define CONFIG = 0x2f50
Define CONFIG2 = 0x3ffc
'********************Placa Pic EBasic ****************************************
'NOMBRE: Antirrebotes con TMR1
'MICRO: PIC16F88/8Mhz reloj interno
'FECHA/AUTOR: 12/2014, By COS
'Versión: 12/2014
'-----------------------------------------------------------------------------
Define CLOCK_FREQUENCY = 8
Include "_FuncionesPic16F88.bas"
Include "_ProcSetUpEBasic.bas"
Lcdinit
'*****************************************************************************
main:  'Rutina del programa
'Configura modulos generales de la tarjeta Pic  EBasic
Call _setupebasic()
'Configura el Timer1
Call _setup_timer1(_tmr1_internal, _tmr1_div8)  'Fondo de escala sobre 131mSeg
Call _set_timer1(0xffff)
Call _timer1(_on)
'Call _enable_interrupts(_int_timer1)
'Call _enable_interrupts(_global)  'Enable interrupciones globales y perifericos
WaitMs 500
'--------------------------------------------------------------------------
Dim flag_tecla1 As Bit
flag_tecla1 = 0
_tmr1if = True
while_main:

If tecla1 = False And flag_tecla1 = 0 And _tmr1if = True Then
flag_tecla1 = 1
Call _set_timer1(0x0000)  '131mSeg más o menos
Endif
If flag_tecla1=1 Then Gosub hago_tecla

Goto while_main
End                                              
'*************************************************
hago_tecla:
'Hago lo que tenga que hacer
flag_tecla1 = 0
Return
« Última modificación: 23 de Diciembre de 2014, 22:47:44 por dogflu66 »
Saludos desde Granada, España.


 

anything