SPI и PT6961

xplp
Offline
Зарегистрирован: 21.12.2012

Есть плата с лед матрицей и драйвером PT6961. Не могу разобраться как правильно отправлять данные по SPI на PT6961. Вот код где тупо перебором отправляются данные, матрица зажигается и хаотично мигает по строкам.



#include <SPI.h>
 
const int SSPin = 10;
 
void setup() {
 
  pinMode (SSPin, OUTPUT);
 
  SPI.begin();
 
}
 
void loop() {
 
  for(int i=0; i<255; i++){
	for(int j=0; j<255; j++)
	digitalPotWrite(i,j);
	delay(1);
  }
 
}
 
int digitalPotWrite(int address, int value) {
 
  digitalWrite(SSPin,LOW);
 
  SPI.transfer(byte(address));
  SPI.transfer(byte(value));
 
  digitalWrite(SSPin,HIGH);
}

 

В даташите https://dl.dropbox.com/u/64193121/datasheet_6961.pdf на 13 странице написан алгоритм работы, какие данные посылать. Помогите разобраться, как это в коде для ардуино написать правильно.
Посылаю данные так:



  digitalWrite(SSPin,LOW); //command 2
  SPI.transfer(byte(0x40));
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 3
  SPI.transfer(byte(0xC0));
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 1
  SPI.transfer(byte(0x03));
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 4
  SPI.transfer(byte(0x00));
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 1
  SPI.transfer(byte(0x03));
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 4
  SPI.transfer(byte(0x08));
  digitalWrite(SSPin,HIGH);

Такая запись будет правильная или нет?(после отправки ничего не мигает).

maksim
Offline
Зарегистрирован: 12.02.2012

Если вы отправляете только команды без данных то все верно, только преобразование byte() можно убрать потому как 0xC0, 0x03 и т.д. это и есть один байт.

xplp
Offline
Зарегистрирован: 21.12.2012

Спасибо за ответ. Теперь вопрос как правильно отправлять данные?)

Пишу так:



  for (int i=0; i<256; i++){
  digitalWrite(SSPin,LOW); //command 3
  SPI.transfer(0xC0);
  SPI.transfer(byte(i));
  digitalWrite(SSPin,HIGH);
}

По идее этот код должен записать хоть что-то, но ничего не происходит =/

maksim
Offline
Зарегистрирован: 12.02.2012

Опять преобразовываете байт в байт... изучите Типы данных 

Судя по даташиту дисплей нужно для начала проинициализировать, а при при записи чего либо сначала отправляется команда 2 с младшими двумя битами сброшенными в ноль, а только потом команда 3 с адресом.

И еще можно для удобства записывать байт в таком виде B10101010 или 0b10101010

xplp
Offline
Зарегистрирован: 21.12.2012

Инициализирую в setup так:







digitalWrite(SSPin,LOW); //command 2
SPI.transfer(0x40); //0x40
digitalWrite(SSPin,HIGH);
digitalWrite(SSPin,LOW); //command 3
SPI.transfer(0xC0);
digitalWrite(SSPin,HIGH);
digitalWrite(SSPin,LOW); //command 1
SPI.transfer(0x03);
digitalWrite(SSPin,HIGH);
digitalWrite(SSPin,LOW); //command 4
SPI.transfer(0x80);
digitalWrite(SSPin,HIGH);
digitalWrite(SSPin,LOW); //command 1
SPI.transfer(0x03);
digitalWrite(SSPin,HIGH);
digitalWrite(SSPin,LOW); //command 4
SPI.transfer(0x8f);
digitalWrite(SSPin,HIGH);

Инициализация проходит вроде бы, так как стирается мусор который остаётся после рендомного прогона.

Пытаюсь отправлять данные вот таким перебором:







  for (int j=0xc0; j<0xcf; j++){
    for (int i=0x00; i<0xff; i++){
      digitalWrite(SSPin,LOW);
      SPI.transfer(0x40); //command 2
      digitalWrite(SSPin,HIGH);
      digitalWrite(SSPin,LOW);
      SPI.transfer(j);//command 3
      SPI.transfer(i);
      digitalWrite(SSPin,HIGH);
    }
}

Но ничего не происходит =/

Про типы данных понял, просто оставил там преобразование, так как переменная перебиралась внутри цикла в 10м виде, но раз это делать не нужно  то уберу.

maksim
Offline
Зарегистрирован: 12.02.2012

А какая разница в каком виде она там перебирается?

Ну а если так?

  digitalWrite(SSPin,LOW);
  SPI.transfer(0x40); //command 2
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW);
  SPI.transfer(0xC0);//command 3
  for (int i=0x00; i<0x0D; i++) SPI.transfer(i);
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 1
  SPI.transfer(0x03);
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin,LOW); //command 4
  SPI.transfer(0x8f);
  digitalWrite(SSPin,HIGH);

 

xplp
Offline
Зарегистрирован: 21.12.2012

Разницы нету в каком виде она перебирается, думал есть разница в каком виде подсовывать  переменную в SPI.transfer()

Ваш код загрузил всё так же молчит почемуто =/

maksim
Offline
Зарегистрирован: 12.02.2012

 

Попробуйте 2 команду два раза отправлять, сначала Read Key Data, а потом Write Data to Display Mode.
xplp
Offline
Зарегистрирован: 21.12.2012

Попробовал, не то всё, не рисуер ничего молчит=/

Вот тут нашёл люди разбираются с pt6961 только там не лед матрица, табло с циферками:http://dangerousprototypes.com/forum/viewtopic.php?t=4541&p=44721

Исправил немного под свою:











#include <SPI.h>


// set pin 10 as the slave select for the digital pot:
const int SSPin = 10;

void setup() {
  // set the slaveSelectPin as an output:
  pinMode (SSPin, OUTPUT);

  // initialize SPI:
  SPI.begin();
  
  delay(200);

   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE2);
}

void loop() {

const char DISP[16]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71};
delay (10);
 
  //set display to 6x12 segments исправлено на 7х11
  /digitalWrite(SSPin,LOW);
  SPI.transfer(0x03);
  digitalWrite(SSPin,HIGH);
 
  //set to writing mode, auto incrament address after data write
  digitalWrite(SSPin,LOW);
  SPI.transfer(0x40);
  digitalWrite(SSPin,HIGH);
 
  //first clear 8 bytes of the display RAM
  digitalWrite(SSPin,LOW);
  SPI.transfer(0xC0);
  for(int i=0; i<8; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
 
  //display on, max brightness
  digitalWrite(SSPin,LOW);
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
 
  //count through 0-9,a-f
  for(int i=0; i<16; i++){
      digitalWrite(SSPin,LOW);
      SPI.transfer(0xC0);
      SPI.transfer(DISP[i]);
      digitalWrite(SSPin,HIGH);
      delay(500);
  }
}

 

Но ничего не показывает, я так понимаю что в массиве там символы, а тут нужно другие данные отправлять, пробую изменить цикл на такой:











for(int i=0; i<=0xff; i++){
      digitalWrite(SSPin,LOW);
      SPI.transfer(0xC0);
      SPI.transfer(i);
      digitalWrite(SSPin,HIGH);
}

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

но если поменять цикл на такой:











  for(int i=0x00; i<0xcd; i++){
    for(int j=0;j<=0xff; j++){
      digitalWrite(SSPin,LOW);
      SPI.transfer(i);
      SPI.transfer(j);
      digitalWrite(SSPin,HIGH);
    }
      delay(1);
  }

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

Добавлю; путём перебора выяснил, что если написать так:



    for(int j=0;j<=0xff; j++){
      digitalWrite(SSPin,LOW);
      SPI.transfer(0x9c);
      SPI.transfer(j);
      digitalWrite(SSPin,HIGH);
      delay(1);
    }

то зажигаются хаотично светодиоды на верхних 4х строках.

Подходят значения от 0х98 до 0х9f разница в том что яркость разная.

xplp
Offline
Зарегистрирован: 21.12.2012

в общем разобрался, всё что написано работает, при инициализации нужно отправлять:











   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);

а в примере было SPI_MODE2 потому и работало криво, не по даташиту...

Теперь вопрос, как лучше сделать, загнать в массив, то что нужно отправлять, что бы зажечь конкретную точку, и потом рисовать, или можно как то более рационально сделать?

Вот код рабочий, очищает всё, потом  зажигает все точки, матрица постепенно заполняется зажёнными светодиодами:










#include <SPI.h>

const int SSPin = 10;

void setup() {

  pinMode (SSPin, OUTPUT);

  SPI.begin();
  
  delay(200);
 
   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);
}

void loop() {
  
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,LOW);
  
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b01001100); //command 2
  digitalWrite(SSPin,LOW);
  
  digitalWrite(SSPin,LOW); //command 3
    SPI.transfer(0xC0);
  for(int i=0; i<=11; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
  
  digitalWrite(SSPin,LOW); //command 4
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
  
 
  for(int i=0xc0; i<=0xcd; i++){
    for(int j=0x00;j<=0xff; j++){

      digitalWrite(SSPin,LOW);
      SPI.transfer(i);
      SPI.transfer(j);
      digitalWrite(SSPin,HIGH);
      delay(10);


      }
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

А как у вас работает с LOW и LOW?

  digitalWrite(SSPin,LOW);  
​  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,LOW);

 

xplp
Offline
Зарегистрирован: 21.12.2012

Спасибо что заметили ошибку. Они значит по идее и не отправлялись, вернее ерунда отправлялась, закомментировал эти команды, и всё равно оно работает, выходит не сильно нужны они. Поправил немного их, а то во 2й команде тестовый режим был включен, оставил их на всякий случай:











#include <SPI.h>

const int SSPin = 10;

void setup() {

  pinMode (SSPin, OUTPUT);
  //Serial.begin(9600);
  // initialize SPI:
  SPI.begin();
  
  delay(200);

   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);
}

void loop() {
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,HIGH);
  
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b01000000); //command 2
  digitalWrite(SSPin,HIGH);
  
  digitalWrite(SSPin,LOW);
    SPI.transfer(0xC0);  //command 3
  for(int i=0; i<=13; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
  
  digitalWrite(SSPin,LOW);  //command 4
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
  
 
  for(int i=0xc0; i<=0xcd; i++){
    for(int j=0;j<256; j++){

      digitalWrite(SSPin,LOW);
      SPI.transfer(i);
      SPI.transfer(j);
      digitalWrite(SSPin,HIGH);
      delay(1);


      }
  }
}

Вот такой код зажигает светодиоды в шахматном порядке:





      digitalWrite(SSPin,LOW);
      SPI.transfer(0xc0);
      SPI.transfer(0b10101010);
      SPI.transfer(0b010);
      SPI.transfer(0b01010101);
      SPI.transfer(0b101);
      SPI.transfer(0b10101010);
      SPI.transfer(0b010);
      SPI.transfer(0b01010101);
      SPI.transfer(0b101);
      SPI.transfer(0b10101010);
      SPI.transfer(0b010);
      SPI.transfer(0b01010101);
      SPI.transfer(0b101);
      SPI.transfer(0b10101010);
      SPI.transfer(0b010);
      digitalWrite(SSPin,HIGH);

 

xplp
Offline
Зарегистрирован: 21.12.2012

Немного разобрался как рисовать на этой матрице.

Вот что получилось http://youtu.be/joydxbGU1TI

Код:







#include <SPI.h>

const int SSPin = 10;
const int SSPin1 = 9;
const int SSPin2 = 8;

int myArray[7][29]={
{0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,1,0},
{0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1},
{1,0,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1},
{1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,0,1,0,0,1},
{1,1,1,1,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,1},
{1,0,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1},
{1,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0,1,1,0},
};

int myAA[7][11]={
{0,0,0,0,1,0,1,0,0,0,0},
{1,1,0,0,1,1,1,0,0,1,1},
{0,1,1,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,1,0,0},
{0,0,1,1,1,1,1,1,1,0,0},
{0,0,0,1,1,1,1,1,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
};

const int myArray1[7]=
{0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc};

const int myArray2[11]=
{1,2,4,8,16,32,64,128,1,2,4};


void setup() {

  pinMode (SSPin, OUTPUT);
  pinMode (SSPin1, OUTPUT);
  pinMode (SSPin2, OUTPUT);
  //Serial.begin(9600);
  // initialize SPI:
  SPI.begin();
  
  delay(200);

   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);
   
  digitalWrite(SSPin,LOW);
  digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  
  digitalWrite(SSPin,LOW);
    digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
  SPI.transfer(0b01000000); //command 2
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  
  digitalWrite(SSPin,LOW);
    digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
    SPI.transfer(0xC0);  //command 3
  for(int i=0; i<=13; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  
  digitalWrite(SSPin,LOW);  //command 4
    digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
  digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  /*
 for(int i=0; i<7; i++)
 {
   for(int j=0; j<11; j++)
    myArray[i][j] = myAA[i][j];
 }*/
 paint(0); delay(2000);
 // paint(1);delay(500);
}
void clearAll(){
  for(int i = 0xc0; i<=0xcd; i++){
    digitalWrite(SSPin,LOW);
      digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
    SPI.transfer(i);  
    SPI.transfer(0x00);
    digitalWrite(SSPin,HIGH);
    digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  }
}

void clMyArray(){
  for(int i=0; i<7; i++)
 {
   for(int j=0; j<29; j++)
    myArray[i][j] = 0;
 }

}

void writeAll(){
  for(int i = 0xc0; i<=0xcd; i++){
    digitalWrite(SSPin,LOW);
      digitalWrite(SSPin1,LOW);
  digitalWrite(SSPin2,LOW);
    SPI.transfer(i);  
    SPI.transfer(0xff);
    digitalWrite(SSPin,HIGH);
    digitalWrite(SSPin1,HIGH);
  digitalWrite(SSPin2,HIGH);
  }
}
void paint(byte inv){

  for(int i = 0; i<=6; i++){
    
    byte r1 = 0; 
    byte r2 = 0;
    
    for(int j=10; j>=0; j--){ 
    if(j<=7){  
      if(myArray[i][j]!=inv)
      r1=r1+myArray2[j];
      }else{
      if(myArray[i][j]!=inv)
      r2=r2+myArray2[j];
      }
    }

    digitalWrite(SSPin,LOW);
    SPI.transfer(myArray1[i]);  
    SPI.transfer(r1);
    SPI.transfer(r2);
    digitalWrite(SSPin,HIGH);
    
    r1 = 0; 
    r2 = 0;
    
    for(int j=10; j>=0; j--){ 
    if(j<=7){  
      if(myArray[i][11+j]!=inv)
      r1=r1+myArray2[j];
      }else{
      if(myArray[i][11+j]!=inv)
      r2=r2+myArray2[j];
      }
    }

    digitalWrite(SSPin1,LOW);
    SPI.transfer(myArray1[i]);  
    SPI.transfer(r1);
    SPI.transfer(r2);
    digitalWrite(SSPin1,HIGH);
    
    r1 = 0; 
    r2 = 0;
    
    for(int j=10; j>=0; j--){ 
    if(j<=7){  
      if(myArray[i][22+j]!=inv)
      r1=r1+myArray2[j];
      }else{
      if(myArray[i][22+j]!=inv)
      r2=r2+myArray2[j];
      }
    }

    digitalWrite(SSPin2,LOW);
    SPI.transfer(myArray1[i]);  
    SPI.transfer(r1);
    SPI.transfer(r2);
    digitalWrite(SSPin2,HIGH);
    }
}


void loop() {

  int val =0;
  for(int i=0; i<29; i++){
    val = analogRead(0);
  
  if(val!=0 && val<100){
  val=1;
  }else{
  val = (map(val, 0, 680, 0, 7));
  }
      for(int j=1; j<val; j++)
        myArray[7-j][i] = 1;
  }
  paint(0);

  clMyArray();


}

Подскажите как к этому лучше прикрутить библиотеку FFT (быстрое преобразование Фурье)?

goldpistol
Offline
Зарегистрирован: 01.10.2014

Уважаемый человек.не поможете ли мне?мне нужно на табло от двд под данным контроллером выводить цифры из переменной.

xplp
Offline
Зарегистрирован: 21.12.2012

Вы пробовали мой код заливать где заполняется всё и в шахматном порядке рисуется? если с этим кодом загораются сегменты на индикаторе то нужно просто опытным путём найти какой при каких данных зажигается, как-то так. А вот чтоб циферки писать на таком это нужно наверно типа быблиотеки писать, у меня в этой теме http://arduino.ru/forum/proekty/arduino-pt6961-led-matrix-watch есть код для часиков, вам нужно для своего сегментного индикатора что то похожеее делать.

goldpistol
Offline
Зарегистрирован: 01.10.2014

Урааа))ОТветили!!!я нашел какие байты что зажигают !)методом тыка.Если я вам предоставлю данные вы мне сможете помочь?

goldpistol
Offline
Зарегистрирован: 01.10.2014

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

goldpistol
Offline
Зарегистрирован: 01.10.2014
include <SPI.h>

int val=11;

//0xca-dvd-1
//0xcb-repl-1
//0xc8-pbc-1
//0xc0-play-1
//0xc2-vcd-1
//0xc4-mp3-1
//0xc6-pause-1
//0xc9-dolby-1
//0xc1-dts-1
//0xcc-средние горизонтальные деления от 1 до 255
//0xca-верхние горизонтальные 1-255
//0xc8-нижние горизонтальные 1-255
//0xc6-верхние левые деления 1-255
//0xc0-нижние левые деления 1-255
//0xc2-верхние правые деления 1-255
//0xc4-нижние правые деления 1-255
//0xc3-первое двоеточие-1-255
//0xc5-второе двоеточие 1-255

const int myArray[8]=
{0x00,0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc};

const int myArray1[12][8]={
{0,14,4,4,14,14,4,0}, //LOL
{0,0,2,2,0,0,0,0},//1-1 digit
{0,2,2,0,0,2,2,2},//2-1 digit
{0,0,2,2,0,2,2,2},//3-1 digit
{0,0,2,2,2,0,0,2},//4-1 digit
{0,0,0,2,2,2,2,2},//5-1 digit
{0,2,0,2,2,2,2,2},//6-1 digit
{0,0,2,2,0,0,2,0},//7-1 digit
{0,2,2,2,2,2,2,2},//8-1 digit
{0,0,2,2,2,2,2,2},//9-1 digit
{0,4,6,6,4,4,4,0},//10-1-2 digit
{0,0,6,6,0,0,0,0},//11-1-2 digit
};
const int SSPin = 10;

void setup() {

pinMode (A0, INPUT);
pinMode (SSPin, OUTPUT);
SPI.begin();
delay(200);

SPI.setBitOrder(LSBFIRST);
SPI.setDataMode(SPI_MODE0);
}

void loop() {
digitalWrite(SSPin,LOW);
SPI.transfer(0b00000011); //command 1
digitalWrite(SSPin,HIGH);

digitalWrite(SSPin,LOW);
SPI.transfer(0b01000000); //command 2
digitalWrite(SSPin,HIGH);

digitalWrite(SSPin,LOW);
SPI.transfer(0xC0); //command 3
for(int i=0; i<=13; i++){
SPI.transfer(0x00);
}
digitalWrite(SSPin,HIGH);

digitalWrite(SSPin,LOW); //command 4
SPI.transfer(0x8F);
digitalWrite(SSPin,HIGH);

for(int j=1;j<8; j++){

digitalWrite(SSPin,LOW);

SPI.transfer(myArray[1]);
SPI.transfer(myArray1[val][1]);

digitalWrite(SSPin,HIGH);

digitalWrite(SSPin,LOW);

SPI.transfer(myArray[2]);
SPI.transfer(myArray1[val][2]);

digitalWrite(SSPin,HIGH);

digitalWrite(SSPin,LOW);

SPI.transfer(myArray[3]);
SPI.transfer(myArray1[val][3]);

digitalWrite(SSPin,HIGH);


digitalWrite(SSPin,LOW);

SPI.transfer(myArray[4]);
SPI.transfer(myArray1[val][4]);

digitalWrite(SSPin,HIGH);


digitalWrite(SSPin,LOW);

SPI.transfer(myArray[5]);
SPI.transfer(myArray1[val][5]);

digitalWrite(SSPin,HIGH);


digitalWrite(SSPin,LOW);

SPI.transfer(myArray[6]);
SPI.transfer(myArray1[val][6]);

digitalWrite(SSPin,HIGH);


digitalWrite(SSPin,LOW);

SPI.transfer(myArray[7]);
SPI.transfer(myArray1[val][7]);

digitalWrite(SSPin,HIGH);

delay(10);

}
}
17:03:09	

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

вы не сможете мне помочь с упрощением этого велосипеда?Я просто недавно начал дуинами заниматься и в этом языке мало понимаю.Особенно с учетом того что до этого был максимум php.А прописывать методом тыка в массив 9999 значений как-то не охота...

xplp
Offline
Зарегистрирован: 21.12.2012

Честно говоря у меня у самого в массиве всё забито просто, до лучшего не додумался лень было и знаний нехватка(только для себя под дуины быдлокодил(= ). Зачем 9999 значений в массив? там только цифры 0-9, нужно для одного сегмента нарисовать все, для других там наверно просто сдвигаются значения, по крайней мере я просто сдвигал, но мб и не так.  

goldpistol
Offline
Зарегистрирован: 01.10.2014

ну у меня 7 цифр по 7 сегментов.код каждого сегмента выше и у меня значение сегмента если 1 то он появляется на первой цифре а если 14 то на первых двух и т.д. до 255.а если я буду смещать то сначала передастся первое значение сегмента а потом уже второе..и выйдет каша

xplp
Offline
Зарегистрирован: 21.12.2012

А как тогда зажечь один сегмент во 2й или 3й цифре без зажигания его в первой? не должно же быть так, что нельзя по отдельности их зажигать. или я не так понял. 

goldpistol
Offline
Зарегистрирован: 01.10.2014

Вы не так поняли..Если я допустим первым параметром передам 0хСА.А вторым чило от 1 до 255
то в зависимости от числа будет меняться комбинация горящих сегментов.0хСА это допустим верхние левые сегменты.так вот они в зависимости от второго числа будут менять последовательность.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

goldpistol пишет:
Вы не так поняли..Если я допустим первым параметром передам 0хСА.А вторым чило от 1 до 255
то в зависимости от числа будет меняться комбинация горящих сегментов.0хСА это допустим верхние левые сегменты.так вот они в зависимости от второго числа будут менять последовательность.

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

goldpistol
Offline
Зарегистрирован: 01.10.2014

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

bpg
Offline
Зарегистрирован: 09.12.2014

Здравстуйте, есть индикатор от старого ДВД микросхема.

Что я только не пробовал, не могу понять логику работы.

Код из сообщения 11 отрабатывается и начинают мигать индикаторы сначала верхние сегменты, потом мигание, дальше зажигаются все и т.д.

Код goldpistol из сообщения 17 отображает число 11 в  третьем и четвертом разряде

Сам модуль очень похож на http://we.easyelectronics.ru/uploads/images/00/32/70/2012/06/28/d159f3.png

только чип MTC1661 доков нигде не нагуглил вообще.

Буду благодарен за любую помощь, бьюсь с ним уже неделю.

 

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

а вы поменяйте int val=11; на int val=10; и отпишите что выйдет

bpg
Offline
Зарегистрирован: 09.12.2014

Пробовал менять, отобразил 10 в тех же разрядах что и 11 до этого, они как бы посредине, в 3 и 4 разрядах горели.

Если ставить другие цифры то или ничегоне происходит, или хаос полный. В другой теме српашивал, там сказали что здесь не SPI подключение, а регистр сдвиговый стоит, но приведенный там код вообще ничего не выдал в отличии от приведенных здесь.

Если можно укажите какой нибудь другой способ связи с Вами, а не через форум (или подскажите тут можно отправить личное сообщение, что то я вообще не пойму этого форума) а то ответа ждал неделю. Сейчас больше не могу сказать, потому что все на работе осталось.

goldpistol
Offline
Зарегистрирован: 01.10.2014

Да,конечно.Связывайтесь через вконтакте : http://vk.com/kr_swag_fox

goldpistol
Offline
Зарегистрирован: 01.10.2014

А вы не подскажете мне как сдвигать значения?Пример кодом нужен...Я все по вашим рекомендациям сделал...Прорисовал от 0 до 9 но сдвигать не могу...Вот топик,может подскажете что?
http://arduino.ru/forum/programmirovanie/spipt6961-i-obuglennyi-mozg

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Всем привет. подключил семисегментник к arduino  UNO DIN - Pin11 (arduino), CLK - Pin12, STB - Pin13, соотвеоствено +5, GND. Заливать пробовал разные скетчи, но толку 0 ((( Т.е. дисплей включается , даже вроде как проходит инициализацию (включается, выключается) полностью, а  потом начинает  просто  мигать хаотично не выдавая никаких данных на  сегменты ((( Подскажите, что не так?

An1684
Offline
Зарегистрирован: 28.04.2019

Доброго времени суток.

Внесу свои пять копеек.

Индикаторы которые стоят в DVD с общим анодом. Микросхема для общего катода. Поэтому получается, что разряды подключены к Сегментам, а сегменты к Разрядам. Из-за этого путаница.

При засвечивании первого сегмента - подключаете полностью весь разряд, а указывая разряд (по даташиту) вы засвечиваете сегмент. Используйте индикаторы с общим катодом и проблем не будет. отправляйте младшим битом вперед. И перебирайте разряды по очереди.

Инициализация
stb_pin0;// сторб = 0
PT6961_tx (0x40); //command 2 запись в микросхему
stb_pin1;
 
stb_pin0;
PT6961_tx (0xC1);  //command 3 очистка дисплея
for(int i=0; i<=13; i++){
PT6961_tx (0x00);
  }
  stb_pin1;
 
stb_pin0;
PT6961_tx (0x03); //command 1 отправляем 11 : 7 Grids, 11 Segments
stb_pin1;
 
stb_pin0;  delay_us(5);//command 4
PT6961_tx (0x8F);// включаем дисплей. макс яркость
 
в цикле программы
stb_pin0;
PT6961_tx (0x40); //command 2
stb_pin1;
stb_pin0;
PT6961_tx (0xc0);  //адрес первого разряда
PT6961_tx (0x01);// шлем сегмент  b00000001
PT6961_tx (0xc2);  //адрес второго разряда
PT6961_tx (0x02);// шлем сегмент  b00000010
PT6961_tx (0xc4);// третий разряд
PT6961_tx (0xff);//все сегменты b11111111
PT6961_tx (0xc6);// четвертый
PT6961_tx (0x00);//
PT6961_tx (0xc8);// пятый
PT6961_tx (0x00);//
PT6961_tx (0xca); //шестой
PT6961_tx (0x00);//
stb_pin0;
stb_pin1;
stb_pin0;
PT6961_tx (0x03); //command 1
stb_pin1;
stb_pin0;  delay_us(5);//command 4
PT6961_tx (0x8f);
stb_pin1;
Вот как-то так