Считать показания с двухразрядного семисегментного LED дисплея.

Datak
Offline
Зарегистрирован: 09.10.2014

bigfoot99, а попробуйте просто проверить, звонятся ли провода, идущие на ардуинку, непосредственно с ногами контроллера устройства.
Боюсь, всё же, что Вы подключились после какого-нибудь резистора, и сигнал там уже не того уровня, какого хотелось бы.
И, кстати, что там вообще с уровнями? Напряжение питания ардуины и устройства совпадает?

Logik
Онлайн
Зарегистрирован: 05.08.2014

Datak пишет:

Logik пишет:

Так что беспокоило. Но не волновало ;)  Есть откуда взятся помехам.

Ну да, тоже правильно. Раз появились - значит есть откуда. :)

Перечисленные в сообщении источники помех Вы незаметили. Жаль. Иначе бы не писали про устранение на аппаратном т.к. не все они имеют аппаратные причины. 

А выяснить причину - конечно правильно. Намного лучше так, чем считать что помехам неоткуда быть.

Далее по обсуждению.

Про общие земли, толщину проводов и плохой контакт - лучше не пишите. У трех челов одинаково вышло и все трое запаять нормально несмогли? К тому же я в этом же устройстве на этот же экран выводил все корректно.

Про подтяжки. Включал внутричиповую конечно. Резисторы не допаивал, но с ними не так просто, они начнут сегменты подсвечивать.

Напоследок код функции ввода с многорозрядного семисегментного. В ней коечто лишнее, типа выхода по нажатию энкодера и пр. Писал много лет назад, ниче  не помню. Код местами безобразный т.к. остался посреди незавершенной отладки.

#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;
}

 

Datak
Offline
Зарегистрирован: 09.10.2014

А что, например, нельзя ли схему этой всей штуковины, хотя бы в виде фотки платы, полностью. Можно даже вместе с припаянной ардуиной. Может тогда и увидим что-то интересное.

А то так гадать, вслепую, можно бесконечно.

Logik
Онлайн
Зарегистрирован: 05.08.2014

Схему, понятно, нельзя - её в природе не существует))  Была куплена мной плата БП на которой семисегментный CL3641AH к чахлому stm припаян. Серху нано на соплях (потому фотка тоже не порадует), подключен к стробам и сегментам. И ресет stm наной управляется. Если нано держит stm в сбросе, то сама выводит на экран. Иначе пытается понять  по сигналам стробов и сегментов чего там эта stm выводит. Земля - общая. Питание тоже. Единственная атипичность - китаянцы на резисторах токоограничения сегментов сэкономили, без них.  Вывод на экран работает сабильно, а ввод подглючивает (но как я писал он мне не особо и нужен, потому интерес больше спортивный, я уже сто лет как забил на проблему, пока эту тему не прочитал и не вспомнил). 

ПС. Просмотрел свой же код - прифигел еще сильней, стробы я ввожу аналогово... Добавил в него обявление макроса для понимания.

Datak
Offline
Зарегистрирован: 09.10.2014

Logiklk, запутали меня немного. Читаю невнимательно, думал мы всё ещё про устройство bigfoot99, а оказывается тут уже второе, Ваше, появилось и обсужается.

Logik пишет:
Единственная атипичность - китаянцы на резисторах токоограничения сегментов сэкономили, без них.

У STM-ов, если не ошибаюсь, встроенная возможность ограничивать ток, программно выбирая из предусмотренных значений. Скорей всего, этим и воспользовались. Но это означает, что уровень сигнала на выходе будет не как обычно, близким к питающему, а обрежется до светодиодного - 1.5В, допустим. Может, из-за этого и пришлось читать их аналогово.
 
А ещё, STM-овские выходы могут конфигуриться как "open drain", и если это так, то я опять вспомню про свои подтягивающие резисторы. Кстати, насчёт нежелательной засветки сегментов через них. По-моему, засветки не будет, если подтягивать именно в правильную сторону. Но надо уточнить - я всё же не могу так, в уме, без картинки.
 
В общем, не знаю, много можно придумать разных мелочей, без которых не будет работать или будет глючить.
 
И, да, про код я пока вообще не говорю.  
 
bigfoot99
Offline
Зарегистрирован: 03.02.2018

День добрый.

Вот фотки моих плат

Из за термоклея который удерживает шлейфб сложно некоторые вещи разглядеть.

Но я теперь уже сам вижу в чем может быть причина проблем.  Datak, Вы правы я подпаялся непосредственно к ножкам дисплея вместо того чтобы подпаиваться к ножка контроллера.

Буду переделывать.

 

 

 

Logik
Онлайн
Зарегистрирован: 05.08.2014

Datak пишет:

У STM-ов, если не ошибаюсь, встроенная возможность ограничивать ток, программно выбирая из предусмотренных значений. Скорей всего, этим и воспользовались. Но это означает, что уровень сигнала на выходе будет не как обычно, близким к питающему, а обрежется до светодиодного - 1.5В, допустим. Может, из-за этого и пришлось читать их аналогово.

 

Возможно, но, т.к. аналогово вводил только стробы то скорей по причине 

Datak пишет:

 STM-овские выходы могут конфигуриться как "open drain",

 
Получается что на неактивном стробе будет явно не 1, а в лучшем случае напряжение равное прямому падению на светодиоде сегмента, 2-2.5В.  
Logik
Онлайн
Зарегистрирован: 05.08.2014

bigfoot99 пишет:

я подпаялся непосредственно к ножкам дисплея вместо того чтобы подпаиваться к ножка контроллера.

вот так в непринужденной беседе и помогли чеолвеку )) 

Теперь самое интересное, а поможет ли перепайка.

bigfoot99
Offline
Зарегистрирован: 03.02.2018

ОНО ЗАРАБОТАЛО!!!

Перепайка решила абсолютно все проблемы. работает как часы, совсем без какой либо обработки ошибок.

Небольшие проблемы наблюдаются на мигающих значениях но это поправимо.

ДРУЗЬЯ, спасибо Вам всем огромное за нужные и правильные мысли, спасибо!

Вот код того что работает:

//Pins Configuration

int Display_pin_Rs = 2;    //  Rs Right segment common Cathode (LOW)  
int Display_pin_Ls = 3;    //  Ls Left segment common Cathode (LOW) 

int Rs = 0;
int Ls =0;
int Result = 0;
int prev_Result = 0;

void setup() {
  pinMode (Display_pin_Ls, INPUT);
  pinMode (Display_pin_Rs, INPUT);

  Serial.begin(9600);
  while (! Serial); 
  Serial.println ("Arduino ready!");
}

void loop() 
{
  while(digitalRead(Display_pin_Rs));   //ждем LOW сигнал 
  Rs = Parser((PIND & 0xF0)|(PINB & 0x0F));
  while(digitalRead(Display_pin_Ls));   //ждем LOW сигнал 
  Ls = Parser((PIND & 0xF0)|(PINB & 0x0F));
  Result = (Ls*10)+Rs ; 
  if (prev_Result != Result)
  {
    prev_Result = Result;
    Serial.println (Result);
  }
}

//FUNCTIONS
int Parser(byte ABCDEFGX)                    //Parser
{
bitWrite(ABCDEFGX,0,LOW);               //Обнуляем сегмент десячиной точки - он нас не интересует
int Parsed_val = 88;
if (ABCDEFGX == 240 || ABCDEFGX == 256)                   
  {
  Parsed_val = 77;      //"]"  or "["      
  }
else if (ABCDEFGX == 158)
  {
  Parsed_val = 99;     //E        
  }
else if (ABCDEFGX == 0 || ABCDEFGX == 252)
  {
  Parsed_val = 0;             
  }
else if (ABCDEFGX == 96)
  {
  Parsed_val = 1;             
  }  
else if (ABCDEFGX == 218)
  {
  Parsed_val = 2;             
  }
else if (ABCDEFGX == 242)
  {
  Parsed_val = 3;             
  }
else if (ABCDEFGX == 102)
  {
  Parsed_val = 4;             
  }
else if (ABCDEFGX == 182)
  {
  Parsed_val = 5;             
  }
else if (ABCDEFGX == 190)
  {
  Parsed_val = 6;             
  }
else if (ABCDEFGX == 224)
  {
  Parsed_val = 7;             
  }
else if (ABCDEFGX == 254)
  {
  Parsed_val = 8;             
  }
else if (ABCDEFGX == 246)
  {
  Parsed_val = 9;             
  }
return Parsed_val;
}

 

bigfoot99
Offline
Зарегистрирован: 03.02.2018

Уже не так актуально но вот фото платы на котором я подписал куда какой контакт подключать:

Datak
Offline
Зарегистрирован: 09.10.2014

bigfoot99, поздравляю, рад что получилось.