I2C шина

Модератор: boogyman

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#21

Сообщение AntonChip » 21 апр 2020, 16:53

Gimpel писал(а): 21 апр 2020, 12:20 Разбираюсь.

Сейчас посмотрел какой у меня индикатор для часов лежит. Общий катод, 4 сегмента, красный. Что я хочу сделать. Хочу отделить значение часов и минут мигающей с частотой 1 Гц точкой. Мигание думаю обеспечить выводом SQWE с ДС1307. А как это сделать? Ведь если я подключаю точку на знакоместо №2 (отделение часов и минут), то мигают все точки индикатора - они же общие.

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

PORTD = SEGMENTE[hour % 10]|0x80; //добавляем точку
Простое условие

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

if(dot) PORTD = SEGMENTE[hour % 10]|0x80; //добавляем точку
else PORTD = SEGMENTE[hour % 10];

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#22

Сообщение Gimpel » 21 апр 2020, 18:30

С частотой разобрался. Увеличил значение сопротивления резистора до 10 кОм.

Что касается точки. А разве конструкция if-else будет работать? Вывод информации на 7ЛЕД идёт через конструкцию case.

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#23

Сообщение Gimpel » 22 апр 2020, 02:33

AntonChip писал(а): 22 апр 2020, 06:50 Должно работать
Так ведь тут точка берётся с порта контроллера, поэтому она объявляется. Я сделал её так же const (0x80). Но ведь она идёт с выхода OUT часовой микросхемы. Контроллер не может её сложить со значением часов.

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#24

Сообщение AntonChip » 22 апр 2020, 06:50

Должно работать

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

switch(seg_counter)
{  
case 0:
PORTD = SEGMENTE[hours/10]; // Выводим первый разряд
break;
case 1:
if(dot) PORTD = SEGMENTE[hour % 10]|0x80; //добавляем точку
else PORTD = SEGMENTE[hour % 10];
break; 
case 2:
PORTD = SEGMENTE[minutes/10]; // Выводим третий разряд
break;         
case 3:
PORTD = SEGMENTE[minutes%10]; // Выводим четвертый разряд
break; 
}
if(seg_counter++ > 2) seg_counter = 0; 
}

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#25

Сообщение Gimpel » 23 апр 2020, 11:50

А делают так? Беру сигнал с частотой 1 Гц и завожу его на вывод РА2 и проверяю в пине что на нём, т.е. как кнопку, а выход вешаю на порт Д к сегменту на точку.
Вложения
1012.jpg

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#26

Сообщение AntonChip » 24 апр 2020, 08:06

Правильнее сигнал 1Гц заводить на внешнее прерывание INT0(INT1), а в обработчике просто менять значение "dot" на противоположное, ноль или единица

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#27

Сообщение Gimpel » 25 апр 2020, 10:11

AntonChip писал(а): 24 апр 2020, 08:06 Правильнее сигнал 1Гц заводить на внешнее прерывание INT0(INT1), а в обработчике просто менять значение "dot" на противоположное, ноль или единица
Победил) Но завёл не на внешнее прерывание, хотя я с ним уже поработал, а на тот же порт А. Не знал, что структура if-else работает в структуре case.

Теперь решил ввести третью кнопку - для будильника. В часовой микросхеме есть регистры памяти. Данные записывать в них или в EEPROM? Как вообще будильник сделать? Как я понимаю нужно сравнить заданное значение будильника с текущим временем. Может вы уже писали код для будильника?

Аватара пользователя
nike
Новичок
Сообщения: 8
Зарегистрирован: 04 май 2020, 14:34

Re: I2C шина

#28

Сообщение nike » 04 май 2020, 14:51

Здравствуйте, на этом сайте есть статья про подключение дисплея ssd1306 по spi. Там написано, что есть исходник для подключения по i2c, но я его никак не могу найти. Пробывал переделать тот исходник, тоже ничего не выходит, замучился уже с ним( Может кто поделится готовой библиотекой для ssd1306 с подключением по i2c к авр (только не для ардуино). Буду очень благодарен

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#29

Сообщение AntonChip » 04 май 2020, 16:53

nike писал(а): 04 май 2020, 14:51 Здравствуйте, на этом сайте есть статья про подключение дисплея ssd1306 по spi. Там написано, что есть исходник для подключения по i2c, но я его никак не могу найти. Пробывал переделать тот исходник, тоже ничего не выходит, замучился уже с ним( Может кто поделится готовой библиотекой для ssd1306 с подключением по i2c к авр (только не для ардуино). Буду очень благодарен
Здравствуйте, пример добавил в архив к этой статье https://radioparty.ru/programming/avr/c ... 06-lesson1

Аватара пользователя
nike
Новичок
Сообщения: 8
Зарегистрирован: 04 май 2020, 14:34

Re: I2C шина

#30

Сообщение nike » 04 май 2020, 17:01

Спасибо большое. Надеюсь заработает

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#31

Сообщение Gimpel » 05 май 2020, 13:01

а по будильнику нет примера? я нашёл в сети на баскоме и ассемблере. на си почему-то нет. :(

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#32

Сообщение AntonChip » 05 май 2020, 17:29

С будильником все просто, установленное время будильника сохраняется в EEPROM контроллера и сравнивается с текущим временем, если часы и минуты равны включается сигнал, сложнее будет сделать меню настройки

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#33

Сообщение Gimpel » 05 май 2020, 18:57

а почему в еепром. а не в регистры часов?

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#34

Сообщение AntonChip » 05 май 2020, 19:13

Можно и в память часов, дело ваше

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#35

Сообщение Gimpel » 07 май 2020, 12:32

Я исхожу из того, что еепром имеет некий ресурс чтения/записи. Разве в регистре часов не сохранится значение?

Аватара пользователя
nike
Новичок
Сообщения: 8
Зарегистрирован: 04 май 2020, 14:34

Re: I2C шина

#36

Сообщение nike » 07 май 2020, 14:23

Для ssd1306 есть такая функция

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

ssd1306_string_font8x16xy(16, 0, "I2C OLED Demo");
которая выводит текст на экран. Можно как нибудь в эту функцию отправить числовую переменную, переделав её в строку ?

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

void ssd1306_string_font8x16xy(uint8_t x, uint8_t y, const char s[]) 
{
	uint8_t ch, j = 0;
	while (s[j] != '\0') 
    {
		ch = s[j] - 32;
		if (x > 120) 
        {
			x = 0;
			y++;
		}
		ssd1306_setpos(x, y);
		i2c_start();
	    i2c_writebyte(SSD1306_SA);
	    i2c_writebyte(0x40);	//write data
		for (uint8_t i = 0; i < 8; i++) 
        {
			i2c_writebyte(pgm_read_byte(&ssd1306xled_font8x16[ch * 16 + i]));
		}
		i2c_stop();
		ssd1306_setpos(x, y + 1);
		i2c_start();
    	i2c_writebyte(SSD1306_SA);
    	i2c_writebyte(0x40);	//write data
		for (uint8_t i = 0; i < 8; i++) 
        {
			i2c_writebyte(pgm_read_byte(&ssd1306xled_font8x16[ch * 16 + i + 8]));
		}
		i2c_stop();
		x += 8;
		j++;
	}

Аватара пользователя
AntonChip
Администратор
Сообщения: 259
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: I2C шина

#37

Сообщение AntonChip » 07 май 2020, 15:32

Gimpel писал(а): 07 май 2020, 12:32 Я исхожу из того, что еепром имеет некий ресурс чтения/записи. Разве в регистре часов не сохранится значение?
EEPROM контроллера полностью энергонезависимая, 100000 циклов чтения записи, вполне достаточно
Память часов RAM, как я знаю, питается от батарейки, если батарейка сядет данные пропадут, но в то же время батарейки хватает на десятилетия

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#38

Сообщение Gimpel » 09 май 2020, 17:17

AntonChip писал(а): 07 май 2020, 15:32
Gimpel писал(а): 07 май 2020, 12:32 Я исхожу из того, что еепром имеет некий ресурс чтения/записи. Разве в регистре часов не сохранится значение?
EEPROM контроллера полностью энергонезависимая, 100000 циклов чтения записи, вполне достаточно
Память часов RAM, как я знаю, питается от батарейки, если батарейка сядет данные пропадут, но в то же время батарейки хватает на десятилетия
ага. понял. тогда сейчас почитаю про работу с ЕЕПРОМ.

Аватара пользователя
Gimpel
Любитель
Сообщения: 22
Зарегистрирован: 29 июн 2019, 10:38

Re: I2C шина

#39

Сообщение Gimpel » 04 июн 2020, 22:42

в общем я не знаю как сделать будильник. замучился уже. сил моих больше нет :(

Ответить