STP16CP05 не могу разобраться

Dikson
Offline
Зарегистрирован: 28.11.2014

Здравствуйте, дорогие форумчане! Не могу разобраться с драйвером светодиодов STP16CP05. Написал код на коленке, ни разу не программист, в основном пользуюсь готовыми кодами для своих мелких поделок, за что спасибо умным людям. Решился зажечь 64 светодиода, но не все, а те, которые нужны, в зависимости от настроек. Со сдвиговым регистром 595 разобрался через shiftout, но они 8-ми битные. Для своей поделки решил поставить STP16CP05 для уменьшения количества резисторов и большей мощности. Код написал по аналогии с 595, не заработало. Сетка из диодов 8х8 светодиодов в соответствии с кодом не работает, загораются рандомные светодиоды. Работает только включение и отключение светодиодов по ножке OE. Даташит читал, тайминги смотрел, но не работает, с английским туговато. Питание светодиодов через линейный стабилизатор на 5В, резистор на R-EXT в соответствии с даташитом поставил 1кОм, все остальное на прямую к ардуине, без обвязки. Светодиоды включаются, как хотят. Прикрутил 1602 с кнопками, чтобы задавать необходимое количество диодов по ширине и высоте, и задавать время свечения. В регистры не пишутся данные через shiftout, отправляю по 8бит 2 раза. Подскажите, куда копать? Спасибо, заранее.

Dikson
Offline
Зарегистрирован: 28.11.2014
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
byte ledUV[9]= {B11111111,B11111110,B11111100,B11111000,B11110000,B11100000,B11000000,B10000000,B00000000};
int latchPin = A3; //Пин подключен к LE входу STP16CP05
int clockPin = A4; //Пин подключен к CLK входу STP16CP05
int dataPin = A1; //Пин подключен к SDI входу STP16CP05
int onPin = A2; //Пин подключен к OE входу STP16CP05 
const int BUTTON_NONE   = 0; //присваиваем постоянное значение для BUTTON_NONE 
const int BUTTON_RIGHT  = 1; //присваиваем постоянное значение для BUTTON_RIGHT
const int BUTTON_UP     = 2; //присваиваем постоянное значение для BUTTON_UP
const int BUTTON_DOWN   = 3; //присваиваем постоянное значение для BUTTON_DOWN 
const int BUTTON_LEFT   = 4; //присваиваем постоянное значение для BUTTON_LEFT
const int BUTTON_SELECT = 5; //присваиваем постоянное значение для BUTTON_SELECT
int w=0;
int h=0;
int t=0;
int s=1;
int a=0;
int getPressedButton() //инициализация переменной
{
  int buttonValue = analogRead(0); // считываем значения с аналогового входа
  if (buttonValue < 100) { //если при нажатии кнопки значение меньше 100
    delay (500);
    return BUTTON_RIGHT;   // выводим значение BUTTON_RIGHT
  }
  else if (buttonValue < 200) { //если при нажатии кнопки значение меньше 200
    delay (500);
    return BUTTON_UP; // выводим значение BUTTON_UP
  }
  else if (buttonValue < 400){ //если при нажатии кнопки значение меньше 400
    delay (500);
    return BUTTON_DOWN; // выводим значение BUTTON_DOWN
  }
  else if (buttonValue < 600){ //если при нажатии кнопки значение меньше 600
    delay (500);
    return BUTTON_LEFT; // выводим значение BUTTON_LEFT
  }
  else if (buttonValue < 800){ //если при нажатии кнопки значение меньше 800
    delay (500);
    return BUTTON_SELECT; // выводим значение BUTTON_SELECT
  }
  return BUTTON_NONE; //иначе, выводим значение BUTTON_NONE
}
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(onPin, OUTPUT);
  digitalWrite(onPin, HIGH);
  digitalWrite(latchPin, HIGH);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  digitalWrite(latchPin, LOW);
  Serial.begin(9600);
  lcd.begin(16, 2); //Инициализируем дисплей: 2 строки по 16 символов
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба           
  lcd.print("LED-UV v1.0");  //Выводи надпись LED-UV v1.0
  delay (500);
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         "); //стираем экран
}
  void loop() 
{ 
int button=getPressedButton();
  switch (button) {
  
  case 1:
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
  lcd.print("Width,cm");//выводим надпись "Width" на экран и размер
  w=w+2;
  lcd.setCursor(0, 1);
  lcd.print(w);
  break;
  
  case 2:
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
  lcd.print("Height,cm");//выводим надпись "height" на экран
  h=h+2;
  lcd.setCursor(0, 1);
  lcd.print(h);
  break;
  
  case 4: 
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба
  lcd.print("Time,sec");//выводим надпись "Time" на экран
  t=t+5;
  lcd.setCursor(0, 1);
  lcd.print(t);
  break;
  
  case 3:
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 0);
  lcd.print("CLEAR");
  w=0;h=0;t=0;a=0;s=1;
  break;
  
  case 5:
  int str=w/2;
  byte x=ledUV[str];
  int y=h/2;
  s=0;
  a=0;
  lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
  lcd.print("                         ");
  lcd.setCursor(0, 0);
  lcd.print("START");
  delay (1000);
    digitalWrite(latchPin, HIGH);
    while (s<y) {
    shiftOut(dataPin, clockPin, MSBFIRST, x);
    s++;
    }
    digitalWrite(latchPin, LOW);
    digitalWrite(onPin, LOW);
    while (a<=t){
      lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
      lcd.print("                         ");
      lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба 
      lcd.print("                         ");
      lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба 
      lcd.print(a);
      a++;
      delay(1000);
      }
    digitalWrite(onPin, HIGH);
    digitalWrite(latchPin, HIGH);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
    digitalWrite(latchPin, LOW);
    break;  
  }
  }
  

 

Dikson
Offline
Зарегистрирован: 28.11.2014

Пробовал такой тестовый код, тоже не работает. Светодиоды зажигаются, но не те. Зависимости не нашел.

 

int latchPin = A3; //Пин подключен к LE входу STP16CP05
int clockPin = A4; //Пин подключен к CLK входу STP16CP05
int dataPin = A1; //Пин подключен к SDI входу STP16CP05
int onPin = A2; //Пин подключен к OE входу STP16CP05 
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(onPin, OUTPUT);
digitalWrite(onPin, LOW);
digitalWrite(latchPin, LOW);
delay(5);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111110);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);  
}

void loop() {
  digitalWrite(onPin, LOW);
    delay(1000);
    digitalWrite(onPin, HIGH);
    delay(1000);
    }

 

Dikson
Offline
Зарегистрирован: 28.11.2014

Пробовал ставить задержку, тоже не прокатило. 

int latchPin = A3; //Пин подключен к LE входу STP16CP05
int clockPin = A4; //Пин подключен к CLK входу STP16CP05
int dataPin = A1; //Пин подключен к SDI входу STP16CP05
int onPin = A2; //Пин подключен к OE входу STP16CP05 
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(onPin, OUTPUT);
digitalWrite(onPin, LOW);
digitalWrite(latchPin, LOW);
delay(5);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111110);
    delay(10);
    digitalWrite(latchPin, HIGH);
    delay(10);
    digitalWrite(latchPin, LOW);
    delay(10);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    delay(10);
    digitalWrite(latchPin, HIGH);
    delay(10);
    digitalWrite(latchPin, LOW);
    delay(10);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    delay(10);
    digitalWrite(latchPin, HIGH);
    delay(10);
    digitalWrite(latchPin, LOW);
    delay(10);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);
    delay(10);
    digitalWrite(latchPin, HIGH);
    delay(10);
    digitalWrite(latchPin, LOW);  
    delay(10);
}

void loop() {
  digitalWrite(onPin, LOW);
    delay(1000);
    digitalWrite(onPin, HIGH);
    delay(1000);
    }

 

Dikson
Offline
Зарегистрирован: 28.11.2014
Dikson
Offline
Зарегистрирован: 28.11.2014

Попробовал код с другой темы http://arduino.ru/forum/apparatnye-voprosy/adruino-led-driver-mbi5026 распиновка та же, код для микросхемы MBi5026. Не работает, светодиоды загораются, но опять без какой либо зависимости. Моргают, потом зависают в статичномп положении. Дайте подсказку, если не сложно. Плата на фото. https://radikal.ru/lfp/c.radikal.ru/c12/1907/57/50645116bab2.jpg/htm

 
Dikson
Offline
Зарегистрирован: 28.11.2014

Никто не знает в чем причина?