Индикатор на 595 регистрах

Тема в разделе "Arduino & Shields", создана пользователем Karabas, 13 янв 2017.

  1. Karabas

    Karabas Гик

    Срочно нуждаюсь в помощи, нужно заменить индикатор, а в наличии только с общим анодом, я было поплясал с бубном, но MAX7219 закапризничал.
    Было решено "бить в лоб", уж что проще сдвиговых регистров, да?
    Там всего три пина используется, но все их называют как угодно, только не так как в датшите, MOSI, DO, DIN и еще десяток названий, так что не могу быть 100% уверенн, что попал в нужные дырки.
    Так же не заработал ни один скетч, индикаторы просто мерцают всеми сегментами.

    Может ли кто дать ссылку на понятную схему (почему-то и схемы разнятся) и библиотеку (ну или рабочий скетч). Именно на двух регистрах.
    Спасибо.
     
  2. mcureenab

    mcureenab Гуру

    Для регистров даже библиотека не нужна. Посмотрите функцию shiftOut. В описании примеры есть. Если вопросы будут, задавайте.

    Функция выталкивает октет в регистр. Если регистры каскадом подключены, то отправляем сначала октет для самого дальнего от МК регистра в цепочке и так до самого ближнего. Биты в октете отвечают за состояние пинов регистра. Отдельный пин МК отвечает за вывод данных из внутренней памяти регистра на пины.
     
  3. Karabas

    Karabas Гик

    Да собственно, весь принцип мне понятен, непонятно почему не работает.
    Вот и прошу проверенную схему и скетч
     
  4. qwone

    qwone Гик

    Код (C++):
    /* counter.ino
    Пример использования 4-х значного 7-ми сегментного индикатора на многофункциональной плате
    Multi_function_Shield
    2х МС74НС595 АD ->4 семисегментных индикатора
    QA1-1;QB1-2;QC1-3;QD1-4;QE1-NC;QF1-NC;QG1-NC;QH1-NC
    QA2-a;QB2-b;QC2-c;QD2-d;QE2-e; QF2-f; QG2-g; QH2-h
          DATA  ->8  (Data_pin)
           CLK  ->7  (CLK_pin)
         LATCH  ->4  (LATCH_pin)
    */

    //#1 счетчик
    uint8_t Count; // счетчик
    //#2
    const int Latch_pin=4;
    const int CLK_pin  =7;
    const int Data_pin =8;
    // матрица цифр 0 to 9
    const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
    // матрица выбора знакоместа 1 to 4
    const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
    // Вывод числа на экран
    void WriteNumber(int Number) {
      WriteNumberToSegment(0 , Number / 1000);
      WriteNumberToSegment(1 , (Number / 100) % 10);
      WriteNumberToSegment(2 , (Number / 10) % 10);
      WriteNumberToSegment(3 , Number % 10);
    }
    // запись нужного числа (0-9) в нужную позицию(1-4)
    void WriteNumberToSegment(byte Segment, byte Value){
      digitalWrite(Latch_pin,0);
      shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_MAP[Value]);
      shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_SELECT[Segment] );
      digitalWrite(Latch_pin,1);  
    }

    void setup ()  {
      //#1
      Count = 0;
      //#2
      pinMode(Latch_pin,OUTPUT);
      pinMode(CLK_pin,OUTPUT);
      pinMode(Data_pin,OUTPUT);
    }
    void loop(){
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1   100 милисек счетчик
      static uint32_t past_1 = 0 ;
      if (MILLIS - past_1 >= 100) { // если прошло 100 миллисек
        past_1 = MILLIS ;
        Count++;
        if(Count > 9999) Count = 0;
        }
      //#2 непрерывно дисплей
      WriteNumber(Count);
    }
     
  5. mcureenab

    mcureenab Гуру

    Проще будет ориентироваться не на названия, а на номера пинов микросхемы. Цоколевка этих микросхем разных производителей совпадает, хотя названия могут быть разными. Найти даташит с нужными названиями, а микросхему от производителя какая есть в наличии.
     
  6. Karabas

    Karabas Гик

    Так это, наш, родной К155, 74НС595.
     
  7. mcureenab

    mcureenab Гуру

    Проще будет по вашему примеру разбор непонятностей сделать.
    Нужна ваша схема и скетч, что ожидаем получить от изделия и что по факту получаем.
    К описанию shiftOut на arduino.cc скетчуп приложен. Можно его разобрать с вашей схемой.
     
  8. mcureenab

    mcureenab Гуру

    Код (C++):
    //**************************************************************//
    //  Name    : shiftOutCode, Hello World                         //
    //  Author  : Carlyn Maw,Tom Igoe                               //
    //  Date    : 25 Oct, 2006                                      //
    //  Version : 1.0                                               //
    //  Notes   : Code for using a 74HC595 Shift Register           //
    //          : to count from 0 to 255                            //
    //****************************************************************

    //Pin connected to ST_CP of 74HC595
    int latchPin = 8;
    //Pin connected to SH_CP of 74HC595
    int clockPin = 12;
    ////Pin connected to DS of 74HC595
    int dataPin = 11;

    void setup() {
      //set pins to output because they are addressed in the main loop
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }

    void loop() {
      //count up routine
      for (int j = 0; j < 256; j++) {
        //ground latchPin and hold low for as long as you are transmitting
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, j);
        //return the latch pin high to signal chip that it
        //no longer needs to listen for information
        digitalWrite(latchPin, HIGH);
        delay(1000);
      }
    }
    Цоколевка тут http://amperka.ru/product/74hc595-shift-out-register
    Пины 12, 11, 14 = STcp, SHcp, Ds = latch, clock, data.

    shiftOut(data, clock,...
    digitalWrite(latch,...
     
    Последнее редактирование: 13 янв 2017
  9. Karabas

    Karabas Гик

    Схема такая, http://img.radiokot.ru/files/91863/medium/osqynkdia.png
    Код (C++):
    #define SCLK 7  // пины ардуины
    #define RCLK 6  
    #define DIO 5
    byte digitBuffer[4];

    void setup(){
      pinMode(RCLK, OUTPUT);
      pinMode(SCLK, OUTPUT);
      pinMode(DIO, OUTPUT);
    }


    void loop(){
      // заполняем массив
      digitBuffer[0] = 1;
      digitBuffer[1] = 2;
      digitBuffer[2] = 3;
      digitBuffer[3] = 4;

      // однократно выводим данные из массива на 7сигмент
      // тоесть функция должна постоянно крутится.
      showDisplay();

    }

    void showDisplay(){

      const byte digit[10] = {  // маска для 7 сигментного индикатора
          0b11000000, // 0
          0b11111001, // 1
          0b10100100, // 2
          0b10110000, // 3
          0b10011001, // 4
          0b10010010, // 5
          0b10000010, // 6
          0b11111000, // 7
          0b10000000, // 8
          0b10010000, // 9
      };

      const byte chr[4] = { // маска для разряда
          0b00001000,
          0b00000100,
          0b00000010,
          0b00001001
      };

      // отправляем в цикле по два байта в сдвиговые регистры
      for(byte i = 0; i <= 3; i=0){
        digitalWrite(RCLK, LOW); // открываем защелку
          shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]);  // отправляем байт с "числом"
          shiftOut(DIO, SCLK, MSBFIRST, chr[i]);   // включаем разряд
        digitalWrite(RCLK, HIGH); // защелкиваем регистры
        delay(1); // ждем немного перед отправкой следующего "числа"
      }
    }
     
    Хочу отображать цифры, отображается- ничего, предидущий скетч изобразил что то вроде семерок во всех
    разрядах. Иногда мерцают все сегменты, но почему то не горит нижний, горизонтальный сегмент третьего разряда.

    Сейчас попробую все пересобрать заново.
     
    Последнее редактирование: 13 янв 2017
  10. rkit

    rkit Гуру

    Это неправильно. Надо вытолкнуть за один проход все биты регистра, без всяких "масок разрядов" и лишнего щелканья защелкой.
    У вас получается, что символ занимает 16 бит, а он должен занимать 7.
     
  11. rkit

    rkit Гуру

    Из-за того, что символ это 7 бит, функция shiftOut вообще не очень удобна. Она выводит по 8 бит за раз. Я бы написал свою, это не сложно, но наверняка есть и готовая.
     
  12. mcureenab

    mcureenab Гуру

    На схеме два регистра в каскаде. На каждую цифру из 4х надо отправлять пару октетов. Один октет выбирает сегменты, другой цифру на индикаторе.

    Только данный скетч не соответствует схеме.
     
  13. Karabas

    Karabas Гик

    Я ошибся ссылкой на схему, уже исправил
     
  14. mcureenab

    mcureenab Гуру

    Да и ладно. Несколько лишних битов погоду не сделают.
     
  15. rkit

    rkit Гуру

    Вы чего-то сильно перепутали. Там нету лишних битов, всё должно быть на своих местах. На двух регистрах нельзя сделать четыре цифры.
     
  16. mcureenab

    mcureenab Гуру

    Ардуино не на Atmega8 сделана.
    Лучше возьмите предыдущую схему.без RTC и правильно распишите пины в скетче
     
  17. mcureenab

    mcureenab Гуру

    Можно хоть 8 цифр. Но нужно быстро переключать цифры, чтобы мерцание не было заметным. Работает в динамике, как растровая развертка.
     
  18. Jedi

    Jedi Гик

    Мне кажется, что по схеме сначала октет разряда должен выталкиваться, а затем октет цифры. Он проталкивает октет индикатора в U3, а сам остается в U2.
    Я ошибаюсь?
     
    mcureenab нравится это.
  19. rkit

    rkit Гуру

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

    mcureenab Гуру

    Да. По схеме http://img.radiokot.ru/files/91863/medium/osqynkdia.png так и выходит. А в скетче наоборот

    Код (C++):
          shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]);  // отправляем байт с "числом"
          shiftOut(DIO, SCLK, MSBFIRST, chr[i]);   // включаем разряд
     
    Нужно эти строки местами поменять.
     
    Karabas нравится это.