Autor Tema: CD4094 y 16F84A  (Leído 20460 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5252
Re:CD4094 y 16F84A
« Respuesta #15 en: 19 de Abril de 2016, 19:05:07 »
Me pregunto si alguien puede ayudarme y si es correcto que pegue el codigo ASM en el mensaje.

Si, podes seguirlo aca, o incluso podes crear un nuevo post aca ( que es el foro de ASM ):

http://www.todopic.com.ar/foros/index.php?board=3.0

Explica exactamente cual es el problema y pega tu codigo para que sea revisado.

Una pregunta, si o si tiene que ser el 16f84 ? Lo digo por el precio del mismo Y que hay mucho mas baratos y hasta con oscilador interno.
« Última modificación: 19 de Abril de 2016, 19:07:30 por KILLERJC »

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 3
Re:CD4094 y 16F84A
« Respuesta #16 en: 19 de Abril de 2016, 19:26:49 »
Bien pego el codigo :
;******************************************************************************
   LIST P=16F84A
   INCLUDE "p16f84a.inc"
 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#define CARRY STATUS,C ;Define la palabra Carry
;***********************  Definir Etiquetas  **********************************
DATO   equ   0x0c
Cont   equ   0x0d
;*************************** VECTOR DE INCIO **********************************
       org   0   ;Establecer dirección de origen del programa
;********************** PROGRAMA PRINCIPAL **********************************
      bsf      STATUS,RP0  ;Seleccionar el Banco 1 en la Memoria de Datos
      clrf      PORTB
       movlw   b'11111111'
      movwf   PORTA
      Bcf      STATUS,RP0    ;Seleccionar el Banco 2 en la Memoria de Datos
;----------------------------------------------------------------------------      
      movlw   b'001010'   ; Carga en W el valor 10 ( sin tono )
      movwf   DATO      ; Carga en DATO el valor de W
      movwf   PORTB
      clrf      Cont
;----------------------------------------------------------------------------      
INICIO   movlw   d'7'
      subwf   Cont,w
      btfsc           STATUS,C
      clrf      Cont
      btfsc    PORTA,2    ; Lee PORTA bit 2 STROBE si esta en 1 pasa en 0 salta
      call      SALIDA
      btfss    PORTA,4   ; Lee PORTA bit 4 CLOCK si esta en 0 salta
      goto    INICIO
      btfss    PORTA,3   ; Lee PORTA bit 3 DATA si esta en 0 pasa en 1 salta
      goto    BAJO
      goto           ALTO
;----------------------------------------------------------------------------
BAJO    bcf      CARRY
      Rlf      DATO  ;Desplaza a la Izquierda el contenido del Registro DATO
      incf      Cont,f
      goto    INICIO      
;----------------------------------------------------------------------------
ALTO   bsf      CARRY
      Rlf      DATO  ;Desplaza a la Izquierda el contenido del Registro DATO
      incf      Cont,f
      goto    INICIO      
;----------------------------------------------------------------------------      
SALIDA   movf    DATO,w
      movwf   PORTB
      return
;----------------------------------------------------------------------------      
      end
Lo que intento es tomar datos que ingresan serie (DATA,CLOCK y STROBE) originalmente a un 4094 y almacenarlos en el registro DATO del pic y al mismo tiempo ver en los led conectados al PORTB. Realice simulaciones con proteus y con picsimulator y parece funcionar pero en la practica no va. A fin de comparar tengo conectado un 4094 con 6 led y el pic con sus led a fin de compara la salida paralela del 4094 con lo que muestra el pic. La idea es prescindir del 4094 y usar solo el pic para tomar los datos.
Gracias por su tiempo!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5252
Re:CD4094 y 16F84A
« Respuesta #17 en: 19 de Abril de 2016, 21:58:13 »
Hoy ya estoy muerto de sueño, pero veo varios problemas, mañana cuando me levante lo veo y te digo lo que encontre.

Una sola cosa que voy a decir ahora, antes que intentes hacer esto. NUNCA pero NUNCA vas a lograr la velocidad del CD4096, este le toma nanosegundos ( 800ns aprox, y 100ns aprox el 74hc595) desde que esta la señal en la entrada hasta que la salida cambia, mientras que el micro le va a tomar varios microsegundos para hacer lo mismo. Eso te va a limitar en la velocidad de entrada "serial" a este simulador de cd4096 realizado con el PIC. Y tambien va a depender en que lo vas a usar y que no compita con tiempos con alguna otra cosa, si nada de esto es preocupacion seguimos para adelante.

Como dije, mañana lo veo bien y te digo que veo mal.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5252
Re:CD4094 y 16F84A
« Respuesta #18 en: 20 de Abril de 2016, 07:02:37 »
El contador ese que tenes, esta demas, lo podrias quitar por que no cumple ninguna funcion, ya que la misma arquitectura del PIC te lo limita a 8 bits.

Uno de los problemas que tenes es que tu condicion de clock no depende del flanco, sino del nivel, entonces eso te lleva a que si el clock esta en 1 tome muchas veces el valor del dato de entrada serial y en la practica vas a ver que si data es 1, y clock es 1, PORTB va a ser 0xFF.
Implementar el flanco seria muy contraproducente en terminos de tiempo. Lo mejor seria usar la interrupcion del RB0, ya que este detecta flanco y en tu programa preguntar por la bandera del mismo ( INTCONT, INTF ) el problema es que el puertoB es tu salida, y de acomodarlo asi luego complicarias un poco mas la salida de datos. Pero no creo que tanto.

Asi que por ahora el fix es por software:

Código: ASM
  1. ;******************************************************************************
  2.  
  3.         LIST P=16F84A
  4.         INCLUDE "p16f84a.inc"
  5.         __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
  6.  
  7. ;***********************  Definir Etiquetas  **********************************
  8.  
  9.         CBLOCK 0x0C
  10.         DATO
  11.         E_ANTERIOR
  12.         ENDC
  13.  
  14. ;*************************** VECTOR DE INCIO **********************************
  15.  
  16.         org     0x00   ;Establecer dirección de origen del programa
  17.         GOTO    CONFIGURACION
  18.         ORG     0x04
  19.         RETURN
  20.  
  21. ;********************** PROGRAMA PRINCIPAL **********************************
  22.  
  23. CONFIGURACION
  24.  
  25.         BANKSEL TRISB                   ; Cambio a donde esta TRISB = Banco 1
  26.         CLRF    TRISB
  27.         movlw   b'11111111'
  28.         movwf   TRISA
  29.         BANKSEL PORTA                   ; Cambio a donde esta PORTA = Banco 0
  30.  
  31.         CLRF    PORTB                   ; Limpio registros de salida
  32.         CLRF    DATO                    ; Limpio el
  33.  
  34.         MOVF    PORTA, W
  35.         MOVWF   E_ANTERIOR              ; Estado anterior del puertoA
  36. ;----------------------------------------------------------------------------      
  37. INICIO
  38.         btfsc   PORTA,2         ; Lee PORTA bit 2 STROBE si esta en 1 pasa en 0 salta
  39.         call    SALIDA
  40.         btfss   PORTA,4         ; Lee PORTA bit 4 CLOCK si esta en 1 salta
  41.         GOTO    EstadoEn0
  42.         BTFSS   E_ANTERIOR, 4   ; Si ahora es 1 y antes era 1 se sale, es decir no hay flanco positivo
  43.         goto    CARGAR          ; Pero si ahora es 1 y antes era 0, no salta = flanco positivo
  44.         GOTO    INICIO
  45. EstadoEn0
  46.         BCF     E_ANTERIOR, 4   ; Pongo en 0 por que estaba en 0 el clock.
  47.         GOTO    INICIO
  48.  
  49. ;----------------------------------------------------------------------------
  50. CARGAR
  51.         BSF     E_ANTERIOR, 4   ; Activo para saber que el clock esta ahora en 1 y poder detectar el flanco
  52.         BCF     CARRY           ; Carry a 0
  53.         BTFSC   PORTA,3         ; Lee PORTA bit 3 DATA si esta en 0 salte el poner a 1 el carry
  54.         BSF     CARRY
  55.         RLF     DATO, F         ; Desplaza a la Izquierda el contenido del Registro DATO
  56.         GOTO    INICIO
  57.  
  58. ;----------------------------------------------------------------------------      
  59. SALIDA  
  60.         movf    DATO, W
  61.         movwf   PORTB
  62.         return
  63. ;----------------------------------------------------------------------------      
  64.       end

Ahora que tenemos el programa hablemos de los tiempos.
Para que sea detectado el clock este debe tener como minimo (me refiero a los peores caso ):

Flanco positivo: 18 ciclos
Flanco negativo: 14 ciclos
Siempre 0 : 14 ciclos
Siempre 1 : 14 ciclos

Es decir tomamos 18 ciclos, es lo que tarda en leer nuevamente el clock.

Dependiendo de la frecuencia de trabajo eso va a dictarte la velocidad maxima de clock.

F_{min} = \frac{F_{osc}}{4 * Ciclos}

Con 4Mhz de oscilador : 55.5Khz clock maximo
Con 8Mhz de oscilador : 111.1Khz clock maximo
Con 10Mhz de oscilador : 138.8Khz clock maximo
Con 20Mhz de oscilador : 277.7Khz clock maximo

Mientras que con el CD4096 tendrias: 3Mhz ( y ni hablar si usamos uno de la linea 74xxx )
Cualquier frecuencia superior a eso, no se asegura el correcto funcionamiento, aunque proximo a esa frecuencia puede llegar a funcionar.
Aun asi espero que se entienda la diferencia entre uno y otro.
« Última modificación: 20 de Abril de 2016, 07:18:25 por KILLERJC »

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 3
Re:CD4094 y 16F84A
« Respuesta #19 en: 20 de Abril de 2016, 11:53:47 »
Perfecto!!!
Solo agregue la definición de CARRY. Pero el tema de la velocidad me jugo una mala pasada cambie el pic por uno a 20 Mhz y salio andando sin problemas. Seguire adelante a ver si logro el objetivo. Mil gracias por su tiempo y ganas de enseñar


 

anything