Digispark+TM1637

В даташите на TM1637 написано, что сразу по заднему фронту восьмого клока тмка передаёт подтверждение приёма байта, для этого она переводит линию дата в режим выхода и ставит в ноль снимается подтверждение девятым стробом клока. У деда, после восьмого строба, линия данных ставится в единицу - отсюда и КЗ.

1 лайк

Посмотрел даташит, похоже на то.

Извиняюсь за наезд не по делу.

2 лайка

какой смысл объяснять людЯм малокомпетентным но выплёвывающим с таким апломбом?

PS надо отправлять…читать даташит

Вообще не ожидала такой дискуссии по моему вопросу) Большое спасибо всем за участие!

к вам барышня сия дискуссия не имеет никакого отношения, тут пацанские разборки, а вот если бы вы последовали совету, нарисовали самостоятельно свои символы, глядишь и интерес к ардуино проявился бы…

примазался, к тебе оно какое отношение имеет?
без тебя нашли, без тебя и поправят.

я гегемон )))

раз Деду безразлично, может так?

void TM1637::WriteByte(int8_t wr_data) const {


	for (uint8_t i = 0; i < 8; i++, wr_data >>= 1)
	{
		digitalWrite(FClockPin, LOW);
		digitalWrite(FDataPin, wr_data & 0x01);// млатшым битом вперёд
		delayMicroseconds(8);

		digitalWrite(FClockPin, HIGH);
		delayMicroseconds(8);
	}
	pinMode(FDataPin,INPUT);
	digitalWrite(FClockPin, LOW);
	delayMicroseconds(100);
	pinMode(FDataPin,OUTPUT);
	digitalWrite(FDataPin, HIGH);
	delayMicroseconds(8);
	digitalWrite(FClockPin, HIGH);
	delayMicroseconds(8);
}

А проверял?

На модуле стоит подяжка к питанию и когда ты переведешь линию дата в режим входа при высоком клоке, тмка это воспримет как стоп и на дисплей оставшиеся байты пакета не попадут.

1 лайк

я не настоящий сталевар, оставим деду, его библиотека он и поправит

ну да, другие делают так:

  void TM1637::WriteByte(int8_t wr_data) const {


	for (uint8_t i = 0; i < 8; i++, wr_data >>= 1)
	{
		digitalWrite(FClockPin, LOW);
		digitalWrite(FDataPin, wr_data & 0x01);// млатшым битом вперёд
		delayMicroseconds(8);
		digitalWrite(FClockPin, HIGH);
		delayMicroseconds(8);
	}
	
  digitalWrite(Clkpin,LOW); //wait for the ACK
  digitalWrite(Datapin,HIGH);
  digitalWrite(Clkpin,HIGH);
  pinMode(Datapin,INPUT);
  delayMicroseconds(8);
  uint8_t ack = digitalRead(Datapin);
  if (ack == 0) 
  {
  pinMode(Datapin,OUTPUT);
  digitalWrite(Datapin,LOW);
  }
  delayMicroseconds(8);
  pinMode(Datapin,OUTPUT);
  delayMicroseconds(8);
  //return ack;
}

Тоже не правильно - КЗ осталось.

Я сейчас с телефона, очень не удобно код набирать, вечером доберусь до компа выложу свою WriteByte.

очень интересно реализовано в рекомендуемой arduino.cc библиотеке:

bool TM1637Display::writeByte(uint8_t b)
{
  uint8_t data = b;

  // 8 Data Bits
  for(uint8_t i = 0; i < 8; i++) {
    // CLK low
    pinMode(m_pinClk, OUTPUT);
    bitDelay();

	// Set data bit
    if (data & 0x01)
      pinMode(m_pinDIO, INPUT);
    else
      pinMode(m_pinDIO, OUTPUT);

    bitDelay();

	// CLK high
    pinMode(m_pinClk, INPUT);
    bitDelay();
    data = data >> 1;
  }

  // Wait for acknowledge
  // CLK to zero
  pinMode(m_pinClk, OUTPUT);
  pinMode(m_pinDIO, INPUT);
  bitDelay();

  // CLK to high
  pinMode(m_pinClk, INPUT);
  bitDelay();
  uint8_t ack = digitalRead(m_pinDIO);
  if (ack == 0)
    pinMode(m_pinDIO, OUTPUT);


  bitDelay();
  pinMode(m_pinClk, OUTPUT);
  bitDelay();

  return ack;
}

Дак а што не так-то? У мня всё работает :slight_smile:

навстречу, АСК на 9 такте вешает ноль на линию, а ты туды HIGH прёшь, естественно КЗ, что вперёд выгорит

Я посмотрю, канеш, но ТМ не работает по I2C или SPI у ней свой протокол

я вроде в #24 ссылку на даташит дал…

“Вроде” это пушта номеров нет? И квадратики эти напрягают :roll_eyes:

Да, поправлю, спс.

2 лайка

Даже Гайвер аск обрабатывает:

int GyverTM1637::writeByte(int8_t wr_data)
{
    uint8_t i, count1;
    for (i = 0; i < 8; i++) //sent 8bit data
    {
        digitalWrite(Clkpin, LOW);
        if (wr_data & 0x01)digitalWrite(Datapin, HIGH); //LSB first
        else digitalWrite(Datapin, LOW);
        wr_data >>= 1;
        digitalWrite(Clkpin, HIGH);

    }
    digitalWrite(Clkpin, LOW); //wait for the ACK
    digitalWrite(Datapin, HIGH);
    digitalWrite(Clkpin, HIGH);
    pinMode(Datapin, INPUT);

    delayMicroseconds(50);
    uint8_t ack = digitalRead(Datapin);
    if (ack == 0)
    {
        pinMode(Datapin, OUTPUT);
        digitalWrite(Datapin, LOW);
    }
    delayMicroseconds(50);
    pinMode(Datapin, OUTPUT);
    delayMicroseconds(50);

    return ack;
}

@nibelung в #33 написал, что это тоже неверно

Набрать код на телефоне тот еще квест. Деда я себе функцию WriteByte вот так переписывал, чтоб КЗ убрать.

int8_t TM1637::WriteByte(int8_t wr_data) const
{
  uint8_t x;

  // передать 8 бит млатшым битом вперёд
  for (uint8_t ii = 8; 0 != ii; --ii)
  {
    x = (wr_data & 1) ? HIGH : LOW;
    wr_data >>= 1;
    digitalWrite(FClockPin, LOW);
    digitalWrite(FDataPin, x);
    digitalWrite(FClockPin, HIGH);
  }

  // если линия данных установлена в единицу
  // можно переключать ее в режим входа
  if (x) pinMode(FDataPin, INPUT_PULLUP);
  
  // задний фронт строба тактирования
  digitalWrite(FClockPin, LOW);

  // переключить линию данных в режим входа
  // для случая когда она была в нуле
  pinMode(FDataPin, INPUT_PULLUP);

  // 9й строб - проверка ACK
  digitalWrite(FClockPin, HIGH);

  // проверить наличие ACK
  x = digitalRead(FDataPin);
  digitalWrite(FDataPin, x);
  pinMode(FDataPin, OUTPUT);

  // завершаем передачу байта
  digitalWrite(FClockPin, LOW);

  // 1 - if ACK;
  // 0 - not ACK;
  return !(x);
}