Shift Register Counter

0

Estoy trabajando en un proyecto con mi microcontrolador MBED y tengo algunos inconvenientes, porque soy nuevo en eso y me estoy confundiendo con cómo funciona exactamente todo.

Tengo mi MBED conectado a un 74HC595, que a su vez está conectado a una pantalla de 7 segmentos. Actualmente estoy intentando probar el segmento siete creando un tipo de contador que va de 0-9. Sin embargo, no estoy seguro de cómo hacer esto. A continuación se muestra mi código y cómo lo tengo conectado, tengo algunas declaraciones adicionales para el proyecto final, así que, por favor, ignórelas:

#include"mbed.h"

SPI spi(p11,p12, p13);
DigitalOut red(p25);
DigitalOut green(p26);
DigitalOut cs(p14);
DigitalIn button(p27); //enter
DigitalIn button2(p28); //down
DigitalIn button3(p29); //up

char switchWord;
char record;
int i;

int main() {
  spi.format(8,0);
  while(1) {
    switchWord=0x3F;
    if(button==1)
      switchWord=switchWord^0x06;
    if(button2==1)
      switchWord=switchWord^0x5B;

    cs=0;
    record=spi.write(switchWord);
    cs=1;
    wait(0.01);

    red=0;
    green=0;
    record=record&0x03;

    if(record==1)
      red=1;
    if(record==2)
      green=1;
    if(record==3){
      red=1;
      green=1;
    }
  }
}

Obviamente, esto no funciona como lo deseo, he intentado varias formas diferentes de hacerlo contar, y he estado jugando con el cumplido de 2, pero ha pasado un tiempo desde que aprendí sobre eso, así que estoy realmente borroso. en él y no pude hacerlo funcionar. Obviamente, contar en este conjunto de binarios será diferente, ya que el segmento 7 muestra cero cuando los 6/7 LED están configurados en 1, en lugar de en todos los ceros, así que no puedo agregar el siguiente número o obtengo una visualización sin sentido. Eventualmente quiero poder contar de 0 a 9 presionando el primer botón, y contando hacia abajo con el segundo botón, pero ni siquiera puedo averiguar cómo hacer que pase de 0 a 1, así que si puedo obtener eso Creo que puedo hacer rodar la pelota.

¡Espero que todo esté claro y agradezco cualquier ayuda que pueda obtener! Gracias!

Alli

    
pregunta Alli Reed

4 respuestas

2

A menos que me esté faltando algo de información importante sobre lo que está tratando de hacer, para que el 7-seg "cuente" tendrá que cambiar al registro los equivalentes de cada número que desee mostrar en tu secuencia (0, 1, 2 ...)

Considere este esquema de una pantalla de segmento. Aunque es probable que esto no sea exactamente como se presenta el suyo, será suficiente para una explicación.

Haciendoalgunosexperimentos,encontramosquesiconectamoselregistroalapantalladelasiguientemanera(comenzandoconlosregistrosLSb):

  • 1->a
  • 2->b
  • 3->c
  • 4->d
  • 5->e
  • 6->f
  • 7->g

Considereeleventoenelquecambiamosuncarácter5(00110101),porejemplo.Elpatróncorrectoenlapantallaparacrearelsímbolo5sería:

  • 1->a
  • 0->b
  • 1->c
  • 1->d
  • 0->e
  • 1->f
  • 1->g

Comopuedever,00110101->1101101quepodríallamarsecondicionamientodedatos,silodesea.

Elpuntoalqueestoytratandodellegaraquíesquenopuedescambiarunnúmeroouncarácter,debesmanipularlapalabraenfuncióndelosdatosqueintentasmostrar;dichotrabajoserealizademaneramássimpleconunatabladeconsulta(LUT),comosesugirióanteriormente.

Parareferencia,consulte: La Tabla ASCII

    
respondido por el sherrellbc
1

¿Espera que su pantalla 7-seg entienda ASCII o que pueda interpretar números binarios en un símbolo para mostrar? Así no es como funcionan las pantallas 7-seg.

Usted está manejando cada segmento individual de la pantalla, por lo que decide qué patrón de segmentos desea iluminar. Eliges un patrón para cada dígito que quieres mostrar.

Cuando dice que muestra un cero cuando los 6/7 LED están configurados en 1, esto es perfectamente normal & comportamiento esperado. Cuente el número de segmentos que están iluminados.  - '1' requiere 2 segmentos  - '2' requiere 5 segmentos  - '3' también requiere 5 segmentos, pero no el mismo conjunto que un '2'  - etc ...

También puede agregar un decodificador IC (algo así como un 74HC4511 que funcionaría) para hacer ese trabajo por usted. Toma una entrada BCD de 4 bits y produce la combinación correcta de salidas para controlar todos los segmentos y mostrar dígitos reconocibles.

    
respondido por el brhans
1

el TDSR1360 es una pantalla de ánodo común, por lo que para que los segmentos se iluminen deben conectarse a tierra a través de resistencias individuales mientras los ánodos de la pantalla están conectados a Vcc.

Para hacer eso, cada segmento debe estar conectado a una salida 595, a través de una resistencia, y solo se iluminará cuando esa salida 595 sea baja.

Una forma de asignar los segmentos para los dígitos "0" a "9" a las salidas del 595 es como lo ha mostrado, pero con los ánodos de la pantalla (patillas 3 y 8) conectados a Vcc en lugar de a tierra.

Luego, para hacer que la pantalla cuente, lo que debe hacer es desplazar en serie un byte que corresponde a, digamos, "0" en el 595, y luego afirmar RCK. Eso cargará el byte en las salidas paralelas del 595 e iluminará los segmentos que corresponden a "0".

A continuación, cambiará un byte que corresponde a "1", haga valer y desactive RCK, y la pantalla mostrará "1".

A continuación, cambiará el byte que corresponde a "2", active y desactive el RCK, y la pantalla mostrará ahora "2".

Continuar con los bytes correspondientes de 3 a 9 hará que parezca que el 595 está contando, cuando todo lo que está haciendo es mostrar secuencialmente las secuencias de bits enlatadas dispuestas para mostrar los dígitos.

    
respondido por el EM Fields
1

Quizás esté ciego, pero no veo la tabla de traducción en tu código que se traduce entre el número entero que contiene tu contador y el patrón de píxeles del glifo que representa ese dígito.

// ...
int counter=0;
char translation_table[] = {
    0b11110111; // 0
    0b00001100; // 1
    // ... fill in details here ...
};
while(1) {
    counter=counter+1;
    // FIXME: do something about overflow
    char LED_pattern = translation_table[counter];
    cs=0;
    record=spi.write( LED_pattern );
    cs=1;
    wait(0.5);
    // ...
}

La "tabla de traducción" mencionada en el código anterior también se denomina

respondido por el davidcary

Lea otras preguntas en las etiquetas