В даташите на TM1637 написано, что сразу по заднему фронту восьмого клока тмка передаёт подтверждение приёма байта, для этого она переводит линию дата в режим выхода и ставит в ноль снимается подтверждение девятым стробом клока. У деда, после восьмого строба, линия данных ставится в единицу - отсюда и КЗ.
какой смысл объяснять людЯм малокомпетентным но выплёвывающим с таким апломбом?
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);
}
А проверял?
На модуле стоит подяжка к питанию и когда ты переведешь линию дата в режим входа при высоком клоке, тмка это воспримет как стоп и на дисплей оставшиеся байты пакета не попадут.
я не настоящий сталевар, оставим деду, его библиотека он и поправит
ну да, другие делают так:
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;
}
Дак а што не так-то? У мня всё работает ![]()
навстречу, АСК на 9 такте вешает ноль на линию, а ты туды HIGH прёшь, естественно КЗ, что вперёд выгорит
Я посмотрю, канеш, но ТМ не работает по I2C или SPI у ней свой протокол
я вроде в #24 ссылку на даташит дал…
“Вроде” это пушта номеров нет? И квадратики эти напрягают ![]()
Да, поправлю, спс.
Даже Гайвер аск обрабатывает:
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);
}
