Вопрос по программированию драйвера MAX7219

Olm
Offline
Зарегистрирован: 09.10.2014
Привет форумчане. Купил я семисегментный индикатор на микросхеме MAX7219 с 8 разрядами
Логика работы вроде понятна-формируем и отправляем 16 бит данных.
Информацию брал отсюда-http://radiohlam.ru/raznoe/max7219_7221.htm
Написал программу для программирования всех регистров микросхемы с целью потестировать.
Но сколько не бился не выводятся цифры на индикатор. В программировании новичёк, так что
сильно не грузите по качеству кода и листинга.
Если кому не сложно гляньте где ошибка.

byte load=8;// пины для подключения
byte clk=9;
byte din=10;

static int8_t print_digits[] = {//разложенный массив данных регистров идущих на печать

  0b00000000,    // 0, адрес // 00000000
  0b00000001, // 1,   // 1---------------------------------------------
  0b00000001,// 2,    // 2--------
  0b00000001,//3,   // 3--------
  0b00000001,// 4,    // 4------
  0b00000001, // 5,   // 5--------
  0b00000000,// 6,     // 6--------
  0b00000000,// 7,     // 7------
  0b00000000,// 8,    // 8-----------------------------------------------
  0b00000000,// 9,    00000000  Decode Mode  0 ("No decode") или 1 ("BCD code B") 
  0b00000000, // 10    00001111 яркость
  0b11111111,// 11    00000111  ОБСЛУЖИВАЕМ ВСЕ 8 РАЗРЯДОВ
  0b00000000, // 12    Включение MAX7219 производится записью 1 в регистр Shutdown, имеющий адрес 0Сh т.е надо 1 бит посылать а не 8
  0b00000000, // 13    nop
  0b00000000, // 14    nop
  0b00000000,// 15    display test 00000000
  };

//0b10000000=128
//0b01000000=64
//0b00100000=32
//0b00010000=16
//0b00001000=8
//0b00000100=4
//0b00000010=2
//0b00000001=1

boolean changesettings=true;// если true то меняем настройки посылая байты 9 10 11 12 13 и меняем на false чтоб в следующий раз не посылать


void setup() {                


  pinMode(load, OUTPUT); //load(cs) PORTB0   digitalWrite(8,LOW);

  pinMode(clk, OUTPUT);//clk      PORTB1
  pinMode(din, OUTPUT);//din    PORTB2
digitalWrite(load,LOW);
digitalWrite(clk,LOW);
digitalWrite(din,LOW);
  delay(50);

 Serial.begin(9600); 
}
void loop() {

   for (byte registeradr=0; registeradr<=15; registeradr++){ //p //за весь цикл грузим все регистры от 0 до 13 микросхемы 7219
 //  delay(10);//
    digitalWrite(load,LOW);//  Установить низкий уровень на линии LOAD
    if (registeradr==13){registeradr=15;}

    Serial.println( );                       

    Serial.print(registeradr);                       
    Serial.print(" adress " ); 
    if(registeradr==9 && changesettings==false){ 
      break;}//выход из цикла если ненадо грузить байты настройки

    for (byte i=128; i >= 1; i=i/2){// отправка 7(от 0 до 7) бит адреса регистра содержащегося в registeradr 
      // цикл работает 8 раз и отпревляет 8 бит

                                            
      byte  tmpregisteradr=registeradr;
      byte tmp_i=i; 
 //     delay(10);
      digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
 //     delay(10);
       if ((tmpregisteradr & tmp_i) > 0 ){ // если результат >0 то отправляем 1     
        digitalWrite(din,HIGH); //установили высокий уровень din
        Serial.print(1);}
      else{
        digitalWrite(din,LOW);//установили низкий уровень din
        Serial.print(0);}
//      delay(10);//---------------------------------------------------------------------------------
      digitalWrite(clk,HIGH);// Установить ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА
    }// i отправили 8 бит адреса registeradr--------------------------------------------
    Serial.print(" data " );                       

for (byte sendbitdata=128; sendbitdata >= 1; sendbitdata=sendbitdata/2)   // отправка 8 бит данных------------------------------------------
    {
      byte  tmpsenddata=print_digits[registeradr];// tmpsenddata- 8 бит данных print_digits[] которые надо отправлять
      byte tmp_sendbitdata=sendbitdata; 

 //      delay(10);//......................................................................................
      digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
 
     if ((tmpsenddata & tmp_sendbitdata) > 0 ){ // если результат >0 то отправляем 1
        digitalWrite(din,HIGH); //установили высокий уровень din
        Serial.print(1); }
      else{
        digitalWrite(din,LOW); //установили  низкий уровень din
        Serial.print(0); }
      
//     delay(10);//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
      digitalWrite(clk,HIGH);//  ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА

    }// sendbitdata отправили 8 бит содержащихся массиве [registerr]  (настройки В МАССИВЕ и отображаемые символы уже закодированны ПОБИТНО)
//-----------------------------------------------------------------------------------------------------------------------------------------
    Serial.print(" send 16 bit " );  
    Serial.println( );                       
//   delay(1000);//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
    digitalWrite(load,HIGH);// отправка load=1

 }//registeradr
  // цикл записи всех регистров закончился и теперь необходимо установить boolean changesettings=false; чтоб не записывать регистры настройки
  // в следующий раз
  changesettings=false;
  Serial.println("changesettings = false");                       

}//конец основного цикла---------------------- 

 

Olm
Offline
Зарегистрирован: 09.10.2014

Не пойму как тут отредактировать первое сообщение

Olm
Offline
Зарегистрирован: 09.10.2014

Разобрался на свежую голову, все работает. Если кому интересно то вот рабочий вариант. Можно смотреть в seriаl port идущие данные. Но это чисто для понимания принципа работы, под конкретные цели можно оптимизировать чтоб не всё подряд выводил.

 


byte load=8;// пины для подключения
byte clk=9;
byte din=10;

static int8_t print_digits[] = {//разложенный массив данных регистров идущих на загрузку в микросхему

  0b00000000,  // 0, адрес // 00000000
  0b00000001, // 1,   // 1---------------------------------------------
  0b00000001, // 2,    // 2------
  0b00000001, //3,   // 3--------
  0b00000001, // 4,    // 4------ТУТ КОДИРУЕМ СЕГМЕНТЫ
  0b00000001, // 5,   // 5------
  0b00000001, // 6,     // 6-----
  0b00000001, // 7,     // 7-----
  0b00000001, // 8,    // 8-----------------------------------------------
  0b00000000, // 9,    00000000  Decode Mode  0 ("No decode") или 1 ("BCD code B") 
  0b00000000, // 10    00001111 яркость
  0b11111111, // 11    00000111  ОБСЛУЖИВАЕМ ВСЕ 8 РАЗРЯДОВ
  0b00000001, // 12    Включение индикаторов MAX7219 производится записью 1 выключение 0
  0b00000000, // 13    nop
  0b00000000, // 14    nop
  0b00000000, // 15    display test 00000000
  };
boolean changesettings=true;// если true то меняем настройки посылая байты 9 10 11 12 13 и меняем на false чтоб в следующий раз не посылать

void setup() {                
 pinMode(load, OUTPUT); //load(cs) 
 pinMode(clk, OUTPUT);//clk  
 pinMode(din, OUTPUT);//din 
 Serial.begin(9600); 
  }
void loop() {

   for (byte registeradr=1; registeradr<=15; registeradr++){//за весь цикл грузим все регистры от 0 до 13 микросхемы 7219
    digitalWrite(load,LOW);//  Установить низкий уровень на линии LOAD
    if (registeradr==13){registeradr=15;}

    Serial.println( );                       
    Serial.print(registeradr);                       
    Serial.print(" adress " ); 
    if(registeradr==9 && changesettings==false){ 
      break;}//выход из цикла если ненадо грузить байты настройки

    for (byte i=128; i >= 1; i=i/2){// отправка 7(от 0 до 7) бит адреса регистра содержащегося в registeradr 
      // цикл работает 8 раз и отпревляет 8 бит                                           
      digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
       if ((registeradr & i) > 0 ){ // если результат >0 то отправляем 1     
        digitalWrite(din,HIGH); //установили высокий уровень din
        Serial.print(1);}
      else{
        digitalWrite(din,LOW);//установили низкий уровень din
        Serial.print(0);}
      digitalWrite(clk,HIGH);// Установить ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА
    }// i отправили 8 бит адреса registeradr--------------------------------------------
    Serial.print(" data " );                       

for (byte sendbitdata=128; sendbitdata >= 1; sendbitdata=sendbitdata/2)// отправка 8 бит данных из массива print_digits[registeradr]
    {
      digitalWrite(clk,LOW);// Установить НИЗКИЙ уровень на линии CLK
      if ((print_digits[registeradr] & sendbitdata) > 0 ){ // если результат >0 то отправляем 1
        digitalWrite(din,HIGH); //установили высокий уровень din
        Serial.print(1); }
      else{
        digitalWrite(din,LOW); //установили  низкий уровень din
        Serial.print(0); }
      
      digitalWrite(clk,HIGH);//  ВЫСОКИЙ уровень на линии CLK -ОТПРАВКА БИТА
    }// sendbitdata отправили 8 бит содержащихся массиве print_digits[]
//---------------------------------------------------------------------------------------
    Serial.print(" send 16 bit " );  
    digitalWrite(load,HIGH);// отправка загруженных 16 бит load=1

 }//registeradr
  // цикл записи всех регистров закончился и теперь необходимо установить changesettings=false; 
  //чтоб не записывать регистры настройки в следующий раз
  changesettings=false;
  Serial.println("changesettings = false");                       

}//конец основного цикла----------------------