bigfoot99, а попробуйте просто проверить, звонятся ли провода, идущие на ардуинку, непосредственно с ногами контроллера устройства.
Боюсь, всё же, что Вы подключились после какого-нибудь резистора, и сигнал там уже не того уровня, какого хотелось бы.
И, кстати, что там вообще с уровнями? Напряжение питания ардуины и устройства совпадает?
Так что беспокоило. Но не волновало ;) Есть откуда взятся помехам.
Ну да, тоже правильно. Раз появились - значит есть откуда. :)
Перечисленные в сообщении источники помех Вы незаметили. Жаль. Иначе бы не писали про устранение на аппаратном т.к. не все они имеют аппаратные причины.
А выяснить причину - конечно правильно. Намного лучше так, чем считать что помехам неоткуда быть.
Далее по обсуждению.
Про общие земли, толщину проводов и плохой контакт - лучше не пишите. У трех челов одинаково вышло и все трое запаять нормально несмогли? К тому же я в этом же устройстве на этот же экран выводил все корректно.
Про подтяжки. Включал внутричиповую конечно. Резисторы не допаивал, но с ними не так просто, они начнут сегменты подсвечивать.
Напоследок код функции ввода с многорозрядного семисегментного. В ней коечто лишнее, типа выхода по нажатию энкодера и пр. Писал много лет назад, ниче не помню. Код местами безобразный т.к. остался посреди незавершенной отладки.
#define RESET_STM8S003F3 12
#define INPUT_DISPLAY_SEGMENTS (((PIND >>2) & 0x3f) | ((PINC << 5) & 0xc0))
const byte Strobe[]={STROBE_3, STROBE_2, STROBE_1, STROBE_4};
const byte StrobePos[]={2, 1, 0, 3};
byte Displ[sizeof(Strobe)];
byte DisplDP;
enum MODE
{
MODE_INPUT_U=1,
MODE_INPUT_I,
};
boolean InputDispl(void)
{
for(byte i=0;i<sizeof(Strobe);i++)
{
repeat_wait_strob:
byte count=20*10; //пробуем не более 20мсек
if(!bit_is_set(ENCODER_INPUT_PORT, ENCODER_INPUT_PIN_PRESS))
return false; //выход по нажатию кнопки
/* ждем спада строба, т.е. его активности*/
for(;analogRead(Strobe[i])>STROBE_POROG;)
{
if(!bit_is_set(ENCODER_INPUT_PORT, ENCODER_INPUT_PIN_PRESS))
return false; //выход по нажатию кнопки
if(!(count--))
{ // спада не дождались
if(i<sizeof(Strobe)-1)
{
count=20*10; //ловим высокий уровень следующего строба, чтоб ждать спада
for(;!analogRead(Strobe[i+1])>STROBE_POROG;)
{
if(!(count--))
{ //следующий строб в единицу не стал, это проблема, выходим с ошибкой
return false;
}
else
delayMicroseconds(100);
}
}
Displ[StrobePos[i]]=0;
goto next_strob;
}
delayMicroseconds(100);
}
delayMicroseconds(100);
count=INPUT_DISPLAY_SEGMENTS; //временно используем
if(!count)
goto repeat_wait_strob;
Displ[StrobePos[i]]= count | 0x10;
next_strob: ;
}
return true;
}
А что, например, нельзя ли схему этой всей штуковины, хотя бы в виде фотки платы, полностью. Можно даже вместе с припаянной ардуиной. Может тогда и увидим что-то интересное.
Схему, понятно, нельзя - её в природе не существует)) Была куплена мной плата БП на которой семисегментный CL3641AH к чахлому stm припаян. Серху нано на соплях (потому фотка тоже не порадует), подключен к стробам и сегментам. И ресет stm наной управляется. Если нано держит stm в сбросе, то сама выводит на экран. Иначе пытается понять по сигналам стробов и сегментов чего там эта stm выводит. Земля - общая. Питание тоже. Единственная атипичность - китаянцы на резисторах токоограничения сегментов сэкономили, без них. Вывод на экран работает сабильно, а ввод подглючивает (но как я писал он мне не особо и нужен, потому интерес больше спортивный, я уже сто лет как забил на проблему, пока эту тему не прочитал и не вспомнил).
ПС. Просмотрел свой же код - прифигел еще сильней, стробы я ввожу аналогово... Добавил в него обявление макроса для понимания.
Logiklk, запутали меня немного. Читаю невнимательно, думал мы всё ещё про устройство bigfoot99, а оказывается тут уже второе, Ваше, появилось и обсужается.
Logik пишет:
Единственная атипичность - китаянцы на резисторах токоограничения сегментов сэкономили, без них.
У STM-ов, если не ошибаюсь, встроенная возможность ограничивать ток, программно выбирая из предусмотренных значений. Скорей всего, этим и воспользовались. Но это означает, что уровень сигнала на выходе будет не как обычно, близким к питающему, а обрежется до светодиодного - 1.5В, допустим. Может, из-за этого и пришлось читать их аналогово.
А ещё, STM-овские выходы могут конфигуриться как "open drain", и если это так, то я опять вспомню про свои подтягивающие резисторы. Кстати, насчёт нежелательной засветки сегментов через них. По-моему, засветки не будет, если подтягивать именно в правильную сторону. Но надо уточнить - я всё же не могу так, в уме, без картинки.
В общем, не знаю, много можно придумать разных мелочей, без которых не будет работать или будет глючить.
Из за термоклея который удерживает шлейфб сложно некоторые вещи разглядеть.
Но я теперь уже сам вижу в чем может быть причина проблем. Datak, Вы правы я подпаялся непосредственно к ножкам дисплея вместо того чтобы подпаиваться к ножка контроллера.
У STM-ов, если не ошибаюсь, встроенная возможность ограничивать ток, программно выбирая из предусмотренных значений. Скорей всего, этим и воспользовались. Но это означает, что уровень сигнала на выходе будет не как обычно, близким к питающему, а обрежется до светодиодного - 1.5В, допустим. Может, из-за этого и пришлось читать их аналогово.
Возможно, но, т.к. аналогово вводил только стробы то скорей по причине
Datak пишет:
STM-овские выходы могут конфигуриться как "open drain",
Получается что на неактивном стробе будет явно не 1, а в лучшем случае напряжение равное прямому падению на светодиоде сегмента, 2-2.5В.
bigfoot99, а попробуйте просто проверить, звонятся ли провода, идущие на ардуинку, непосредственно с ногами контроллера устройства.
Боюсь, всё же, что Вы подключились после какого-нибудь резистора, и сигнал там уже не того уровня, какого хотелось бы.
И, кстати, что там вообще с уровнями? Напряжение питания ардуины и устройства совпадает?
Так что беспокоило. Но не волновало ;) Есть откуда взятся помехам.
Ну да, тоже правильно. Раз появились - значит есть откуда. :)
Перечисленные в сообщении источники помех Вы незаметили. Жаль. Иначе бы не писали про устранение на аппаратном т.к. не все они имеют аппаратные причины.
А выяснить причину - конечно правильно. Намного лучше так, чем считать что помехам неоткуда быть.
Далее по обсуждению.
Про общие земли, толщину проводов и плохой контакт - лучше не пишите. У трех челов одинаково вышло и все трое запаять нормально несмогли? К тому же я в этом же устройстве на этот же экран выводил все корректно.
Про подтяжки. Включал внутричиповую конечно. Резисторы не допаивал, но с ними не так просто, они начнут сегменты подсвечивать.
Напоследок код функции ввода с многорозрядного семисегментного. В ней коечто лишнее, типа выхода по нажатию энкодера и пр. Писал много лет назад, ниче не помню. Код местами безобразный т.к. остался посреди незавершенной отладки.
А что, например, нельзя ли схему этой всей штуковины, хотя бы в виде фотки платы, полностью. Можно даже вместе с припаянной ардуиной. Может тогда и увидим что-то интересное.
А то так гадать, вслепую, можно бесконечно.
Схему, понятно, нельзя - её в природе не существует)) Была куплена мной плата БП на которой семисегментный CL3641AH к чахлому stm припаян. Серху нано на соплях (потому фотка тоже не порадует), подключен к стробам и сегментам. И ресет stm наной управляется. Если нано держит stm в сбросе, то сама выводит на экран. Иначе пытается понять по сигналам стробов и сегментов чего там эта stm выводит. Земля - общая. Питание тоже. Единственная атипичность - китаянцы на резисторах токоограничения сегментов сэкономили, без них. Вывод на экран работает сабильно, а ввод подглючивает (но как я писал он мне не особо и нужен, потому интерес больше спортивный, я уже сто лет как забил на проблему, пока эту тему не прочитал и не вспомнил).
ПС. Просмотрел свой же код - прифигел еще сильней, стробы я ввожу аналогово... Добавил в него обявление макроса для понимания.
Logiklk, запутали меня немного. Читаю невнимательно, думал мы всё ещё про устройство bigfoot99, а оказывается тут уже второе, Ваше, появилось и обсужается.
День добрый.
Вот фотки моих плат
Из за термоклея который удерживает шлейфб сложно некоторые вещи разглядеть.
Но я теперь уже сам вижу в чем может быть причина проблем. Datak, Вы правы я подпаялся непосредственно к ножкам дисплея вместо того чтобы подпаиваться к ножка контроллера.
Буду переделывать.
У STM-ов, если не ошибаюсь, встроенная возможность ограничивать ток, программно выбирая из предусмотренных значений. Скорей всего, этим и воспользовались. Но это означает, что уровень сигнала на выходе будет не как обычно, близким к питающему, а обрежется до светодиодного - 1.5В, допустим. Может, из-за этого и пришлось читать их аналогово.
Возможно, но, т.к. аналогово вводил только стробы то скорей по причине
STM-овские выходы могут конфигуриться как "open drain",
я подпаялся непосредственно к ножкам дисплея вместо того чтобы подпаиваться к ножка контроллера.
вот так в непринужденной беседе и помогли чеолвеку ))
Теперь самое интересное, а поможет ли перепайка.
ОНО ЗАРАБОТАЛО!!!
Перепайка решила абсолютно все проблемы. работает как часы, совсем без какой либо обработки ошибок.
Небольшие проблемы наблюдаются на мигающих значениях но это поправимо.
ДРУЗЬЯ, спасибо Вам всем огромное за нужные и правильные мысли, спасибо!
Вот код того что работает:
Уже не так актуально но вот фото платы на котором я подписал куда какой контакт подключать:
bigfoot99, поздравляю, рад что получилось.