Передать данные по SPI на светодиодную матрицу

Тема в разделе "Микроконтроллеры AVR", создана пользователем Logika, 17 май 2019.

Метки:
  1. parovoZZ

    parovoZZ Гуру

    Мне кажется, что матрица тактируется не по тому фронту, по которому ожидаешь. А лишняя единица - это линия моси уходит в единицу и тактом захватывается матрицей. Но это догадки - надо ЛА смотреть.
     
  2. Logika

    Logika Нерд

    Спасибо за ответ :), посмотрю и отпишусь. Возможно на реальном устройстве не будет так вести себя.
     
  3. parovoZZ

    parovoZZ Гуру

    Перепробуй все режимы SPI. Благо их всего четыре.
     
  4. Logika

    Logika Нерд

    Заработал матрица. Страший бит - из предидущей собщении - двигал Proteus, а устройсто не двигается и отображает все так как запрограмирован.
    Добавляю фотки от матрицы и анализатора. Особый плогодарности за подержки parovoZZ он сачало до конца подерживал меня Спасибо огромное.
    (Усли кого-то интерестно код то выложу, она примитивная, но в работе матрицы и микросхемы разберетесь )
    Тема считается закрытим.

    P.S. Извиняюсь за грамм. ошибок, я не Русско-язычный.
    Заработал матрица. Страший бит - из предидущей собщении - двигал Proteus, а устройсто не двигается и отображает все так как запрограмирован.
    Добавляю фотки от матрицы и анализатора. Особый плогодарности за подержку parovoZZ он сачало до конца подерживал меня Спасибо огромное.
    (Если кого-то интерестно код то выложу, она примитивная, но в работе матрицы и микросхемы разберетесь )
    Тема считается закрытим.

    P.S. Извиняюсь за грамм. ошибок, я не Русско-язычный.
     

    Вложения:

    • 000.JPG
      000.JPG
      Размер файла:
      34,1 КБ
      Просмотров:
      41
    • analiz.jpg
      analiz.jpg
      Размер файла:
      124,3 КБ
      Просмотров:
      42
  5. Logika

    Logika Нерд

    Мне матрица так понравилось даже прогу напимал для генерации массивов для симболов. Прога генертрует массивы как для строк так и для столбцов, так же добавляет 0bxxxxxxxx и 0xXX так жа запятой. Если кому-то понадобится выложу.
     

    Вложения:

    parovoZZ нравится это.
  6. Oleksandr54

    Oleksandr54 Нерд

    Предлагаю виложить исходники и програму сдесь
     
  7. Logika

    Logika Нерд

    Нет проблем. программу могу сразу выложить а прошивку удалил, напишу заново и выложу ее.
    В программе добавил функцию SHIFT ARRAY пересортирует по убыванию элементы массива т.е. первый элемент в массиве двигается на право и окажется последним. Этот вариант подходить тогда когда вам нужен перевернуть символ
     

    Вложения:

  8. Logika

    Logika Нерд

    Код как раньше написал примитивная но для изучения подойдет.
    Код (C++):
    /*
         
            Athor Malkhazi
        */



        #define F_CPU 8000000L
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <C:/WinAVR-20100110/lib/gcc/avr/4.3.3/include/stdbool.h>


        #define CLK   PB7  
        #define ENB   PB4  
        #define MOSI  PB5
       #define MAXDEVICE  4



        //====declare own var =======
        volatile unsigned low  = 0;
        volatile static unsigned int TOP = 1000;
        volatile unsigned int counter = 0;

        //0b01100110 Heart
        unsigned char textShow[] ={
            0b00000000,0b01100110,0b11111111,0b11111111, //0b01100110 => 11001100
            0b01111110, 0b00111100,0b00011000,0b0000000
        };

        // Texst Array  "mari"
        unsigned char text[][8]={
            {0b01111110, 0b01000010, 0b0000010, 0b00000010,         //m
                0b01111110, 0b01000010, 0b01000010, 0b01111110
            },
           
            { 0b01000000,0b00100000,0b00010000,0b00001000,         //a
                0b00000010,0b01000010,0b01000010,0b01111110
            },
           
            { 0b01000000,0b01000000,0b01000000, 0b01000000,       //r
                0b01111100, 0b01000010,0b01000010,0b01000010
            },

            { 0b00000000,0b00111100,0b01000010,0b01000010,        //i
                0b01000010,0b001000010, 0b01000010,0b01000010
            }                      
        };


        //=========== own functios declare ===========
            void init(void);
            void transSpi(unsigned char t);
            void repearTransByte(unsigned char addr, unsigned char data);
            void resetAllLeds(void);
            void charShow(unsigned char t);

        //----------- END OWN FUNCTIONS ------

        //=========== interrupts ============
        ISR(TIMER0_COMP_vect){
            counter++;
        }


        //-------- END INTERRUPTS -----------  

        int main(void){
            init();
           
           
            // TestMode off
            repearTransByte(0x0F, 0);
           
            // decode mode Off
            repearTransByte(0x09, 0);

            // intens
            repearTransByte(0x0A, 10);

            //ScenLimit
            repearTransByte(0x0B, 7);

            // shutDown
            repearTransByte(0x0C, 1);

            //resetAllLeds
            resetAllLeds();
       
            sei();          
            while(1){

           //every 1sec Update screen    
           if (counter >= TOP){
                    cli();
                    if (low >= 4) {low = 0;}
                    //resetAllLeds();
                    charShow(low);
                    low++;
                    counter = 0;
                    sei();                          
                }// END


            } // Basic Loop End
        return 0;
        }

    //=============================================
    //------------------------------------------------------------------------
        void init(void){
            // set PORT
            DDRB = 0xFF;
            PORTB = (1<<ENB);


            //set TIMER0   for 1mC
            TCCR0 = (1<<WGM01 | 1<<CS01 | 1<<CS00);
            OCR0 = 125;
            TIMSK = (1<<OCIE0);

            // SPI
            SPCR = (1<<SPE | 1<<MSTR);
         
        }// END init


        /*------- sendCharBySPI--------*/
        void transSpi(unsigned char t){
            SPDR = t;
            while (!(SPSR & (1<<SPIF))) continue;      
        } //END

        /*------Prepere byte for sending-------------*/
        void repearTransByte(volatile unsigned char addr, volatile unsigned char data){

            PORTB &= ~(1<<ENB);
            asm("nop");

            transSpi(addr);
            transSpi(data);
           
            PORTB |= (1<<ENB);
            asm("nop");
        }//END

        /*-------------------------*/
        void resetAllLeds(void){  
         
            for(unsigned short k = 1; k < 9; k++){
                PORTB &= ~(1<<ENB);       // SS low
                asm("nop");
               for(unsigned short  dev = 0;   devi  <  MAXDEVICE ;  dev ++){
     
                  transSpi((unsigned char)  dev );   // send Address
                  transSpi(0);                                      // send data
                }
                PORTB |= (1<<ENB);      //SS high
               asm("nop");
            }

        }//END

        /*---Show  the text on the screen----*/
        void charShow(unsigned char t){  
         
            for(unsigned short k = 0; k < 8; k++){
                PORTB &= ~(1<<ENB);
                asm("nop");

                for(unsigned short dev = 0; dev < MAXDEVICE; dev++){
                    transSpi((unsigned char) k+1);
                    transSpi((unsigned char) text[dev][k]);
                }

                PORTB |= (1<<ENB);
                asm("nop");                
            }
                           
        }//END