Совместное использование 74CH165 и 74CH595

Atreidos
Offline
Зарегистрирован: 18.03.2016

Добрый день. Реализую небольшой проэкт для которого нужны кнопки и и четырехразрядный семисегментный индикатор. Случайно в руки попал готовый модуль от промышленного прибора с 6 кнопками и таким индикатором.

Внутри:

- 2 сдвиговых регистра 74CH595 подключенные каскадом;

- 1 cдвиговый регистр 74CH165;

- и какая-то микруха ( точно названия не помню , что-то типа 401060), судя по даташиту служит для аппаратного подавления дребезга.

У этого модуля имеется разьем на который и подключается питание +5, GND, MOSI, MISO, обший для всех микрух CLK и SS от 595 и от 165. 

Подклюено так : CLK - pin 13 , MISO - pin 12, MOSI - pin 11, SS 165 - pin 9 , SS 595 - pin 8.

Библиотеку SPI.h не использую , т.к. с ней в обще не работает никак.

Отдельно изображение через 595 выводиться на отлично. И так же считывается с кнопок через 165 - тоже четко.

Но как только я в коде пытаюсь и выводить , то в момент считывания байта со 165 на дисплее подсвечиваюся все сегменты. Менял частоту считывания - все так же просто реже моргает. Пробовал играть с задержками в микросекундах между переключениями защёлок у регистров и командами shiftIn/shiftOut. Но все тщетно. Начинает уже немного все это злить. Вот и решил обратиться за помошью. Может образумите :)

 

int SS_595 = 8;
int CLK = 13;
int MOS1 = 11;
int M1SO = 12;
int SS_165 = 9;

const int numeral[10]=
{
//ABCDEFG /dp
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111, // 9
};

const int razr[4] = 
{
 B10000000,
 B01000000,
 B00100000,
 B00010000
};

byte but = 72;
int i = 0;
int interval = 500;  
unsigned long prevmil = 0; 
unsigned long curmil = 0;  


void setup() {
pinMode (SS_595, OUTPUT);
pinMode (CLK, OUTPUT);
pinMode (MOS1, OUTPUT);
pinMode (M1SO, INPUT);
pinMode (SS_165, OUTPUT);
digitalWrite(SS_165,HIGH);
}

void loop() {
  i++;
Number(i/10);
curmil = millis();
  if ( curmil - prevmil > 0.1*interval) 
  { 
digitalWrite(SS_165, HIGH);
digitalWrite(SS_165, LOW);
but = shiftIn(M1SO, CLK, MSBFIRST);
    prevmil = curmil;
  }

}
void Number (int number)
{
  for( int i = 0; i < 4; i++)
  {
    showDigit( number%10, i);
    number = number / 10;
  }
}

void showDigit (int number, int digit)
{
digitalWrite(SS_595, LOW);
shiftOut(MOS1, CLK, LSBFIRST, razr[digit]);
shiftOut(MOS1, CLK, MSBFIRST, numeral[number]);
digitalWrite(SS_595, HIGH);
delay(3);
}

 

Atreidos
Offline
Зарегистрирован: 18.03.2016

Совсем забыл. Пробовал на 2х разных UNO и одной NANO . Разницы никакой.

Atreidos
Offline
Зарегистрирован: 18.03.2016

В общем. Проблемма решена. Если кому нужно будет. ЗАработал вот такой вариант кода:

 

int SS_595 = 8;
int CLK = 13;
int MOS1 = 11;
int M1SO = 12;
int SS_165 = 9;

const int numeral[10]=
{
//ABCDEFG /dp
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111, // 9
};

const int razr[4] = 
{
 B10000000,
 B01000000,
 B00100000,
 B00010000
};

byte but = 72;
int i = 0;
int interval = 500;  
unsigned long prevmil = 0; 
unsigned long curmil = 0;  


void setup() {
pinMode (SS_595, OUTPUT);
pinMode (CLK, OUTPUT);
pinMode (MOS1, OUTPUT);
pinMode (M1SO, INPUT);
pinMode (SS_165, OUTPUT);
digitalWrite(SS_165,HIGH);
//Serial.begin(9600);
}

void loop() {
  i++;
  if (i>9999) {i=0;}
Number(i/10);
curmil = millis();
  if ( curmil - prevmil > 0.1*interval) 
  { 
digitalWrite(SS_165, HIGH);
digitalWrite(SS_165, LOW);
but = shiftIn(M1SO, CLK, MSBFIRST);
    prevmil = curmil;
  }
  if (curmil - prevmil < 0 )
  { prevmil = curmil; }        // Защита от последствий переполнения функции millis()

//Serial.println(but, BIN);
//Serial.println("----------------------");

}
void Number (int number)
{
  for( int i = 0; i < 4; i++)
  {
    showDigit( number%10, i);
    number = number / 10;
  }
}

void showDigit (int number, int digit)
{
digitalWrite(SS_595, LOW);
shiftOut(MOS1, CLK, LSBFIRST, razr[digit]);
shiftOut(MOS1, CLK, MSBFIRST, numeral[number]);
digitalWrite(SS_595, HIGH);
delayMicroseconds(20);
}