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

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
CD4094 y 16F84A
« en: 30 de Marzo de 2007, 11:30:36 »
aquí hay un ejemplo usando el convertidor serial - paralelo CD4094 manejado por un 16F84A mediante una función escrita en C:

Código: C
  1.  
  2. #include <16F84A.h>
  3. #use delay(clock=4000000)
  4.  
  5. #define dato PIN_A0
  6. #define clock PIN_A1
  7. #define strobe PIN_A2
  8.  
  9. void  escribir_byte(int datob);
  10.  
  11. void main(){
  12. int t;
  13.    while(1){
  14.       for(t=0;t<=255;t++){
  15.          escribir_byte(t);
  16.          delay_ms(100);
  17.       }
  18.    }
  19. }
  20.  
  21.  
  22. void  escribir_byte(int datob){
  23. int contador;
  24.    output_low(clock);
  25.    delay_cycles(1);
  26.    output_low(strobe);
  27.    for(contador=0;contador<8;contador++){
  28.       output_bit(dato,(datob & 0x1));
  29.       datob>>=1;
  30.       output_high(clock);
  31.       delay_cycles(1);
  32.       output_low(clock);
  33.    }
  34.    output_high(strobe);
  35.    delay_cycles(1);
  36.    output_low(strobe);
  37. }
  38.  
  39.  

simulación en proteus:




debo decir que me guié por la explicación de este documento cuyo autor es Hugo Erhard

el adjunto con la simulación
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado mincho

  • PIC12
  • **
  • Mensajes: 81
Re: CD4094 y 16F84A
« Respuesta #1 en: 12 de Julio de 2007, 21:10:03 »
Gracias Palitroquez, Entonces este seria el complemento del 4017, que sirve para aumentar las entradas...

Un Saludo...

:-/ Saludos  :-/ Desde  :-/ Colombia  :-/

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: CD4094 y 16F84A
« Respuesta #2 en: 13 de Julio de 2007, 13:19:10 »
hola mincho, no estoy seguro que sean similares porque con el 4017 tendrias las salidas activadas secuencialmente, mientras con el 4094 esperarias tener completados los 8 estados para habilitar los pines de salida.



La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado okapi

  • PIC10
  • *
  • Mensajes: 10
Re: CD4094 y 16F84A
« Respuesta #3 en: 31 de Agosto de 2007, 14:44:15 »
Saludos muchachos,

¿Alguien sabe cómo sería el programa en PicBasic? o ¿Cómo pasarlo de C a PicBasic?
Por favor, cualquier ayudita es bienvenida.
okapi

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: CD4094 y 16F84A
« Respuesta #4 en: 01 de Septiembre de 2007, 14:02:57 »
hola okapi.

Lamento decirte que no conozco el basic para micros  :(, ¿has pasado por el subforo de basic? de repente encuentres algo.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado okapi

  • PIC10
  • *
  • Mensajes: 10
Re: CD4094 y 16F84A
« Respuesta #5 en: 01 de Septiembre de 2007, 20:42:56 »
¡Saludos PalitroqueZ!
Gracias por responder, me parece buena idea, voy a plantear este tema en el foro de PicBasic.
Una cosa más, ¿podrías indicarme cómo adjunto una imagen al plantear el nuevo tema?
Hasta pronto,
okapi

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: CD4094 y 16F84A
« Respuesta #6 en: 03 de Septiembre de 2007, 12:27:04 »
el servidor mas común es http://imageshack.us/

clicas en el botón examinar, seleccionas la imagen y clicas en Host it!

otra forma rápida es con un programita que te ahorra un paso, se llama imageshackert




« Última modificación: 31 de Octubre de 2007, 18:29:28 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 206
Re: CD4094 y 16F84A
« Respuesta #7 en: 06 de Septiembre de 2007, 21:50:14 »
Muy interesante, sobre todo para ampliar las salidas de pics pequeños como el 12F675, aqui en la imagen puede verse como se implementa un voltímetro digital con dicho pic y displays de 7 segmentos...el punto decimal lo implemente con leds..adapte un poco el código de PalitroqueZ :D :D,solo tengo una duda.. ¿proteus tiene display de 1x7seg con punto decimal?  :shock: lo he buscado y no lo encuentro..







Código: C
  1. #include <12F675.h>       //Dispositivo a programar
  2. #device adc=10              // numero de bits de conversion A/D 1023 conteos
  3. #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOCPD,NOMCLR,BROWNOUT
  4. #use delay(clock=4000000)//Reloj a 4Mhz
  5. #ROM 0x3ff = {0x3478} //valor registro osccal
  6. #define GP0 PIN_A0       // Pin del canal cero del ADC
  7. #define GP1 PIN_A1       // Pin del canal uno del ADC
  8. #define GP2 PIN_A2       // pin DATA
  9. #define GP3 PIN_A3       // Pin reset pic MCLR (solo entrada)mclr externo desactivado
  10. #define GP4 PIN_A4       // Pin de reloj CLK
  11. #define GP5 PIN_A5       // Pin de strobe
  12. #define dato PIN_A2      //pin de datos Data
  13. #define clock PIN_A4     //pin de reloj o Clk
  14. #define strobe PIN_A5   //pin de strobe transfiere los datos a la salida del 4094    
  15. #ZERO_RAM //pongo memoria Ram a ceros
  16. /***************************Declaración Global de variables*******************/
  17. int8  bcd_dato[5];     // arreglo de 5 elementos para almacenar los digitos bcd
  18. int32 j;                    //Aqui se guarda conversión de las variables a,b,c int8 en Int32
  19. int16 t;                    //variable ADC, de 1023 conteos
  20. int8 a,b,c,d;            //Variables donde se almacenan los dig del display de 7seg  
  21. float const res=5000.0/1023.0; //resolución como const 5v/1023 16bits 5v=5000.0 por fuct BCD
  22. /******************************************************************************
  23.    Array para formar los digitos de 0 a 9 en  Formato  7 segmentos
  24.    para ser mostrados en los display de cátodo común
  25. ******************************************************************************/
  26. byte const DISPLAY[16] =  {0b11111100, //contiene los digitos
  27.                            0b01100000, //0,1,2,3,4,5,6,7,8,9
  28.                            0b11011010, // en formato para ser
  29.                            0b11110010, // mostrados en display de 7segmentos
  30.                            0b01100110,
  31.                            0b10110110,
  32.                            0b10111110,
  33.                            0b11100000,
  34.                            0b11111110,
  35.                            0b11110110,};
  36. /**************************************************************************                          
  37.  
  38.           FUNCION QUE CONVIERTE A 5 DIGITOS DE BINARIO long int A BCD
  39.          
  40. ****************************************************************************/
  41. void bin16_bcd5(int16 n)// el numero a convertir es un entero largo
  42. {
  43. int i;               // indice del arreglo unidades=bcd_dato [0],d=[1],...m=[5]
  44. for(i=0;i<5;i++)// llena el arreglo con los valores uni,dec,cen,mil,diezm
  45.    {
  46.     bcd_dato[i]=n%10;// mediante la operacion modulo se obtiene el, i digito decimal
  47.     n=n/10;      // n dividido 10 para cada i y tomamos su valor entero:
  48.    }                 // por ejemplo  para i=0,  4358 mod 10 =8, luego 4358/10 =435
  49. }                    // para i=2, 435 mod 10=5,435/10=43 luego 43 mod 10=3
  50. /********************************************************************************
  51.  
  52.   Esta función Muestra el valor de j en el registro de desplazamiento 4094
  53.    
  54. *********************************************************************************/
  55.    
  56. void  escribir_byte(int32 datob){//funcion que carga el registro CD4094 con dato j
  57. int contador;               // variable contador como entero cuenta los bits a sacar por el pin
  58.    output_low(clock);    // EL pin clk se pone en bajo antes de enviar bits
  59.   // delay_cycles(1);    // espera 1 ciclo de instrucción?????
  60.    output_low(strobe);  // strobe en bajo
  61.    for(contador=0;contador<32;contador++){ //el dato a sacar serialmente es de 16 bits
  62.       output_bit(dato,(datob & 0x01)); // operación and para sacar bit a bit
  63.       datob>>=1;          //desplazo un bit a la derecha a datob y lo almaceno en dato
  64.       output_high(clock);// saca un pulso de reloj
  65.       delay_cycles(1);    // de un periodo en alto de 1 ciclo de instrucción
  66.       output_low(clock);
  67.    }
  68.    output_high(strobe); // transfiere los datos a las salidas del registro 4094
  69.    delay_cycles(1);      // al terminar de  enviar el dato, enviando
  70.    output_low(strobe);  // un pulso de strobe
  71. }
  72. /********************************************************************************/
  73. void  escribir_byte(int32 datob); //llamo a la funcion antes de entrar en el main
  74.  
  75. /********************************************************************************
  76.                                  Programa Principal
  77. *********************************************************************************/
  78. void main(){
  79. SET_TRIS_A(0b001011);   // Configuro  GP0-GP1 Como Entradas análogas el resto salidas
  80. SETUP_COMPARATOR(NC_NC_NC_NC);//Desactivo comparadores
  81. SETUP_ADC(ADC_CLOCK_INTERNAL);//Reloj para el ADC interno
  82. SETUP_ADC_PORTS(AN0_ANALOG|VSS_VDD);//AN0 entrada análoga, con rango de 0 a Vdd
  83. /**********************************************************************************
  84.  Bucle infinito Lee constantemente el Canales 0 y 1 AN0 AN1 del pic (ADC)
  85. ***********************************************************************************/
  86.    while(true){
  87.           if (input(pin_A3)) //muestra dos lecturas sen el mismo display
  88.           set_adc_channel(0);//Selecciono el canal cero del ADC
  89.           else               //si no
  90.           set_adc_channel(1);//Selecciono el canal uno del ADC
  91.           delay_us(10);      //Espera 10us
  92.           t = read_adc()*res;//lee el ADC y guarda el valor leido en t                  
  93.           bin16_bcd5(t);    //Conversión de la cifra t int16 a BCD
  94.                             //para posicionar el punto decimal
  95.              a=display[bcd_dato[3]]|0x01;
  96.              b=display[bcd_dato[2]];//muestra los datos decodificados  
  97.              c=display[bcd_dato[1]];//en los display de 7segmentos
  98.              d=display[bcd_dato[0]];//en unidades decenas y centenas      
  99.           j= make32(a,b,c,d);//conversion de los 3 bytes int8 de las variablesa,b,c
  100.           escribir_byte(j);//a int32,saco los tres bytes juntos hacia el reg de dezplazamiento
  101.           delay_ms(100);  //Muestreo de la señal cada 100ms
  102.        
  103.    }
  104. }
  105. /*******************fin programa ppal ********************************************/
  106.  
  107.  

Aqui esta la simulación:

ARCHIVO PROTEUS

Saludos
« Última modificación: 06 de Septiembre de 2007, 23:56:25 por pachopic »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: CD4094 y 16F84A
« Respuesta #8 en: 07 de Septiembre de 2007, 16:17:52 »
hola pachopic.

fueras usado el que trae 4 displays unidos, esos si tienen el punto.


PD: el código no es mio, lo que hice fué mudarlo al c
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Resistencio

  • PIC12
  • **
  • Mensajes: 82
Re: CD4094 y 16F84A
« Respuesta #9 en: 11 de Abril de 2008, 16:27:06 »
No me sale una simulacion...como "catso" se hace ??? Es increible como se virtualizo la electronica !!! entre lineas veo que son solo programadores, Yo tengo "cayos" y quemaduras varias haciendo electronica "fierro" y no me sale nada con esto de la simulacion...

Los circuitos que pones arriba, estan hechos con un REGISTRO de DESPLAZAMIENTO FIFO, y el 4017 es un contador de decadas, nada que ver una cosa con la otra...

SALUDOS !!! tratare de seguir viendo como anda este "PUTEOS" del "ORTIS"...

Consegui una version portable del 7.1 con SP4...pense que el problema era ese, pero haciendo correr la simulacion del ejemplo anda bien...cuando quiero hacer lo propio con un .HEX para prender un led (que me lo hizo mi sobrinito mientras miraba los dibujitos en la tele...) NO ME ANDA...XD !!! como cuesta adaptarse a estos tiempos !!!

Desconectado IAO

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 701
Re: CD4094 y 16F84A
« Respuesta #10 en: 11 de Abril de 2008, 21:34:05 »
Holaaaaa:

Sr. Resistencio:
Te comento que tuve un problema similar en un atlon 3000, corrìa en cualquier màquina con Intel.
Vendì mi atlon me cambiè a un 2 core duo y sorpresa mi problema continuò.
Por ùltimo y para resumirte me dì cuenta que tenìa instalado el winxp en una tabla de particiòn tipo VFAT32 por conveniencia con linux Suse.
La converti a NTFS y nada. Formateo el disco a NTFS desde el iprincipio y solucionè el problema.
Me arrepentì de vender el atlon 3000, pero eso ya es pasado.

Espero te sirva este comentario.
Bye('_').
"No hay caminos para lograr la PAZ. La PAZ es el camino"... (Mahatma Gandhi).
Mentes Superiores discuten Ideas, Proyectos. Mentes Promedio discuten Acontecimientos y Sucesos. Mentes Pobres discuten sobre Personas.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5454
    • Electrónica Didacta
Re: CD4094 y 16F84A
« Respuesta #11 en: 12 de Abril de 2008, 12:34:11 »
...Los circuitos que pones arriba, estan hechos con un REGISTRO de DESPLAZAMIENTO FIFO, y el 4017 es un contador de decadas, nada que ver una cosa con la otra...

...

exacto, creo que el 4017 también se le conoce como contador "jhonson"

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: CD4094 y 16F84A
« Respuesta #12 en: 13 de Abril de 2008, 08:32:50 »
Creo que el 4017 solo actua como simple contador de décadas (del 0 al 9).

Un contador Jhonson se puede conseguir a partir de un registro de desplazamiento con biestables J-K uniendo la salida negada del último biestable con la entrada J del primer biestable y la salida Q del último con la entrada K del primero.

Yo para ampliar Entradas uso el 74LS195 y para ampliar Salidas el 74LS194.

El equivalente en CMOS para las Salidas es el 4094, sería cuestión de buscar el equivalente CMOS para las Entradas (ha de ser un registro de desplazamiento, no el contador 4017).

Un saludo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: CD4094 y 16F84A
« Respuesta #13 en: 13 de Abril de 2008, 08:37:06 »
Aquí un ejemplo de uso de ampliación de Entradas con 74LS165:    http://www.todopic.com.ar/foros/index.php?topic=885.0

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 11
Re:CD4094 y 16F84A
« Respuesta #14 en: 19 de Abril de 2016, 18:59:02 »
 :5] Tengo un dilema. !!! Quiero reemplazar un cd4094 por un 16f84. Tengo un equipo que entraga las señales DATA, CLOCK y STROBE a un registro de desplazamiento. Lo que necesito es reemplazarlo por un Pic para agregar otras funcionalidades.
Estoy trabajando en assembler pero estoy mareado con el codigo y no puedo emular el 4094.
En el pic ingreso por RA2 STROBE, por RA3 DATA y por RA4 CLOCK. En tanto las salidas van led a de RB0 al RB5.
Me pregunto si alguien puede ayudarme y si es correcto que pegue el codigo ASM en el mensaje.
GRACIAS
« Última modificación: 19 de Abril de 2016, 19:03:58 por lu8djr »