Помогите разобраться с 7-сегментным индикатором на TM1637

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Чт фев 11, 2016 22:14:09

Сообщение Yamazaki »

Уважаемые коты, здравствуйте.
Пытаюсь подключить к микронтроллеру (atmega16) микросхему TM1637 по программному I2C
Среда разработки - micropascal (Си не владею, щито поделать)
Используется штатная библиотека software i2c
За основу взял код из даташита:

Код: Выделить всё

void SmgDisplay(void) // Write display register   
{      
unsigned char i;   
  I2CStart();  
  I2CWrByte(0x40); //40H address is automatically incremented by 1 mode, 44H fixed address mode 
  I2Cask();  
  I2CStop();  
  I2CStart();  
  I2CWrByte(0xc0);  // Set the first address  
  I2Cask();  
  for(i=0;i<6;i++)  // Addresses from Canada, do not always write address  
{  
  I2CWrByte(0xff);  // Send data  
  I2Cask();  
}  
  I2CStop();  
  I2CStart();    
  I2CWrByte(0x8f); // Open display, maximum brightness  
  I2Cask();    
  I2CStop();   
}
В примере все команды i2c сделаны отдельными процедурами, в то время как я пользуюсь встроенной библиотекой
Изображение[/url]
как видите, в ней есть все те же команды, кроме I2Cask
вот так она сделана в примере:

Код: Выделить всё

void I2Cask (void) // 1637 Answer  
{ 
clk = 0;  
Delay_us (5); // After the falling edge of the eighth clock delay 5us, 
ACK signals the beginning of judgment  
while (dio);  
    clk = 1;  
Delay_us (2);  
    clk = 0;  
}
Без команды I2Cask на данный момент ничего не работает, индикатор молчит

Код: Выделить всё

procedure disp_write();
begin
    SREG_I_bit:=0;  //запретить прерывания
    Soft_I2C_Init();
    Soft_I2C_Start();
    Soft_I2C_Write(%01000000);
    Soft_I2C_Stop();
    
    Soft_I2C_Start();
    Soft_I2C_Write(%11000000); 
    Soft_I2C_Write(249);
    Soft_I2C_Write(164);
    Soft_I2C_Write(176);
    Soft_I2C_Write(153);
    Soft_I2C_Write(146);
    Soft_I2C_Write(130);
    Soft_I2C_Stop();
    
    Soft_I2C_Start();
    Soft_I2C_Write(%10001111); 
    Soft_I2C_Stop();

    Soft_I2C_Write(%10001111); //разрешить прерывания
 
end;
Вопрос получается такой: объясните на пальцах, что делает процедура I2Cask, чтобы я смог воспроизвести её в паскале и наконец заставить работать эту щайтан-машину на полную катушку. Буду очень рад вашим добрым советам!
Последний раз редактировалось Yamazaki Пт май 17, 2019 20:19:50, всего редактировалось 1 раз.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1443
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

А разве TM1637 с i2c работает? По моему там своё, попроще.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Чт фев 11, 2016 22:14:09

Сообщение Yamazaki »

Протокол i2C-подобный, но упрощен.

Код: Выделить всё

Microprocessor data  realize  the  communication  with  TM1637  by  means  of  two–wire  bus  interface  (Note:  The 
communication method is not equal to 12C bus protocol totally because there is no slave address).
>>Протокол не в точности соответствует I2C, поскольку у микросхемы нет slave адреса.

Добавлено after 4 hours 20 minutes 50 seconds:
Re: Помогите разобраться с 7-сегментным индикатором на TM1637

Код: Выделить всё

void I2Cask (void) // 1637 Answer  
{ 
clk = 0;  
Delay_us (5); // After the falling edge of the eighth clock delay 5us, 
ACK signals the beginning of judgment  
while (dio);  
    clk = 1;  
Delay_us (2);  
    clk = 0;  
}
Вот эта строчка что означает?

Код: Выделить всё

while (dio);  
Цикл какой-то?
OKF
Это не хвост, это антенна
Сообщения: 1443
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Дядя, вы меня пугаете!(
О чём можно говорить дальше!
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 3
Зарегистрирован: Чт фев 11, 2016 22:14:09

Сообщение Yamazaki »

[uquote="OKF",url="/forum/viewtopic.php?p=3635248#p3635248"]Дядя, вы меня пугаете!(
О чём можно говорить дальше![/uquote]
Уважаемый, я же описал ситуацию: пример на С, я пишу на паскале.
Если бы я знал язык, сам бы разобрался, не стал никого отвлекать.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

А что, в Паскале нет оператора while ? Вроде с утра был. А логика процедуры проста, как грабли.

clk := 0;
Delay_us (5);
while not(dio=0) do ;
clk = 1;
Delay_us (2);
clk := 0;

0 -> clk ; задержка 5мкс; пока dio не = 0, крутить пустой цикл; 1 -> сlk; задержка 2мкс ; 0 -> clk ;

dio меняется во внешнем окружении, скорее всего - в прерывании.
Изображение
Реклама
Z_A
Родился
Сообщения: 3
Зарегистрирован: Сб апр 09, 2016 13:02:10

Сообщение Z_A »

У этого индикатора ещё и порядок бит обратный... (по сравнению с I2C)
Поэтому он ничего не показал.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3636851#p3636851"]dio меняется во внешнем окружении, скорее всего - в прерывании.[/uquote]
Это скорей всего пин SDA...
Ответить

Вернуться в «Периферия»