Страница 4 из 8

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Сб фев 04, 2023 09:30:38
Starichok51
собственный код удобнее даже тем, что сигналы можно назначить на любые ноги, а не только на те, которые связаны с аппаратным I2С.

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Сб фев 04, 2023 10:25:46
veso74
[uquote="Starichok51",url="/forum/viewtopic.php?p=4366041#p4366041"]... можно назначить на любые ноги ...[/uquote]
Да, то же самое и с программным I2c, но для конкретного теста в ATtiny13A сэкономило памяти. Осталось и для других приложений, например для датчиков.

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Сб фев 04, 2023 16:00:52
VNS
Имитация работы часов… убрал всё лишнее… код подкорректировал… :) частота тактирования 9,6 МГц.
Исходник на АВ… код для индикатора без конденсаторов… :solder: :)
Test TM1637 tiny13 forum.zip
(16.98 КБ) 133 скачивания

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 11:34:24
veso74
Мне удалось подключить дисплей к TM1637 и устройство с "настоящим I2C" (с адресом) на двух пинах МК :).
(Добавил и "безадресный" i2c_start в TinyWire).

Конечно, с оговорками и особенностями: должен быть выполнен порядок загрузки инфо: сначала загрузка информации на у-во с "настоящим I2C", затем на дисплей. Последняя цифра в дисплее гаснет за время загрузки информации, но после расстановки приоритета загрузки этого не заметно.

Я доволен :), теперь 3 (+1) пина "бедного" ATtiny13A остаются "для будущего использования".

тест: счетчик 0000..9999 и светодиодная мигалка:

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 11:45:48
musor
забавно вот тока иногда +++ читать даьтчик на шине "настоящим I2C" (с адресом)
нать и доску опросить через ТМ-ку

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 11:51:22
veso74
musor, я не понял (РУ сленг?). Можно другими словами?

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 12:27:51
musor
ну пример на общей I2C
висят ds1307 +LM75A через tm1641
выводим на LED час-митуты -сек +год месяц - число -ден недели
+температура с LM75A
+опрос клавиатуры (periodic polling of the keyboard matrix) через tm1641
такое будет работать?

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 12:41:03
veso74
TM1641: интерфейс (CLK, STB, DIN, DOUT)
Совсем ушли от темы.

Re: Светодиодный индикатор на базе LM75A

Добавлено: Вс фев 05, 2023 12:45:17
musor
ах да тамже подобие SPI забыл уже... ну ладно а тоже самое с ТМ1637?

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс фев 05, 2023 13:00:33
veso74
DS1307: 0x68, LM75A: 0x48

ТМ1637 еще не использовал для входа (слишком "бедная" на функций, оставлю для дисплея на данный момент).
Клавиатуру бы использовал напр. на PCF8574. Преимущество: даже не нужно постоянно сканировать ее, а ИС будет генерировать прерывание.

PCF8574: 0x20

-> занятые выводы МК: 2 за I2C (+1 для прерывание).

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт фев 07, 2023 16:24:04
>TEHb<
Просто напомнить, что к настоящей и2ц шине экран таки действительно подключается. И да, как говорил Starichok51, он съедает шину целиком.

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт фев 07, 2023 18:39:02
veso74
[uquote="Starichok51",url="/forum/viewtopic.php?p=4362845#p4362845"]по I2C можно подключить только один модуль на базе ТМ1637.
а мне нужно подключить 2 модуля для показа напряжения и показа тока в блоке питания.[/uquote]
Мне попадались сегодня интересные способы о подключения для решения этого вопроса. Второго дисплея нет для теста, но положил решения в папку "интересные варианты" :). (и использование минимального количества выводов МК)

Connect multiple displays
7-segment Displays Connection

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт фев 07, 2023 18:59:25
musor
драйверы tm16xx неплохи но иза отсудсвия привязки к адресам или входоф CS
ф настоящем девайсе имет смысл прменять толка 1 чип соответствуюшей (минимално нужной разрядности) на шине...
при болшом числе разрядоф LED имет смысл применять старшие многоразрядные чипы начиная с 1640 при этом ПО ВОЗМОЖНОСТИ игнорируя опрос клавы ими... имено таки сделано вмногих серийных промдевайсах...
вопрос связи с другими девайсами на техже пинах весма мутен и может силно усложнить кодили привести ку сбоям опроса датчикоф
боле целесобразно выделить на дисплей отделные пины что исключает малопиновые мк из оборота но ничего плохого в том нет
КАЖДОМУ СВОЕ

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт фев 07, 2023 19:16:25
veso74
Если буду искать чип, который сложно найти (TM1640), то бы предпочел построить драйвер LED/KBD (с любым МК) в I2c slave режиме, с со своим адресом и функциями.
---
Упс, нет :).
10 pcs: US $3.35, правда, китайцы их раздают почти бесплатно.

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт июн 06, 2023 17:50:04
veso74
Почему на всех дисплеях с TM1637 есть кондензаторы 10 nF на DIO и CLK ...?

Купил другие дисплеи 4x 7seg, другого типа, другой формы. Опять же, у них есть конденсаторы:
Я устал их выпаивать :). Стало интересно почему так все производители так их делают ...
Есть какие-то пояснения?

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт июн 06, 2023 18:08:58
Alex_641
Блокировочные , например макс 7219 вообще не работают с большими ёмкостями .

Добавлено after 34 seconds:
В смысле не работают без них

Добавлено after 6 minutes 59 seconds:
veso74 писал(а):Объясните. Не понимал.
У матриц в моменты максимального свечения , происходит максимальное потребление тока,
конденсаторы сглаживают этот бросок .

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт июн 06, 2023 18:10:43
veso74
Вопрос о кондензаторы 10 nF на DIO и CLK.

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вт июн 06, 2023 18:37:15
Alex_641
Ну да, на дио и цлк - непонятно зачем нужны

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс июн 11, 2023 08:14:30
kalobyte
с интересом прочитал тему
у меня есть эти платы и я даже не знал, что там шина и2ц
я думал спи, т.к. на платах подписано не как обычно пишут scl sda

еще и конденсаторы зачем-то и еще выбора адреса нет

тогда лучше 7219, если кнопки не нужны
цена та же, так их хоть друг за другом можно подключить

я этих плат купил всех цветов и еще купил платы на 8 индикаторов и 2 регистра и тоже всех цветов

Re: Светодиодный индикатор на базе ТМ1637

Добавлено: Вс сен 24, 2023 12:26:59
Vlad_RK
Привет.
У меня никак не получается выводить цифры в Proteus 8.15 на 7SEG-MPX4-CC. То дисплей вообще не светится, то светит всеми элементами.
Пробовал код отсюда: https://www.chipmaker.ru/blogs/entry/2170/ (там на ассме, я переделывал на си), пробовал ИИ дать задание написать программку, но ничего не работает. Все есть в архиве, там и для Microchip Studio и для Протеуса.
Помогите разобраться. :(
Спойлер

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

#define F_CPU 12000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stDIO.h>
#include <avr/iom32.h>
#include <math.h>
//#include "TM1637Display.h"
 
//*****************************************
//Это код от ИИ
/*
#define CLK PORTC0 // Подключите CLK к порту C0
#define DIO PORTC1 // Подключите DIO к порту C1

uint8_t digitSegments[] =
{
	0b00111111, // 0
	0b00000110, // 1
	0b01011011, // 2
	0b01001111, // 3
	0b01100110, // 4
	0b01101101, // 5
	0b01111101, // 6
	0b00000111, // 7
	0b01111111, // 8
	0b01101111  // 9
};
*/
//*****************************************

//**********************
//Настройка портов:
 void Port_ini(void)
 {
	 DDRC |= (1<<PORTC0)|(1<<PORTC1);	//PORTC0 - CLK, PORTC1 - DIO
	 PORTC |= (1<<PORTC0)|(1<<PORTC1);
}
//**********************

//*****************************************
//Это код от https://www.chipmaker.ru/blogs/entry/2170/
//
void start(void)					//Маркер начала посылки
{
	_delay_us(100);					//Пауза 100 мкс
	PORTC |= (1<<PORTC0);			//На выходе CLK "1"
	PORTC |= (1<<PORTC1);			//На выходе DIO "1"
	_delay_us(100);					//Пауза 100 мкс
	PORTC &=~(1<<PORTC1);			//На выходе DIO "0"
	_delay_us(100);					//Пауза 100 мкс
}

void end(void)						//Маркер конца посылки
{
	PORTC |= (1<<PORTC0);			//На выходе CLK "1"
	_delay_us(100);					//Пауза 100 мкс
	PORTC |= (1<<PORTC1);			//На выходе DIO "1"
	_delay_us(100);					//Пауза 100 мкс
}

void outcom(unsigned char d)		//Последовательный вывод. Выводимый байт находится в переменной "d"
{
unsigned char i = 0;				//Рабочая переменная для счетчика цикла
unsigned char x = 0b00000001;		//Рабочая переменная для выделения текущего передаваемого бита из байта "d"
	
	for (i=0; i<=7; i++)			//Побитно выводим байт на LED индикатор
	{
		PORTC &=~(1<<PORTC0);		//На выходе CLK "0"
		_delay_us(100);				//Пауза 100 мкс
	
//Если текущий передаваемый бит = 1 -> установить в "1" PORTC1 (DIO), и через 100 мкс сбросить PORTC1 в "0"
	
		if (d & x) PORTC |= (1<<PORTC1);	//На выходе DIO "1"
		else PORTC &=~(1<<PORTC1);			//На выходе DIO "0"
		
		_delay_us(100);				//Пауза 100 мкс
		PORTC |= (1<<PORTC0);		//На выходе CLK "1"
		_delay_us(100);				//Пауза 100 мкс
		x = x<<1;					//Сдвигаем "x" влево на 1 бит
	}

//Стоп-бит
	DDRC &=~(1<<PORTC1);			//PORTC1 - на вход, переключаем DIO как вход, чтобы исключить коллизию с ACK	
	PORTC &=~(1<<PORTC0);			//На выходе CLK "0"	
	_delay_us(100);					//Пауза 100 мкс	
	PORTC |= (1<<PORTC0);			//На выходе CLK "1"	
	_delay_us(100);					//Пауза 100 мкс	
	PORTC &=~(1<<PORTC0);			//На выходе CLK "0"	
	PORTC &=~(1<<PORTC1);			//На выходе DIO "0"	
	DDRC |= (1<<PORTC1);			//PORTC1 - на выход, окончание стоп-бита, переключаем DIO как выход

	
//(Выходим с нулями на обеих шинах)
	_delay_us(100);					//Пауза 100 мкс
}

void incom(void)					//Чтение кнопок
{
	
}
//
//*****************************************



//*****************************************
//Это код от ИИ
/*
void TM1637_start(void) {
	DDRC |= (1<<DIO); // Установка DIO на выход
	PORTC &= ~(1<<CLK); // CLK = 0
	_delay_us(5); // Задержка
}

void TM1637_stop(void) {
	DDRC &= ~(1<<DIO); // Установка DIO на вход
	PORTC |= (1<<CLK); // CLK = 1
	_delay_us(5); // Задержка
}

void TM1637_writeByte(uint8_t data) {
	for(uint8_t i = 0; i < 8; i++) {
		PORTC &= ~(1<<CLK); // CLK = 0
		_delay_us(5); // Задержка
		if(data & 0x01) { // Если бит данных равен 1
			DDRC &= ~(1<<DIO); // Установка DIO на вход
			} else {
			DDRC |= (1<<DIO); // Установка DIO на выход
		}
		data >>= 1;
		PORTC |= (1<<CLK); // CLK = 1
		_delay_us(5); // Задержка
	}

	// Чтение подтверждения
	DDRC &= ~(1<<DIO); // Установка DIO на вход
	PORTC &= ~(1<<CLK); // CLK = 0
	_delay_us(5); // Задержка
	while(PINC & (1<<DIO)); // Ожидание подтверждения
	PORTC |= (1<<CLK); // CLK = 1
	_delay_us(5); // Задержка
}

void TM1637_displayDigit(uint8_t digit, uint8_t position) {
	TM1637_start();
	TM1637_writeByte(0x44); // Фиксированный адрес
	TM1637_stop();

	TM1637_start();
	TM1637_writeByte(0xC0 | position); // Установка адреса
	TM1637_writeByte(digitSegments[digit]); // Запись сегментов
	TM1637_stop();

	TM1637_start();
	TM1637_writeByte(0x8F); // Включение дисплея
	TM1637_stop();
}*/
//*****************************************





//***********
// ПРОГРАММА
//***********
int main(void)
{
	
//*****************************************
//Это код от ИИ
/*
// Инициализация портов
DDRC |= (1<<CLK); // Установка CLK на выход
PORTC |= (1<<CLK); // CLK = 1

// Инициализация дисплея
TM1637_start();
TM1637_writeByte(0x8F); // Включение дисплея
TM1637_stop();

// Вывод цифры 7 на позицию 0
TM1637_displayDigit(7, 0);
*/
//*****************************************



//*****************************************
//Это код от https://www.chipmaker.ru/blogs/entry/2170/
//
	Port_ini();						//Конфигурация портов В/В
	_delay_ms(2000);				//Задержка в 2000 миллисекунд, чтобы Proteus 8 Professional корректно отобразил осциллограмму на виртуальном осциллографе

//Инициализация TM1637:
	start();
	outcom(0x88);
	end();
	_delay_us(100);					//Пауза 100 мкс

//Включение режима передачи данных с автоинкрементом адреса:
	start();
	outcom(0x40);
	end();
	_delay_us(100);					//Пауза 100 мкс

//Вывод сообщения "123" на табло:
	start();						//Маркер начала посылки
	outcom(0xC0);					//Выводим начальный адрес (0хC0 - крайнее левое знакоместо)
	outcom(0x06);					//Выводим 1 в первый разряд
	outcom(0x5b);					//Выводим 2 во второй разряд
	outcom(0x4f);					//Выводим 3 в третий разряд
	end();							//Маркер конца посылки
	_delay_us(100);					//Пауза 100 мкс
//
//*****************************************




	while(1)
	{

	}

}