Модератор: boogyman
-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#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
#22
Сообщение
Gimpel » 21 апр 2020, 18:30
С частотой разобрался. Увеличил значение сопротивления резистора до 10 кОм.
Что касается точки. А разве конструкция if-else будет работать? Вывод информации на 7ЛЕД идёт через конструкцию case.
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#23
Сообщение
Gimpel » 22 апр 2020, 02:33
AntonChip писал(а): ↑22 апр 2020, 06:50
Должно работать
Так ведь тут точка берётся с порта контроллера, поэтому она объявляется. Я сделал её так же const (0x80). Но ведь она идёт с выхода OUT часовой микросхемы. Контроллер не может её сложить со значением часов.
-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#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
#25
Сообщение
Gimpel » 23 апр 2020, 11:50
А делают так? Беру сигнал с частотой 1 Гц и завожу его на вывод РА2 и проверяю в пине что на нём, т.е. как кнопку, а выход вешаю на порт Д к сегменту на точку.
-
Вложения
-

-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#26
Сообщение
AntonChip » 24 апр 2020, 08:06
Правильнее сигнал 1Гц заводить на внешнее прерывание INT0(INT1), а в обработчике просто менять значение "dot" на противоположное, ноль или единица
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#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
#28
Сообщение
nike » 04 май 2020, 14:51
Здравствуйте, на этом сайте есть статья про подключение дисплея ssd1306 по spi. Там написано, что есть исходник для подключения по i2c, но я его никак не могу найти. Пробывал переделать тот исходник, тоже ничего не выходит, замучился уже с ним( Может кто поделится готовой библиотекой для ssd1306 с подключением по i2c к авр (только не для ардуино). Буду очень благодарен
-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#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
#30
Сообщение
nike » 04 май 2020, 17:01
Спасибо большое. Надеюсь заработает
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#31
Сообщение
Gimpel » 05 май 2020, 13:01
а по будильнику нет примера? я нашёл в сети на баскоме и ассемблере. на си почему-то нет.

-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#32
Сообщение
AntonChip » 05 май 2020, 17:29
С будильником все просто, установленное время будильника сохраняется в EEPROM контроллера и сравнивается с текущим временем, если часы и минуты равны включается сигнал, сложнее будет сделать меню настройки
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#33
Сообщение
Gimpel » 05 май 2020, 18:57
а почему в еепром. а не в регистры часов?
-
AntonChip
- Администратор
- Сообщения: 259
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
-
Контактная информация:
#34
Сообщение
AntonChip » 05 май 2020, 19:13
Можно и в память часов, дело ваше
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#35
Сообщение
Gimpel » 07 май 2020, 12:32
Я исхожу из того, что еепром имеет некий ресурс чтения/записи. Разве в регистре часов не сохранится значение?
-
nike
- Новичок
- Сообщения: 8
- Зарегистрирован: 04 май 2020, 14:34
#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
- Откуда: Киров
-
Контактная информация:
#37
Сообщение
AntonChip » 07 май 2020, 15:32
Gimpel писал(а): ↑07 май 2020, 12:32
Я исхожу из того, что еепром имеет некий ресурс чтения/записи. Разве в регистре часов не сохранится значение?
EEPROM контроллера полностью энергонезависимая, 100000 циклов чтения записи, вполне достаточно
Память часов RAM, как я знаю, питается от батарейки, если батарейка сядет данные пропадут, но в то же время батарейки хватает на десятилетия
-
Gimpel
- Любитель
- Сообщения: 22
- Зарегистрирован: 29 июн 2019, 10:38
#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
#39
Сообщение
Gimpel » 04 июн 2020, 22:42
в общем я не знаю как сделать будильник. замучился уже. сил моих больше нет
