Проблема при взаимодействии p-fet и дисплея

Тема в разделе "Arduino & Shields", создана пользователем Rins, 19 авг 2019.

  1. Rins

    Rins Нуб

    Добрый день!
    Возникла проблема при взаимодействии дисплея на каскаде из 74HC595 и двух модулей P-FET. По отдельности, все работает перекрестно, однако стоит только подключить все вместе, на дисплее просто начинают загораться случайные светодиоды. Если не подключать феты в коде, все работает. На схеме из общего только пин MOSI.

    Код (C++):
    #define disp_pin  8   //CS пин экрана
    #define fet_pin   9   //CS пин мосфетов
    #define mosi_pin  11  //MOSI
    #define miso_pin  12  //MISO
    #define sck_pin   13  //SCK

    #include "AmperkaFET.h"           //Библиотека мосфетов

    FET mosfet(fet_pin, 2);                          //CS пин мофсфета и количество модулей


    void setup() {
      pinMode(disp_pin, OUTPUT);
      pinMode(fet_pin, OUTPUT);
      pinMode(disp_pin, OUTPUT);
      pinMode(mosi_pin, OUTPUT);
      pinMode(miso_pin, OUTPUT);
                                                 
      mosfet.begin();               //Стоит закоментить эту строку, и все работает перкрастно

    }

    void loop() {
      for (int i = 0; i <= 9999; i++) {
        displaySigns(i);
        delay (1);
      }
      while (true) {
      }
    }
    void displaySigns(int val) {
      byte sign [4];
      sign[3] = val / 1000 % 10;
      sign[2] = val / 100 % 10;
      sign[1] = val / 10 % 10;
      sign[0] = val % 10;
      digitalWrite(disp_pin, LOW);
      for (int i = 0; i < 4; i++) {
        switch (sign[i]) {
          case 0: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11111100); break;
          case 1: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b01100000); break;
          case 2: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11011010); break;
          case 3: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11110010); break;
          case 4: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b01100110); break;
          case 5: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b10110110); break;
          case 6: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b10111110); break;
          case 7: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11100000); break;
          case 8: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11111110); break;
          case 9: shiftOut(mosi_pin, miso_pin, LSBFIRST, 0b11110110); break;
        }
      }
      digitalWrite(disp_pin, HIGH);
    }

    Кстати, та же проблема возникала у меня при работе p-fet и quad dispay'я. Но там экспериментальным путем удалось установить что внесение строки
    Код (C++):
    digitalWrite (display_pin, LOW);
    после каждого обращения к дисплею, решало эту проблему.
     
    Последнее редактирование: 19 авг 2019
  2. NikitOS

    NikitOS Король шутов Администратор

    Этой командой вы отключали связь с дисплеем, так и тут
    Вы должны выбрать, с каким устройством вы работаете
    Вместе нельзя
     
  3. Rins

    Rins Нуб

    Да, я читал про SPI, и вообще думал что отключением приема должна заниматься библиотека, к тому же, если я правильно понимаю то LOW наоборот должен был включать прием, но ок, предположим он не инверсный. Проблема в том, что я уже пробовал ставить и низкий и высокий сигнал и на фетах и на дисплее и пихать это в разные куски кода, и либо я не вижу какого то очевидного решения, либо это не работает.
     
  4. parovoZZ

    parovoZZ Гуру

    А что это?
     
  5. Rins

    Rins Нуб

  6. b707

    b707 Гуру

    у вас дисплей на сдвиговых регистрах, они не имеют никакого отношения к SPI. подключите дисплей к любым другим пинам, кроме MOSI MISO SCK и пользуйтесь на здоровье
     
  7. NikitOS

    NikitOS Король шутов Администратор

    В обсуждение магазина :)
     
  8. Rins

    Rins Нуб

    Да, спасибо, в данном скетче действительно помогло, однако в основной программе пока что нет. Ушел думать дальше.