Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

10/11/2014 #1


¿Cómo visualizar un display 7 segmentos con un CD4094?
Hola:
Estoy tratando de visualizar en un display 7 segmentos de cuatro dígitos y ánodo común, los números del 0 a 9 a través de un registro de desplazamiento CD4094 con un PIC16F676 usando mikroC.
He visto y probado todo lo que he encontrado y no me funciona, el compilador no me da error, pero sin embargo la simulación no funciona

Esto es parte del código que he estado usando:
Código:
  #define dato RA0_bit      //pin de datos Data
#define clock RA1_bit     //pin de reloj o Clk
#define strobe RA2_bit   //pin de strobe transfiere los datos a la salida del 4094

        /***************************Declaración Global de variables*******************/
  //char bit_test;
  int t;
int const SEGMENTO[16] =  {0b00000011, //contiene los digitos
                          0b10011111, //0,1,2,3,4,5,6,7,8,9
                          0b00100101, // en formato para ser
                          0b00001101, // mostrados en display de 7segmentos
                          0b10011001,
                          0b01001001,
                          0b01000001,
                          0b00011111,
                          0b00000001,
                          0b00011001,
                          0b00010001,
                          0b11000001,
                          0b01100001,
                          0b10000101,
                          0b01100001,
                          0b01110001};
 void escribir_4094( int caracter){//funcion que carga el registro CD4094 con dato j
 int contador_8;               // variable contador como entero cuenta los bits a sacar por el pin
dato=0;
clock=0;
strobe=0;
   if(contador_8=0,contador_8<8,contador_8++){ //el dato a sacar serialmente es de 16 bits
 dato= caracter & 0x01; // operación and para sacar bit a bit
     dato=caracter >>1;
     dato=dato;
      clock=1;// saca un pulso de reloj
      delay_ms(10);    // de un periodo en alto de 1 ciclo de instrucción
      clock=0;
   }
  strobe=1; // transfiere los datos a las salidas del registro 4094
   delay_ms(10);      // al terminar de  enviar el dato, enviando
   strobe=0;  // un pulso de strobe
        }
  //void bit_test();
void escribir_4094(int caracter);// el numero a convertir es un entero largo
void main(){
porta=0;
portc=0;
trisa=0;
trisc=0;
while (1){               // indice del arreglo unidades=bcd_dato [0],d=[1],...m=[5]
(t=0,t<16,t++)// llena el arreglo con los valores uni,dec,cen,mil,diezm
   {
   escribir_4094(t);
   delay_ms(100); // n dividido 10 para cada i y tomamos su valor entero:
           }
        }
    }
Esto lo saqué del libro uControl que tiene esta misma estructura pero en CCS.
Si alguien tiene una respuesta se lo estaría agradeciendo.
10/11/2014 #2

Avatar de Nuyel

en if(contador_8=0,contador_8&lt;8,contador_8++){ aparte de que no se que signo es ese &lt; quizás quisiste decir for en lugar de if, los demás me cuesta entender por los caracteres que desaparecieron, también delante del while esperaba un for antes del paréntesis.

Otra recomendación, aquí no importa por que 8 es representable como 1000 en binario, pero es recomendable comparar a 0 que comprar a X para que se aproveche la instrucción "saltar si cero", solo ahorras un par de ciclos pero es una practica más adecuada para que la consideres.
11/11/2014 #3


Gracias por responder, si tienes razon, ambas sentencias son FOR.
for(contador_8=0;contador_8<8;contador_8++) y for(t=0;t<16;t++). La cuestion es que no hay simulacion, como dije anteriormente el compilador no da ningun error, la simulacion es la que no funciona. Ya no se que hacer.

---------- Actualizado después de 3 minutos ----------

Gracias por responder, si tienes razon, ambas sentencias son FOR.
for(contador_8=0;contador_8<8;contador_8++) y for(t=0;t<16;t++). La cuestion es que no hay simulacion, como dije anteriormente el compilador no da ningun error, la simulacion es la que no funciona. Ya no se que hacer.
11/11/2014 #4

Avatar de Nuyel

ok, voy a decir, que no se cual es tu circuito, tampoco veo inicialización de los relojes, no se si es predeterminado algún interno, oscilador RC, cristal o externo así que no sabría decirte si ahí radica el problema.
12/11/2014 #5


Sinceramente, lo de los relojes no lo he tenido en cuenta porque creí que fuera necesario.
El circuito es sencilla es el PIC16F676+CD4094+display 7seg ánodo común (adjunto te mando el esquema) Si la cuestión es el reloj entonces te diría que estaba en la tontería, voy a ver si este es el problema en cuestión. Yo he podido comunicarme y visualizar con este mismo esquema pero realizando un código para cada número de la siguiente forma, que me ocupa demasiado espacio en la memoria.
Código:
Num_2(){
// Bit 7
porta=0b000001;
porta=0b000011;
porta=0;
// Bit 6
porta=0b000000;
porta=0b000010;
porta=0;
// Bit 5
porta=0b000001;
porta=0b000011;
porta=0;
// Bit 4
porta=0b000000;
porta=0b000010;
porta=0;
// Bit 3
porta=0b000000;
porta=0b000010;
porta=0;
// Bit 2
porta=0b000001;
porta=0b000011;
porta=0;
// Bit 1
porta=0b000000;
porta=0b000010;
porta=0;
// Bit 0
porta=0b000000;
porta=0b000010;
porta=0;
// strobe
porta=0x04;
}
Y así para cada número, lo que no he podido lograr es el desplazamiento bit a bit.
Bueno no sé si entiende lo que quiero hacer.
Imágenes Adjuntas
Tipo de Archivo: jpg PIC16F676+CD4094+D7segCA.jpg (41,1 KB (Kilobytes), 27 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.