Динамическая индикация

Daniil497

✩✩✩✩✩✩✩
20 Сен 2022
7
0
Подскажите в чем может быть проблема, создал прошивку для arduino uno в flprog, управление семисегментным индикатором 4 разряда с динамической индикацией, работает нормально до того момента когда подключаеш часы реального времени по i2c, читал что при считывании датчиков может нарушается динамическая индикация, начинаются заметные мерцания, надеюсь поймете мой французкий далёк от програмирования и прочих терминов
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Если обработка динамической индикации и запросы по i2c находятся в основном цикле, то будут затыки.
 
  • Лойс +1
Реакции: Boroda22

Daniil497

✩✩✩✩✩✩✩
20 Сен 2022
7
0
Эту проблему можно обойти или лучше воспользоваться сдвиговым регстром
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Смотря что необходимо делать с часами реального времени. Судя по вопросу - часы реального времени опрашиваются постоянно, с максимально достижимой частотой? Зачем? Скорее всего, они изменяют своё состояние раз в секунду. Для чего с них постоянно получать время, если можно воспользоваться тактирующим входом и считать время внутри, не затрачивая гигантских усилий на опрос I2C?
4 разряда, даже если их переключать с частотой 100Гц, дают интервал между переключениями 2,5мс - за это время можно много чего сделать, включая опрос I2C (который, к.м.к, не нужен).
 

Daniil497

✩✩✩✩✩✩✩
20 Сен 2022
7
0
Оформи код соответствующим тэгом
@poty,сейчас с работы приеду скину код который генерируется с помощью блоков FL prog
Расскажу о схеме по подробнее, семи сегменты не стандартные, а сделанные из светодиодной ленты, 4 разряда
У разрядов общий анод
Эти самые аноды управляются pnp транзисторами который в свою очередь управляется npn.
А катоды всех сегментов в паррадель
И на каждый сегмент от a до g стоит свой npn транзистор который подтягивает катоды к минусу
Схемы нету придумывал грубо говоря сам как по мне работоспособна
И ещё до подключения часов на i2c частота сигнала на базах транзисторов
была в пределах 70-ти Гц
После подключения возросла до ста
Яркость заметно упала и проявились мерцания

#include <Wire.h>
struct _I2CRealRimeClockTime
{
byte seconds = 0;
byte minutes = 0;
byte Hours = 0;
byte weekday = 0;
byte day = 0;
byte month = 0;
byte year = 0;
unsigned long startTime = 0;
}
;
_I2CRealRimeClockTime _RTC1;
int _sido1TB = 0;
String _sido1TSN;
bool _sido1a1 = 0;
bool _sido1b1 = 0;
bool _sido1c1 = 0;
bool _sido1d1 = 0;
bool _sido1e1 = 0;
bool _sido1f1 = 0;
bool _sido1g1 = 0;
bool _sido1dp = 0;
bool _sido1r1 = 0;
bool _sido1r2 = 0;
bool _sido1r3 = 0;
bool _sido1r4 = 0;
int _sido1Raz = 1;
unsigned long _sido1STi = 0UL;
bool _sido1Mod = 0;
String _RTC1_GetTime1_StrOut;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
pinMode(12, OUTPUT);
digitalWrite(12, 0);
pinMode(11, OUTPUT);
digitalWrite(11, 0);
pinMode(10, OUTPUT);
digitalWrite(10, 0);
pinMode(9, OUTPUT);
digitalWrite(9, 0);
pinMode(8, OUTPUT);
digitalWrite(8, 0);
pinMode(7, OUTPUT);
digitalWrite(7, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
pinMode(5, OUTPUT);
digitalWrite(5, 0);
pinMode(4, OUTPUT);
digitalWrite(4, 0);
pinMode(3, OUTPUT);
digitalWrite(3, 0);
Wire.begin();
delay(10);
Wire.beginTransmission(68);
Wire.write(0x0E);
Wire.write(B00000000);
Wire.write(B10001000);
Wire.endTransmission();
_RTC1.startTime = millis() - 1000;
}
void loop()
{
//Плата:1
get3231Date(0x68, &_RTC1);
_RTC1_GetTime1_StrOut = (_convertRealTimeClockNumberToString(_RTC1.Hours))+
String(":")+
(_convertRealTimeClockNumberToString(_RTC1.minutes));
if(_isTimer(_sido1STi, 1))
{
_sido1STi = millis();
if (_sido1Raz > 4)
{
_sido1Raz = 1;
}
if(_sido1Mod)
{
_sido1a1 =1;
_sido1b1 =1;
_sido1c1 =1;
_sido1d1 =1;
_sido1e1 =1;
_sido1f1 =1;
_sido1g1 =1;
_sido1r4 =0;
_sido1r3 =0;
_sido1r2 =0;
_sido1r1 =0;
_sido1Mod=0;
}
else
{
_sido1TSN = _RTC1_GetTime1_StrOut;
_sido1TB = _IntToSevenSegment(_charFromStringForIndex(_sido1TSN,_sido1Raz));
_sido1a1 =! bitRead(_sido1TB, 0);
_sido1b1 =! bitRead(_sido1TB, 1);
_sido1c1 =! bitRead(_sido1TB, 2);
_sido1d1 =! bitRead(_sido1TB, 3);
_sido1e1 =! bitRead(_sido1TB, 4);
_sido1f1 =! bitRead(_sido1TB, 5);
_sido1g1 =! bitRead(_sido1TB, 6);
_sido1r4 = (_sido1Raz==1);
_sido1r3 = (_sido1Raz==2);
_sido1r2 = (_sido1Raz==3);
_sido1r1 = (_sido1Raz==4);
if(_sido1Raz == 4)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 3)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 2)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 1)
{
_sido1dp = ! (0);
}
_sido1Raz = _sido1Raz +1;
_sido1Mod=1;
}
}
digitalWrite(3, _sido1r4);
digitalWrite(4, _sido1r3);
digitalWrite(5, _sido1r2);
digitalWrite(6, _sido1r1);
digitalWrite(7, !(_sido1g1));
digitalWrite(8, !(_sido1f1));
digitalWrite(9, !(_sido1e1));
digitalWrite(10, !(_sido1d1));
digitalWrite(11, !(_sido1c1));
digitalWrite(12, !(_sido1b1));
digitalWrite(13, !(_sido1a1));
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
byte _IntToSevenSegment(int value)
{
if (value==48)
{
return 63;
}
if (value==49)
{
return 6;
}
if (value==50)
{
return 91;
}
if (value==51)
{
return 79;
}
if (value==52)
{
return 102;
}
if (value==53)
{
return 109;
}
if (value==54)
{
return 125;
}
if (value==55)
{
return 7;
}
if (value==56)
{
return 127;
}
if (value==57)
{
return 111;
}
if (value==45)
{
return 64;
}
if (value==65)
{
return 119;
}
if (value==67)
{
return 57;
}
if (value==99)
{
return 88;
}
if (value==100)
{
return 94;
}
if (value==69)
{
return 121;
}
if (value==70)
{
return 113;
}
if (value==72)
{
return 118;
}
if (value==104)
{
return 116;
}
if (value==76)
{
return 56;
}
if (value==79)
{
return 63;
}
if (value==111)
{
return 92;
}
if (value==80)
{
return 115;
}
if (value==114)
{
return 80;
}
if (value==83)
{
return 109;
}
if (value==116)
{
return 120;
}
if (value==85)
{
return 62;
}
if (value==117)
{
return 28;
}
if (value==110)
{
return 84;
}
return 0;
}
int _charFromStringForIndex(String val, int idx)
{
int lengt=val.length();
if(lengt < idx) return 0;
return val.charAt(lengt-idx);
}
void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct)
{
if (!(_isTimer ((timeStruct ->startTime), 250)))
{
return;
}
Wire.beginTransmission(addres);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(addres, 7);
if (Wire.available())
{
byte seconds = Wire.read();
byte minutes = Wire.read();
byte hours = Wire.read();
byte day = Wire.read();
byte date = Wire.read();
byte month = Wire.read();
byte year = Wire.read();
timeStruct -> seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111));
timeStruct -> minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111));
timeStruct -> Hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111));
timeStruct -> weekday = (day & B00000111);
timeStruct -> day = (((date & B00110000) >> 4) * 10 + (date & B00001111));
timeStruct -> month = (((month & B00010000) >> 4) * 10 + (month & B00001111));
timeStruct -> year = (((year & B11110000) >> 4) * 10 + (year & B00001111));
}
timeStruct ->startTime = millis();
}
String _convertRealTimeClockNumberToString(byte value)
{
if (value > 9)
{
return String(value, DEC);
}
return (String("0") + String(value, DEC));
}
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
Боже! Мои глаза лопнут! Ни одного комментария на этой простыне.
А что делает куча IF ? Из чего во что переводит?
Сложно разглядеть архитектуру кода,автор,помогай.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Как и предполагалось: время считывается каждый цикл, всякая конвертация тоже происходит каждый цикл, куча переменных, но нигде ничего не запоминается...
Для начала создайте цикл, который, допустим, 1 раз в секунду (по таймеру millis()) подготавливает все 4 числа для разрядов, а потом всю оставшуюся секунду только тем и занимается, что динамически это выводит. Причём в таймер подставляйте переменную period=1000, а не константу.
Потом создайте цикл, который, допустим, каждые 10 минут (600 предыдущих циклов) сравнивает прошедшее время с тем, что он получает от RTC. Если время отстаёт от RTC - уменьшайте переменную period на 1, если спешит - увеличивайте. Вот у Вас и будет синхронизация.
 

Daniil497

✩✩✩✩✩✩✩
20 Сен 2022
7
0
@te238s,) увы я не автор я создавал программу в FL prog там программу не пишут а собирают из блоков, визуальное программирование, а этот код выводится уже в компиляторе
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@Daniil497,вообще,да,poty, вещь говорит. Либо изредка считывать RTC и синхронизироваться,либо ...впрочем это единственный вариант,не залезая в реализацию iic обмена. Как я понимаю беда в том что она блокирует работу динамической индикации.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
увы я не автор я создавал программу в FL prog там программу не пишут а собирают из блоков,
надеюсь, урок усвоен? Учитесь программировать, а не собирать из блоков.