No se puede mantener el registro de segundo turno en la cadena de 3 de “fugas”

1

Estoy trabajando en un reloj de palabras y estoy usando 3 regsiters de cambio (CD4094BE) y 3 matrices de transistores Darlington (ULN2003A) para controlar si hay 21 palabras diferentes activadas o desactivadas. Las palabras constan de LED, cada LED tiene una resistencia de 220 ohmios en línea con su cable positivo, y los LED en una palabra comparten una base común. Hago esto para que las palabras con diferentes cantidades de LED no tengan diferentes niveles de brillo. Ejecuto el terreno común para cada palabra en una matriz de transistores, y luego uso los registros de desplazamiento para habilitar un camino hacia el suelo.

Tengo un problema con el registro de segundo turno en mi cadena de registros de turnos. Si cambio un byte que consta de todos los 0, B00000000, entonces todas las palabras permanecen completamente desactivadas. Con la excepción del valor B00000001 y B00000000, cualquier byte que muevo en él parece iluminar la palabra deseada, e ilumina débilmente el resto de las palabras conectadas a la matriz de transistores respectiva / registro de desplazamiento.

He usado un voltímetro para medir el voltaje entre un pin de salida que se supone que está apagado en el registro de desplazamiento de problemas y en los otros dos que parecen estar funcionando bien. En el registro de cambio de problemas, obtengo en promedio una lectura de 0.5 voltios para un pin de apagado, mientras que los otros dos leen aproximadamente 0.01 voltios.

He intentado cambiar la matriz de transistores y el registro de cambios en caso de que los componentes estuvieran dañados, pero no he tenido suerte. Incluso los cambié por los de trabajo y los puse de nuevo en su posición original. Los componentes no parecen estar dañados.

Las siguientes son las hojas de datos a las que me he referido:

enlace

enlace

Estoy usando un Arduino Uno y una fuente de alimentación de 5 voltios para alimentar / ejecutar el proyecto.

Aquí hay algunas imágenes reales del proyecto, y un circuito aproximado que inventé para demostrar lo que podría no estar claro en las imágenes.

Aquíestáelcódigoqueestoyusando.PuedeverqueestoyusandolasvariablesDisplay1-3paradefinirlosestadosdelosregistrosdedesplazamiento.Actualmentelosestoyconfigurandomanualmente,enlugardedejarquelalógicaquetengoestablezcalosvalores.Noincluyelosarchivosparaalgunasdelasfuncionesquenosonrelevantesparaloqueestásucediendo(obtencióndeinformacióndelmóduloRTCqueestoyusando).Noestoysegurodequémáspuedoofrecer.¡Sóloházmelosaber!¡Ygracias!

/*WORDCLOCKINSPIREDBYhttp://imgur.com/a/iMXmj*/#include<Wire.h>#include<Adafruit_NeoPixel.h>/*DEFINITIONS*/#definebday_strip_size14#definebday_strip_pin12//thefollowingarethepindefinitonsforthegroundoftherespectivewords#defineHALFDisplay1=Display1|(1<<0)#defineH_TIUDisplay1=Display1|(1<<1)#defineTUTTUGUDisplay1=Display1|(1<<2)#defineOGDisplay1=Display1|(1<<3)#defineH_FIMMDisplay1=Display1|(1<<5)#defineFIMMTANDisplay1=Display1|(1<<4)#defineMINUTURDisplay1=Display1|(1<<6)#defineINDisplay2=Display2|(1<<0)#defineYFIRDisplay2=Display2|(1<<1)#defineTHRJUDisplay2=Display2|(1<<2)#defineELLEFUDisplay2=Display2|(1<<3)#defineATTADisplay2=Display2|(1<<4)#defineEITTDisplay2=Display2|(1<<5)#defineNIUDisplay2=Display2|(1<<6)#defineSJODisplay3=Display3|(1<<0)#defineSEXDisplay3=Display3|(1<<1)#defineTOLFDisplay3=Display3|(1<<2)#defineTVODisplay3=Display3|(1<<3)#defineL_TIUDisplay3=Display3|(1<<4)#defineL_FIMMDisplay3=Display3|(1<<5)#defineFJOGURDisplay3=Display3|(1<<6)//regsiterpins#defineCD4094_CLOCK8#defineCD4094_DATA9#defineCD4094_STROBE10#defineCD4094_OUTPUT11/*VARIABLEDECLERATIONS*///thesearethetimevariables,thertcfunctionsareinaseperatefile.donethiswaytobeabletoeasilypluginanothersourceoftimeintseconds;intminutes;inthours;intday;intdate;//0-31intmonth;intyear;//0-99intcentury;//byteDisplay1=B00011000;byteDisplay2=B01000000;byteDisplay3=B00000001;Adafruit_NeoPixelbday_strip=Adafruit_NeoPixel(bday_strip_size,bday_strip_pin,NEO_GRB+NEO_KHZ800);voidsetup(){pinMode(CD4094_CLOCK,OUTPUT);pinMode(CD4094_STROBE,OUTPUT);pinMode(CD4094_DATA,OUTPUT);pinMode(CD4094_OUTPUT,OUTPUT);digitalWrite(CD4094_OUTPUT,HIGH);bday_strip.begin();bday_strip.setBrightness(100);//set_rtc_date(7,13,9,14);//set_rtc_time(0,36,15);Serial.begin(9600);while(!Serial);Serial.println("application start");

  Wire.begin();// start IC2 interface for communicating with Chronodot RTC module
  clear_ESOC_bit();
}

void loop() {
  get_date();
  get_time();

  print_rtc_datetime();

  //clear_leds();
  //MINUTUR;
  //IN;
  //YFIR;
  //THRJU;
  //NIU;
  //FJOGUR;
  //set_time_pins();
  write_leds();
  //rainbowCycle(20);

  Serial.println(Display1, BIN);
  Serial.println(Display2, BIN);
  Serial.println(Display3, BIN);
  delay(1000);

}

void set_time_pins() {
  if(minutes > 4 && minutes < 10) {
    H_FIMM;
    MINUTUR;
  }

  if(minutes > 9 && minutes < 15) {
    H_TIU;
    MINUTUR;
  }

  if(minutes > 14 && minutes < 20) {
    FIMMTAN;
    MINUTUR;
  }

  if(minutes > 19 && minutes < 25) {
    TUTTUGU;
    MINUTUR;
  }

  if(minutes > 24 && minutes < 30) {
    TUTTUGU;
    OG;
    H_FIMM;
    MINUTUR;
  }

  if(minutes > 29 && minutes < 35) {
    HALF;
  }

  if(minutes > 34 && minutes < 40) {
    TUTTUGU;
    OG;
    H_FIMM;
    MINUTUR;
  }

  if(minutes > 39 && minutes < 45) {
    TUTTUGU;
    MINUTUR;
  }

  if(minutes > 44 && minutes < 50) {
    FIMMTAN;
    MINUTUR;
  }

  if(minutes > 49 && minutes < 55) {
    H_TIU;
    MINUTUR;
  }

  if(minutes > 54) {
    H_FIMM;
    MINUTUR;
  }

  int working_hour = hours;
  if (minutes > 29) {
    working_hour = hour_cap(working_hour, 1);
  }

  switch(working_hour) {
    case 1:
      EITT;
      break;
    case 2:
      TVO;
      break;
    case 3:
      THRJU;
      break;
    case 4:
      FJOGUR;
      break;
    case 5:
      L_FIMM;
      break;
    case 6:
      SEX;
      break;
    case 7:
      SJO;
      break;
    case 8:
      ATTA;
      break;
    case 9:
      NIU;
      break;
    case 10:
      L_TIU;
      break;
    case 11:
      ELLEFU;
      break;
    case 12:
      TOLF;
      break;
  }

  if ((minutes < 5) || (minutes > 29 && minutes < 35)) {
    //
  } else {
    if(minutes > 30) {
     YFIR;
    } else {
      IN;
    }
  }
}

void clear_leds() {
  Display1 = 0;
  Display2 = 0;
  Display3 = 0;
}

void write_leds() {

  //digitalWrite(CD4094_OUTPUT, LOW);
  digitalWrite(CD4094_STROBE, HIGH);
  shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
  shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
  shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
  //digitalWrite(CD4094_OUTPUT, HIGH);
  digitalWrite(CD4094_STROBE, LOW);
}

int hour_cap(int working_hour, int incriment) {
  working_hour += incriment;

  if(working_hour > 12) {
    working_hour = 1;
  }
  if(working_hour < 1) {
    working_hour = 12;
  }

  return working_hour;
}

void get_date() {
  get_rtc_date();
}

void get_time() {
  get_rtc_time();
}
    
pregunta

1 respuesta

1

conexiones a tierra

Verifique las conexiones a tierra en los registros de turnos, eso es lo primero que verificaría. Si yo fuera usted, agregaría otro cable de tierra dedicado entre el pin de tierra de cada registro de desplazamiento y el pin de tierra de su 7805 (o cualquier regulador de voltaje que esté usando) - probablemente exagerado, pero cómo ¿De lo contrario, va a descartar una "mala conexión a tierra"? Los síntomas de "LED débil" que usted describe son consistentes con una conexión a tierra para que un registro de desplazamiento se desconecte por completo.

Muchos chips CMOS, como los registros de cambios, a menudo parecen funcionar parcialmente después de que desconectamos accidentalmente el pin GND o el pin VCC o ambos. lo que nos lleva a horas de frustración cuando asumimos que, debido a que parece estar funcionando, seguramente las clavijas de alimentación están conectadas correctamente, y buscamos infructuosamente el problema en otra parte. Adivina cómo sé esto?

Alimentar un chip a través de los pines de entrada, en lugar de los pines VCC y GND, ha sido llamado "truco sucio" y "abuse" .

p.s .: Creo que los relojes de palabras son geniales. Te deseo un gran éxito.

    
respondido por el davidcary

Lea otras preguntas en las etiquetas