TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: fco1306 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
'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
-
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.
-
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):
'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.
-
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
-
Puede ser, es relativamente nueva.
-
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
-
No lo he probado y no tengo tiempo por el momento, te dejo esto para que investigues:
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